fix: widgets - firm - customer-service-budgets should prefer AdminPulse omzetbudget (budgets.turnover) over computed invoice-schedule amount when available

Onderwerp: Kantoor: effectief uurtarief houdt rekening met je omzetbudget uit AdminPulse

Samenvatting

Het effectief uurtarief in de widget voor "Diensten met budgetten per klant" zal rekening houden met het omzetbudget dat je al in AdminPulse hebt ingesteld, in plaats van dat bedrag altijd zelf te herberekenen op basis van het facturatieschema.

Beschrijving

Voor klanten met een forfait- of voorschotfacturatieschema berekent Finibase vandaag de jaaromzet altijd zelf, op basis van het bedrag en de frequentie van het facturatieschema. Als je in AdminPulse echter al een expliciet omzetbudget hebt ingegeven voor dat schema, negeert Finibase dat bedrag volledig.

Dat kan een verschil opleveren wanneer het omzetbudget in AdminPulse handmatig is aangepast of andere veronderstellingen gebruikt dan een eenvoudige herberekening. We passen de berekening van het effectief uurtarief aan zodat ze het omzetbudget uit AdminPulse gebruikt wanneer dat beschikbaar is, en enkel terugvalt op de herberekening op basis van het facturatieschema wanneer er geen omzetbudget is ingesteld.

Internal notes

  • Gerapporteerd door B&DS (Tim Verbestel), letterlijke actiepunt-notitie uit de Onboarding II-sessie van 2026-09-02: "Berekening effectief uurtarief --> op basis van omzetbudget indien beschikbaar."
  • Root cause (code-analyse): de "schedule"-basis van buildEffectiveRateBreakdown() (src/features/dashboards-content/firm/widgets/customer-service-budgets/get-effective-hourly-rate.ts:78-144) rekent met scheduleAnnualAmount (klantOmzet), dat in resolveGroupRevenue() (build-customer-budget-rows.ts:1328-1353) voor forfait/voorschot/gemengd-klanten volledig komt uit context.invoiceScheduleAmountByGroupRoot.
  • Die map wordt gevuld door fetchInvoiceScheduleAnnualAmountsPerRelation() (aggregate-from-invoice-schedule-amounts.ts:162-252), die de jaaromzet ALTIJD zelf herberekent als SUM(invoiceSchedules.amount × effectiveLines × proRateFactor), zonder ooit de budgets-tabel te raadplegen.
  • AdminPulse synct nochtans wel degelijk een expliciet omzetbudget per (invoiceScheduleId, year) naar de budgets-tabel (src/db/adminpulse-integration/schema.ts:1201-1224, kolom turnover), en dat veld wordt al op meerdere andere plekken gelezen als "het AdminPulse-omzetbudget": advance-payments-settlement/get-advance-payments-data.ts:346, lump-sum-post-calculation/get-lump-sum-data.ts:361, budget-analysis/get-budget-analysis-data.ts:335, customer-evolution/get-customer-evolution-data.ts:344, get-lump-sum-export-data.ts:1552. Binnen customer-service-budgets zelf wordt van diezelfde tabel vandaag enkel budgets.hours gelezen (aggregate-from-adminpulse-budgets.ts, voor de uren-gebaseerde bulk-init-bron), nooit budgets.turnover.
  • Voorgestelde fix-richting (te bevestigen bij implementatie): in fetchInvoiceScheduleAnnualAmountsPerRelation() (of een nieuwe sibling-fetch ernaast), voor elk (invoiceScheduleId, calendarYear) eerst controleren of er een budgets-rij met een positieve turnover bestaat; zo ja, dat bedrag gebruiken als annualAmount in plaats van de herberekening op basis van invoiceSchedules.amount. Enkel terugvallen op de bestaande pro-rate/lines-herberekening wanneer er geen (of een lege) budgets-rij is voor dat jaar. Nagaan of dezelfde voorkeur ook moet doorwerken naar de bulk-init "from invoice-schedule amounts"-bron (expandInvoiceScheduleAmountsByServiceConfig), die dezelfde per-relatie rijen hergebruikt.
  • Bron: Leexi-transcript "B&DS x Finibase - Onboarding II" (2026-09-02).

Please authenticate to join the conversation.

Upvoters
Status

Planned

Board
💡

💡 Feature requests & verbeteringen

ETA
Sep 30, 2026
Date

About 4 hours ago

Author

Linear

Subscribe to post

Get notified by email when there are changes.