diff --git a/api-v3/src/inspection-operations/field-discovery-inspection-link.service.ts b/api-v3/src/inspection-operations/field-discovery-inspection-link.service.ts index 9e4b2a2..fd22058 100644 --- a/api-v3/src/inspection-operations/field-discovery-inspection-link.service.ts +++ b/api-v3/src/inspection-operations/field-discovery-inspection-link.service.ts @@ -26,19 +26,60 @@ export class FieldDiscoveryInspectionLinkService { [visitId], )) as Array<{ id: string; status: string }>; + const [existing] = (await manager.query( + ` + SELECT included, planning_source AS "planningSource" + FROM inspection_visit_assets + WHERE visit_id = $1 AND asset_id = $2 + FOR UPDATE + `, + [visitId, assetId], + )) as Array<{ included: boolean; planningSource: string }>; await manager.query( ` - INSERT INTO inspection_visit_assets (visit_id, asset_id, included, added_by) - VALUES ($1, $2, true, $3) + INSERT INTO inspection_visit_assets ( + visit_id, asset_id, included, planning_source, added_by, + exclusion_reason, excluded_by, excluded_at + ) + VALUES ($1, $2, true, 'FIELD', $3, NULL, NULL, NULL) ON CONFLICT (visit_id, asset_id) DO UPDATE SET included = true, + planning_source = CASE + WHEN inspection_visit_assets.planning_source IN ('AUTOMATIC','VERIFICATION') + THEN inspection_visit_assets.planning_source + ELSE 'FIELD' + END, added_by = EXCLUDED.added_by, + exclusion_reason = NULL, + excluded_by = NULL, + excluded_at = NULL, updated_at = CURRENT_TIMESTAMP `, [visitId, assetId, userId], ); + const eventType = existing && existing.included ? null : 'FIELD_INCLUDED'; + if (eventType) { + await manager.query( + ` + INSERT INTO inspection_visit_asset_events ( + visit_id, asset_id, event_type, actor_user_id, metadata + ) + VALUES ($1, $2, 'FIELD_INCLUDED', $3, $4::jsonb) + `, + [ + visitId, + assetId, + userId, + JSON.stringify({ + fieldSelection: true, + previousPlanningSource: existing?.planningSource ?? null, + }), + ], + ); + } + if (act) { await manager.query( `