import { ProjectModel, VAModel, ClientModel } from "../../models/vaModel.js"; import { Types } from "mongoose"; import { updateEntityRelationships } from "../../helper/updateEntityRelationships.js"; // Register a new VA async function project_add_sf(req, res) { try { const payload = req.body|| {}; const { name, hourlyRate, clientId, vaAssigned, dedicatedHours } = payload; // Validate required fields if (!name) { return res.status(400).json({ success: false, message: "Project name is required" }); } if (!clientId) { return res.status(400).json({ success: false, message: "Client ID is required" }); } // Validate and convert clientId to ObjectId let clientObjectId; try { clientObjectId = new Types.ObjectId(clientId); } catch (error) { return res.status(400).json({ success: false, message: "Invalid Client ID format" }); } // Validate and convert vaAssigned to array of ObjectIds let vaAssignedArray = []; if (vaAssigned) { if (Array.isArray(vaAssigned)) { try { vaAssignedArray = vaAssigned.map(vaId => new Types.ObjectId(vaId)); } catch (error) { return res.status(400).json({ success: false, message: "Invalid VA ID format in vaAssigned array" }); } } else if (typeof vaAssigned === 'string') { // Handle single VA ID as string try { vaAssignedArray = [new Types.ObjectId(vaAssigned)]; } catch (error) { return res.status(400).json({ success: false, message: "Invalid VA ID format" }); } } } // sanitize/construct allowed fields const toCreate = { name: name.trim(), hourlyRate: hourlyRate || '0', clientId: clientObjectId, vaAssigned: vaAssignedArray, dedicatedHours: dedicatedHours ? parseFloat(dedicatedHours) : 0, }; const created = await ProjectModel.create(toCreate); const relationshipUpdate = await updateEntityRelationships({ project: { projectId: created._id, clientId: clientObjectId, vaId: vaAssignedArray } }); if (!relationshipUpdate.success) { console.warn('Project created but relationship update failed:', relationshipUpdate.message); } // Send data to Salesforce API after successful registration try { // const salesforceUrl = `${process.env.SF_DOCTRACKER_API_URL}services/apexrest/docva/api/`; // const response = await fetch(salesforceUrl, { // method: 'POST', // headers: { // 'Content-Type': 'application/json', // }, // body: JSON.stringify(created) // }); // if (!response.ok) { // const errorText = await response.text(); // throw new Error(`Salesforce API responded with status ${response.status}: ${errorText}`); // } // const result = await response.json(); // console.log("✅ Successfully synced VA data to Salesforce:", result); // res.status(201).json({ success: true, data: created, SyncSalesforce: result }); res.status(201).json({ success: true, data: created, relationships: relationshipUpdate }); } catch (error) { console.error("❌ Failed to sync with Salesforce:", error.message); // Create a custom error to distinguish Salesforce errors const salesforceError = new Error(`Salesforce sync failed: ${error.message}`); salesforceError.isSalesforceError = true; throw salesforceError; } } catch (error) { console.error("project_add_sf error:", error); return res.status(500).json({ success: false, message: "Internal Server Error" }); } } export { project_add_sf };