3a1163d5a7
voeg zendingen toe die wij moeten uitleveren aan de database
289 lines
44 KiB
JSON
289 lines
44 KiB
JSON
{
|
|
"name": "Palletways BI - Leveringen",
|
|
"nodes": [
|
|
{
|
|
"parameters": {
|
|
"jsCode": "// Get today's date\nconst today = new Date();\n\n\nconst lastWorkday = new Date(today);\n\n// Format as YYYY-MM-DD\nconst yyyy = lastWorkday.getFullYear();\nconst mm = String(lastWorkday.getMonth() + 1).padStart(2, '0');\nconst dd = String(lastWorkday.getDate()).padStart(2, '0');\nconst formattedDate = `${yyyy}-${mm}-${dd}`;\n\nreturn [\n {\n json: {\n lastWorkday: formattedDate\n }\n }\n];"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
480,
|
|
-144
|
|
],
|
|
"id": "08c5aa91-9a51-49f7-ab05-c103ab5c53f4",
|
|
"name": "Last workday1"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const xmlData = items[0]?.json?.data;\nconst listDate = (() => {\n try { return $items('Last workday1')?.[0]?.json?.lastWorkday || null; } catch (e) { return null; }\n})();\n\nif (typeof xmlData !== 'string') {\n throw new Error('Expected an XML string in $input.first().json.data');\n}\n\nconst out = [];\nconst seen = new Set();\nconst regex = /<TrackingID>([\\s\\S]*?)<\\/TrackingID>/gi;\nlet match;\n\nwhile ((match = regex.exec(xmlData)) !== null) {\n const trackingid = String(match[1] || '').trim().toUpperCase();\n if (!trackingid || seen.has(trackingid)) continue;\n seen.add(trackingid);\n\n out.push({\n json: {\n trackingid,\n source_name: 'PW_DELIVERY_LIST',\n delivery_list_date: listDate,\n },\n });\n}\n\nreturn out;"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
960,
|
|
-144
|
|
],
|
|
"id": "b6a0bffa-2e63-40d0-b91f-d9e3c330546b",
|
|
"name": "Extract TrackingIDs"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "=https://api.palletways.com/getconsignment/{{ $json.trackingid }}?apikey=SXJaM7PLjZDqfsnXSDP8Y9wDY6crxJySBg705MQEPus%3D",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.2,
|
|
"position": [
|
|
1440,
|
|
-144
|
|
],
|
|
"id": "094aa988-beee-448f-9aad-d14e69c55ee7",
|
|
"name": "Get Consignment"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.splitInBatches",
|
|
"typeVersion": 3,
|
|
"position": [
|
|
1200,
|
|
-144
|
|
],
|
|
"id": "0df72e64-9034-4643-b984-4f0ee5396ada",
|
|
"name": "Loop Over Items"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"amount": 0.5
|
|
},
|
|
"type": "n8n-nodes-base.wait",
|
|
"typeVersion": 1.1,
|
|
"position": [
|
|
2160,
|
|
-144
|
|
],
|
|
"id": "537e024d-1ec6-43cc-92fe-22a7347f3306",
|
|
"name": "Wait",
|
|
"webhookId": "b17f739d-d020-4810-b669-e01b2df86c08"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"rule": {
|
|
"interval": [
|
|
{
|
|
"field": "cronExpression",
|
|
"expression": "0 21 * * 1-5"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"type": "n8n-nodes-base.scheduleTrigger",
|
|
"typeVersion": 1.2,
|
|
"position": [
|
|
240,
|
|
-144
|
|
],
|
|
"id": "ec8c08dc-9dcb-424c-b194-f99a5e43c3d3",
|
|
"name": "Schedule Trigger"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"url": "=https://portal.palletways.com/api/getObman/{{ $json.lastWorkday }}?apikey=&output=xml",
|
|
"sendQuery": true,
|
|
"queryParameters": {
|
|
"parameters": [
|
|
{
|
|
"name": "apikey",
|
|
"value": "SXJaM7PLjZDqfsnXSDP8Y9wDY6crxJySBg705MQEPus%3D"
|
|
},
|
|
{
|
|
"name": "date",
|
|
"value": "={{ $json[\"lastWorkday\"] }}"
|
|
},
|
|
{
|
|
"name": "output",
|
|
"value": "xml"
|
|
}
|
|
]
|
|
},
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.httpRequest",
|
|
"typeVersion": 4.2,
|
|
"position": [
|
|
720,
|
|
-144
|
|
],
|
|
"id": "29d07f3e-bb03-404e-9de0-96c77d15f472",
|
|
"name": "Get Obman delivery list"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"jsCode": "const OUR_DEPOT = 464;\nconst out = [];\n\nconst asArray = (v) => {\n if (v === undefined || v === null || v === '') return [];\n return Array.isArray(v) ? v : [v];\n};\n\nconst text = (v) => {\n if (v === undefined || v === null) return null;\n const s = String(v).trim();\n return s === '' ? null : s;\n};\n\nconst num = (v) => {\n const s = text(v);\n if (s === null) return null;\n const n = Number(String(s).replace(',', '.'));\n return Number.isFinite(n) ? n : null;\n};\n\nconst intVal = (v) => {\n const n = num(v);\n return n === null ? null : Math.trunc(n);\n};\n\nconst yesNoBool = (v) => {\n const s = String(v ?? '').trim().toLowerCase();\n if (['yes', 'true', '1', 'ja', 'y', 'on'].includes(s)) return true;\n if (['no', 'false', '0', 'nee', 'n', 'off'].includes(s)) return false;\n return null;\n};\n\nconst normalizeCountry = (v) => {\n const s = text(v);\n if (!s) return null;\n const u = s.toUpperCase();\n return u === 'UK' ? 'GB' : u;\n};\n\nconst decodeXml = (s) => String(s ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\");\n\nconst tag = (xml, name) => {\n if (!xml) return null;\n const re = new RegExp(`<${name}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)<\\\\/${name}>`, 'i');\n const m = String(xml).match(re);\n return m ? text(decodeXml(m[1])) : null;\n};\n\nconst blocks = (xml, name) => {\n if (!xml) return [];\n const re = new RegExp(`<${name}(?:\\\\s[^>]*)?>([\\\\s\\\\S]*?)<\\\\/${name}>`, 'gi');\n const result = [];\n let m;\n while ((m = re.exec(String(xml))) !== null) {\n result.push(m[1]);\n }\n return result;\n};\n\nconst firstBlock = (xml, name) => blocks(xml, name)[0] || '';\n\nconst safeNodeItem = (name) => {\n try {\n return $(name).item.json || {};\n } catch (e) {\n try {\n return $items(name)?.[0]?.json || {};\n } catch (e2) {\n return {};\n }\n }\n};\n\nconst makeDateTime = (dateValue, timeValue) => {\n const d = text(dateValue);\n const t = text(timeValue);\n if (!d) return null;\n\n // Already datetime\n if (d.includes('T') || /^\\d{4}-\\d{2}-\\d{2}\\s+\\d{2}:\\d{2}/.test(d)) {\n return d.replace(' ', 'T');\n }\n\n return `${d}T${t || '00:00:00'}`;\n};\n\nconst dateOnly = (v) => {\n const s = text(v);\n if (!s) return null;\n return s.substring(0, 10);\n};\n\nconst statusFlags = (statusValue, statusDateTime) => {\n const status = text(statusValue);\n const s = String(status || '').toLowerCase();\n\n const isDelivered =\n s.includes('delivered') ||\n s.includes('afgeleverd') ||\n s.includes('pod');\n\n const isCollected =\n s.includes('collected') ||\n s.includes('picked up') ||\n s.includes('pickup complete') ||\n s.includes('collection complete') ||\n s.includes('opgehaald') ||\n s.includes('afgehaald');\n\n const isDeleted =\n s.includes('deleted') ||\n s.includes('removed') ||\n s.includes('cancelled') ||\n s.includes('canceled') ||\n s.includes('verwijderd') ||\n s.includes('geannuleerd');\n\n return {\n current_status: status,\n current_status_at: status ? statusDateTime : null,\n is_delivered: isDelivered,\n delivered_at: isDelivered ? statusDateTime : null,\n is_collected: isCollected,\n collected_at: isCollected ? statusDateTime : null,\n is_deleted: isDeleted,\n deleted_at: isDeleted ? statusDateTime : null,\n status_source: status ? 'PALLETWAYS_API' : null,\n };\n};\n\nfunction addressFromXml(consignmentXml, type) {\n const addressBlocks = blocks(consignmentXml, 'Address');\n const wanted = addressBlocks.find(a => String(tag(a, 'Type') || '').toLowerCase() === type.toLowerCase()) || '';\n return {\n contact: tag(wanted, 'ContactName'),\n company: tag(wanted, 'CompanyName'),\n addr1: tag(wanted, 'Addr1'),\n addr2: tag(wanted, 'Addr2'),\n addr3: tag(wanted, 'Addr3'),\n addr4: tag(wanted, 'Addr4'),\n town: tag(wanted, 'Town'),\n county: tag(wanted, 'County'),\n country: normalizeCountry(tag(wanted, 'Country')),\n postcode: tag(wanted, 'PostCode'),\n };\n}\n\nfunction getAddressFromJson(consignment, type) {\n const addresses = asArray(consignment.Address);\n return addresses.find(a => String(a.Type || '').toLowerCase() === type.toLowerCase()) || {};\n}\n\nfunction getServiceFromXml(consignmentXml, type) {\n const serviceBlocks = blocks(consignmentXml, 'Service');\n return serviceBlocks.find(s => String(tag(s, 'Type') || '').toLowerCase() === type.toLowerCase()) || '';\n}\n\nfunction getServiceFromJson(consignment, type) {\n const services = asArray(consignment.Service);\n return services.find(s => String(s?.Type || '').toLowerCase() === type.toLowerCase()) || {};\n}\n\nfunction countPalletCodesXml(consignmentXml) {\n return blocks(consignmentXml, 'Pallet')\n .map(p => text(decodeXml(p)))\n .filter(Boolean).length;\n}\n\nfunction countPalletCodesJson(palletValue) {\n return asArray(palletValue).map(p => text(p)).filter(Boolean).length;\n}\n\nfunction choosePrimaryService(parts, collectionDepot, deliveryDepot) {\n const collectionCode = text(parts.collection_service_code);\n const deliveryCode = text(parts.delivery_service_code);\n\n if (collectionDepot === OUR_DEPOT && collectionCode) {\n return {\n service_type: 'Collection',\n service_code: collectionCode,\n service_surcharge: text(parts.collection_service_surcharge),\n };\n }\n\n if (deliveryDepot === OUR_DEPOT && deliveryCode) {\n return {\n service_type: 'Delivery',\n service_code: deliveryCode,\n service_surcharge: text(parts.delivery_service_surcharge),\n };\n }\n\n // fallback voor zendingen die wij alleen aanmelden\n if (collectionCode) {\n return {\n service_type: 'Collection',\n service_code: collectionCode,\n service_surcharge: text(parts.collection_service_surcharge),\n };\n }\n\n if (deliveryCode) {\n return {\n service_type: 'Delivery',\n service_code: deliveryCode,\n service_surcharge: text(parts.delivery_service_surcharge),\n };\n }\n\n return {\n service_type: text(parts.service_type),\n service_code: text(parts.service_code),\n service_surcharge: text(parts.service_surcharge),\n };\n}\n\nfunction pushRowFromParts(parts) {\n const payingDepot = intVal(parts.paying_depot);\n const collectionDepot = intVal(parts.collection_depot);\n const deliveryDepot = intVal(parts.delivery_depot);\n const trackingId = text(parts.tracking_id);\n if (!trackingId) return;\n\n const primaryService = choosePrimaryService(parts, collectionDepot, deliveryDepot);\n\n const isOurPayingDepot = Boolean(parts.is_our_paying_depot) || payingDepot === OUR_DEPOT;\n const isCollectionByUs = Boolean(parts.is_collection_by_us) || collectionDepot === OUR_DEPOT;\n const isDeliveryByUs = Boolean(parts.is_delivery_by_us) || deliveryDepot === OUR_DEPOT;\n const isManifested = Boolean(parts.is_manifested) || isOurPayingDepot || text(parts.manifested_at) !== null;\n\n const statusInfo = statusFlags(parts.current_status, parts.current_status_at);\n\n out.push({\n json: {\n tracking_id: trackingId,\n\n consignment_number: text(parts.consignment_number),\n reference: text(parts.reference),\n collection_reference: text(parts.collection_reference),\n\n manifest_date: text(parts.manifest_date),\n manifest_time: text(parts.manifest_time),\n\n paying_depot: payingDepot,\n collection_depot: collectionDepot,\n delivery_depot: deliveryDepot,\n\n is_our_paying_depot: isOurPayingDepot,\n is_collection_by_us: isCollectionByUs,\n is_delivery_by_us: isDeliveryByUs,\n is_manifested: isManifested,\n\n account_name: text(parts.account_name),\n account_code: text(parts.account_code),\n\n consignment_type: text(parts.consignment_type),\n classification: text(parts.classification),\n\n service_type: primaryService.service_type,\n service_code: primaryService.service_code,\n service_surcharge: primaryService.service_surcharge,\n\n collection_service_code: text(parts.collection_service_code),\n collection_service_surcharge: text(parts.collection_service_surcharge),\n delivery_service_code: text(parts.delivery_service_code),\n delivery_service_surcharge: text(parts.delivery_service_surcharge),\n\n due_date: text(parts.due_date),\n due_time: text(parts.due_time),\n\n planned_collection_date: dateOnly(parts.planned_collection_date),\n planned_delivery_date: dateOnly(parts.planned_delivery_date),\n delivery_list_date: dateOnly(parts.delivery_list_date),\n collection_list_date: dateOnly(parts.collection_list_date),\n manifested_at: text(parts.manifested_at),\n\n lifts: num(parts.lifts),\n weight_kg: num(parts.weight_kg),\n\n bill_unit_type: text(parts.bill_unit_type),\n bill_unit_amount: num(parts.bill_unit_amount),\n\n pallet_count: intVal(parts.pallet_count),\n\n handball: yesNoBool(parts.handball),\n tail_lift: yesNoBool(parts.tail_lift),\n adr_goods: yesNoBool(parts.adr_goods),\n limited_quantity_goods: yesNoBool(parts.limited_quantity_goods),\n booked_in: yesNoBool(parts.booked_in),\n book_in_request: yesNoBool(parts.book_in_request),\n\n collection_company: text(parts.collection_company),\n collection_contact: text(parts.collection_contact),\n collection_addr1: text(parts.collection_addr1),\n collection_addr2: text(parts.collection_addr2),\n collection_addr3: text(parts.collection_addr3),\n collection_addr4: text(parts.collection_addr4),\n collection_town: text(parts.collection_town),\n collection_county: text(parts.collection_county),\n collection_country: normalizeCountry(parts.collection_country),\n collection_postcode: text(parts.collection_postcode),\n\n delivery_company: text(parts.delivery_company),\n delivery_contact: text(parts.delivery_contact),\n delivery_addr1: text(parts.delivery_addr1),\n delivery_addr2: text(parts.delivery_addr2),\n delivery_addr3: text(parts.delivery_addr3),\n delivery_addr4: text(parts.delivery_addr4),\n delivery_town: text(parts.delivery_town),\n delivery_county: text(parts.delivery_county),\n delivery_country: normalizeCountry(parts.delivery_country),\n delivery_postcode: text(parts.delivery_postcode),\n\n hub_sequence: intVal(parts.hub_sequence),\n hub_name: text(parts.hub_name),\n\n current_status: statusInfo.current_status,\n current_status_at: statusInfo.current_status_at,\n is_delivered: statusInfo.is_delivered,\n delivered_at: statusInfo.delivered_at,\n is_deleted: statusInfo.is_deleted,\n deleted_at: statusInfo.deleted_at,\n is_collected: statusInfo.is_collected,\n collected_at: statusInfo.collected_at,\n status_source: statusInfo.status_source,\n\n source_first_seen: text(parts.source_name),\n source_last_seen: text(parts.source_name),\n last_api_seen_at: new Date().toISOString(),\n\n raw_json: parts.raw_json ?? {},\n },\n });\n}\n\nfor (const item of items) {\n const root = item.json || {};\n\n const ctxTracking = safeNodeItem('Extract TrackingIDs');\n const ctxCollections = safeNodeItem('Extract Collections or No Work');\n const context = Object.keys(ctxTracking).length ? ctxTracking : (Object.keys(ctxCollections).length ? ctxCollections : {});\n\n const lastWorkday = (() => {\n try { return $items('Last workday1')?.[0]?.json?.lastWorkday || null; } catch (e) { return null; }\n })();\n\n const xml = typeof root.data === 'string'\n ? root.data\n : typeof root.body === 'string'\n ? root.body\n : typeof root === 'string'\n ? root\n : null;\n\n // Route 1: HTTP Request returned XML as json.data/body\n if (xml && xml.includes('<Response')) {\n const manifestXml = firstBlock(xml, 'Manifest');\n const depotXml = firstBlock(manifestXml, 'Depot');\n const accountXml = firstBlock(depotXml, 'Account');\n const serviceManifestDate = tag(manifestXml, 'Date');\n const serviceManifestTime = tag(manifestXml, 'Time');\n const payingDepot = tag(depotXml, 'Number');\n\n const consignmentBlocks = blocks(accountXml, 'Consignment');\n\n for (const cXml of consignmentBlocks) {\n const collectionServiceXml = getServiceFromXml(cXml, 'Collection');\n const deliveryServiceXml = getServiceFromXml(cXml, 'Delivery');\n const fallbackServiceXml = firstBlock(cXml, 'Service');\n\n const billUnitXml = firstBlock(cXml, 'BillUnit');\n const hubXml = firstBlock(cXml, 'Hub');\n const collection = addressFromXml(cXml, 'Collection');\n const delivery = addressFromXml(cXml, 'Delivery');\n\n const dueDate = tag(cXml, 'DueDate');\n const colDueDate = tag(cXml, 'ColDueDate');\n const statusDateTime = makeDateTime(\n tag(cXml, 'StatusDate') || tag(cXml, 'DeliveredDate') || tag(cXml, 'CollectedDate') || serviceManifestDate,\n tag(cXml, 'StatusTime') || tag(cXml, 'DeliveredTime') || tag(cXml, 'CollectedTime') || serviceManifestTime\n );\n\n pushRowFromParts({\n tracking_id: tag(cXml, 'TrackingID'),\n consignment_number: tag(cXml, 'Number'),\n reference: tag(cXml, 'Reference'),\n collection_reference: tag(cXml, 'CollectionReference'),\n\n manifest_date: serviceManifestDate,\n manifest_time: serviceManifestTime,\n\n paying_depot: payingDepot,\n collection_depot: tag(cXml, 'CollectionDepot'),\n delivery_depot: tag(cXml, 'DeliveryDepot'),\n\n is_our_paying_depot: context.source_name === 'DWT_OUTBOUND',\n is_manifested: context.source_name === 'DWT_OUTBOUND',\n\n account_name: tag(accountXml, 'Name'),\n account_code: tag(accountXml, 'Code'),\n\n consignment_type: tag(cXml, 'Type'),\n classification: tag(cXml, 'Classification'),\n\n service_type: tag(fallbackServiceXml, 'Type'),\n service_code: tag(fallbackServiceXml, 'Code'),\n service_surcharge: tag(fallbackServiceXml, 'Surcharge'),\n\n collection_service_code: tag(collectionServiceXml, 'Code'),\n collection_service_surcharge: tag(collectionServiceXml, 'Surcharge'),\n delivery_service_code: tag(deliveryServiceXml, 'Code'),\n delivery_service_surcharge: tag(deliveryServiceXml, 'Surcharge'),\n\n due_date: dueDate || colDueDate,\n due_time: tag(cXml, 'DueTime'),\n\n planned_collection_date: colDueDate || (String(tag(cXml, 'CollectionDepot') || '') === String(OUR_DEPOT) ? dueDate : null),\n planned_delivery_date: dueDate,\n\n delivery_list_date: context.delivery_list_date || (context.source_name === 'PW_DELIVERY_LIST' ? lastWorkday : null),\n collection_list_date: context.collection_list_date || (context.source_name === 'PW_COLLECTION_FOR_US' ? context.manifest_date || serviceManifestDate : null),\n manifested_at: context.manifested || context.date_entered || (context.source_name === 'DWT_OUTBOUND' ? makeDateTime(serviceManifestDate, serviceManifestTime) : null),\n\n lifts: tag(cXml, 'Lifts'),\n weight_kg: tag(cXml, 'Weight'),\n\n bill_unit_type: tag(billUnitXml, 'Type'),\n bill_unit_amount: tag(billUnitXml, 'Amount'),\n\n pallet_count: countPalletCodesXml(cXml),\n\n handball: tag(cXml, 'HandBall'),\n tail_lift: tag(cXml, 'TailLift'),\n adr_goods: tag(cXml, 'ADRGoods'),\n limited_quantity_goods: tag(cXml, 'LimitedQuantityGoods'),\n booked_in: tag(cXml, 'BookedIn'),\n book_in_request: tag(cXml, 'BookInRequest'),\n\n collection_company: collection.company,\n collection_contact: collection.contact,\n collection_addr1: collection.addr1,\n collection_addr2: collection.addr2,\n collection_addr3: collection.addr3,\n collection_addr4: collection.addr4,\n collection_town: collection.town,\n collection_county: collection.county,\n collection_country: collection.country,\n collection_postcode: collection.postcode,\n\n delivery_company: delivery.company,\n delivery_contact: delivery.contact,\n delivery_addr1: delivery.addr1,\n delivery_addr2: delivery.addr2,\n delivery_addr3: delivery.addr3,\n delivery_addr4: delivery.addr4,\n delivery_town: delivery.town,\n delivery_county: delivery.county,\n delivery_country: delivery.country,\n delivery_postcode: delivery.postcode,\n\n hub_sequence: tag(hubXml, 'Sequence'),\n hub_name: tag(hubXml, 'HubName') || tag(hubXml, 'Name'),\n\n current_status:\n context.status ||\n tag(cXml, 'Status') ||\n tag(cXml, 'CurrentStatus') ||\n tag(cXml, 'ConsignmentStatus') ||\n tag(manifestXml, 'Status'),\n\n current_status_at:\n context.manifested ||\n context.date_entered ||\n statusDateTime,\n\n source_name: context.source_name || 'GETCONSIGNMENT',\n\n raw_json: {\n source: 'getconsignment_xml',\n source_context: context,\n tracking_id: tag(cXml, 'TrackingID'),\n consignment_xml: cXml,\n },\n });\n }\n\n continue;\n }\n\n // Route 2: HTTP Request returned parsed JSON\n const manifest =\n root.Response?.Detail?.Data?.Manifest ??\n root.Detail?.Data?.Manifest ??\n root.Manifest ??\n root;\n\n const depot = manifest.Depot || {};\n const account = depot.Account || {};\n const consignments = asArray(account.Consignment);\n\n for (const c of consignments) {\n const collectionService = getServiceFromJson(c, 'Collection');\n const deliveryService = getServiceFromJson(c, 'Delivery');\n const fallbackService = asArray(c.Service)[0] || {};\n const billUnit = asArray(c.BillUnit)[0] || {};\n const collectionAddress = getAddressFromJson(c, 'Collection');\n const deliveryAddress = getAddressFromJson(c, 'Delivery');\n const hub = c.Hub?.Hub1 || c.Hub || {};\n const dueDate = c.DueDate;\n const colDueDate = c.ColDueDate;\n const statusDateTime = makeDateTime(\n c.StatusDate || c.DeliveredDate || c.CollectedDate || manifest.Date,\n c.StatusTime || c.DeliveredTime || c.CollectedTime || manifest.Time\n );\n\n pushRowFromParts({\n tracking_id: c.TrackingID,\n consignment_number: c.Number,\n reference: c.Reference,\n collection_reference: c.CollectionReference,\n\n manifest_date: manifest.Date,\n manifest_time: manifest.Time,\n\n paying_depot: depot.Number,\n collection_depot: c.CollectionDepot,\n delivery_depot: c.DeliveryDepot,\n\n is_our_paying_depot: context.source_name === 'DWT_OUTBOUND',\n is_manifested: context.source_name === 'DWT_OUTBOUND',\n\n account_name: account.Name,\n account_code: account.Code,\n\n consignment_type: c.Type,\n classification: c.Classification,\n\n service_type: fallbackService.Type,\n service_code: fallbackService.Code,\n service_surcharge: fallbackService.Surcharge,\n\n collection_service_code: collectionService.Code,\n collection_service_surcharge: collectionService.Surcharge,\n delivery_service_code: deliveryService.Code,\n delivery_service_surcharge: deliveryService.Surcharge,\n\n due_date: dueDate || colDueDate,\n due_time: c.DueTime,\n\n planned_collection_date: colDueDate || (String(c.CollectionDepot || '') === String(OUR_DEPOT) ? dueDate : null),\n planned_delivery_date: dueDate,\n\n delivery_list_date: context.delivery_list_date || (context.source_name === 'PW_DELIVERY_LIST' ? lastWorkday : null),\n collection_list_date: context.collection_list_date || (context.source_name === 'PW_COLLECTION_FOR_US' ? context.manifest_date || manifest.Date : null),\n manifested_at: context.manifested || context.date_entered || (context.source_name === 'DWT_OUTBOUND' ? makeDateTime(manifest.Date, manifest.Time) : null),\n\n lifts: c.Lifts,\n weight_kg: c.Weight,\n\n bill_unit_type: billUnit.Type,\n bill_unit_amount: billUnit.Amount,\n\n pallet_count: countPalletCodesJson(c.Pallet),\n\n handball: c.HandBall,\n tail_lift: c.TailLift,\n adr_goods: c.ADRGoods,\n limited_quantity_goods: c.LimitedQuantityGoods,\n booked_in: c.BookedIn,\n book_in_request: c.BookInRequest,\n\n collection_company: collectionAddress.CompanyName,\n collection_contact: collectionAddress.ContactName,\n collection_addr1: collectionAddress.Addr1,\n collection_addr2: collectionAddress.Addr2,\n collection_addr3: collectionAddress.Addr3,\n collection_addr4: collectionAddress.Addr4,\n collection_town: collectionAddress.Town,\n collection_county: collectionAddress.County,\n collection_country: collectionAddress.Country,\n collection_postcode: collectionAddress.PostCode,\n\n delivery_company: deliveryAddress.CompanyName,\n delivery_contact: deliveryAddress.ContactName,\n delivery_addr1: deliveryAddress.Addr1,\n delivery_addr2: deliveryAddress.Addr2,\n delivery_addr3: deliveryAddress.Addr3,\n delivery_addr4: deliveryAddress.Addr4,\n delivery_town: deliveryAddress.Town,\n delivery_county: deliveryAddress.County,\n delivery_country: deliveryAddress.Country,\n delivery_postcode: deliveryAddress.PostCode,\n\n hub_sequence: hub.Sequence,\n hub_name: hub.HubName || hub.Name,\n\n current_status:\n context.status ||\n c.Status ||\n c.CurrentStatus ||\n c.ConsignmentStatus ||\n manifest.Status,\n\n current_status_at:\n context.manifested ||\n context.date_entered ||\n statusDateTime,\n\n source_name: context.source_name || 'GETCONSIGNMENT',\n\n raw_json: {\n source: 'getconsignment_json',\n source_context: context,\n consignment: c,\n },\n });\n }\n}\n\nif (out.length === 0) {\n throw new Error('Geen Consignment gevonden in getconsignment response. Controleer of de HTTP Request XML of JSON teruggeeft.');\n}\n\nreturn out;"
|
|
},
|
|
"type": "n8n-nodes-base.code",
|
|
"typeVersion": 2,
|
|
"position": [
|
|
1680,
|
|
-144
|
|
],
|
|
"id": "2c6a7fea-2aeb-457f-b623-daa16e39b620",
|
|
"name": "Normalize Palletways Consignment"
|
|
},
|
|
{
|
|
"parameters": {
|
|
"operation": "executeQuery",
|
|
"query": "insert into palletways_shipments (\n tracking_id,\n consignment_number,\n reference,\n collection_reference,\n manifest_date,\n manifest_time,\n paying_depot,\n collection_depot,\n delivery_depot,\n is_our_paying_depot,\n is_collection_by_us,\n is_delivery_by_us,\n is_manifested,\n account_name,\n account_code,\n consignment_type,\n classification,\n service_type,\n service_code,\n service_surcharge,\n collection_service_code,\n collection_service_surcharge,\n delivery_service_code,\n delivery_service_surcharge,\n due_date,\n due_time,\n planned_collection_date,\n planned_delivery_date,\n delivery_list_date,\n collection_list_date,\n manifested_at,\n lifts,\n weight_kg,\n bill_unit_type,\n bill_unit_amount,\n pallet_count,\n handball,\n tail_lift,\n adr_goods,\n limited_quantity_goods,\n booked_in,\n book_in_request,\n collection_company,\n collection_contact,\n collection_addr1,\n collection_addr2,\n collection_addr3,\n collection_addr4,\n collection_town,\n collection_county,\n collection_country,\n collection_postcode,\n delivery_company,\n delivery_contact,\n delivery_addr1,\n delivery_addr2,\n delivery_addr3,\n delivery_addr4,\n delivery_town,\n delivery_county,\n delivery_country,\n delivery_postcode,\n hub_sequence,\n hub_name,\n current_status,\n current_status_at,\n is_delivered,\n delivered_at,\n is_deleted,\n deleted_at,\n is_collected,\n collected_at,\n status_source,\n source_first_seen,\n source_last_seen,\n first_seen_in_bi_at,\n last_api_seen_at,\n raw_json,\n last_seen_at\n)\nvalues (\n '{{ ($json.tracking_id ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.consignment_number ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.reference ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_reference ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n {{ $json.manifest_date ? \"'\" + $json.manifest_date + \"'\" : \"null\" }},\n {{ $json.manifest_time ? \"'\" + $json.manifest_time + \"'\" : \"null\" }},\n\n {{ $json.paying_depot ?? \"null\" }},\n {{ $json.collection_depot ?? \"null\" }},\n {{ $json.delivery_depot ?? \"null\" }},\n\n {{ $json.is_our_paying_depot ? \"true\" : \"false\" }},\n {{ $json.is_collection_by_us ? \"true\" : \"false\" }},\n {{ $json.is_delivery_by_us ? \"true\" : \"false\" }},\n {{ $json.is_manifested ? \"true\" : \"false\" }},\n\n '{{ ($json.account_name ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.account_code ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.consignment_type ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.classification ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n '{{ ($json.service_type ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.service_code ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.service_surcharge ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n '{{ ($json.collection_service_code ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_service_surcharge ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_service_code ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_service_surcharge ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n {{ $json.due_date ? \"'\" + $json.due_date + \"'\" : \"null\" }},\n {{ $json.due_time ? \"'\" + $json.due_time + \"'\" : \"null\" }},\n\n {{ $json.planned_collection_date ? \"'\" + $json.planned_collection_date + \"'\" : \"null\" }},\n {{ $json.planned_delivery_date ? \"'\" + $json.planned_delivery_date + \"'\" : \"null\" }},\n {{ $json.delivery_list_date ? \"'\" + $json.delivery_list_date + \"'\" : \"null\" }},\n {{ $json.collection_list_date ? \"'\" + $json.collection_list_date + \"'\" : \"null\" }},\n {{ $json.manifested_at ? \"'\" + $json.manifested_at + \"'\" : \"null\" }},\n\n {{ $json.lifts ?? \"null\" }},\n {{ $json.weight_kg ?? \"null\" }},\n '{{ ($json.bill_unit_type ?? \"\").replaceAll(\"'\", \"''\") }}',\n {{ $json.bill_unit_amount ?? \"null\" }},\n {{ $json.pallet_count ?? \"null\" }},\n\n {{ $json.handball === null || $json.handball === undefined ? \"null\" : ($json.handball ? \"true\" : \"false\") }},\n {{ $json.tail_lift === null || $json.tail_lift === undefined ? \"null\" : ($json.tail_lift ? \"true\" : \"false\") }},\n {{ $json.adr_goods === null || $json.adr_goods === undefined ? \"null\" : ($json.adr_goods ? \"true\" : \"false\") }},\n {{ $json.limited_quantity_goods === null || $json.limited_quantity_goods === undefined ? \"null\" : ($json.limited_quantity_goods ? \"true\" : \"false\") }},\n {{ $json.booked_in === null || $json.booked_in === undefined ? \"null\" : ($json.booked_in ? \"true\" : \"false\") }},\n {{ $json.book_in_request === null || $json.book_in_request === undefined ? \"null\" : ($json.book_in_request ? \"true\" : \"false\") }},\n\n '{{ ($json.collection_company ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_contact ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_addr1 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_addr2 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_addr3 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_addr4 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_town ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_county ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_country ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.collection_postcode ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n '{{ ($json.delivery_company ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_contact ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_addr1 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_addr2 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_addr3 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_addr4 ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_town ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_county ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_country ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.delivery_postcode ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n {{ $json.hub_sequence ?? \"null\" }},\n '{{ ($json.hub_name ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n '{{ ($json.current_status ?? \"\").replaceAll(\"'\", \"''\") }}',\n {{ $json.current_status_at ? \"'\" + $json.current_status_at + \"'\" : \"null\" }},\n {{ $json.is_delivered ? \"true\" : \"false\" }},\n {{ $json.delivered_at ? \"'\" + $json.delivered_at + \"'\" : \"null\" }},\n {{ $json.is_deleted ? \"true\" : \"false\" }},\n {{ $json.deleted_at ? \"'\" + $json.deleted_at + \"'\" : \"null\" }},\n {{ $json.is_collected ? \"true\" : \"false\" }},\n {{ $json.collected_at ? \"'\" + $json.collected_at + \"'\" : \"null\" }},\n '{{ ($json.status_source ?? \"\").replaceAll(\"'\", \"''\") }}',\n\n '{{ ($json.source_first_seen ?? \"\").replaceAll(\"'\", \"''\") }}',\n '{{ ($json.source_last_seen ?? \"\").replaceAll(\"'\", \"''\") }}',\n now(),\n now(),\n\n '{{ JSON.stringify($json.raw_json ?? {}).replaceAll(\"'\", \"''\") }}'::jsonb,\n now()\n)\non conflict (tracking_id)\ndo update set\n consignment_number = coalesce(nullif(excluded.consignment_number, ''), palletways_shipments.consignment_number),\n reference = coalesce(nullif(excluded.reference, ''), palletways_shipments.reference),\n collection_reference = coalesce(nullif(excluded.collection_reference, ''), palletways_shipments.collection_reference),\n manifest_date = coalesce(excluded.manifest_date, palletways_shipments.manifest_date),\n manifest_time = coalesce(excluded.manifest_time, palletways_shipments.manifest_time),\n paying_depot = coalesce(excluded.paying_depot, palletways_shipments.paying_depot),\n collection_depot = coalesce(excluded.collection_depot, palletways_shipments.collection_depot),\n delivery_depot = coalesce(excluded.delivery_depot, palletways_shipments.delivery_depot),\n\n is_our_paying_depot = palletways_shipments.is_our_paying_depot or excluded.is_our_paying_depot,\n is_collection_by_us = palletways_shipments.is_collection_by_us or excluded.is_collection_by_us,\n is_delivery_by_us = palletways_shipments.is_delivery_by_us or excluded.is_delivery_by_us,\n is_manifested = palletways_shipments.is_manifested or excluded.is_manifested,\n\n account_name = coalesce(nullif(excluded.account_name, ''), palletways_shipments.account_name),\n account_code = coalesce(nullif(excluded.account_code, ''), palletways_shipments.account_code),\n consignment_type = coalesce(nullif(excluded.consignment_type, ''), palletways_shipments.consignment_type),\n classification = coalesce(nullif(excluded.classification, ''), palletways_shipments.classification),\n\n service_type = coalesce(nullif(excluded.service_type, ''), palletways_shipments.service_type),\n service_code = coalesce(nullif(excluded.service_code, ''), palletways_shipments.service_code),\n service_surcharge = coalesce(nullif(excluded.service_surcharge, ''), palletways_shipments.service_surcharge),\n\n collection_service_code = coalesce(nullif(excluded.collection_service_code, ''), palletways_shipments.collection_service_code),\n collection_service_surcharge = coalesce(nullif(excluded.collection_service_surcharge, ''), palletways_shipments.collection_service_surcharge),\n delivery_service_code = coalesce(nullif(excluded.delivery_service_code, ''), palletways_shipments.delivery_service_code),\n delivery_service_surcharge = coalesce(nullif(excluded.delivery_service_surcharge, ''), palletways_shipments.delivery_service_surcharge),\n\n due_date = coalesce(excluded.due_date, palletways_shipments.due_date),\n due_time = coalesce(excluded.due_time, palletways_shipments.due_time),\n\n planned_collection_date = coalesce(excluded.planned_collection_date, palletways_shipments.planned_collection_date),\n planned_delivery_date = coalesce(excluded.planned_delivery_date, palletways_shipments.planned_delivery_date),\n delivery_list_date = coalesce(excluded.delivery_list_date, palletways_shipments.delivery_list_date),\n collection_list_date = coalesce(excluded.collection_list_date, palletways_shipments.collection_list_date),\n manifested_at = coalesce(excluded.manifested_at, palletways_shipments.manifested_at),\n\n lifts = coalesce(excluded.lifts, palletways_shipments.lifts),\n weight_kg = coalesce(excluded.weight_kg, palletways_shipments.weight_kg),\n bill_unit_type = coalesce(nullif(excluded.bill_unit_type, ''), palletways_shipments.bill_unit_type),\n bill_unit_amount = coalesce(excluded.bill_unit_amount, palletways_shipments.bill_unit_amount),\n pallet_count = coalesce(excluded.pallet_count, palletways_shipments.pallet_count),\n\n handball = coalesce(excluded.handball, palletways_shipments.handball),\n tail_lift = coalesce(excluded.tail_lift, palletways_shipments.tail_lift),\n adr_goods = coalesce(excluded.adr_goods, palletways_shipments.adr_goods),\n limited_quantity_goods = coalesce(excluded.limited_quantity_goods, palletways_shipments.limited_quantity_goods),\n booked_in = coalesce(excluded.booked_in, palletways_shipments.booked_in),\n book_in_request = coalesce(excluded.book_in_request, palletways_shipments.book_in_request),\n\n collection_company = coalesce(nullif(excluded.collection_company, ''), palletways_shipments.collection_company),\n collection_contact = coalesce(nullif(excluded.collection_contact, ''), palletways_shipments.collection_contact),\n collection_addr1 = coalesce(nullif(excluded.collection_addr1, ''), palletways_shipments.collection_addr1),\n collection_addr2 = coalesce(nullif(excluded.collection_addr2, ''), palletways_shipments.collection_addr2),\n collection_addr3 = coalesce(nullif(excluded.collection_addr3, ''), palletways_shipments.collection_addr3),\n collection_addr4 = coalesce(nullif(excluded.collection_addr4, ''), palletways_shipments.collection_addr4),\n collection_town = coalesce(nullif(excluded.collection_town, ''), palletways_shipments.collection_town),\n collection_county = coalesce(nullif(excluded.collection_county, ''), palletways_shipments.collection_county),\n collection_country = coalesce(nullif(excluded.collection_country, ''), palletways_shipments.collection_country),\n collection_postcode = coalesce(nullif(excluded.collection_postcode, ''), palletways_shipments.collection_postcode),\n\n delivery_company = coalesce(nullif(excluded.delivery_company, ''), palletways_shipments.delivery_company),\n delivery_contact = coalesce(nullif(excluded.delivery_contact, ''), palletways_shipments.delivery_contact),\n delivery_addr1 = coalesce(nullif(excluded.delivery_addr1, ''), palletways_shipments.delivery_addr1),\n delivery_addr2 = coalesce(nullif(excluded.delivery_addr2, ''), palletways_shipments.delivery_addr2),\n delivery_addr3 = coalesce(nullif(excluded.delivery_addr3, ''), palletways_shipments.delivery_addr3),\n delivery_addr4 = coalesce(nullif(excluded.delivery_addr4, ''), palletways_shipments.delivery_addr4),\n delivery_town = coalesce(nullif(excluded.delivery_town, ''), palletways_shipments.delivery_town),\n delivery_county = coalesce(nullif(excluded.delivery_county, ''), palletways_shipments.delivery_county),\n delivery_country = coalesce(nullif(excluded.delivery_country, ''), palletways_shipments.delivery_country),\n delivery_postcode = coalesce(nullif(excluded.delivery_postcode, ''), palletways_shipments.delivery_postcode),\n\n hub_sequence = coalesce(excluded.hub_sequence, palletways_shipments.hub_sequence),\n hub_name = coalesce(nullif(excluded.hub_name, ''), palletways_shipments.hub_name),\n\n current_status = coalesce(nullif(excluded.current_status, ''), palletways_shipments.current_status),\n current_status_at = coalesce(excluded.current_status_at, palletways_shipments.current_status_at),\n\n is_delivered = palletways_shipments.is_delivered or excluded.is_delivered,\n delivered_at = coalesce(excluded.delivered_at, palletways_shipments.delivered_at),\n\n is_deleted = palletways_shipments.is_deleted or excluded.is_deleted,\n deleted_at = coalesce(excluded.deleted_at, palletways_shipments.deleted_at),\n\n is_collected = palletways_shipments.is_collected or excluded.is_collected,\n collected_at = coalesce(excluded.collected_at, palletways_shipments.collected_at),\n\n status_source = coalesce(nullif(excluded.status_source, ''), palletways_shipments.status_source),\n\n source_first_seen = coalesce(nullif(palletways_shipments.source_first_seen, ''), nullif(excluded.source_first_seen, '')),\n source_last_seen = coalesce(nullif(excluded.source_last_seen, ''), palletways_shipments.source_last_seen),\n first_seen_in_bi_at = coalesce(palletways_shipments.first_seen_in_bi_at, excluded.first_seen_in_bi_at),\n last_api_seen_at = now(),\n\n raw_json = excluded.raw_json,\n last_seen_at = now();",
|
|
"options": {}
|
|
},
|
|
"type": "n8n-nodes-base.postgres",
|
|
"typeVersion": 2.6,
|
|
"position": [
|
|
1920,
|
|
-144
|
|
],
|
|
"id": "c679ba46-3029-41fc-a066-e1c243dcf358",
|
|
"name": "Upsert Palletways BI",
|
|
"credentials": {
|
|
"postgres": {
|
|
"id": "a0jnANQ89VLSby0b",
|
|
"name": "Palletways DB"
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"pinData": {},
|
|
"connections": {
|
|
"Schedule Trigger": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Last workday1",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Last workday1": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Get Obman delivery list",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Get Obman delivery list": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Extract TrackingIDs",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Extract TrackingIDs": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Loop Over Items",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Loop Over Items": {
|
|
"main": [
|
|
[],
|
|
[
|
|
{
|
|
"node": "Get Consignment",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Get Consignment": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Normalize Palletways Consignment",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Normalize Palletways Consignment": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Upsert Palletways BI",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Upsert Palletways BI": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Wait",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
},
|
|
"Wait": {
|
|
"main": [
|
|
[
|
|
{
|
|
"node": "Loop Over Items",
|
|
"type": "main",
|
|
"index": 0
|
|
}
|
|
]
|
|
]
|
|
}
|
|
},
|
|
"active": true,
|
|
"settings": {
|
|
"executionOrder": "v1",
|
|
"binaryMode": "separate",
|
|
"timezone": "Europe/Amsterdam",
|
|
"callerPolicy": "workflowsFromSameOwner",
|
|
"availableInMCP": false
|
|
},
|
|
"versionId": "a07a812c-8e82-4922-933d-587ad44e0c9e",
|
|
"meta": {
|
|
"templateCredsSetupCompleted": true,
|
|
"instanceId": "bef8d409866a58c0777dfe7cca1b9c2400fd051c056d361501393ab423006b5f"
|
|
},
|
|
"nodeGroups": [],
|
|
"id": "AREbn3cNh6zN9R9w",
|
|
"tags": [
|
|
{
|
|
"updatedAt": "2025-11-11T04:59:39.416Z",
|
|
"createdAt": "2025-11-11T04:59:39.416Z",
|
|
"id": "ClOZrAjJKoGLFvaO",
|
|
"name": "Palletways"
|
|
},
|
|
{
|
|
"updatedAt": "2025-11-09T14:44:19.471Z",
|
|
"createdAt": "2025-11-09T14:44:19.471Z",
|
|
"id": "DHSMO2U01lFZRZ27",
|
|
"name": "Productie"
|
|
}
|
|
]
|
|
} |