TC-5834 Van Wijnen

Bulk close rental orders

Total hours: 2.5

Documents

Design Spec: Bulk Close Rental Orders

Design Spec: Bulk Close Rental Orders

Ticket: TC-5834 Klant: Van Wijnen Datum: 2026-03-25 Bedrijf voor testen: 0910

Samenvatting

Een Processing Only report waarmee gebruikers inhuurorders in bulk kunnen afsluiten. Het rapport controleert automatisch of elke order aan alle voorwaarden voldoet en sluit alleen de orders af die volledig gereed zijn.

Achtergrond

De materieeldienst controleert nu handmatig via pagina "Huidige stand inhuur gefactureerd tot en met" (11020593) welke inhuurorders afgesloten kunnen worden. Dit kost veel tijd. De klant wil dit in bulk kunnen doen via een rapport.

Belangrijk: de exitorder-check en de datumcheck zijn twee onafhankelijke voorwaarden. Het is mogelijk dat einddatum en gefactureerd t/m gelijk zijn, maar het materieel nog fysiek bij de klant staat (exitorder ontbreekt). "Is het gefactureerd?" is iets anders dan "is het materieel daadwerkelijk teruggebracht?"

8-weken werkwijze: de klant kijkt momenteel naar exitdatums ouder dan 8 weken. Dit is hun handmatige werkwijze, geen businessregel die we in code afdwingen.

Object

Property Value
Type Report (Processing Only)
Name Bulk Close Rental Orders
ID Uit beschikbare range (50000-99999)

Geen nieuwe table extensions, page extensions of codeunits nodig.

RequestPage

Standaard BC filters via het dataitem op Purchase Header. De gebruiker kan filteren op:

  • Nr.
  • Leverancier (Buy-from Vendor No.)
  • Orderdatum

Geen custom request page opties nodig.

Bevestigingsdialoog

Voordat de verwerking start, toon een Confirm:

"U staat op het punt inhuurorders in bulk af te sluiten. Doorgaan?"

Verwerkingslogica

DataItem

Purchase Header
  Filters: Document Type = Order, No. Series = 'INH-ORD', Status = Released

Per order (OnAfterGetRecord)

  1. Haal alle Purchase Lines op (waar Type > 0 EN Plant Type <> '' EN Plant No. <> '')
  2. Per regel, voer vier checks uit:
# Check Veld Tabel Bij falen
1 Einddatum is gevuld Expected Enddate Rent (11012443) Purchase Line Skip order, log reden
2 Gefactureerd t/m is gevuld Ext. Rented Invoiced to (490) Plant Number Skip order, log reden
3 Einddatum = Gefactureerd t/m Vergelijking van bovenstaande - Skip order, log reden
4 Exitorder aanwezig Removed = true Plant Rent Entry Skip order, log reden
  1. Alle regels OK → probeer te sluiten:
    • Wrap Codeunit 415 "Release Purchase Document".Close(PurchHeader) in error handling
    • Bij succes: Commit() zodat deze order niet teruggerold wordt bij een latere fout
    • Bij error (bijv. open approval requests op ontvangsten): log als overgeslagen met foutmelding
  2. Log resultaat in tijdelijke tabel

Plant Rent Entry lookup (check 4)

Per Purchase Line:

  • Zoek Plant Rent Entry waar:
    • Plant Type = Purchase Line."Plant Type"
    • Plant No. = Purchase Line."Plant No."
    • Vendor No. = Purchase Header."Buy-from Vendor No."
    • Removed = true
  • Minimaal één record gevonden → check OK

Let op: zonder de Vendor No. filter zou je een exitorder van een vorige huurperiode bij een andere verhuurder kunnen matchen. De combinatie Plant Type + Plant No. + Vendor No. + Removed koppelt de check aan de juiste huurrelatie.

Plant Number lookup (check 2 en 3)

Per Purchase Line:

  • Plant Number.Get(Purchase Line."Plant Type", Purchase Line."Plant No.")
  • Lees Plant Number."Ext. Rented Invoiced to"

Output

Processing Only, geen printbare layout.

Na afloop een Message met samenvatting:

"X inhuurorders afgesloten, Y inhuurorders overgeslagen."

Voor overgeslagen orders: een tijdelijke tabel bijhouden met:

  • Ordernummer
  • Reden van overslaan (welke check faalde, op welke regel)

Deze lijst tonen via een pagina na afloop, zodat de gebruiker precies weet welke orders niet voldoen en waarom.

Afhankelijkheden

Object Type Gebruik
Purchase Header (38) Table DataItem, filters
Purchase Line (39) Table Regelvalidatie
Plant Number (11012552) Table Ext. Rented Invoiced to ophalen
Plant Rent Entry (11012535) Table Exitorder check
Release Purchase Document (415) Codeunit Close procedure aanroepen

Teststappen

  1. Open bedrijf 0910
  2. Controleer dat er inhuurorders bestaan (INH-ORD, status Vrijgegeven)
  3. Draai het rapport zonder filters
  4. Verifieer: orders die aan alle voorwaarden voldoen zijn afgesloten (status = Closed)
  5. Verifieer: orders die niet voldoen zijn overgeslagen met correcte reden
  6. Draai het rapport opnieuw, verifieer dat al gesloten orders niet opnieuw verwerkt worden (CU 415 checkt dit al)

Testresultaten:

# Stap Verwacht Resultaat
1 Rapport draaien met geldige orders Orders afgesloten
2 Order zonder exitorder Overgeslagen met reden
3 Order waar einddatum != gefactureerd t/m Overgeslagen met reden
4 Order waar einddatum niet gevuld Overgeslagen met reden
5 Reeds gesloten order Niet meegenomen (DataItem filter Status = Released)
6 Order met open approval requests Overgeslagen met foutmelding
7 Orderregel zonder Plant Type/No. Regel wordt overgeslagen in validatie

Bulk Close Rental Orders — Implementation Plan

Bulk Close Rental Orders — Implementation Plan

For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: A processing-only report that bulk-closes rental purchase orders (INH-ORD) after validating exit order, end date, and invoiced-to date per line.

Architecture: Single report object with Purchase Header as DataItem, filtered on INH-ORD + Released. Validation logic inline in the report. Uses CU 415 Close for the actual close. Skipped orders are collected in a temp record and shown via a page after processing.

Tech Stack: AL (Business Central 25.x), 4PS Construct NL base app

Spec: _DOCS/Wijn/TC-5834/2026-03-25-bulk-close-rental-orders-design.md


File Structure

File Responsibility
src/report/Rep99289.BulkCloseRentalOrders.al Report: DataItem, validation, close logic, output
src/page/Pag99067.BulkCloseRentalOrderLog.al Temp page: shows skipped orders with reasons after processing
Translations/Van Wijnen Customisations.nl-NL.xlf Dutch translations for all captions and labels

Task 1: Create the report skeleton

Files:

  • Create: src/report/Rep99289.BulkCloseRentalOrders.al

  • Step 1: Create report file with DataItem and RequestPage

report 99289 "Bulk Close Rental Orders"
{
    Caption = 'Bulk Close Rental Orders';
    UsageCategory = Tasks;
    ApplicationArea = All;
    ProcessingOnly = true;

    dataset
    {
        dataitem(PurchaseHeader; "Purchase Header")
        {
            DataItemTableView = where("Document Type" = const(Order), Status = const(Released));
            RequestFilterFields = "No.", "Buy-from Vendor No.", "Order Date";

            trigger OnPreDataItem()
            begin
                PurchaseHeader.SetRange("No. Series", 'INH-ORD');

                if not Confirm(ConfirmQst) then
                    CurrReport.Quit();

                ClosedCount := 0;
                SkippedCount := 0;
            end;

            trigger OnAfterGetRecord()
            begin
                if CanCloseOrder(PurchaseHeader) then
                    TryCloseOrder(PurchaseHeader);
                // SkippedCount is incremented inside LogSkippedOrder
            end;
        }
    }

    trigger OnPostReport()
    begin
        Message(SummaryMsg, ClosedCount, SkippedCount);
        ShowSkippedOrders();
    end;

    var
        ConfirmQst: Label 'You are about to bulk close rental orders. Continue?';
        SummaryMsg: Label '%1 rental orders closed, %2 rental orders skipped.';
        ClosedCount: Integer;
        SkippedCount: Integer;
}
  • Step 2: Verify it compiles (skeleton only, procedures stubbed)

Add empty procedure stubs so it compiles:

    local procedure CanCloseOrder(var PurchHeader: Record "Purchase Header"): Boolean
    begin
        exit(false);
    end;

    local procedure TryCloseOrder(var PurchHeader: Record "Purchase Header")
    begin
    end;

    local procedure ShowSkippedOrders()
    begin
    end;
  • Step 3: Commit
git add src/report/Rep99289.BulkCloseRentalOrders.al
git commit -m "feat(TC-5834): add report skeleton for bulk close rental orders"

Task 2: Implement validation logic (CanCloseOrder)

Files:

  • Modify: src/report/Rep99289.BulkCloseRentalOrders.al

  • Step 1: Implement CanCloseOrder

Replace the stub with the full validation. This loops through all purchase lines with plant data and runs the four checks per line.

    local procedure CanCloseOrder(var PurchHeader: Record "Purchase Header"): Boolean
    var
        PurchLine: Record "Purchase Line";
        PlantNumber: Record "Plant Number";
        PlantRentEntry: Record "Plant Rent Entry";
    begin
        PurchLine.SetRange("Document Type", PurchHeader."Document Type");
        PurchLine.SetRange("Document No.", PurchHeader."No.");
        PurchLine.SetFilter(Type, '>0');
        PurchLine.SetFilter("Plant Type", '<>%1', '');
        PurchLine.SetFilter("Plant No.", '<>%1', '');

        if not PurchLine.FindSet() then begin
            LogSkippedOrder(PurchHeader."No.", '', NoPlantLinesMsg);
            exit(false);
        end;

        repeat
            // Check 1: Expected Enddate Rent must be filled
            if PurchLine."Expected Enddate Rent" = 0D then begin
                LogSkippedOrder(PurchHeader."No.", PurchLine."Plant No.", EndDateNotFilledMsg);
                exit(false);
            end;

            // Check 2 & 3: Plant Number "Ext. Rented Invoiced to" must be filled and equal to end date
            if not PlantNumber.Get(PurchLine."Plant Type", PurchLine."Plant No.") then begin
                LogSkippedOrder(PurchHeader."No.", PurchLine."Plant No.", PlantNumberNotFoundMsg);
                exit(false);
            end;

            if PlantNumber."Ext. Rented Invoiced to" = 0D then begin
                LogSkippedOrder(PurchHeader."No.", PurchLine."Plant No.", InvoicedToNotFilledMsg);
                exit(false);
            end;

            if PurchLine."Expected Enddate Rent" <> PlantNumber."Ext. Rented Invoiced to" then begin
                LogSkippedOrder(PurchHeader."No.", PurchLine."Plant No.",
                    StrSubstNo(DatesNotEqualMsg,
                        PurchLine."Expected Enddate Rent",
                        PlantNumber."Ext. Rented Invoiced to"));
                exit(false);
            end;

            // Check 4: Plant Rent Entry with Removed = true must exist
            PlantRentEntry.Reset();
            PlantRentEntry.SetRange("Plant Type", PurchLine."Plant Type");
            PlantRentEntry.SetRange("Plant No.", PurchLine."Plant No.");
            PlantRentEntry.SetRange("Vendor No.", PurchHeader."Buy-from Vendor No.");
            PlantRentEntry.SetRange(Removed, true);
            if PlantRentEntry.IsEmpty() then begin
                LogSkippedOrder(PurchHeader."No.", PurchLine."Plant No.", NoExitOrderMsg);
                exit(false);
            end;
        until PurchLine.Next() = 0;

        exit(true);
    end;
  • Step 2: Add the Label variables
        NoPlantLinesMsg: Label 'No purchase lines with plant data found.';
        EndDateNotFilledMsg: Label 'Expected end date rent is not filled.';
        PlantNumberNotFoundMsg: Label 'Plant number not found.';
        InvoicedToNotFilledMsg: Label 'Ext. rented invoiced to is not filled.';
        DatesNotEqualMsg: Label 'End date %1 does not match invoiced to date %2.';
        NoExitOrderMsg: Label 'No exit order found (plant not returned).';
  • Step 3: Add LogSkippedOrder stub
    local procedure LogSkippedOrder(OrderNo: Code[20]; PlantNo: Code[20]; Reason: Text)
    begin
        SkippedCount += 1;
        // Buffer logic will be implemented in Task 4
    end;
  • Step 4: Commit
git add src/report/Rep99289.BulkCloseRentalOrders.al
git commit -m "feat(TC-5834): implement rental order validation logic (4 checks per line)"

Task 3: Implement close logic (TryCloseOrder)

Files:

  • Modify: src/report/Rep99289.BulkCloseRentalOrders.al

  • Step 1: Implement TryCloseOrder with TryFunction error handling

We use a [TryFunction] wrapper because Codeunit.Run would call the OnRun trigger (Release), not Close. The Commit() before TryClose ensures previously closed orders are not rolled back if this one fails.

    local procedure TryCloseOrder(var PurchHeader: Record "Purchase Header")
    begin
        Commit();
        if TryClose(PurchHeader) then
            ClosedCount += 1
        else
            LogSkippedOrder(PurchHeader."No.", '', GetLastErrorText());
    end;

    [TryFunction]
    local procedure TryClose(var PurchHeader: Record "Purchase Header")
    var
        ReleasePurchDoc: Codeunit "Release Purchase Document";
    begin
        ReleasePurchDoc.Close(PurchHeader);
    end;
  • Step 2: Commit
git add src/report/Rep99289.BulkCloseRentalOrders.al
git commit -m "feat(TC-5834): implement close logic with TryFunction error handling"

Task 4: Implement skip logging and results page

Files:

  • Modify: src/report/Rep99289.BulkCloseRentalOrders.al

  • Create: src/page/Pag99067.BulkCloseRentalOrderLog.al

  • Step 1: Add temp table buffer variables and LogSkippedOrder implementation

We use "Name/Value Buffer" (table 823, standard BC) as a temp table to store skipped orders. Field mapping:

  • Name = Order No.
  • Value = Plant No.
  • "Value Long" = Reason
    var
        TempSkippedBuffer: Record "Name/Value Buffer" temporary;
        EntryNo: Integer;

Replace LogSkippedOrder with full implementation (SkippedCount is already incremented here, single source of truth):

    local procedure LogSkippedOrder(OrderNo: Code[20]; PlantNo: Code[20]; Reason: Text)
    begin
        SkippedCount += 1;
        EntryNo += 1;
        TempSkippedBuffer.Init();
        TempSkippedBuffer.ID := EntryNo;
        TempSkippedBuffer.Name := OrderNo;
        TempSkippedBuffer.Value := PlantNo;
        TempSkippedBuffer."Value Long" := CopyStr(Reason, 1, MaxStrLen(TempSkippedBuffer."Value Long"));
        TempSkippedBuffer.Insert();
    end;
  • Step 2: Implement ShowSkippedOrders
    local procedure ShowSkippedOrders()
    begin
        if TempSkippedBuffer.IsEmpty() then
            exit;

        Page.Run(Page::"Bulk Close Rental Order Log", TempSkippedBuffer);
    end;
  • Step 3: Create the log page
page 99067 "Bulk Close Rental Order Log"
{
    Caption = 'Bulk Close Rental Order Log';
    PageType = List;
    SourceTable = "Name/Value Buffer";
    SourceTableTemporary = true;
    Editable = false;
    InsertAllowed = false;
    DeleteAllowed = false;
    ModifyAllowed = false;

    layout
    {
        area(Content)
        {
            repeater(Lines)
            {
                field(OrderNo; Rec.Name)
                {
                    ApplicationArea = All;
                    Caption = 'Order No.';
                }
                field(PlantNo; Rec.Value)
                {
                    ApplicationArea = All;
                    Caption = 'Plant No.';
                }
                field(Reason; Rec."Value Long")
                {
                    ApplicationArea = All;
                    Caption = 'Reason';
                }
            }
        }
    }
}
  • Step 4: Commit
git add src/report/Rep99289.BulkCloseRentalOrders.al src/page/Pag99067.BulkCloseRentalOrderLog.al
git commit -m "feat(TC-5834): add skip logging and results page for bulk close"

Task 5: Add Dutch translations

Files:

  • Modify: Translations/Van Wijnen Customisations.nl-NL.xlf

  • Step 1: Build the project to generate the .g.xlf file

The .g.xlf file is auto-generated by the AL compiler. After building, copy the new trans-unit entries from .g.xlf to .nl-NL.xlf and add Dutch translations.

Translations needed:

English (source) Dutch (target)
Bulk Close Rental Orders Inhuurorders bulk afsluiten
You are about to bulk close rental orders. Continue? U staat op het punt inhuurorders in bulk af te sluiten. Doorgaan?
%1 rental orders closed, %2 rental orders skipped. %1 inhuurorders afgesloten, %2 inhuurorders overgeslagen.
No purchase lines with plant data found. Geen inkoopregels met materieel gevonden.
Expected end date rent is not filled. Verwachte einddatum huur is niet gevuld.
Plant number not found. Materieelnummer niet gevonden.
Ext. rented invoiced to is not filled. Inhuur gefactureerd t/m is niet gevuld.
End date %1 does not match invoiced to date %2. Einddatum %1 komt niet overeen met gefactureerd t/m datum %2.
No exit order found (plant not returned). Geen exitorder gevonden (materieel niet teruggebracht).
Bulk Close Rental Order Log Logboek bulk afsluiten inhuurorders
Order No. Ordernr.
Plant No. Materieelnr.
Reason Reden
  • Step 2: Commit
git add Translations/Van\ Wijnen\ Customisations.nl-NL.xlf
git commit -m "feat(TC-5834): add Dutch translations for bulk close rental orders"

Task 6: Add to permission set and final verification

Files:

  • Modify: src/permissionset/PermissionSet99401.CustPermissions.al

  • Step 1: Add report and page to the permission set

Add to the existing permission set:

    report "Bulk Close Rental Orders" = X;
    page "Bulk Close Rental Order Log" = X;
  • Step 2: Full compile check

Verify the entire extension compiles without errors.

  • Step 3: Commit
git add src/permissionset/PermissionSet99401.CustPermissions.al
git commit -m "feat(TC-5834): add bulk close objects to permission set"

Task 7: Create client documentation

Files:

  • Create: _DOCS/Wijn/TC-5834/klantmail.md

  • Create: _DOCS/Wijn/TC-5834/technisch-oplossingsontwerp.md

  • Step 1: Write client email (Dutch, concise, room for screenshots)

  • Step 2: Write technical solution document (Dutch, deep, with test steps and room for test results)

  • Step 3: Update knowledge base

Update _DOCS/Wijn/cases/materieel-en-inhuur.md with the new bulk close solution.

  • Step 4: Commit
git add _DOCS/Wijn/TC-5834/klantmail.md _DOCS/Wijn/TC-5834/technisch-oplossingsontwerp.md _DOCS/Wijn/cases/materieel-en-inhuur.md
git commit -m "docs(TC-5834): add client email, technical doc, and update knowledge base"

TC-5834: Inhuurorders bulk afsluiten

TC-5834: Inhuurorders bulk afsluiten

Beste collega's,

Naar aanleiding van het verzoek om inhuurorders in bulk te kunnen afsluiten hebben wij een rapport ontwikkeld: Inhuurorders bulk afsluiten.

Wat doet het rapport?

Het rapport controleert automatisch alle openstaande inhuurorders (INH-ORD, status Vrijgegeven) en sluit de orders af die aan alle voorwaarden voldoen:

  1. Alle regels hebben een gevulde einddatum
  2. De einddatum is gelijk aan "Inhuur gefactureerd t/m" op het materieelnummer
  3. Er is een exitorder aanwezig (het materieel is daadwerkelijk teruggebracht)

Orders die niet aan alle voorwaarden voldoen worden overgeslagen. Na afloop toont het rapport een overzicht van afgesloten en overgeslagen orders, inclusief de reden per overgeslagen order.

Hoe te gebruiken?

  1. Zoek het rapport "Inhuurorders bulk afsluiten" via de zoekbalk
  2. Optioneel: filter op ordernummer, leverancier of orderdatum
  3. Klik op OK
  4. Bevestig dat u wilt doorgaan
  5. Na afloop verschijnt een samenvatting en (indien van toepassing) een lijst met overgeslagen orders

[Screenshot: rapport openen]

[Screenshot: resultaat na uitvoering]

Mocht u vragen hebben, neem gerust contact op.

Met vriendelijke groet

Technisch oplossingsontwerp

Technisch Oplossingsontwerp TC-5834: Inhuurorders Bulk Afsluiten

Ticket: TC-5834 Klant: Van Wijnen Datum: 2026-03-25 Testbedrijf: 0910

Probleemstelling

De materieeldienst moet periodiek controleren welke inhuurorders afgesloten kunnen worden. Dit gebeurt nu handmatig via pagina "Huidige stand inhuur gefactureerd tot en met" (11020593). Per order wordt gecontroleerd of het materieel teruggebracht is en of de facturatie afgerond is. Dit kost veel tijd bij grote aantallen orders.

Oplossing

Een Processing Only rapport (Rep99289 "Bulk Close Rental Orders") dat inhuurorders automatisch controleert en afsluit wanneer ze aan alle voorwaarden voldoen.

Nieuwe objecten

Object ID Naam
Report 99289 Bulk Close Rental Orders
Page 99067 Bulk Close Rental Order Log

Validatielogica

Het rapport filtert op Purchase Header waar:

  • Document Type = Order
  • No. Series = INH-ORD
  • Status = Released

Per order worden alle inkoopregels gecontroleerd (waar Type > 0, Plant Type en Plant No. gevuld). Per regel vier checks:

# Check Bron Veld
1 Einddatum is gevuld Purchase Line Expected Enddate Rent (11012443)
2 Gefactureerd t/m is gevuld Plant Number (11012552) Ext. Rented Invoiced to (490)
3 Einddatum = Gefactureerd t/m Vergelijking
4 Exitorder aanwezig Plant Rent Entry (11012535) Removed = true, gefilterd op Vendor No.
5 Exitdatum minimaal 8 weken geleden Plant Rent Entry (11012535) Removed on <= vandaag - 8 weken

Belangrijk: de exitorder-check (check 4) filtert ook op Vendor No. om te voorkomen dat een exitorder van een eerdere huurperiode bij een andere verhuurder wordt gematcht.

Als alle regels aan alle checks voldoen, wordt de order afgesloten via Codeunit 415 "Release Purchase Document", procedure Close. Dit zet de status op Closed, nult openstaande bedragen en verwerkt commitments.

Foutafhandeling

  • Per order wordt een Commit() uitgevoerd voor de close-poging, zodat eerder afgesloten orders niet teruggerold worden bij een fout
  • De close-aanroep is gewrapt in een [TryFunction], zodat fouten (bijv. open goedkeuringsaanvragen op ontvangsten) worden opgevangen en gelogd
  • Overgeslagen orders worden getoond in een logpagina met ordernummer, materieelnummer en reden

8-weken buffer

Het materieel moet minimaal 8 weken geleden teruggebracht zijn voordat een order afgesloten kan worden. Dit geeft de administratie tijd om alles af te handelen (facturatie, controles). Check 5 in de validatielogica dwingt dit af: Plant Rent Entry."Removed on" moet <= vandaag - 8 weken zijn.

Testen

Alle testen uitvoeren in bedrijf 0910.

Voorbereiding

  1. Open BC → schakel naar bedrijf 0910
  2. Zoek "Inhuurorders bulk afsluiten" in de zoekbalk
  3. Verwacht: het rapport verschijnt in de zoekresultaten
  4. Noteer een paar inhuurordernummers (INH...) die je gaat gebruiken voor de testen. Open de Inkooporderlijst, filter op Nr. reeks = INH-ORD en Status = Vrijgegeven

Resultaat:

Test 01: Bevestigingsdialoog annuleren

  1. Open het rapport "Inhuurorders bulk afsluiten"
  2. Klik op OK
  3. De bevestigingsdialoog verschijnt: "U staat op het punt inhuurorders in bulk af te sluiten. Doorgaan?"
  4. Klik Nee
  5. Verwacht: het rapport stopt, geen enkele order wordt verwerkt
  6. Controleer: open een van de eerder genoteerde orders → status is nog steeds "Vrijgegeven"

Resultaat:

Test 02: Order die aan alle voorwaarden voldoet

  1. Zoek een inhuurorder waar:
    • Alle regels een gevulde "Expected Enddate Rent" hebben
    • Per regel het Plant Number een gevulde "Ext. Rented Invoiced to" heeft die gelijk is aan de einddatum
    • Per regel een Plant Rent Entry bestaat met Removed = true voor dezelfde leverancier
  2. Noteer het ordernummer: _______________
  3. Open het rapport, filter op dit specifieke ordernummer in het veld "Nr."
  4. Klik OK → bevestig met Ja
  5. Verwacht: melding "1 inhuurorders afgesloten, 0 inhuurorders overgeslagen."
  6. Controleer: open de order → status moet "Afgesloten" zijn
  7. Controleer: openstaande bedragen op de regels moeten 0 zijn

Resultaat:

Test 03: Order zonder exitorder (materieel niet teruggebracht)

  1. Zoek een inhuurorder waar het materieel nog niet teruggebracht is (geen exitorder, Plant Rent Entry.Removed = false)
  2. Noteer het ordernummer: _______________
  3. Open het rapport, filter op dit ordernummer
  4. Klik OK → bevestig met Ja
  5. Verwacht: melding "0 inhuurorders afgesloten, 1 inhuurorders overgeslagen."
  6. Verwacht: de logpagina opent met:
    • Ordernr. = het ordernummer
    • Reden = "No exit order found (plant not returned)." (of de Nederlandse vertaling)
  7. Controleer: open de order → status is nog steeds "Vrijgegeven"

Resultaat:

Test 04: Order waar einddatum niet gevuld is

  1. Zoek een inhuurorder waar minstens één regel geen "Expected Enddate Rent" heeft (veld is leeg/0D)
  2. Noteer het ordernummer: _______________
  3. Open het rapport, filter op dit ordernummer
  4. Klik OK → bevestig met Ja
  5. Verwacht: melding "0 afgesloten, 1 overgeslagen"
  6. Verwacht: logpagina toont reden "Expected end date rent is not filled." met het materieelnummer van de betreffende regel
  7. Controleer: order status is nog steeds "Vrijgegeven"

Resultaat:

Test 05: Order waar einddatum != gefactureerd t/m

  1. Zoek een inhuurorder waar de einddatum op een regel afwijkt van "Ext. Rented Invoiced to" op het Plant Number
  2. Noteer het ordernummer: _______________
  3. Open het rapport, filter op dit ordernummer
  4. Klik OK → bevestig met Ja
  5. Verwacht: melding "0 afgesloten, 1 overgeslagen"
  6. Verwacht: logpagina toont reden "End date [datum] does not match invoiced to date [datum]."
  7. Controleer: order status is nog steeds "Vrijgegeven"

Resultaat:

Test 06: Rapport opnieuw draaien na afsluiting

  1. Dit is een vervolg op Test 02 (dezelfde order die al afgesloten is)
  2. Open het rapport zonder filters (of met een breed filter)
  3. Klik OK → bevestig met Ja
  4. Verwacht: de eerder afgesloten order verschijnt NIET in het resultaat (het rapport filtert op Status = Vrijgegeven)
  5. Verwacht: de afgesloten order wordt niet dubbel verwerkt of getoond in de logpagina

Resultaat:

Test 07: Exitdatum minder dan 8 weken geleden

  1. Zoek een inhuurorder waar het materieel recent is teruggebracht (minder dan 8 weken geleden, Plant Rent Entry."Removed on" > vandaag - 8 weken)
  2. Noteer het ordernummer: _______________
  3. Noteer de exitdatum: _______________
  4. Open het rapport, filter op dit ordernummer
  5. Klik OK → bevestig met Ja
  6. Verwacht: melding "0 afgesloten, 1 overgeslagen"
  7. Verwacht: logpagina toont reden "Exit date [datum] is less than 8 weeks ago." met het materieelnummer
  8. Controleer: order status is nog steeds "Vrijgegeven"

Resultaat:

Test 08: Bulk verwerking (meerdere orders tegelijk)

  1. Open het rapport ZONDER filter op ordernummer (of met een breed filter, bijv. op leverancier)
  2. Klik OK → bevestig met Ja
  3. Verwacht: melding toont het totaal aantal afgesloten en overgeslagen orders
  4. Verwacht: als er overgeslagen orders zijn, opent de logpagina met een lijst van alle overgeslagen orders + redenen
  5. Controleer: steekproefsgewijs een paar afgesloten orders → status = Afgesloten, openstaande bedragen = 0
  6. Controleer: steekproefsgewijs een paar overgeslagen orders → status = Vrijgegeven, de genoemde reden klopt

Resultaat:

STATUS

Afhankelijkheden

Object Rol
Purchase Header (38) DataItem, filters
Purchase Line (39) Regelvalidatie
Plant Number (11012552) Ophalen "Ext. Rented Invoiced to"
Plant Rent Entry (11012535) Exitorder check
Release Purchase Document (415) Close procedure
Name/Value Buffer (823) Tijdelijke opslag overgeslagen orders

Time Entries

DateHoursDescription
2026-03-252.5

Activity

2026-04-01 11:17:41 status changed from "open" to "testing"
2026-04-01 11:17:18 2.5h logged for 2026-03-25
2026-04-01 11:05:40 Document "fo" added
2026-04-01 11:05:40 Document "to" added
2026-04-01 11:05:40 Document "client_email" added
2026-04-01 11:05:40 Document "to" added
2026-04-01 11:04:40 Ticket "Bulk close rental orders" created