Files
panel/src/lib/queries/projects.js

291 lines
7.2 KiB
JavaScript

import db from "../db.js";
export function getAllProjects(contractId = null) {
const baseQuery = `
SELECT
p.*,
c.contract_number,
c.contract_name,
c.customer,
c.investor,
creator.name as created_by_name,
creator.username as created_by_username,
assignee.name as assigned_to_name,
assignee.username as assigned_to_username,
assignee.initial as assigned_to_initial
FROM projects p
LEFT JOIN contracts c ON p.contract_id = c.contract_id
LEFT JOIN users creator ON p.created_by = creator.id
LEFT JOIN users assignee ON p.assigned_to = assignee.id
`;
if (contractId) {
return db
.prepare(
baseQuery + " WHERE p.contract_id = ? ORDER BY p.finish_date DESC"
)
.all(contractId);
}
return db.prepare(baseQuery + " ORDER BY p.finish_date DESC").all();
}
export function getProjectById(id) {
return db
.prepare(
`
SELECT
p.*,
creator.name as created_by_name,
creator.username as created_by_username,
assignee.name as assigned_to_name,
assignee.username as assigned_to_username,
assignee.initial as assigned_to_initial
FROM projects p
LEFT JOIN users creator ON p.created_by = creator.id
LEFT JOIN users assignee ON p.assigned_to = assignee.id
WHERE p.project_id = ?
`
)
.get(id);
}
export function createProject(data, userId = null) {
// 1. Get the contract number and count existing projects
const contractInfo = db
.prepare(
`
SELECT
c.contract_number,
COUNT(p.project_id) as project_count
FROM contracts c
LEFT JOIN projects p ON c.contract_id = p.contract_id
WHERE c.contract_id = ?
GROUP BY c.contract_id, c.contract_number
`
)
.get(data.contract_id);
if (!contractInfo) {
throw new Error("Contract not found");
}
// 2. Generate sequential number and project number
const sequentialNumber = (contractInfo.project_count || 0) + 1;
const projectNumber = `${sequentialNumber}/${contractInfo.contract_number}`;
const stmt = db.prepare(`
INSERT INTO projects (
contract_id, project_name, project_number, address, plot, district, unit, city, investment_number, finish_date,
wp, contact, notes, wartosc_zlecenia, project_type, project_status, coordinates, created_by, assigned_to, created_at, updated_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, datetime('now', 'localtime'), datetime('now', 'localtime'))
`);
const result = stmt.run(
data.contract_id,
data.project_name,
projectNumber,
data.address,
data.plot,
data.district,
data.unit,
data.city,
data.investment_number,
data.finish_date,
data.wp,
data.contact,
data.notes,
data.wartosc_zlecenia || null,
data.project_type || "design",
data.project_status || "registered",
data.coordinates || null,
userId,
data.assigned_to || null
);
return result;
}
export function updateProject(id, data, userId = null) {
const stmt = db.prepare(`
UPDATE projects SET
contract_id = ?, project_name = ?, project_number = ?, address = ?, plot = ?, district = ?, unit = ?, city = ?,
investment_number = ?, finish_date = ?, wp = ?, contact = ?, notes = ?, wartosc_zlecenia = ?, project_type = ?, project_status = ?,
coordinates = ?, assigned_to = ?, updated_at = CURRENT_TIMESTAMP
WHERE project_id = ?
`);
const result = stmt.run(
data.contract_id,
data.project_name,
data.project_number,
data.address,
data.plot,
data.district,
data.unit,
data.city,
data.investment_number,
data.finish_date,
data.wp,
data.contact,
data.notes,
data.wartosc_zlecenia || null,
data.project_type || "design",
data.project_status || "registered",
data.coordinates || null,
data.assigned_to || null,
id
);
console.log('Update result:', result);
return result;
}
export function deleteProject(id) {
db.prepare("DELETE FROM projects WHERE project_id = ?").run(id);
}
// Get all users for assignment dropdown
export function getAllUsersForAssignment() {
return db
.prepare(
`
SELECT id, name, username, role
FROM users
WHERE is_active = 1 AND can_be_assigned = 1
ORDER BY name
`
)
.all();
}
// Get projects assigned to a specific user
export function getProjectsByAssignedUser(userId) {
return db
.prepare(
`
SELECT
p.*,
creator.name as created_by_name,
creator.username as created_by_username,
assignee.name as assigned_to_name,
assignee.username as assigned_to_username
FROM projects p
LEFT JOIN users creator ON p.created_by = creator.id
LEFT JOIN users assignee ON p.assigned_to = assignee.id
WHERE p.assigned_to = ?
ORDER BY p.finish_date DESC
`
)
.all(userId);
}
// Get projects created by a specific user
export function getProjectsByCreator(userId) {
return db
.prepare(
`
SELECT
p.*,
creator.name as created_by_name,
creator.username as created_by_username,
assignee.name as assigned_to_name,
assignee.username as assigned_to_username
FROM projects p
LEFT JOIN users creator ON p.created_by = creator.id
LEFT JOIN users assignee ON p.assigned_to = assignee.id
WHERE p.created_by = ?
ORDER BY p.finish_date DESC
`
)
.all(userId);
}
// Update project assignment
export function updateProjectAssignment(projectId, assignedToUserId) {
return db
.prepare(
`
UPDATE projects
SET assigned_to = ?, updated_at = CURRENT_TIMESTAMP
WHERE project_id = ?
`
)
.run(assignedToUserId, projectId);
}
export function getProjectWithContract(id) {
return db
.prepare(
`
SELECT
p.*,
c.contract_number,
c.contract_name,
c.customer,
c.investor,
creator.name as created_by_name,
creator.username as created_by_username,
assignee.name as assigned_to_name,
assignee.username as assigned_to_username,
assignee.initial as assigned_to_initial
FROM projects p
LEFT JOIN contracts c ON p.contract_id = c.contract_id
LEFT JOIN users creator ON p.created_by = creator.id
LEFT JOIN users assignee ON p.assigned_to = assignee.id
WHERE p.project_id = ?
`
)
.get(id);
}
export function getNotesForProject(projectId) {
return db
.prepare(
`
SELECT n.*,
u.name as created_by_name,
u.username as created_by_username
FROM notes n
LEFT JOIN users u ON n.created_by = u.id
WHERE n.project_id = ?
ORDER BY n.note_date DESC
`
)
.all(projectId);
}
// Get finish date update history for a project
export function getFinishDateUpdates(projectId) {
return db
.prepare(
`
SELECT fdu.*,
u.name as updated_by_name,
u.username as updated_by_username
FROM project_finish_date_updates fdu
LEFT JOIN users u ON fdu.updated_by = u.id
WHERE fdu.project_id = ?
ORDER BY fdu.updated_at DESC
`
)
.all(projectId);
}
// Log a finish date update
export function logFinishDateUpdate(projectId, oldDate, newDate, userId, reason = null) {
const stmt = db.prepare(`
INSERT INTO project_finish_date_updates (
project_id, old_finish_date, new_finish_date, updated_by, reason, updated_at
) VALUES (?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`);
return stmt.run(projectId, oldDate, newDate, userId, reason);
}
// Check if project has finish date updates
export function hasFinishDateUpdates(projectId) {
const result = db
.prepare('SELECT COUNT(*) as count FROM project_finish_date_updates WHERE project_id = ?')
.get(projectId);
return result.count > 0;
}