n8n-nodes-everest-tms
Version:
Everest TMS n8n integration
373 lines • 18.9 kB
JavaScript
;
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