ZZP belasting zaken

Als zelfstandige zonder personeel (ZZP-er) heb je een aantal belastingverplichtingen. Het gaat hier om aanslag- en aangifte-belasting. Respectievelijk komt dit neer op inkomstenbelasting en omzetbelasting (BTW-aangifte).

Inkomstenbelasting dient achteraf betaald te worden - of via een voorschot - over een heel jaar. Hierbij is een nader te bepalen percentage over het belastbaar-inkomen van toepassing.

De omzetbelasting dient per kwartaal ingediend te worden.

Zoals eerder aangegeven dient over het belastbaar-inkomen inkomensafhankelijke belasting betaald te worden. Dit kan weer opgedeeld worden in inkomstenbelasting (35% - 50%) en een bijdrage in het kader van de zorgverzekeringswet (+/- 5%).

Het belastbaar-inkomen bestaat allereerst uit de winst, dit kan berekend worden door de zakelijke kosten van de omzet af te halen.

Winst = omzet - zakelijke kosten

Wanneer de winst is uitgerekend mogen de onderstaande bedragen van de winst afgetrokken worden.

Belastingdienst 2023

Korting Omschrijving Bedrag
Zelfstandigenaftrek > 1225 uur per jaar besteed aan onderneming € 5.030
Startersaftrek < 3 jaar geleden gestart € 2.123
MKB-winstvrijstelling  voor elke ondernemer 14%

Belastbaar-inkomen = winst - kortingen

Afhankelijk van de hoogte van het belastbaar-inkomen wordt het onderstaande percentage toegepast voor de inkomsten belasting.

Belastingdienst 2023

2023 Belastbaar-inkomen Belastingschijf
1 < 73.031 36,93%
2 >= 73.031 49,50%

Belastbaar-inkomen = belastbaar-inkomen * percentage belastingschijf

Tot slot dient van het overgebleven belastbaar-inkomen de heffings- en arbeidskorting te worden toegepast.

De omzetbelasting wordt ook wel BTW genoemd, dit staat voor belasting over toegevoegde waarde en kan maandelijks of per kwartaal ingediend worden.

Alle ontvangen bedragen aan BTW dient afgedragen te worden en zal worden verrekend met de betaalde BTW over zakelijke kosten.

Stel je voor, je hebt een dienst verleend of product verkocht voor € 1.000,00. Boven dit bedrag ontvang je € 210,00 aan BTW. Als je in dezelfde periode bijvoorbeeld een kantoor hebt gehuurd voor € 500, betaal je hier boven op nog eens € 105 aan BTW. Dit betekent dat je uiteindelijk maar € 105 (210 - 105) aan BTW hoeft af te dragen.

Met behulp van het onderstaande python script worden alle PDF-bestanden ingelezen - inclusief submappen - en samengevat in een csv-bestand.

import pdfplumber
import re
import os
import csv

def getAmount(pdf_path):
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text = page.extract_text()
            matches = re.findall(r"€\s*(\d+,\d{2})", text)
            if matches:
                amounts = [float(match.replace(',', '.')) for match in matches]
                return max(amounts) if amounts else None
    return None

def getDescription(pdf_path):
    product_descriptions = ""
    with pdfplumber.open(pdf_path) as pdf:
        for page in pdf.pages:
            text = page.extract_text()
            lines = text.split('\n')
            for line in lines:
                if "Omschrijving" in line or "Productnaam" in line or "Samenvatting" in line:
                    description_index = lines.index(line) + 1
                    if description_index < len(lines):
                        product_descriptions.append(lines[description_index])
    return product_descriptions

def iterateFolders(folder_path, output_csv):
    script_dir = os.path.dirname(os.path.abspath(__file__))

    with open(output_csv, 'w', newline='', encoding='utf-8') as csvfile:
#         csv_writer = csv.writer(csvfile)
        csv_writer = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        csv_writer.writerow(["Subfolder", "Bestandsnaam", "Bedrag", "BTW", "Omschrijving"])

        for root, dirs, files in os.walk(folder_path):
            for file in files:
                if file.endswith('.pdf') and not file.startswith('._') and not file.startswith('~$'):
                    pdf_path = os.path.join(root, file)
                    if root != script_dir:
                        relative_subfolder_path = os.path.relpath(root, script_dir)
                    else:
                        relative_subfolder_path = "Hoofdmap"
                    try:
                        amount = getAmount(pdf_path)
                        vat = amount * 100 / 121
                        file_no_extension = file.replace(".pdf", "")
                        description = str(getDescription(pdf_path))
                        if description == "":
                            description = "onbekend"
                        csv_writer.writerow([relative_subfolder_path , file_no_extension, amount, vat, description])
                        print(relative_subfolder_path, file_no_extension, amount, vat, description)
                    except Exception as e:
                        csv_writer.writerow([relative_subfolder_path, file, 0, 0, "Mislukt"])
                        print(relative_subfolder_path, file_no_extension, 0, 0, "Mislukt")

script_dir = os.path.dirname(os.path.abspath(__file__))
output_csv = "facturen.csv"

execute = input("Wilt u nu alle hoogste bedragen uit de PDF facturen inlezen en exporteren naar het bestand " + output_csv + " j/n? ").lower().strip()

if execute == "j":
    iterateFolders(script_dir, output_csv)
    print ("Het exportbestand is succesvol geëxporteerd: ", script_dir, "/", output_csv)