BetaalbeschermingDetails
- Revisies binnen het pakket zijn gratis.
- Reageer je niet binnen 3 dagen na levering, dan wordt het werk automatisch goedgekeurd.
Het geld wordt bij betaling gereserveerd en pas vrijgegeven als je het werk goedkeurt.

Voorbeeldresultaat
Merging the monthly sales files of 9 shops into one Excel report
How it is run
python merge_sales.py --month 2026-10
2026-11-02 09:14:03 INFO Folder: sales/2026-10, 9 files found
2026-11-02 09:14:03 INFO shop-01.csv: 1,284 rows
2026-11-02 09:14:04 INFO shop-02.xlsx: 967 rows
2026-11-02 09:14:04 WARN shop-07.csv: 3 rows without a price skipped (lines 88, 412, 913)
2026-11-02 09:14:05 INFO Done: 10,412 rows -> report-2026-10.xlsx (sheets "Sales" and "Totals")
Settings, not code
The column names of each shop live in settings.ini, so a new shop or a renamed column is a line there:
[columns]
date = Date, Sale date, Day
product = Product, Item, Name
quantity = Qty, Quantity, Pcs
price = Price, Unit price
A part of the code
def read_shop_file(path: Path, columns: dict[str, list[str]]) -> pd.DataFrame:
"""Reads one shop's file and gives it the report's column names."""
table = pd.read_excel(path) if path.suffix == ".xlsx" else pd.read_csv(path, encoding="utf-8-sig")
renamed = {}
for name, variants in columns.items():
found = next((c for c in table.columns if c.strip() in variants), None)
if found is None:
raise ReportError(f"{path.name}: no column for '{name}' (looked for {', '.join(variants)})")
renamed[found] = name
table = table.rename(columns=renamed)[list(columns)]
table["shop"] = path.stem
return table
Files: a ZIP archive with merge_sales.py (310 lines), settings.ini, requirements.txt and a README with installing Python, running the script and what each message in the log means. The client runs it on their own computer.
Client: a small chain of 9 stationery shops; each shop sends its sales for the month as a CSV or Excel file, with slightly different column names. Task: one script that reads every file in a folder, brings the columns to one shape, and writes a single Excel report with all sales and a sheet of totals by shop.
De klant en alle details zijn verzonnen.
Over deze dienst
Opent iemand op kantoor elke ochtend hetzelfde Excel-bestand, kopieert hij de totalen en zet hij ze in een e-mail, dan kan dit Python-script dat deel overnemen. Het leest de bestanden die je noemt, zoals de verkoopexport van gisteren of een voorraadbestand in een gedeelde map, berekent wat je vraagt (totalen, aantallen, gemiddelden per winkel of product, de rijen boven een grens) en stuurt vanuit je eigen mailaccount een korte e-mail met een nette tabel naar de mensen die je opgeeft, vanaf Standaard met het bestand als bijlage. Het verzendwachtwoord van het mailaccount zet je zelf in de instellingen; het komt nooit in de code. De ontvangers zijn je eigen collega's of klanten, ruim binnen de verzendlimieten van je maildienst. Het rapporteert de cijfers in je bestanden; het controleert of verklaart ze niet.
Wat is inbegrepen
- Wat je krijgtEen ZIP-archief met het Python-script, een README met stapsgewijze instructies en, vanaf Standaard, een instellingenbestand met bestanden, ontvangers en mailinstellingen; de code staat ook op de bestelpagina.
- Jouw cijfersTotalen, aantallen en gemiddelden die jij kiest
- Een leesbare e-mailEen korte tabel die ook op een telefoon opent
- Vanuit je mailboxJe eigen mailaccount, wachtwoord buiten de code
- Bestand als bijlageVanaf Standaard het Excel-bestand of een samenvatting ervan
- Leesbare codeMet commentaar, later makkelijk een cijfer toe te voegen
Hoe het werkt
- 1TaakJe stuurt een voorbeeldbestand en een voorbeeld van de e-mail die je wilt
- 2CodeWij schrijven het script en de handleiding om het uit te voeren
- 3UitproberenJe voert het uit met alleen je eigen adres op de lijst
- 4WijzigingenJe vraagt binnen je pakket om wijzigingen en stuurt een eventuele foutmelding mee
Wat we van je nodig hebben
Een van de Excel-bestanden waaruit het rapport wordt gemaakt, ingekort tot een paar rijen of met gewijzigde cijfers, waar de bestanden verschijnen (een map, een gedeelde schijf) en hoe ze heten, wat de e-mail moet tonen (schrijf hem uit zoals je hem met de hand zou maken), wie hem krijgt en vanuit welk mailaccount (de naam van de maildienst is genoeg; het wachtwoord vul je zelf in). Wanneer hij verstuurd moet worden, en de computer waarop het gaat draaien: Windows, macOS of Linux.
We vragen je:
- Van welke bestanden wordt het rapport gemaakt?
- Wat moet de e-mail tonen?
- Wie krijgt hem, en wanneer?
- Waar gaat het draaien?
Pakketten vergelijken
| Pakketten | BasisEén rapport€ 15 | StandaardRapport met instellingen€ 30 | PremiumRapporttool€ 60 |
|---|---|---|---|
| Levertijd | 1 dag | 2 dagen | 3 dagen |
| Revisies | 1 | 2 | 3 |
| Code | tot 150 regels | tot 400 regels | tot 1.000 regels |
| Codebestanden | 1 | tot 3 | tot 8 |
| Instellingenbestand | Nee | Ja | Ja |
| Duidelijke foutmeldingen en een log | Nee | Ja | Ja |
| Startopties en een handleiding om het volgens een schema te laten draaien | Nee | Nee | Ja |
| Handleiding voor installeren en uitvoeren (README) | Ja | Ja | Ja |
| Taal | Python | Python | Python |
| Bestellen Basis | Bestellen Standaard | Bestellen Premium |
Betaalbescherming
Je betaalt bij het bestellen, maar het geld wordt alleen vrijgegeven voor goedgekeurd werk.
- Vaste prijsDe prijs van het pakket verandert niet meer nadat je hebt betaald.
- Het geld wordt gereserveerdBij betaling wordt het bedrag alleen gereserveerd. Het gaat pas naar de dienst als je het werk goedkeurt.
- Gecontroleerd vóór leveringElk resultaat doorloopt een kwaliteitscontrole voordat het bij jou komt, en je ziet het op de bestelpagina voordat je het goedkeurt.
- Gratis revisiesVraag wijzigingen binnen je briefing aan, zo vaak als het pakket toestaat.
- Goedkeuring na 3 dagenKeur je het werk binnen 3 dagen na levering niet goed en vraag je ook geen wijzigingen, dan wordt het automatisch goedgekeurd. Schrijf je na levering in de chat van de bestelling, dan wacht de bestelling; zodra we hebben geantwoord, kunnen we de 3 dagen opnieuw laten ingaan en melden we dat in de chat.
- Opnieuw doen of volledige terugbetalingPast het resultaat niet bij je briefing en hebben de revisies dat niet opgelost, of duurt het werk meer dan twee keer zo lang als de levertijd, schrijf dan in de chat van de bestelling: we doen het werk opnieuw of betalen het volledige bedrag terug.
Vragen en antwoorden
Verstuurt het het rapport elke dag vanzelf?
Het verstuurt een rapport elke keer dat het draait. Premium bevat een handleiding om het elke ochtend te laten draaien met Taakplanner, cron of launchd; met Basis of Standaard voer je het zelf uit of stel je dat zelf in. De computer moet op dat moment aanstaan.
Met welke mailaccounts werkt het?
Met de meeste diensten die verzenden via SMTP toestaan, en daar horen gangbare zakelijke en persoonlijke mailaccounts bij. Sommige vragen je hiervoor een app-wachtwoord aan te maken; de README laat zien waar.
Mijn bestanden staan in Google Spreadsheets, niet in Excel. Werkt dat?
Daarvoor past een Google Apps Script in de spreadsheet beter, dat vanuit je Gmail verstuurt; zeg het in de briefing, dan schrijven we het in Apps Script.
Kan het het rapport naar mijn klanten sturen?
Ja, naar mensen die het verwachten, zoals klanten die om een dagelijkse voorraadlijst hebben gevraagd. Het is niet bedoeld voor massamailings of voor lijsten die je niet zelf hebt verzameld.
Staat je antwoord er niet bij?