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_i en open die map in VS Code. Maak daarin straks offerte.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 python op macOS of Linux niet, gebruik dan python3 voor 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_text schrijft de volledige tekst naar het doelbestand.
  • In WERK staan omschrijving, uren en tarief per regel. Een extra werkzaamheid vraagt dus geen kopie van de berekeningscode.
  • De template is een lijst tekstregels. join voegt 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.py in je projectmap. Zet eventuele invoerbestanden op de plek die in blok 03 staat.
  • Open de geïntegreerde terminal in die projectmap en activeer .venv als 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.