Logo
Afbeelding

Facturen in de administratie

Geschreven door The Audit Analytics | 3 minuten

Een vaak voorkomende analyse is om te achterhalen of de inkoopfacturen ook allemaal volledig en juist terecht zijn gekomen in de administratie. Waarom? Nou, je wil natuurlijk geen spookfacturen missen, en dubbele boekingen kunnen opsporen en simpelweg zeker weten dat wat binnen is gekomen is ook netjes geboekt is.

Analyse leveranciers

Welke data hebben we nodig?

Om dit te checken, hebben we twee datasets nodig:

  1. Inkoopfacturen – Dit is de lijst met alle ontvangen inkoopfacturen, inclusief factuurnummers, leveranciers, factuurbedragen en factuurdata. Download hier de dummy data.
  2. Boekingen in de financiële administratie – Dit is de lijst met alle geboekte inkoopfacturen, met de bedragen en factuurnummers zoals ze in de administratie staan. Download hier de dummy data.

Nu is de vraag: hoe matchen we deze lijsten en vinden we afwijkingen?


Stap-voor-stap analyse met Python

Laten we Python gebruiken om deze controle uit te voeren. We gaan kijken naar:

  • Ontbrekende facturen
  • Dubbele boekingen
  • Verschillen in bedragen

Stap 1: Dummy data inladen

Eerst laden we de dummy datasets in.

import pandas as pd

# Inlezen van de auditfile (boekingen) en factuurbestand met parsing van datums
boekingen = pd.read_csv("dummy_auditfile_accounts_payable.csv", parse_dates=["Date"])
facturen = pd.read_csv("dummy_invoices_analysis.csv", parse_dates=["InvoiceDate"])

# We filteren alleen de inkoopboekingen, omdat we weten dat deze geboekt worden op rekening 2000.
inkoop_boekingen = boekingen[boekingen['AccountNumber'] == 2000]

# Samenvoegen van de bestanden op basis van InvoiceNumber
# Met 'outer' join nemen we alle gegevens uit beide bestanden mee, inclusief mismatches.
df = inkoop_boekingen.merge(facturen, on="InvoiceNumber", how="outer", suffixes=("_factuur", "_auditfile"))

# Toon de eerste paar regels van de gecombineerde dataset om te controleren of de merge correct is verlopen
print(df.head())

Analyse 1: Ontbrekende facturen opsporen

Vaak redeneren we vanuit de auditfile; zien we de boekingen ook terug in de facturen?

# Identificeren van boekingen zonder een corresponderende factuur
boekingen_zonder_factuur = df[df['TotalAmount'].isna()].reset_index()
print(boekingen_zonder_factuur)

Het kan in sommige gevallen ook zinvol zijn op inkoopfacturen te bekijken die niet geboekt zijn.

# Identificeren van boekingen zonder een corresponderende factuur
ontbrekend = facturen[~facturen['InvoiceNumber'].isin(boekingen['InvoiceNumber'])]
print(ontbrekend)

Wie scherp is, ziet dat we bij deze laatste het samengevoegde dataframe helemaal niet gebruiken, maar direct met de brontabellen werken. Dat wilde ik je ook even laten zien. Dit kan alleen om te kijken of bepaalde waarden wel of niet voorkomen. Om te vergelijken (zoals bij analyse 3) is het wel veel verstandiger om een samengevoegde tabel te hebben.

Analyse 2: Dubbele boekingen zoeken

Soms worden facturen per ongeluk dubbel geboekt. We checken of een factuurnummer meer dan één keer voorkomt in de boekingen.

dubbele_boekingen = boekingen[boekingen.duplicated('InvoiceNumber', keep=False)]
print(dubbele_boekingen)

Analyse 3: Afwijkende bedragen detecteren

Nu kijken we of de geboekte bedragen overeenkomen met de oorspronkelijke facturen.

# Identificeren van afwijkingen tussen de factuurbedragen en de geboekte bedragen
# Hierbij wordt ook rekening gehouden met negatieve bedragen (crediteurenfacturen)
afwijkingen = df[(df['Amount']*-1 != df['TotalAmount']) & (~df['TotalAmount'].isna())]
print(afwijkingen)

In deze dummy set hebben we behoorlijk wat mismatches gezet. Om het totale verschil te kunnen berekenen kun je het volgende doen:


totaleAfwijking = afwijkingen.groupby("InvoiceNumber").apply(lambda x: (x["Amount"] - x["TotalAmount"])).sum()
print(totaleAfwijking)

Conclusie

Dit soort checks helpen enorm bij het detecteren van fouten en het implemteren was niet erg lastig toch? Download de dummyset en probeer het zelf uit!