/** * RAYNET CRM: zalozeni nebo doplneni kontaktni osoby. * * Sluzba: https://services.csbot.cz/apps/raynet * Endpointy: GET /person?fulltext=..., POST /person, PUT /person/{id} * * Vzor **upsert**: nejdriv se hleda, pak se rozhoduje. Zakladat naslepo by * po tydnu znamenalo tri kontakty s tymz e-mailem a obchodnik by nevedel, * do ktereho psat. */ export const manifest = { id: 'raynet.upsert-contact', name: 'Založit nebo aktualizovat kontakt', description: 'Podle e-mailu kontakt najde a doplní chybějící údaje, jinak založí nový. ' + 'Vrací ID kontaktu a to, jestli teprve vznikl.', inputs: [ { id: 'email', label: 'E-mail', type: 'string', required: true, hint: 'Podle něj se pozná, jestli kontakt už existuje.', }, { id: 'firstName', label: 'Jméno', type: 'string', required: false }, { id: 'lastName', label: 'Příjmení', type: 'string', required: false, hint: 'Bez příjmení se u nového kontaktu dosadí část e-mailu před zavináčem.', }, { id: 'phone', label: 'Telefon', type: 'string', required: false }, { id: 'companyId', label: 'ID firmy', type: 'number', required: false, hint: 'Vrací ho krok Dohledat firmu. Bez něj kontakt zůstane bez vazby.', }, ], outputs: [ { id: 'contactId', label: 'ID kontaktu', type: 'number', required: true }, { id: 'created', label: 'Kontakt teprve vznikl', type: 'boolean', required: true }, { id: 'fullName', label: 'Jméno kontaktu', type: 'string', required: false }, ], }; export async function run(inputs, ctx) { const { unwrap, pick, first, text, num, need } = ctx.util; const { body: found } = await ctx.http.get('/person', { query: { fulltext: inputs.email, limit: 5 }, }); const existing = first(unwrap(found)); const contactInfo = {}; if (inputs.email) contactInfo.email = inputs.email; if (inputs.phone) contactInfo.tel1 = inputs.phone; if (existing) { const id = need(num(pick(existing, 'id')), 'ID kontaktu'); // Prepisuji se jen vyplnena pole. Prazdna hodnota v kroku stromu znamena // "nevim", ne "smaz" - jinak by jeden beh bez telefonu telefon vymazal. const patch = {}; if (inputs.firstName) patch.firstName = inputs.firstName; if (inputs.lastName) patch.lastName = inputs.lastName; if (Object.keys(contactInfo).length > 0) patch.contactInfo = contactInfo; if (inputs.companyId !== null) patch.company = { id: inputs.companyId }; if (Object.keys(patch).length > 0) { await ctx.http.put(`/person/${id}`, patch); ctx.log(`Kontakt ${id} doplněn.`); } else { ctx.log(`Kontakt ${id} už má vše, nic se nemění.`); } return { contactId: id, created: false, fullName: text(pick(existing, 'fullName', 'lastName')), }; } // Prijmeni je v RAYNETu povinne. Kdyz nedoslo, vezme se cast e-mailu - // kontakt bez jmena se v seznamu neda najit a nikdo ho uz neopravi. const lastName = inputs.lastName ?? inputs.email.split('@')[0]; const { body: created } = await ctx.http.post('/person', { ...(inputs.firstName ? { firstName: inputs.firstName } : {}), lastName, contactInfo, ...(inputs.companyId !== null ? { company: { id: inputs.companyId } } : {}), }); const id = need(num(pick(unwrap(created), 'id')), 'ID nového kontaktu'); ctx.log(`Založen kontakt ${id}.`); return { contactId: id, created: true, fullName: [inputs.firstName, lastName].filter(Boolean).join(' '), }; }