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