236053cd7f
Kategoriserer danske regnskabs-/ERP-skills, ERP-data-afstemnings-
skill og to devops-workflows (gitea-issue-agent, kanban-workflows)
som Radix-medlemmers AI-agenter kan dele.
Struktur:
skills/<kategori>/<skill-navn>/SKILL.md
skills/<kategori>/<skill-navn>/{references,templates,scripts}/
Indekseret af index.json (genereret af scripts/rebuild_index.py).
Kør `python3 scripts/rebuild_index.py --check` i CI for at fange
synkroniseringsfejl.
179 lines
5.7 KiB
Markdown
179 lines
5.7 KiB
Markdown
---
|
||
name: dansk-csv-import
|
||
description: >
|
||
Importér danske bank-CSV-eksporter (Nordea, Danske Bank, Jyske Bank, Sydbank) og
|
||
e-conomic-bankimport-format — aktiveres ved "importér CSV", "bankudtog", "kontoudtog",
|
||
"Nordea eksport", "Danske Bank CSV", "Jyske Bank eksport", "e-conomic bankimport".
|
||
version: 0.2.0
|
||
author: radix-accountant
|
||
license: MIT
|
||
metadata:
|
||
hermes:
|
||
tags: [accounting, dansk-regnskab, csv-import, bank, nordea, danske-bank, jyske-bank, e-conomic]
|
||
related: [kontoplan-mapping, coop-bankimport, momsafregning, e-conomic-integration]
|
||
---
|
||
|
||
# Dansk CSV-import (bankudtog)
|
||
|
||
Håndterer import af **danske bank-CSV-eksporter** til Radix ERP med korrekt detektering af:
|
||
- Bank (Nordea, Danske Bank, Jyske Bank, Sydbank, Nykredit, Arbejdernes Landsbank)
|
||
- Datoformat (dansk `dd-MM-yyyy` eller ISO `yyyy-MM-dd`)
|
||
- Decimalformatering (komma som decimal — dansk standard)
|
||
- Feltsemikolon (dansk CSV-standard, ikke komma)
|
||
- Tegnsæt (Latin1, UTF-8 med/uden BOM)
|
||
|
||
## Aktiveres ved
|
||
|
||
- "Importér denne Nordea-CSV til Radix"
|
||
- "Jyske Bank har sendt kontoudtog — hjælp med at indlæse det"
|
||
- "Parse denne bankeksport"
|
||
- "Vis alle transaktioner fra marts 2026 i denne CSV"
|
||
|
||
## Genkendte bankformater
|
||
|
||
### Nordea (Erhverv)
|
||
```
|
||
Bogføringsdato;Tekst;Beløb;Saldo;Valuta;Reference
|
||
01-06-2026;"Nets *12345";-123,45;12.345,67;DKK;
|
||
```
|
||
- Separator: `;`
|
||
- Encoding: Latin1
|
||
- Beløb: dansk format (`-123,45`)
|
||
- Dato: `dd-MM-yyyy`
|
||
|
||
### Danske Bank
|
||
```
|
||
Dato;Tekst;Beløb;Saldo
|
||
01-06-2026;"MobilePay - Anders Hansen";-250,00;5.000,00
|
||
```
|
||
- Separator: `;`
|
||
- Encoding: UTF-8 med BOM
|
||
- Beløb: dansk format
|
||
- Dato: `dd-MM-yyyy`
|
||
|
||
### Jyske Bank
|
||
```
|
||
Dato;Beskrivelse;Beløb;Saldo
|
||
01-06-2026;"POS DSB 1234 København";-89,00;3.456,78
|
||
```
|
||
- Separator: `;`
|
||
- Encoding: Latin1
|
||
- Dato: `dd-MM-yyyy`
|
||
- Negative beløb: kan være `-89,00` eller `(89,00)` — begge understøttes
|
||
|
||
### Sydbank
|
||
```
|
||
Bogføringsdato;Posteringstekst;Beløb;Saldo
|
||
01-06-2026;"Coop Danmark A/S Bankbetaling";-12.345,67;45.678,90
|
||
```
|
||
- Separator: `;`
|
||
- Encoding: Latin1
|
||
- Dato: `dd-MM-yyyy`
|
||
|
||
### e-onomic bankimport-format
|
||
```
|
||
Dato;Tekst;Beløb;Saldo;Modkonto;Valuta;Bankkonto
|
||
01-06-2026;"Nets *12345";-123,45;12.345,67;5820;DKK;5508 8765432
|
||
```
|
||
- Separator: `;`
|
||
- Encoding: UTF-8 med BOM
|
||
- **Modkonto** (e-conomics kontonr, fx 5820 for bank) — bruges direkte ved bogføring
|
||
- **Bankkonto** i dansk 14-cifret format (reg.nr. + kontonr) — verificer mod kundens egen bankaftale
|
||
- Dato: `dd-MM-yyyy` (men konverter til ISO `yyyy-MM-dd` før API-kald til e-conomic)
|
||
|
||
## Workflow
|
||
|
||
1. **Modtag CSV-fil** (enten via sti eller indhold direkte i chat)
|
||
2. **Detektér bank-format** ud fra header (kolonnenavne) — spørg brugeren hvis usikker
|
||
3. **Detektér encoding** (tjek for BOM, prøv Latin1, UTF-8)
|
||
4. **Parse CSV** med korrekt separator (`;` for dansk)
|
||
5. **Normaliser data**:
|
||
- Datoer → `dd-MM-yyyy` (ensret formattering)
|
||
- Beløb → Python float (erstat `,` med `.`, fjern tusindtalsseparator)
|
||
- Negativ beløb → negativ tal (fjern evt. parentesnotation)
|
||
- Tekst → trim, fjern dobbelte mellemrum
|
||
6. **Vis preview** med de første 5-10 transaktioner (bed brugeren bekræfte format)
|
||
7. **Vis statistik**:
|
||
- Antal transaktioner
|
||
- Periode (første/sidste dato)
|
||
- Total ind, total ud, slutbalance
|
||
- Kontroller at slutbalance matcher det brugeren forventede
|
||
8. **Identificér dubletter** (samme dato + beløb + tekst)
|
||
9. **Kortlæg konti** (se kontoplan-mapping skill) — eller lad brugeren vælge
|
||
10. **Generer klar-til-import JSON** til Radix ERP API
|
||
|
||
## Eksempel-aktivering
|
||
|
||
**Bruger:** *indsætter en filsti eller indhold:*
|
||
```
|
||
Bogføringsdato;Tekst;Beløb;Saldo;Valuta
|
||
01-06-2026;"Nets *12345 MobilePay";-123,45;12.345,67;DKK
|
||
02-06-2026;"Coop Danmark";-5.678,90;6.666,77;DKK
|
||
...
|
||
```
|
||
|
||
**Svar:**
|
||
> ✅ Genkendt format: **Nordea Erhverv** (Latin1, semikolon-separeret)
|
||
>
|
||
> | Dato | Tekst | Beløb | Saldo |
|
||
> |---|---|---|---|
|
||
> | 01-06-2026 | Nets *12345 MobilePay | −123,45 | 12.345,67 |
|
||
> | 02-06-2026 | Coop Danmark | −5.678,90 | 6.666,77 |
|
||
> | ... |
|
||
>
|
||
> **Statistik:**
|
||
> - Periode: 01-06-2026 til 30-06-2026
|
||
> - Transaktioner: 47
|
||
> - Total ind: 8.901,23 kr.
|
||
> - Total ud: 23.456,78 kr.
|
||
> - Slutbalance: 6.666,77 kr.
|
||
>
|
||
> ⚠️ **1 mulig dublet** fundet (samme dato, beløb og tekst på række 12 og 23). Skal jeg springe dubletten over ved import?
|
||
|
||
## Almindelige CSV-fælder
|
||
|
||
- ❌ Latin1-filer åbnet som UTF-8 → `æ` i stedet for `æ`
|
||
- ❌ Datoer med `.` (amerikansk) i stedet for `-` (dansk)
|
||
- ❌ Beløb med `.` som tusindtalsseparator ignoreret
|
||
- ❌ Negative beløb som `(123,45)` (parentes) ikke håndteret
|
||
- ❌ Header-række fejlfortolket som data
|
||
- ❌ Linjeskift i `Tekst`-felt (fx "Coop\nDanmark") brækker parser
|
||
- ✅ ALTID detektér encoding først (BOM, Latin1, UTF-8)
|
||
- ✅ ALTID vis preview før import
|
||
- ✅ ALTID vis statistik og balancesum til kontrol
|
||
|
||
## Radix ERP API-endpoint (for import)
|
||
|
||
## Bogføringssystem-integration (efter import)
|
||
|
||
Efter import kan transaktioner bogføres direkte i e-conomic (se `e-conomic-integration` skill):
|
||
|
||
```
|
||
POST /journals/{journalId}/vouchers/{voucherNumber}/entries
|
||
Headers:
|
||
X-AppSecretToken: ${ECONOMIC_APP_SECRET_TOKEN}
|
||
X-AgreementGrantToken: ${ECONOMIC_AGREEMENT_GRANT_TOKEN}
|
||
Idempotency-Key: <UUID v4>
|
||
```
|
||
|
||
Eksempel-payload genereret fra importeret CSV:
|
||
```json
|
||
{
|
||
"accountingYear": {"year": 2026},
|
||
"entries": [
|
||
{
|
||
"date": "2026-06-01",
|
||
"text": "Nets *12345 MobilePay",
|
||
"amount": -123.45,
|
||
"amountInBaseCurrency": -123.45,
|
||
"currency": "DKK",
|
||
"account": {"accountNumber": 1690},
|
||
"contraAccount": {"accountNumber": 5820},
|
||
"vatAccount": {"vatCode": "I25"}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
⚠️ **Bekræft ALTID med brugeren før bulk-import** — vis diff (antal transaktioner, totaler) og kræv eksplicit "ja, importer" før API-kald.
|