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; }