/** * iDoklad: dohledani vydane faktury podle cisla dokladu. * * Sluzba: https://services.csbot.cz/apps/idoklad * Endpoint: GET /issued-invoices?filter=(DocumentNumber~eq~2024001) * * Tohle je vzor **predvalidace**: skript nic nemeni, jen odpovi, jestli doklad * existuje. Vystup `found` je pak to, na co se ve strome vetvi podminka. * Stejny princip jako akce "Dohledat firmu" u CRM, viz documentation/06-tickety.md. * * Proto taky nenalezena faktura NENI chyba. Kdyby skript spadl, nesla by * postavit vetev "doklad neznam, zaloz ho". */ export const manifest = { id: 'idoklad.find-issued-invoice', name: 'Najít vydanou fakturu', description: 'Zjistí, jestli v iDokladu existuje vydaná faktura s daným číslem dokladu. ' + 'Nic nezakládá ani nemění. Podle výsledku se strom větví.', inputs: [ { id: 'documentNumber', label: 'Číslo dokladu', type: 'string', required: true, hint: 'Číslo, jak je na faktuře, například 2024001.', }, ], outputs: [ { id: 'found', label: 'Faktura nalezena', type: 'boolean', required: true }, { id: 'invoiceId', label: 'ID faktury', type: 'number', required: false }, { id: 'totalWithVat', label: 'Celkem s DPH', type: 'number', required: false }, { id: 'dateOfMaturity', label: 'Datum splatnosti', type: 'date', required: false }, { id: 'isPaid', label: 'Je uhrazená', type: 'boolean', required: false }, { id: 'ambiguous', label: 'Odpovídá víc faktur', type: 'boolean', required: true, }, ], }; export async function run(inputs, ctx) { const { unwrap, pick, num, bool, date } = ctx.util; const { body } = await ctx.http.get('/issued-invoices', { query: { // Tvar filtru je dany iDokladem: (Pole~operator~hodnota) filter: `(DocumentNumber~eq~${inputs.documentNumber})`, filtertype: 'and', // Dva staci: jeden na vysledek, druhy na zjisteni, ze neni jednoznacny. pageSize: 2, }, }); const items = unwrap(body); const list = Array.isArray(items) ? items : []; if (list.length === 0) { ctx.log(`Faktura ${inputs.documentNumber} v iDokladu není.`); return { found: false, invoiceId: null, totalWithVat: null, dateOfMaturity: null, isPaid: null, ambiguous: false, }; } if (list.length > 1) { // Neni to chyba, ale nekdo to ma vedet - cislo dokladu ma byt jednoznacne. ctx.log(`Číslu dokladu ${inputs.documentNumber} odpovídá víc faktur, beru první.`); } const invoice = list[0]; return { found: true, invoiceId: num(pick(invoice, 'id')), totalWithVat: num(pick(invoice, 'totalWithVat', 'totalWithVatHc', 'total')), dateOfMaturity: date(pick(invoice, 'dateOfMaturity')), isPaid: bool(pick(invoice, 'isPaid')), ambiguous: list.length > 1, }; }