Project I - Maak offertes automatisch
01 - Projectoverzicht
- In dit project maak je een Python-script dat automatisch een offertebestand samenstelt.
- Het script helpt wanneer je vaak dezelfde soort offerte maakt met alleen andere klantgegevens en bedragen.
- Je gebruikt invoer zoals klantnaam, projectnaam, werkzaamheden, uurtarief, aantal uren en geldigheidsdatum.
- Het script berekent subtotaal, btw en totaal en plaatst deze gegevens in een tekstbestand, Markdown-bestand of PDF.
- Het resultaat is een complete offerte met een vaste opbouw en een duidelijke bestandsnaam.
- Je gebruikt AI om de eerste code te laten genereren en vraagt om variabelen bovenaan het script.
- Je voert de code uit in VS Code en controleert of alle bedragen en teksten op de juiste plek staan.
- Als de offerte niet professioneel genoeg is, verbeter je de prompt met een voorbeeldindeling en verplichte onderdelen.
02 - Projectmap en Python-omgeving
Voorkennis: doorloop de voorgaande projecten. Het doel en gebruik van .venv zijn uitgelegd in project A, blok 02. Voor ieder nieuw project maak je een eigen omgeving; hieronder herhaal je die bekende stappen.
- Maak een eigen projectmap
project_ien open die map in VS Code. Maak daarin straksofferte.py. - Deze oefeningen voer je lokaal uit in de terminal van VS Code, omdat ze bestanden op je computer lezen of schrijven. Gebruik hiervoor de Python-installatie uit de basiscursus.
- Controleer je Python-versie. Werkt
pythonop macOS of Linux niet, gebruik danpython3voor het aanmaken van de omgeving.
python --version
python -m venv .venv
Activeer de omgeving. In Windows PowerShell:
.venv\Scripts\Activate.ps1
In de Windows-opdrachtprompt (cmd):
.venv\Scripts\activate.bat
Op macOS of Linux:
source .venv/bin/activate
Kies in VS Code via Python: Select Interpreter de interpreter uit .venv. Gebruik vanaf nu de geactiveerde terminal. Je verlaat de omgeving later met deactivate.
Dit project gebruikt alleen de standaardbibliotheek van Python. Extra pakketten installeren is niet nodig.
03 - Testgegevens voorbereiden
Deze versie maakt een Markdown-offerte, zodat je eerst de gegevens en berekeningen kunt volgen. Gebruik fictieve klant Voorbeeldbedrijf Alfa, project Website bijwerken, offertedatum 2026-05-01 en geldig tot 2026-05-31.
De werkzaamheden zijn 4 uur ontwerp en 6 uur bouw, beide à EUR 60.00. We gebruiken 21% als instelbare btw-waarde voor deze rekenoefening.
04 - Begrippen en hulpmiddelen vóór de opdracht
- Je gebruikt Decimal en afronding uit project H. Markdown is gewone tekst met opmaaktekens:
#maakt een hoofdkop,##een tussenkop en-een opsommingsregel. - Een Markdown-tabel gebruikt
|tussen kolommen en een scheidingsregel onder de kop. VS Code kan de opgemaakte versie tonen via Open Preview. "\n".join(regels)voegt een lijst tekstregels samen met regeleinden.write_textschrijft de volledige tekst naar het doelbestand.
- In
WERKstaan omschrijving, uren en tarief per regel. Een extra werkzaamheid vraagt dus geen kopie van de berekeningscode. - De template is een lijst tekstregels.
joinvoegt ze samen met regeleinden; Markdown zorgt voor kopjes en een tabel. - De geldigheidsdatum is hier handmatig ingevuld. Bij herhaald uitvoeren wordt dezelfde oefenofferte vervangen.
05 - Een gerichte AI-prompt maken
Geef AI eerst een concrete opdracht. Kopieer bijvoorbeeld deze prompt en vergelijk het antwoord met de voorbeeldcode in het volgende blok:
Maak een Python-script dat uitvoer/offerte_2026_001.md maakt uit variabelen
bovenaan. Gebruik fictieve klant, project, nummer, datum, geldig-tot en een
lijst werkzaamheden met uren en tarief. Bereken met Decimal regelbedragen,
subtotaal, 21 procent voorbeeld-btw en totaal, afgerond met ROUND_HALF_UP.
Geef vaste kopjes Klant en project, Werkzaamheden, Bedragen en Afspraken.
Gebruik 4 uur ontwerp en 6 uur bouw tegen 60.00. Vermeld als oefenafspraken
één feedbackronde en planning in overleg. Gebruik pathlib en UTF-8.
Vraag om uitleg bij onbekende regels en controleer welke bestanden de code leest en schrijft voordat je haar uitvoert. Gebruik de oefengegevens uit dit project.
06 - Een werkende basisversie
Dit is een complete basisversie voor offerte.py. Neem de code over of vergelijk haar met het antwoord van AI.
from pathlib import Path
from decimal import Decimal, ROUND_HALF_UP
KLANT = "Voorbeeldbedrijf Alfa"
PROJECT = "Website bijwerken"
NUMMER = "2026-001"
DATUM = "2026-05-01"
GELDIG_TOT = "2026-05-31"
BTW = Decimal("0.21")
WERK = [("Ontwerp", Decimal("4"), Decimal("60.00")),
("Bouw", Decimal("6"), Decimal("60.00"))]
UITVOER = Path(__file__).resolve().parent / "uitvoer" / "offerte_2026_001.md"
def afronden(bedrag):
return bedrag.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
def main():
regels = [f"# Offerte {NUMMER}", "", "## Klant en project", "",
f"Klant: {KLANT}", f"Project: {PROJECT}", f"Datum: {DATUM}",
f"Geldig tot: {GELDIG_TOT}", "", "## Werkzaamheden", "",
"| Werk | Uren | Tarief excl. btw | Bedrag excl. btw |",
"| --- | ---: | ---: | ---: |"]
subtotaal = Decimal("0.00")
for naam, uren, tarief in WERK:
bedrag = afronden(uren * tarief)
subtotaal += bedrag
regels.append(f"| {naam} | {uren} | EUR {tarief:.2f} | EUR {bedrag:.2f} |")
btw = afronden(subtotaal * BTW)
regels.extend(["", "## Bedragen", "", f"Subtotaal: EUR {subtotaal:.2f}",
f"Btw ({BTW * 100:.0f}%): EUR {btw:.2f}",
f"Totaal inclusief btw: EUR {subtotaal + btw:.2f}", "",
"## Afspraken", "", "- Eén feedbackronde inbegrepen.",
"- Planning in overleg.", "- Dit is een oefenofferte met fictieve gegevens."])
UITVOER.parent.mkdir(exist_ok=True)
UITVOER.write_text("\n".join(regels) + "\n", encoding="utf-8")
print(f"Offerte gemaakt: {UITVOER}")
print(f"Totaal inclusief btw: EUR {subtotaal + btw:.2f}")
if __name__ == "__main__":
main()
07 - Het script uitvoeren
- Sla de volledige code op als
offerte.pyin je projectmap. Zet eventuele invoerbestanden op de plek die in blok 03 staat. - Open de geïntegreerde terminal in die projectmap en activeer
.venvals dat nog niet is gebeurd. - Voer het script uit met:
python offerte.py
Lees eerst de terminaluitvoer en open daarna eventuele uitvoerbestanden. Controleer het resultaat met blok 08 voordat je met eigen gegevens verdergaat.
08 - Het resultaat controleren
- Subtotaal EUR 600.00, btw EUR 126.00 en totaal EUR 726.00 staan in de offerte.
- Open het Markdown-bestand in VS Code en kies de Markdown-preview. Controleer kopjes, tabel, klant en geldigheidsdatum.
- Voeg 1.5 uur overleg tegen EUR 60.00 toe: subtotaal EUR 690.00, btw EUR 144.90 en totaal EUR 834.90. Gebruik
Decimal("1.5").
09 - Fouten herkennen en oplossen
- De tabel wordt verkeerd getoond? Open de Markdown-preview en controleer de scheidingsregel. Gebruik in de eerste oefening geen verticale strepen in omschrijvingen.
- Bedragen zijn tekst? Zet uren en tarieven om naar
Decimal; behoud een punt als decimaalteken in de code.
10 - Uitbreiden en afronden
Probeer deze vervolgstap pas als de basis werkt:
Combineer de berekening met de PDF-opmaak van project H. Vraag AI daarnaast te controleren dat geldig-tot niet vóór de offertedatum ligt en dat uren en tarieven niet negatief zijn.
Bewaar je werkende basisversie en verander één onderdeel tegelijk. Geef AI bij een fout de foutmelding, het relevante stukje code, je testinvoer en de verwachte uitkomst.
Het project is afgerond wanneer de basiscontrole uit blok 08 slaagt en je in eigen woorden kunt uitleggen welke invoer wordt gebruikt, hoe de verwerking werkt en waar de uitvoer terechtkomt.