From dd7c4d1dcf73d78105b06f8f7c66351510aed19f Mon Sep 17 00:00:00 2001 From: "b.boterman@htm.nl" Date: Tue, 3 Sep 2024 10:07:33 +0200 Subject: [PATCH] OVPAY-782 - Pseudo code. --- src/pseudo/ovpay782.js | 90 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/pseudo/ovpay782.js diff --git a/src/pseudo/ovpay782.js b/src/pseudo/ovpay782.js new file mode 100644 index 0000000..30e2b02 --- /dev/null +++ b/src/pseudo/ovpay782.js @@ -0,0 +1,90 @@ +let runDate = '2024-08-13'; // Datum van de run (instelbaar ivm herstartbaarheid) +let termDuration = 'P1M'; // Uitsluitend P1M of P1W +let billingDay; + +// Bepaal de billingDay +if (termDuration = 'P1M') { + billingDay = runDate.getDayOfMonth(); +} else { + billingDay = runDate.getDayOfWeek(); +} + +let contracts = API.findContracts([1,2], billingDay, termDuration, 2); // Resultaat van de API call +let invoiceDate = runDate.add(termDuration); // Factuurdatum is de rundatum + 1 termijnduur + +contracts.forEach(function(contract) { + + // Bepaal de einddatum van de hoogste contractversie + let endDate = contract.contractVersions.sort('contractVersionId', 'DESC')[0].end; + + // Controleer of het contract binnenkort afloopt (obv de laatste contractVersion) + if (endDate != null && endDate < invoiceDate) { + // Dit contract eindigt nog voor de termijn die we willen factureren + return; + } + + // Bepaal de laatste factuur die geen creditfactuur is + let latestInvoice = contract.contractInvoices.filter(invoice.status != 8).sort('created')[0]; + let contractInvoiceId; + + // Controleer of er al een factuur bestaat voor dit contract voor deze termijn + if (latestInvoice.createDate != invoiceDate) { + // Er bestaat nog geen factuur voor deze termijn, maak deze aan in de database met status 'pending' + contractInvoiceId = API.createContractInvoice(contract, contract.highestInvoiceTerm + 1, invoiceDate, 'pending'); + + } else { + // Er bestaat al wel een factuur met deze factuurdatum. Controleer de status + if (!(latestInvoice.state == 'pending' || latestInvoice.state == 'failed')) { + // De factuur is reeds aangemaakt en verwerkt + return; + } + + // De factuur heeft state 'pending' of 'failed', vervolg de flow + } + + // Controleer of de factuur al bestaat in WeFact + let searchAt = 'referenceNumber'; + let searchFor = contract.contractNumber + '-' + contract.highestInvoiceTerm + 1; + let invoices = API.getInvoices(searchAt, searchFor); + + // Filter alle credit nota's eruit + let debitInvoices = invoices.filter(invoice.status != 8); + + let externalReference; + let state; + + if (debitInvoices.count() == 0) { + // Er zijn geen facturen gevonden in WeFact. Maak factuur aan + let result = API.createInvoice(/* invoice-object */); + + if (result.code == 201) { + // Call naar WeFact ging goed + externalReference = result.externalReference; + state = "created"; + + } else { + // Callnaar WeFact is gefaald + externalReference = "null"; + state = "failed"; + } + + } else if (debitInvoices.count == 1) { + // Er is precies 1 debitfactuur gevonden in WeFact. Haal de factuurreferentie uit het resultaat + externalReference = debitInvoices[0].invoiceCode; + state = "created"; + + } else { + // Debitfactuur bestaat meermaals in WeFact. Registreer een fout en ga door met de volgende + log.error("Factuur bestaat meermaals in WeFact"); + return; + } + + // Sla de factuurreferentie op + API.updateContractInvoice(contactInvoiceId, state, externalReference); + + // Werk het contract bij + API.updateContract(contract, contract.highestInvoiceTerm + 1); + + // Maak een contractAction aan + API.createContractAction(contract, "invoice", Date.now(), /* payload */); +}); \ No newline at end of file