Fix weekend overuren regiemutaties
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:
- Medewerker boekt uren via urenstaten op de werkorder
- Coördinator keurt goed en boekt door, maar ziet geen regiemutaties en dus ook niet of het overurentarief ontbreekt
- Werkorder gaat op status "80 Gereed"
- 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:
- Bepaal of de
Posting Dateop een zaterdag of zondag valt (viaDate2DWY) - Haal het bijbehorende looncomponent op uit VKKT Setup
- Valideer het nieuwe looncomponent op de regel (via
Validate("Wage Component", ...)zodat prijzen herberekend worden) - Modify de regel
Aandachtspunten:
Cost Typeis 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 hetCost Objectveld 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
- Inrichting: Open VKKT Instellingen, vul "Wage Component Saturday" en "Wage Component Sunday" in met de juiste looncomponenten
- Testdata: Maak een werkorder met regiemutaties aan via de buitendienst-app, met boekingsdatum op een zaterdag en een zondag
- Run rapport: Voer het rapport handmatig uit
- Controleer zaterdag: Regiemutatieregel met zaterdagdatum heeft nu het zaterdag-looncomponent, prijzen zijn herberekend op 150%
- Controleer zondag: Regiemutatieregel met zondagdatum heeft nu het zondag-looncomponent, prijzen zijn herberekend op 200%
- Controleer niet-weekend: Regiemutatieregels met doordeweekse datum zijn niet gewijzigd
- Controleer gefactureerd: Reeds gefactureerde regels zijn niet gewijzigd
- Idempotent: Draai het rapport nogmaals, er mogen geen verdere wijzigingen zijn
- 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 closingkeysblock)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.alStep 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:
- OnPreDataItem sets the fixed filters (FSA-Created, Wage Component filled, not invoiced) so the user can't accidentally remove them, but
RequestFilterFieldsallows narrowing by Service Order No. and Posting Date. - Date2DWY with parameter 1 returns day of week (1=Monday ... 7=Sunday).
- Cost Type check in code because it's a FlowField and can't be used in SetRange.
- Idempotent: skips entries that already have the correct weekend wage component.
- Validate triggers price recalculation (Basic Price, Sales Price, Surcharge) via the table's OnValidate trigger on Wage Component.
- 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.xlfStep 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
- Op de VKKT Instellingen pagina stel je per dag het weekend-looncomponent in (zaterdag/zondag)
- Het rapport zoekt alle niet-gefactureerde BDA-regiemutaties met een weekendboekingsdatum
- Een preview toont welke regels aangepast worden
- 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