294 lines
7.3 KiB
JavaScript
294 lines
7.3 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, completion_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.completion_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 = ?, completion_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.completion_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_contract_number,
|
|
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;
|
|
}
|