sevenweirdpeople 50 30 00 80

Case: Fakturabehandling

Case: Byggematerialefirma sparede 500 timer/år på fakturabehandling

Antal ord
ca. 700
Læsetid
ca. 3 minutter
Sværhedsgrad
Mellem
Emner
Fakturabehandling, Automatisering, Procesoptimering
Målgruppe
Teknikere, Økonomiansvarlige, IT-beslutningstagere

01 — Problem

Et distributionsfirma for byggematerialer havde:

  • 12 forskellige fakturalinjer pr. ordre
  • Manuel matching af indkøbsordrer mod fakturaer
  • 3 medarbejdere brugte 15 timer/uge på fejlrettelser

02 — Vores tiltag

1. Standardisering af fakturalinjer (Fra 12 → 3 kategorier)

Problem:
Fakturaer indeholdt overflødige detaljer:

  • 6-8 linjer for emballagegebyrer (kasse, tape, polstring, etc.)
  • 4 linjer for forskellige fragttyper
  • 2 linjer for "diverse tillæg"

Løsning:
Vi implementerede en faktura-normaliseringsengine:

public class InvoiceNormalizer
{
    public NormalizedInvoice Normalize(SupplierInvoice rawInvoice)
    {
        return new NormalizedInvoice
        {
            Materials = SumAllMaterialLines(rawInvoice.Lines),
            Shipping = CalculateShippingTotal(rawInvoice.Lines),
            Surcharges = CalculateSurcharges(rawInvoice.Lines)
        };
    }

    private decimal SumAllMaterialLines(List<InvoiceLine> lines)
    {
        // Antager InvoiceLine har Amount og Category properties
        return lines.Where(l => l.Category == "MATERIAL")
                   .Sum(l => l.Amount);
    }
    // ... tilsvarende for Shipping og Surcharges
}

Effekt:

  • 90% færre linjekonflikter ved matching
  • Enkelt sted at opdatere priser (ingen "jagten" på specifikke linjer)
  • Automatisk validering af afvigelser (f.eks. hvis "MATERIAL" beløb > ordreværdi)

2. Automatisk matching baseret på ordrenummer

Gammel proces:
Medarbejdere skulle manuelt:

  • Åbne ordresystem
  • Søge på leverandørnavn
  • Matche datoer og beløb

Ny løsning:
Vi byggede en faktura-auto-matcher med:

public async Task<MatchResult> MatchInvoiceAsync(string orderNumber, decimal amount)
{
    // Antager _orderRepo findes og har GetByNumberAsync
    var order = await _orderRepo.GetByNumberAsync(orderNumber);

    if (order == null)
        return MatchResult.NotFound();

    // Tolerance for 2% afvigelse i beløb
    // Antager order har TotalAmount property
    if (Math.Abs(order.TotalAmount - amount) > order.TotalAmount * 0.02m)
        return MatchResult.AmountMismatch();

    return MatchResult.Success(order);
}

Optimeringer:

  • Fuzzy matching på ordrenumre (f.eks. "PO-1234" ≡ "1234")
  • Automatisk valutaomregning for internationale ordrer
  • Machine learning til at identificere hyppige matching-mønstre

Resultat:

  • Fra 15 → 2 minutter pr. faktura
  • False positives < 0,5%

3. Én-kliks godkendelse for 80% af fakturaer

Flow:

graph TD
    A[Faktura modtaget] --> B{Automatisk match?}
    B -->|Ja| C[Vis "Godkend" knap]
    B -->|Nej| D[Send til manuel review]
    C --> E[Log godkendelse i blockchain]

Teknisk implementering:

// Antager ASP.NET Core Controller kontekst
[HttpPost]
public async Task<IActionResult> ApproveInvoice(string invoiceId, [FromServices] IBlockchainService blockchain)
{
    // Antager _invoiceRepo findes
    var invoice = await _invoiceRepo.GetAsync(invoiceId);

    // Valider at fakturaen er klar til godkendelse
    // Antager Invoice har Status property og Approve metode
    if (invoice.Status != InvoiceStatus.PendingApproval)
        return BadRequest();

    // Gem uforanderlig transaktion
    // Antager IBlockchainService findes
    var txHash = await blockchain.LogApprovalAsync(
        invoiceId,
        User.Identity.Name, // Kræver bruger er logget ind
        DateTime.UtcNow
    );

    invoice.Approve(txHash);
    await _invoiceRepo.UpdateAsync(invoice);

    return Ok();
}

Sikkerhedsforanstaltninger:

  • Fire-and-forget arkitektur - Godkendelser behandles asynkront
  • Blockchain-audit trail - Uforfalskelig logning
  • Separat godkendelsesflow for fakturaer > 50.000 kr

03 — Samlet virkning

Disse tiltag sammen bidrog til:

Tidsbesparelser:

AktivitetFørEfterBesparelse
Fakturabehandling12 min2 min83%
Fejlrettelse3 timer/uge0,5 timer/uge85%

Økonomi:

  • 500 timer/år ⇨ ~375.000 kr sparet (ved 750 kr/time)
  • Reduceret cashflow-tid fra 45 → 22 dage
  • Nul papirfakturaer efter 6 måneder

Kvalitetsgevinster:

  • Leverandørers tilfredshed: +40%
  • Regnskabsfejl: Fra 5% → 0,8%

04 — Hvorfor det virkede

  • Vi angreb kompleksiteten ved kilden (fakturalinjer) i stedet for at bygge komplekse workarounds
  • Brugte eksisterende data smartere (ordrenumre var allerede unikke nøgler)
  • Designet for "happy path" - optimerede 80% af tilfældene i stedet for at overengineere for edge cases
Den største innovation var ikke teknologien - men at genoverveje, hvad der faktisk var nødvendigt at validere.

Læs også

Mere fra os.

Ring. Vi tager den.

Ring eller skriv — vi lytter og hjælper gerne.