TC-CHANGE2602-024 Van Kempen

Fix weekend overuren regiemutaties

Total hours: 0.0

Documents

Weekend overuren automatisch correct looncomponent op regiemutaties

Weekend overuren automatisch correct looncomponent op regiemutaties - TC-CHANGE2602-024

Probleem

Wanneer een werkorder in het weekend wordt uitgevoerd (storing, onderhoud), moeten de regiemutaties op de werkbon het juiste overurentarief krijgen: 150% voor zaterdag, 200% voor zondag. Dit gebeurt nu niet automatisch.

De huidige situatie:

  1. Medewerker boekt uren via urenstaten op de werkorder
  2. Coördinator keurt goed en boekt door, maar ziet geen regiemutaties en dus ook niet of het overurentarief ontbreekt
  3. Werkorder gaat op status "80 Gereed"
  4. José (administratie) ziet bij het factureren wel de regiemutaties, maar moet handmatig het looncomponent corrigeren van 100% naar 150%/200%, als ze de fout al opmerkt

Het risico is dat weekendwerk tegen standaardtarief gefactureerd wordt.

Oorzaak

De regiemutatieregels (Service Order Cost Plus Entry, tabel 11012825) krijgen bij aanmaak via de Field Service App (buitendienst) het standaard looncomponent. Er is geen mechanisme dat het looncomponent vervangt door een weekend-variant op basis van de boekingsdatum.

De interne urenstaten-correctie (codeunit 91504 Hour Accounting-Correction VKK) lost dit al op voor de salaris/payroll-kant via CAO Daily Schedule, maar de klantfactuur-kant (regiemutaties) wordt niet meegenomen.

Oplossing

Overzicht

Een rapport (batch job) dat wekelijks via de taakwachtrij draait en regiemutatieregels met een weekendboekingsdatum bijwerkt met het juiste looncomponent. De configuratie van welk looncomponent per dag (zaterdag/zondag) wordt ingesteld op de bestaande VKKT Instellingen pagina.

Wijziging 1: VKKT Setup uitbreiden (tabel 50002 + page 50007)

Twee nieuwe velden op tabel VKKT Setup:

Veld Type TableRelation Doel
Wage Component Saturday Code[10] Wage Component Looncomponent voor zaterdagwerk (150%)
Wage Component Sunday Code[10] Wage Component Looncomponent voor zondagwerk (200%)

Op page VKKT Setup (50007) een nieuwe groep "Weekend Overuren" met beide velden.

Wijziging 2: Nieuw rapport (batch job)

Een nieuw Report object (bijv. Report 91500 "Update Weekend Cost Plus Entries VKK").

Filtercriteria op Service Order Cost Plus Entry:

Criterium Veld Filter
Weekenddag Posting Date Dag van de week = zaterdag of zondag
Aangemaakt door buitendienst FSA-Created Entry true
Kostensoort = Arbeid Cost Type Arbeid (dit is een FlowField via Dimension Value, dus filteren via Cost Object of het veld berekenen)
Looncomponent gevuld Wage Component <>''
Niet gefactureerd Invoiced false

Verwerking per regel:

  1. Bepaal of de Posting Date op een zaterdag of zondag valt (via Date2DWY)
  2. Haal het bijbehorende looncomponent op uit VKKT Setup
  3. Valideer het nieuwe looncomponent op de regel (via Validate("Wage Component", ...) zodat prijzen herberekend worden)
  4. Modify de regel

Aandachtspunten:

  • Cost Type is een FlowField (CalcFormula via Dimension Value). Dit veld kan niet direct gefilterd worden in een SetRange. Alternatief: na ophalen CalcFields uitvoeren en in code filteren, of filteren op het Cost Object veld als de arbeid-kostenplaatsen bekend zijn.
  • Het rapport moet idempotent zijn: als het looncomponent al het weekend-component is, niet opnieuw verwerken. Dit voorkomt dubbele runs.
  • Validate op Wage Component triggert herberekening van prijzen (Basic Price, Sales Price, Surcharge). Dit is het gewenste gedrag.

Wijziging 3: Taakwachtrij inrichten

Het rapport inplannen in de Job Queue:

  • Herhaling: dagelijks om 06:00
  • Dagelijks draaien zodat weekendregels altijd de eerstvolgende werkdag verwerkt zijn
  • Toekomstbestendig: als later doordeweekse overuren (125%) via knoppen in de BDA worden gelogd, kan de batch zonder aanpassingen dagelijks blijven draaien

Bestaande objecten die geraakt worden

Object Wat Wijziging
Tabel 50002 VKKT Setup Instellingentabel 2 velden toevoegen
Page 50007 VKKT Setup Instellingenpagina Nieuwe groep + 2 velden

Nieuw object

Object Naam Doel
Report 91500 Update Weekend Cost Plus Entries VKK Batch job voor weekend looncomponent correctie

Objecten die gelezen worden (geen wijziging)

Object Tabel ID Rol
Service Order Cost Plus Entry 11012825 Bron: regiemutatieregels
Wage Component 11012014 Lookup: looncomponent validatie
Dimension Value 349 Lookup: Cost Type bepaling

Scope en afbakening

Op basis van de opmerkingen van Gerrit Jan Timmerman, JL en Marcel Helsdingen (3-4 maart 2026):

  • Alleen weekend (za/zo): Doordeweekse overuren (125%, eerste twee overuren voor/na werktijd) kunnen niet geautomatiseerd worden omdat 95% van de monteurs niet op de start/stop-knoppen in de BDA drukt, waardoor tijdstippen niet betrouwbaar gelogd worden. José corrigeert dit handmatig op basis van >8 uur per dag.
  • Alleen BDA-uren: Het betreft regiemutatieregels aangemaakt door de Field Service App (BDA), niet uren via urenstaten.
  • Status 80: De werkorder gaat naar status 80 (Gereed), niet 75 (Technisch Gereed) zoals in het oorspronkelijke FO stond.
  • Dagelijks draaien: De batch draait dagelijks om 06:00 in plaats van wekelijks, zodat data altijd actueel is en het later uitbreidbaar is als de BDA-knoppen wel gebruikt gaan worden.
  • VKKT Instellingen: Eenmalig in te stellen, klant kan zelf muteren zonder tussenkomst van DIS (bijv. bij looncomponentwijzigingen). Instellingen blijven behouden bij updates.

Teststappen

  1. Inrichting: Open VKKT Instellingen, vul "Wage Component Saturday" en "Wage Component Sunday" in met de juiste looncomponenten
  2. Testdata: Maak een werkorder met regiemutaties aan via de buitendienst-app, met boekingsdatum op een zaterdag en een zondag
  3. Run rapport: Voer het rapport handmatig uit
  4. Controleer zaterdag: Regiemutatieregel met zaterdagdatum heeft nu het zaterdag-looncomponent, prijzen zijn herberekend op 150%
  5. Controleer zondag: Regiemutatieregel met zondagdatum heeft nu het zondag-looncomponent, prijzen zijn herberekend op 200%
  6. Controleer niet-weekend: Regiemutatieregels met doordeweekse datum zijn niet gewijzigd
  7. Controleer gefactureerd: Reeds gefactureerde regels zijn niet gewijzigd
  8. Idempotent: Draai het rapport nogmaals, er mogen geen verdere wijzigingen zijn
  9. Taakwachtrij: Plan het rapport in via Job Queue en verifieer dat het automatisch draait

Testresultaten

[Ruimte voor screenshots en testresultaten]

Status

  • Technisch ontwerp
  • Code geschreven
  • Getest
  • Klant geïnformeerd
  • Deployed

Weekend Cost Plus Entry Correction - Implementation Plan

Weekend Cost Plus Entry Correction - Implementation Plan

For agentic workers: Use superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.

Goal: Automatically correct the wage component on weekend regime mutation lines (Service Order Cost Plus Entry) so they use the correct overtime surcharge (150% Saturday, 200% Sunday).

Architecture: Extend VKKT Setup with two wage component fields (Saturday/Sunday). Create a ProcessingOnly report that filters Cost Plus Entries on weekend posting dates and replaces the wage component. Schedule via Job Queue daily at 06:00.

Tech Stack: AL (Business Central), 4PS Field Service tables

Spec: _DOCS/Van Kempen/TC-CHANGE2602-024/2026-03-31-fix-weekend-overuren-regiemutaties.md


Task 1: Add weekend wage component fields to VKKT Setup table

Files:

  • Modify: app/src/Table/Tab50002.VKKTSetup.al:79 (before closing keys block)

  • Step 1: Add two fields after field 100

Add after field(100; "Cost Center Call Out Charges") closing brace:

field(110; "Wage Component Saturday"; Code[10])
{
    Caption = 'Wage Component Saturday';
    TableRelation = "Wage Component";
}
field(120; "Wage Component Sunday"; Code[10])
{
    Caption = 'Wage Component Sunday';
    TableRelation = "Wage Component";
}

Task 2: Show weekend fields on VKKT Setup page

Files:

  • Modify: app/src/Page/Pag50007.VKKTSetup.al:38 (after CoolTechnicalReport group closing brace)

  • Step 1: Add new group after CoolTechnicalReport

Add a new group after the closing } of group(CoolTechnicalReport):

group(WeekendOvertime)
{
    Caption = 'Weekend Overtime';

    field("Wage Component Saturday"; Rec."Wage Component Saturday")
    {
    }
    field("Wage Component Sunday"; Rec."Wage Component Sunday")
    {
    }
}

Task 3: Create the batch report

Files:

  • Create: app/src/Report/Rep91547.UpdateWeekendCostPlusVKK.al

  • Step 1: Create the report file

report 91547 "Update Weekend Cost Plus VKK"
{
    Caption = 'Update Weekend Cost Plus Entries';
    ProcessingOnly = true;
    ApplicationArea = All;

    dataset
    {
        dataitem(CostPlusEntry; "Service Order Cost Plus Entry")
        {
            RequestFilterFields = "Service Order No.", "Posting Date";

            trigger OnPreDataItem()
            begin
                VKKTSetup.Get();
                VKKTSetup.TestField("Wage Component Saturday");
                VKKTSetup.TestField("Wage Component Sunday");

                CostPlusEntry.SetRange("FSA-Created Entry", true);
                CostPlusEntry.SetFilter("Wage Component", '<>%1', '');
                CostPlusEntry.SetRange(Invoiced, false);
            end;

            trigger OnAfterGetRecord()
            var
                DayOfWeek: Integer;
                NewWageComponent: Code[10];
            begin
                DayOfWeek := Date2DWY("Posting Date", 1);

                // 6 = Saturday, 7 = Sunday
                case DayOfWeek of
                    6:
                        NewWageComponent := VKKTSetup."Wage Component Saturday";
                    7:
                        NewWageComponent := VKKTSetup."Wage Component Sunday";
                    else
                        CurrReport.Skip();
                end;

                CostPlusEntry.CalcFields("Cost Type");
                if CostPlusEntry."Cost Type" <> CostPlusEntry."Cost Type"::Labor then
                    CurrReport.Skip();

                if "Wage Component" = NewWageComponent then
                    CurrReport.Skip();

                Validate("Wage Component", NewWageComponent);
                Modify(true);

                EntriesUpdated += 1;
            end;

            trigger OnPostDataItem()
            begin
                if GuiAllowed then
                    Message(EntriesUpdatedMsg, EntriesUpdated);
            end;
        }
    }

    var
        VKKTSetup: Record "VKKT Setup";
        EntriesUpdated: Integer;
        EntriesUpdatedMsg: Label '%1 cost plus entries updated with weekend wage component.';
}

Design decisions in this code:

  1. OnPreDataItem sets the fixed filters (FSA-Created, Wage Component filled, not invoiced) so the user can't accidentally remove them, but RequestFilterFields allows narrowing by Service Order No. and Posting Date.
  2. Date2DWY with parameter 1 returns day of week (1=Monday ... 7=Sunday).
  3. Cost Type check in code because it's a FlowField and can't be used in SetRange.
  4. Idempotent: skips entries that already have the correct weekend wage component.
  5. Validate triggers price recalculation (Basic Price, Sales Price, Surcharge) via the table's OnValidate trigger on Wage Component.
  6. Message only when GuiAllowed so it works silently in Job Queue but shows feedback when run manually.

Task 4: Add Dutch translations

Files:

  • Modify: app/Translations/Van Kempen Customizations.nl-NL.xlf

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

Run AL build (Ctrl+Shift+B in VS Code or dotnet build) to regenerate Van Kempen Customizations.g.xlf with the new trans-unit IDs.

  • Step 2: Copy new trans-unit entries from .g.xlf to .nl-NL.xlf and add Dutch targets

Translations to add:

Source (English) Target (Dutch)
Wage Component Saturday Looncomponent zaterdag
Wage Component Sunday Looncomponent zondag
Weekend Overtime Weekend overuren
Update Weekend Cost Plus Entries Weekendtoeslag regiemutaties bijwerken
%1 cost plus entries updated with weekend wage component. %1 regiemutatieregels bijgewerkt met weekend looncomponent.

Task 5: Commit

  • Step 1: Stage and commit
git add app/src/Table/Tab50002.VKKTSetup.al \
      app/src/Page/Pag50007.VKKTSetup.al \
      app/src/Report/Rep91547.UpdateWeekendCostPlusVKK.al \
      app/Translations/Van\ Kempen\ Customizations.nl-NL.xlf \
      app/Translations/Van\ Kempen\ Customizations.g.xlf
git commit -m "feat: automatic weekend wage component correction on cost plus entries (CHANGE2602-024)"

CHANGE2602-024 Ticket Update

CHANGE2602-024 — Weekend overurentoeslag regiemutaties

Wat is er gebouwd

Een rapport dat automatisch het looncomponent op regiemutatieregels corrigeert voor weekendwerk. Regels die door de BDA zijn aangemaakt op een zaterdag of zondag krijgen automatisch het juiste overuren-looncomponent, zodat de verkoopprijs de weekendtoeslag bevat.

Hoe het werkt

  1. Op de VKKT Instellingen pagina stel je per dag het weekend-looncomponent in (zaterdag/zondag)
  2. Het rapport zoekt alle niet-gefactureerde BDA-regiemutaties met een weekendboekingsdatum
  3. Een preview toont welke regels aangepast worden
  4. Na bevestiging wordt het looncomponent vervangen en herberekent 4PS automatisch de prijzen

Resultaat

Voor (standaard looncomponent 0100, geen toeslag):

[screenshot: CHANGE2602-024.png]

Na (weekend looncomponent 0802/0803 met overurentoeslag):

[screenshot: CHANGE2602-024 Result.png]

Regel Dag Looncomp. Brutoprijs Te factureren Toeslag
28-3 (za) Zaterdag 0100 → 0802 104 → 156 832 → 1.248 150%
29-3 (zo) Zondag 0100 → 0803 104 → 208 416 → 832 200%
28-3 Zaterdag 0100 (geen BDA) Ongewijzigd Ongewijzigd
25-3 (di) Doordeweeks 0100 Ongewijzigd Ongewijzigd

Regels zonder BDA-vinkje en doordeweekse regels worden niet aangepast.

Inrichting

  • VKKT Instellingen → groep "Weekend Overuren"
  • Looncomponent zaterdag: het component met 150% overurentoeslag
  • Looncomponent zondag: het component met 200% overurentoeslag
  • Rapport inplannen via taakwachtrij (dagelijks 06:00)

Status

  • Gebouwd en getest in sandbox
  • Review met Marcel/Peter
  • Deployed naar productie

Time Entries

Activity

2026-04-01 11:25:44 status changed from "open" to "testing"
2026-04-01 11:05:31 Document "analysis" added
2026-04-01 11:05:31 Document "to" added
2026-04-01 11:05:31 Document "other" added
2026-04-01 11:04:36 Ticket "Fix weekend overuren regiemutaties" created