UNPKG

n8n-nodes-everest-tms

Version:

Everest TMS n8n integration

373 lines 18.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.executeRouteOperations = executeRouteOperations; const GenericFunctions_1 = require("../GenericFunctions"); // Helper function to convert comma-separated string to array of numbers function parseCommaSeparatedNumbers(value) { if (!value || typeof value !== 'string') return []; return value.split(',') .map(item => item.trim()) .filter(item => item.length > 0) .map(item => parseInt(item, 10)) .filter(num => !isNaN(num)); } // Helper function to convert comma-separated string to array of strings function parseCommaSeparatedStrings(value) { if (!value || typeof value !== 'string') return []; return value.split(',') .map(item => item.trim()) .filter(item => item.length > 0); } // Helper function to convert time windows from datetime to timestamps function convertTimeWindows(timeWindows) { if (!timeWindows || !timeWindows.window || !Array.isArray(timeWindows.window)) { return []; } return timeWindows.window.map((tw) => { const convertedWindow = (0, GenericFunctions_1.convertDateFieldsToParisTimezone)(tw, ['start_datetime', 'end_datetime']); return [convertedWindow.start_datetime, convertedWindow.end_datetime]; }).filter((tw) => tw[0] && tw[1]); // Filter out windows with missing dates } async function executeRouteOperations(itemIndex) { const operation = this.getNodeParameter('operation', itemIndex); if (operation === 'get') { const id = this.getNodeParameter('id', itemIndex); (0, GenericFunctions_1.validateRequiredFields)({ id }, ['id']); const response = await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes/get', { id }); return response.route || response; } if (operation === 'getMany') { const options = this.getNodeParameter('options', itemIndex, {}); let body = (0, GenericFunctions_1.cleanObject)(options); // Handle statuses array conversion if (body.statuses && typeof body.statuses === 'string') { const statusesString = body.statuses; if (statusesString.trim()) { body.statuses = statusesString.split(',').map(status => status.trim()).filter(status => status.length > 0); } else { delete body.statuses; } } // Handle date conversion for Europe/Paris timezone body = (0, GenericFunctions_1.convertDateFieldsToParisTimezone)(body, ['date_between_start', 'date_between_end']); // Handle pagination if (body.limit && body.limit > 0) { // Use custom limit_start if provided, otherwise default to 0 const limitStart = body.limit_start || 0; body.limit_start = limitStart; body.limit_end = limitStart + body.limit; delete body.limit; const response = await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes', body); return response.routes || []; } else { return await GenericFunctions_1.everestApiRequestAllItems.call(this, 'routes', 'POST', '/routes', body); } } if (operation === 'create') { const missionRefsString = this.getNodeParameter('mission_refs', itemIndex); const vehiclesString = this.getNodeParameter('vehicles', itemIndex); const additionalFields = this.getNodeParameter('additionalFields', itemIndex, {}); const constraintTimeWindow = this.getNodeParameter('constraint_time_window', itemIndex, {}); const statusExtrasString = this.getNodeParameter('status_extras', itemIndex, ''); (0, GenericFunctions_1.validateRequiredFields)({ mission_refs: missionRefsString, vehicles: vehiclesString }, ['mission_refs', 'vehicles']); // Parse mission references and vehicles const missionRefs = parseCommaSeparatedStrings(missionRefsString); const vehicles = parseCommaSeparatedNumbers(vehiclesString); if (missionRefs.length === 0) { throw new Error('At least one mission reference is required'); } if (vehicles.length === 0) { throw new Error('At least one vehicle is required'); } const body = { mission_refs: missionRefs, vehicles: vehicles, ...(0, GenericFunctions_1.cleanObject)(additionalFields), }; // Handle constraint time window if (constraintTimeWindow.window) { const window = constraintTimeWindow.window; if (window.start_datetime && window.end_datetime) { const convertedWindow = (0, GenericFunctions_1.convertDateFieldsToParisTimezone)(window, ['start_datetime', 'end_datetime']); body.constraint_time_window = [convertedWindow.start_datetime, convertedWindow.end_datetime]; } } // Handle status extras if (statusExtrasString) { body.status_extras = parseCommaSeparatedStrings(statusExtrasString); } const response = await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes/create', body); return response.route || response; } if (operation === 'update') { const id = this.getNodeParameter('id', itemIndex); const additionalFields = this.getNodeParameter('additionalFields', itemIndex, {}); const updateFields = this.getNodeParameter('updateFields', itemIndex, {}); (0, GenericFunctions_1.validateRequiredFields)({ route_id: id }, ['route_id']); const body = { route_id: id, ...(0, GenericFunctions_1.cleanObject)(additionalFields), ...(0, GenericFunctions_1.cleanObject)(updateFields), }; // Handle mission references and vehicles in updateFields if (updateFields.mission_refs && typeof updateFields.mission_refs === 'string') { body.mission_refs = parseCommaSeparatedStrings(updateFields.mission_refs); } if (updateFields.vehicles && typeof updateFields.vehicles === 'string') { body.vehicles = parseCommaSeparatedNumbers(updateFields.vehicles); } const response = await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes/update', body); return response.route || response; } if (operation === 'delete') { const id = this.getNodeParameter('id', itemIndex); (0, GenericFunctions_1.validateRequiredFields)({ route_id: id }, ['route_id']); return await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes/delete', { route_id: id }); } if (operation === 'optimize') { const shipmentsData = this.getNodeParameter('shipments', itemIndex, {}); const vehiclesData = this.getNodeParameter('vehicles', itemIndex, {}); const matricesData = this.getNodeParameter('matrices', itemIndex, {}); const timeWindowConstraintData = this.getNodeParameter('time_window_constraint', itemIndex, {}); const options = this.getNodeParameter('options', itemIndex, {}); const shipments = []; const vehicles = []; const matrices = []; const timeWindowConstraints = []; // Process shipments if (shipmentsData.shipment && Array.isArray(shipmentsData.shipment)) { for (const shipment of shipmentsData.shipment) { const shipmentData = { amount: shipment.amount || 1, volume: shipment.volume || 0, weight: shipment.weight || 0, priority: shipment.priority || 1, }; // Process pickup if (shipment.pickup) { const pickup = { id: shipment.pickup.id, description: shipment.pickup.description || '', setup: shipment.pickup.setup || 0, service: shipment.pickup.service || 0, }; // Handle pickup location if (shipment.pickup.location && shipment.pickup.location.coordinates) { pickup.location = [ shipment.pickup.location.coordinates.lng, shipment.pickup.location.coordinates.lat ]; } // Handle pickup duration if (shipment.pickup.duration) { pickup.duration = shipment.pickup.duration; } // Handle pickup time windows - convert datetime to timestamps if (shipment.pickup.time_windows) { const timeWindows = convertTimeWindows(shipment.pickup.time_windows); if (timeWindows.length > 0) { pickup.time_windows = timeWindows; } } shipmentData.pickup = pickup; } // Process delivery if (shipment.delivery) { const delivery = { id: shipment.delivery.id, description: shipment.delivery.description || '', setup: shipment.delivery.setup || 0, service: shipment.delivery.service || 0, }; // Handle delivery location if (shipment.delivery.location && shipment.delivery.location.coordinates) { delivery.location = [ shipment.delivery.location.coordinates.lng, shipment.delivery.location.coordinates.lat ]; } // Handle delivery duration if (shipment.delivery.duration) { delivery.duration = shipment.delivery.duration; } // Handle delivery time windows - convert datetime to timestamps if (shipment.delivery.time_windows) { const timeWindows = convertTimeWindows(shipment.delivery.time_windows); if (timeWindows.length > 0) { delivery.time_windows = timeWindows; } } shipmentData.delivery = delivery; } // Process skills - now handling multiOptions array instead of comma-separated string if (shipment.skills && Array.isArray(shipment.skills) && shipment.skills.length > 0) { shipmentData.skills = shipment.skills.map((skill) => parseInt(skill)).filter((skill) => !isNaN(skill)); } // Process metadata if (shipment.metas && shipment.metas.meta && Array.isArray(shipment.metas.meta)) { const metasObj = {}; for (const meta of shipment.metas.meta) { if (meta.key && meta.value) { metasObj[meta.key] = meta.value; } } if (Object.keys(metasObj).length > 0) { shipmentData.metas = metasObj; } } shipments.push(shipmentData); } } // Process vehicles if (vehiclesData.vehicle && Array.isArray(vehiclesData.vehicle)) { for (const vehicle of vehiclesData.vehicle) { const vehicleData = { id: vehicle.id, profile: vehicle.profile || 'car', description: vehicle.description || '', capacity: vehicle.capacity || 1, weight: vehicle.weight || 0, volume: vehicle.volume || 0, priority: vehicle.priority || 1, speed_factor: vehicle.speed_factor || 1, show_start: vehicle.show_start || false, show_end: vehicle.show_end || false, }; // Handle start location if (vehicle.start && vehicle.start.coordinates) { vehicleData.start = [vehicle.start.coordinates.lng, vehicle.start.coordinates.lat]; } // Handle end location if (vehicle.end && vehicle.end.coordinates && (vehicle.end.coordinates.lng !== 0 || vehicle.end.coordinates.lat !== 0)) { vehicleData.end = [vehicle.end.coordinates.lng, vehicle.end.coordinates.lat]; } // Handle optional constraints if (vehicle.max_tasks && vehicle.max_tasks > 0) { vehicleData.max_tasks = vehicle.max_tasks; } if (vehicle.max_travel_time && vehicle.max_travel_time > 0) { vehicleData.max_travel_time = vehicle.max_travel_time; } if (vehicle.max_distance && vehicle.max_distance > 0) { vehicleData.max_distance = vehicle.max_distance; } // Handle time window - convert datetime to timestamps if (vehicle.time_window && vehicle.time_window.window) { const window = vehicle.time_window.window; if (window.start_datetime && window.end_datetime) { const convertedWindow = (0, GenericFunctions_1.convertDateFieldsToParisTimezone)(window, ['start_datetime', 'end_datetime']); vehicleData.time_window = [convertedWindow.start_datetime, convertedWindow.end_datetime]; } } // Process skills - now handling multiOptions array instead of comma-separated string if (vehicle.skills && Array.isArray(vehicle.skills) && vehicle.skills.length > 0) { vehicleData.skills = vehicle.skills.map((skill) => parseInt(skill)).filter((skill) => !isNaN(skill)); } // Process breaks if (vehicle.breaks && vehicle.breaks.break && Array.isArray(vehicle.breaks.break)) { vehicleData.breaks = vehicle.breaks.break.map((breakItem) => { const breakData = { id: breakItem.id, description: breakItem.description || '', service: breakItem.service || 0, is_every_day: breakItem.is_every_day || false, }; // Handle break time windows - convert datetime to timestamps if (breakItem.time_windows) { const timeWindows = convertTimeWindows(breakItem.time_windows); if (timeWindows.length > 0) { breakData.time_windows = timeWindows; } } return breakData; }); } // Process costs if (vehicle.costs) { vehicleData.costs = { fixed: vehicle.costs.fixed || 0, per_hour: vehicle.costs.per_hour || 0, per_km: vehicle.costs.per_km || 0, }; } // Process metadata if (vehicle.metas && vehicle.metas.meta && Array.isArray(vehicle.metas.meta)) { const metasObj = {}; for (const meta of vehicle.metas.meta) { if (meta.key && meta.value) { metasObj[meta.key] = meta.value; } } if (Object.keys(metasObj).length > 0) { vehicleData.metas = metasObj; } } vehicles.push(vehicleData); } } // Process matrices if (matricesData.matrix && Array.isArray(matricesData.matrix)) { for (const matrix of matricesData.matrix) { const matrixData = { profile: matrix.profile || 'car', }; // Parse JSON strings for matrix data try { if (matrix.durations) { matrixData.durations = JSON.parse(matrix.durations); } } catch (error) { // Ignore parsing errors for durations } try { if (matrix.distances) { matrixData.distances = JSON.parse(matrix.distances); } } catch (error) { // Ignore parsing errors for distances } try { if (matrix.costs) { matrixData.costs = JSON.parse(matrix.costs); } } catch (error) { // Ignore parsing errors for costs } matrices.push(matrixData); } } // Process time window constraints - convert datetime to timestamps if (timeWindowConstraintData.constraint && Array.isArray(timeWindowConstraintData.constraint)) { for (const constraint of timeWindowConstraintData.constraint) { if (constraint.start_datetime && constraint.end_datetime) { const convertedConstraint = (0, GenericFunctions_1.convertDateFieldsToParisTimezone)(constraint, ['start_datetime', 'end_datetime']); timeWindowConstraints.push([convertedConstraint.start_datetime, convertedConstraint.end_datetime]); } } } (0, GenericFunctions_1.validateRequiredFields)({ shipments, vehicles }, ['shipments', 'vehicles']); const body = { shipments, vehicles, ...(0, GenericFunctions_1.cleanObject)(options), }; // Add optional top-level parameters if (matrices.length > 0) { body.matrices = matrices; } if (timeWindowConstraints.length > 0) { body.time_window_constraint = timeWindowConstraints; } const response = await GenericFunctions_1.everestApiRequest.call(this, 'POST', '/routes/solve', body); return response.solution || response; } throw new Error(`The operation "${operation}" is not known!`); } //# sourceMappingURL=RouteOperations.js.map