diff --git a/services/targo-hub/lib/legacy-dispatch-sync.js b/services/targo-hub/lib/legacy-dispatch-sync.js index ffe7d2e..048498a 100644 --- a/services/targo-hub/lib/legacy-dispatch-sync.js +++ b/services/targo-hub/lib/legacy-dispatch-sync.js @@ -173,7 +173,11 @@ async function fetchTargoTickets () { FROM ticket t LEFT JOIN ticket_dept dd ON dd.id = t.dept_id LEFT JOIN account a ON a.id = t.account_id - LEFT JOIN delivery dv ON dv.id = t.delivery_id + LEFT JOIN delivery dv ON dv.id = COALESCE( + NULLIF(t.delivery_id, 0), + (SELECT d2.id FROM delivery d2 WHERE d2.account_id = t.account_id AND d2.latitude IS NOT NULL AND d2.latitude <> 0 AND ABS(d2.latitude) > 1 ORDER BY d2.id DESC LIMIT 1), + (SELECT d3.id FROM delivery d3 WHERE d3.account_id = t.account_id ORDER BY d3.id DESC LIMIT 1) + ) WHERE t.status = 'open' AND t.assign_to = ? ORDER BY t.due_date DESC`, [TARGO_TECH_STAFF_ID], @@ -266,7 +270,7 @@ async function buildJob (t) { } async function findExisting (legacyId) { - const r = await erp.list('Dispatch Job', { filters: [['legacy_ticket_id', '=', legacyId]], fields: ['name', 'status', 'assigned_tech', 'scheduled_date', 'legacy_dept', 'legacy_activation_url', 'legacy_detail', 'latitude', 'longitude', 'service_location'], limit: 1 }) + const r = await erp.list('Dispatch Job', { filters: [['legacy_ticket_id', '=', legacyId]], fields: ['name', 'status', 'assigned_tech', 'scheduled_date', 'subject', 'legacy_dept', 'legacy_activation_url', 'legacy_detail', 'latitude', 'longitude', 'service_location'], limit: 1 }) return (r && r[0]) || null } @@ -313,6 +317,9 @@ async function syncImpl ({ dryRun = false } = {}) { if (b.payload.latitude != null && (!exHas || isUpgrade)) { patch.latitude = b.payload.latitude; patch.longitude = b.payload.longitude; coordsFilled++ } if (!ex.service_location && b.payload.service_location) patch.service_location = b.payload.service_location // backfill lien Service Location if (ex.status === 'open' && !ex.assigned_tech && b.payload.scheduled_date && b.payload.scheduled_date !== ex.scheduled_date) patch.scheduled_date = b.payload.scheduled_date + // Rafraîchit le sujet (qui inclut l'adresse de SERVICE) pour les jobs encore au pool (open + non assigné), + // sans surprendre un tech sur un job déjà dispatché. Corrige les sujets anciens basés sur la facturation. + if (ex.status === 'open' && !ex.assigned_tech && b.payload.subject && ex.subject !== b.payload.subject) patch.subject = b.payload.subject if (!dryRun && Object.keys(patch).length) { const r = await erp.update('Dispatch Job', ex.name, patch) if (r && r.ok) { updated++; details.push({ legacy_id: b.legacy_id, action: 'update', job: ex.name, patch }) }