Description
Crea una opportunità nel pipeline CRM di Odoo (modello crm.lead) abbattendo la complessità tipica della sintassi XML-RPC many2many sui tag. Il modello crm.lead di Odoo richiede per i campi relazionali (tag_ids, user_id, team_id, partner_id) la sintassi "command Odoo" — array di tuple [(6, 0, [id1, id2])] dove 6 significa "replace all relations" e 0 è un placeholder posizionale — sintassi notoriamente ostica anche per developer esperti e completamente fuori portata per un commercialista che vuole solo "aggiungere un lead da una PEC ricevuta". Questo nodo nasconde tutto: accetta i tag come array di stringhe leggibili (["interessato_fattura_elettronica", "studio_torino"]) e li risolve idempotentemente lato Odoo via crm.tag name_create — i tag esistenti vengono riutilizzati, quelli mai visti prima vengono creati ON THE FLY senza fallire il workflow per "tag inesistente". user_id (commerciale assegnato) e team_id (team di vendita) accettano sia ID numerico sia email/nome — la risoluzione avviene server-side con search per email in res.users. Bug noto fixato 2026-06-04: prima versione del name_create non era idempotente sotto race condition (due workflow concurrent con stesso tag → 2 record duplicati) — ora con SAVEPOINT + ON CONFLICT. Output: { leadId, success, lead: { name, email, phone, partnerId, tagIds, userId, teamId, expectedRevenue, probability, description, stageId, createDate } }. Campi coperti dal wrapper: name (titolo opportunità), email/phone/mobile, description (rich text Qweb), tagIdsByName (array stringhe), userIdByEmail, teamIdByName, expectedRevenue (decimal € EUR), probability (0-100), source (sorgente lead per analytics CRM: "PEC", "WhatsApp", "Web form"). Use case reali: input da action_pec_classify branch received_message → crea lead "Richiesta info da X" con tag "pec_inbound" e source="PEC" assegnato al commercialista in turno (round-robin via team_id); webhook from Calendly meeting booking → crea lead con expectedRevenue stimato da pacchetto selezionato; reazione a agent_email_triage_b2b_sales label "qualified_prospect" → lead in stage "Qualifying" con probability 30; integration LinkedIn Sales Navigator export → bulk create lead con tag "linkedin_outbound" e team_id "BDR".
