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 */); });