Merge e duplicati
Due gruppi di endpoint che lavorano insieme: la rilevazione (read-only) propone i gruppi di probabili duplicati; il merge fonde due record, con anteprima prima e undo dopo. Le operazioni richiedono il permesso di delete sul modulo (fondere elimina il record perdente).
| Metodo | Endpoint | Cosa fa |
|---|---|---|
| GET | /api/duplicates/summary | Conteggio dei gruppi di duplicati per modulo. |
| GET | /api/duplicates?module=… | I gruppi candidati di un modulo. |
| GET | /api/merge/modules | I moduli su cui il merge è disponibile. |
| GET | /api/merge/preview?module=&masterId=&loserId= | Confronto read-only dei due record prima di fondere. |
| POST | /api/merge | Esegue la fusione. |
| GET | /api/merge/history | I merge recenti (query limit opzionale). |
| POST | /api/merge/undo | Ripristina un merge: body { "mergeId" }. |
01Rilevazione duplicati
I gruppi candidati per un modulo. Ogni gruppo elenca i members
(i record sospettati di essere la stessa entità) e matchedOn:
per quali criteri combaciano. Es. stessa email, stessa P.IVA, nome
simile (fuzzy, con la percentuale di somiglianza). Un modulo senza rilevazione
configurata risponde 422.
{ "success": true, "data": { "groups": [{ "members": [ { "id": "41", … }, { "id": "87", … } ], "matchedOn": [ { "type": "email", "label": "Stessa email" }, { "type": "name_fuzzy", "label": "Nome simile", "value": "92%" } ] }] } }
02Fusione
Fonde il record perdente nel master: i record collegati
(note, allegati, attività, lookup) vengono ri-puntati al master e il perdente viene
eliminato. Con fields scegli, campo per campo, quale dei due
valori tenere. Usa prima GET /api/merge/preview (stessi
parametri in query) per il confronto.
| Campo | Tipo | Descrizione | |
|---|---|---|---|
| module | string | richiesto | Il modulo dei due record. |
| masterId | string | richiesto | Il record che sopravvive. |
| loserId | string | richiesto | Il record che viene fuso ed eliminato. |
| fields | object | opzionale | Scelte per campo: { "campo": "master" | "loser" } (default: restano i valori del master). |
curl -X POST https://crm.tuodominio.it/api/merge \ -H "Authorization: Bearer <accessToken>" \ -H "Content-Type: application/json" \ -d '{ "module": "accounts", "masterId": "41", "loserId": "87", "fields": { "phone": "loser" } }'
const res = await fetch("https://crm.tuodominio.it/api/merge", { method: "POST", headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" }, body: JSON.stringify({ module: "accounts", masterId: "41", loserId: "87" }), });
Il merge è reversibile ma non all'infinito: l'undo
(POST /api/merge/undo con il mergeId
restituito dalla history) ripristina il record perdente e i collegamenti registrati al
momento della fusione. Le modifiche fatte dopo il merge sul master non vengono
toccate. Ogni merge e ogni undo finiscono nell'audit trail.