
Elk werk start als een Project. Een project bevat Posten. Een post heeft ofwel directe taken, ofwel een tussenniveau van Subposten (elk met taken). Een taak is de kleinste reken-eenheid.
PROJECT (calc_projects)
│ marges, klant, status, besteknummer
│
├── POST (calc_posten) [meerdere per project]
│ │ postnr, beschrijving, eenheid, hoeveelheid, marge_factor
│ │
│ ├── (optie A) directe TAKEN [als post geen subposten heeft]
│ │ └── TAAK ........... [calc_taken]
│ │
│ └── (optie B) SUBPOSTEN [als post wel subposten heeft]
│ └── SUBPOST (calc_subposten)
│ ├── naam, eenheid, hoeveelheid
│ └── TAAK ........... [calc_taken met subpost_id]
│
└── ...
Alle berekeningen baseren zich op centraal beheerde lijsten in het Parameters scherm. Eén plek = consistente prijzen voor alle calculaties.
km_bedrijf_werf: 130 km (default)diesel_wit: 1,5 €/l (lichte voertuigen)diesel_rood: 1,0 €/l (machines)elek: 0,3 €/kmovernachting: 145 €/nachtPer rol × type × regime. Type = algemeen (per regime D/N/ZAT/ZON met toeslag) of gewogen (vlak tarief).
Per taak kies je 1 van 4 methodes om het rendement per shift te bepalen. Dit drijft het aantal shifts en dus de kosten.
Voor afgewerkte stuks (bv. piketten, deksels).
rendement = (60 / min_per_stuk) × u_per_shift
eenheid: stuk/shift
Voorbeeld: 30 min/stuk × 4u/shift → (60/30) × 4 = 8 stuk/shift
Voor kraangrond.
rendement = (3600 / sec_per_schep) × m³_per_schep × u_per_shift × kranen
eenheid: m³/shift
Voorbeeld: 30s/schep · 0,8 m³/schep · 8u/shift · 2 kranen = 1536 m³/shift
Voor afvoeren of aanvoeren met lorries (vrachtwagens).
min_per_rit = laad_min + los_min + rij_min ritten_per_shift = (u_per_shift × 60) / min_per_rit m³_per_shift = ritten_per_shift × m³_per_lorrie afhankelijk van keuze "resultaat in": • m³/shift → m³_per_shift • lm/shift → m³_per_shift / (breedte × diepte) • m²/shift → m³_per_shift / (breedte × diepte)
Twee opties: direct rendement opgeven, of 3 dimensies vermenigvuldigen.
rendement = dim1 × dim2 × dim3 (modus: dimensies) rendement = waarde (modus: direct)
activiteit_hoeveelheid = post_hoeveelheid × conversie_factor shifts = activiteit_hoeveelheid / rendement_resultaat
Het aantal shifts wordt later vermenigvuldigd met de kost per shift om de totaalprijs te bekomen.
Per taak heb je 5 kostencategorieën die elk hun eigen sub-totaal per shift opleveren.
per rij: tot_eenheden = pers × uren_per_pers
tot_bedrag = tot_eenheden × tarief
tarief lookup uit calc_globals_arbeid:
type = "algemeen" + regime D/N/ZATD/ZATN/ZOND/ZONN
type = "gewogen" (vlak tarief)
Twee sub-tabellen: rijtijd-uren én diesel-verbruik.
Rijtijd uren: bedrag = pers × afstand × km_vergoeding Diesel verbruik: liters = (verbruik_l_100km × afstand) / 100 bedrag = aantal × liters × diesel_eur_l
ep = (eenheid = "/shift") → kost_per_h
(eenheid = "/h") → kost_per_h × uren
diesel = verbruik_l_u × uren × diesel_rood
totaal = aantal × (ep + diesel)
Machines gebruiken rode diesel.
ep = kost_per_h × uren diesel = verbruik_l_u × uren × diesel_wit totaal = aantal × (ep + diesel)
Transport gebruikt witte diesel.
totaal = aantal × prijs (uit globals_leveringen)
Velden lengte/breedte/hoogte zijn informatief — enkel aantal × prijs telt mee in de totalisatie.
De app splitst Werk en Levering apart vanaf hier — elk met eigen marge.
totaal_werk_per_shift = uurkost + verplaatsing + machinekost + transport totaal_levering_per_shift = leverkost totaal_per_shift = totaal_werk + totaal_levering bruto_werk = totaal_werk × (1 + marge_werk) [default 23%] bruto_levering = totaal_levering × (1 + marge_levering) [default 0%] totaalprijs_taak = totaal_per_shift × shifts totaalprijs_taak_bruto = (bruto_werk + bruto_levering) × shifts ehp_taak = totaalprijs_taak / activiteit_hoeveelheid ehp_post = totaalprijs_taak / post_hoeveelheid
Taken rollen op naar hun parent.
// Subpost (indien aanwezig) subpost.totaal_netto = Σ taken.totaalprijs_taak subpost.totaal_bruto = Σ taken.totaalprijs_taak_bruto subpost.netto = totaal_netto / subpost.hoeveelheid // Post post.totaal_netto = Σ alle taken in post (direct + via subposten) post.netto = post.totaal_netto / post.hoeveelheid post.bruto = post.netto × marge_factor [default 1.22] post.totaal_bruto = post.bruto × post.hoeveelheid
marge_factor per post is editable in het Meetstaat scherm.
Het Meetstaat scherm geeft de samenvatting per project. Bovenaan staan 6 categorie-marges; eronder een hiërarchische lijst (post · subpost · taak) met live totalen.
// Op basis van post.type
totaal_werk_bruto = Σ post.totaal_bruto waar type ∈ {werk, toeslag}
totaal_levering_bruto = Σ post.totaal_bruto waar type ∈ {materiaal, levering}
TOTAAL_BRUTO = totaal_werk_bruto + totaal_levering_bruto
winst_werk = totaal_werk_bruto × marge_werk_pct [10%] winst_levering = totaal_levering_bruto × marge_levering_pct [10%] winst_abr = totaal_werk_bruto × marge_abr_pct [0,3%] winst_overhead = TOTAAL_BRUTO × marge_overhead_pct [4%] toeslag_pct → niet vermenigvuldigd in dit scherm (info) ak_pct → idem (info) WINST_TOTAAL = winst_werk + winst_levering + winst_abr + winst_overhead
IDEALE_INSCHRIJVING = TOTAAL_BRUTO + WINST_TOTAAL Bruto marge % = (IDEALE - TOTAAL_BRUTO) / IDEALE Netto marge % = (IDEALE - TOTAAL_NETTO) / IDEALE
Marges (per post én per categorie) live aanpassen → totalen herrekenen meteen → na 600ms auto-save naar DB.
Drie types templates voor hergebruik:
Bij opslaan opent een modal met 2 keuzes:
klant van het project waar het template uitkwam wordt mee opgeslagen als source_klant (info-veld), maar wordt nooit doorgetrokken bij gebruik. Het nieuwe project behoudt steeds zijn eigen klant.| Wijziging | Effect | Auto-save |
|---|---|---|
| Veld in taak (hoeveelheid, methode, NETTO rij…) | Live update taak-totaal → post-totaal → meetstaat totalen | 500ms debounce |
| Marge per post in meetstaat | Live update bruto EP, totaal bruto, ideale inschrijving | 500ms debounce |
| Categorie-marge in meetstaat (Werk/Lev/ABR/Overhead) | Live update WINST_TOTAAL, IDEALE_INSCHRIJVING, %-marges | 600ms debounce |
| Parameter wijzigen in ⚙️ Parameters | Geen impact tot je ↻ Update parameters klikt op een calculatie | Per cel direct |
| ↻ Update parameters (per calculatie) | Loopt door alle taken, herrekent met laatste globals, slaat op | Bulk-save |
| ↻ Update all (vanuit Parameters) | Idem, maar voor alle CONCEPT calculaties tegelijk | Progress overlay |
| Status wijziging (Concept → Ingediend …) | Update calc_projects.status | 600ms debounce |
| Taak/post/subpost verwijderen | CASCADE in DB → bovenliggende totalen herrekend lokaal | Direct |
In Gebruikersbeheer → Calculator rechten:
Admin-gebruikers krijgen automatisch alle rechten. De ⚡-knop "Volledige calculator-toegang aan" zet alle 11 vinkjes ineens.