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.
291 lines
10 KiB
Markdown
291 lines
10 KiB
Markdown
---
|
||
name: e-conomic-integration
|
||
description: >
|
||
Integration med e-conomic cloud-bogføring — aktiveres ved "bogfør i e-conomic", "hent fakturaer
|
||
fra e-conomic", "kassekladde", "sync mod e-conomic", "opret kunde i e-conomic", "kontoudtog
|
||
e-conomic", "REST API", "AppSecretToken". Dækker auth, kontoplan, kassekladder, bogførte
|
||
fakturaer, kreditorer, kunder og banktransaktioner.
|
||
version: 0.1.0
|
||
author: radix-accountant
|
||
license: MIT
|
||
metadata:
|
||
hermes:
|
||
tags: [accounting, e-conomic, dansk-regnskab, api, cloud-bogfoering, integration]
|
||
related: [resultatopgoerelse, momsafregning, kontoplan-mapping, coop-bankimport, dansk-csv-import]
|
||
---
|
||
|
||
# e-conomic-integration
|
||
|
||
Integration med **e-conomic** cloud-bogføringssystem via den officielle REST API. Bruges til at hente fakturaer, kunder, kreditorer, bogføre bilag, synce banktransaktioner og afstemme konti — alt på dansk.
|
||
|
||
## Aktiveres ved
|
||
|
||
- "Bogfør denne faktura i e-conomic"
|
||
- "Hent åbne fakturaer fra e-conomic"
|
||
- "Synk banktransaktioner til e-conomic"
|
||
- "Opret kunde X i e-conomic"
|
||
- "Hvad er saldi på konto 1010 i e-conomic?"
|
||
- "Generer kassekladdeline for denne betaling"
|
||
- "Vis alle kreditorer med udestående i e-conomic"
|
||
|
||
## API basics
|
||
|
||
### Base-URL
|
||
```
|
||
https://restapi.e-conomic.com
|
||
```
|
||
|
||
### Auth (kræver to tokens)
|
||
|
||
| Header | Værdi | Hvad det er |
|
||
|---|---|---|
|
||
| `X-AppSecretToken` | `${ECONOMIC_APP_SECRET_TOKEN}` | App-identifikation (din app's hemmelige token) |
|
||
| `X-AgreementGrantToken` | `${ECONOMIC_AGREEMENT_GRANT_TOKEN}` | Aftale-specifik adgang (bruger-godkendt) |
|
||
| `Content-Type` | `application/json` | Altid JSON |
|
||
| `Idempotency-Key` | `<unik UUID>` | Forhindrer dobbeltbogføring ved netværksfejl (POST/PUT) |
|
||
|
||
⚠️ **Tokens skal ALDRIG hardcodes** — brug miljøvariabler eller en secret manager.
|
||
|
||
### Demo-mode (sandbox)
|
||
Til test/udvikling, tilføj `?demo=true` til URL — alle writes deaktiveres (kun GET).
|
||
|
||
## Vigtigste endpoints
|
||
|
||
| Formål | Endpoint | HTTP |
|
||
|---|---|---|
|
||
| List konti (kontoplan) | `/accounts?pagesize=N` | GET |
|
||
| Hent én konto | `/accounts/:accountNumber` | GET |
|
||
| List bogføringsår | `/accounting-years` | GET |
|
||
| List perioder (måneder) i et år | `/accounting-years/:year/periods` | GET |
|
||
| Hent kontosaldo for en periode | `/accounts/:accountNumber/accounting-years/:year/periods/:period/totals` | GET |
|
||
| List kassekladder | `/journals` | GET |
|
||
| Hent kassekladdeline | `/journals/:id/vouchers?voucherNumber=:n` | GET |
|
||
| Opret kassekladdeline (bilag) | `/journals/:id/vouchers/:n/entries` | POST |
|
||
| Bogfør voucher | `/journals/:id/vouchers/:n/book` | POST |
|
||
| List bogførte fakturaer | `/invoices/booked` | GET |
|
||
| Opret bogført faktura | `/invoices/booked` | POST |
|
||
| Hent kunde | `/customers/:customerNumber` | GET |
|
||
| Opret kunde | `/customers` | POST |
|
||
| List kreditorer | `/suppliers` | GET |
|
||
| Opret kreditor | `/suppliers` | POST |
|
||
| List moms-konti | `/vat-accounts` | GET |
|
||
| Hent valutakurser | `/currencies` | GET |
|
||
|
||
⚠️ **Rate limit**: e-conomic har et fair-use loft. Hold dig under 10 requests/sekund.
|
||
|
||
## e-conomics standardkontoplan (4-cifret)
|
||
|
||
| Kontointerval | Type | Bruges til |
|
||
|---|---|---|
|
||
| 1000-1099 | Heading/profitAndLoss | Indtægter, overskrifter |
|
||
| 1100-1199 | ProfitAndLoss | Omsætning undergrupper (varekategorier) |
|
||
| 1200-1299 | ProfitAndLoss | Diverse indtægter |
|
||
| 1300-1399 | ProfitAndLoss | Produktionsomkostninger (COGS) |
|
||
| 1500-1599 | ProfitAndLoss | Lokaleomkostninger |
|
||
| 1600-1699 | ProfitAndLoss | Salgsomkostninger |
|
||
| 1700-1799 | ProfitAndLoss | Administrationsomkostninger |
|
||
| 1800-1899 | ProfitAndLoss | Personaleomkostninger (løn) |
|
||
| 2000-2099 | ProfitAndLoss | Andre driftsomkostninger |
|
||
| 2100-2199 | ProfitAndLoss | Afskrivninger |
|
||
| 2200-2299 | ProfitAndLoss | Finansielle indtægter |
|
||
| 2300-2399 | ProfitAndLoss | Finansielle udgifter |
|
||
| **5500-5899** | **Balance** | **Bank, kasse, tilgodehavender** |
|
||
| 5800-5899 | Balance | Bankkonti (typisk 5820 = drift) |
|
||
| 6000-6899 | Balance | Leverandørgæld, moms, A-skat |
|
||
| 6500-6599 | Balance | Moms (6500 = indgående, 6600 = udgående) |
|
||
| 6900-6999 | Balance | Diverse statuskonti |
|
||
|
||
⚠️ **Dette er e-conomics STANDARD kontoplan** — ikke alle kunder har den. Hent altid kundens egen kontoplan via `/accounts` endpoint.
|
||
|
||
## Momskoder (VAT-accounts)
|
||
|
||
| Kode | Type | Sats | Bruges til |
|
||
|---|---|---|---|
|
||
| `U25` | Udgående | 25% | Salg af varer/ydelser i DK (momspligtig) |
|
||
| `I25` | Indgående | 25% | Køb af varer/ydelser i DK (momsfradrag) |
|
||
| `U0` | Udgående | 0% | Eksport, EU-salg med VIES, moms-fritagne ydelser |
|
||
| `I0` | Indgående | 0% | Køb uden moms (import under bagatelgrænse) |
|
||
| `UEU25` | Udgående | 25% | EU-varesalg (vareleverance til andet EU-land) |
|
||
| `UV25` | Udgående | 25% | Byggeydelser i andre EU-lande (omvendt betalingspligt) |
|
||
|
||
⚠️ Korrekt momskode er afgørende for momsangivelsen — forkert kode kan give skattesmæk.
|
||
|
||
## Kassekladder (Journals)
|
||
|
||
| Journal-ID | Navn (typisk) | Bruges til |
|
||
|---|---|---|
|
||
| 1 | Daglig / Kassekladde | Almindelige bilag (køb, salg, bank) |
|
||
| 2 | Indbetalinger | Kundeindbetalinger (kontra-konto typisk 5820 bank) |
|
||
| 3 | Lønninger | Lønbogføring (entryType `financeVoucher`) |
|
||
| 4 | Moms | Momsafregning |
|
||
| 5 | Afskrivninger | Anlægsaktiver |
|
||
|
||
Journal-ID'er varierer fra kunde til kunde — hent altid `/journals` først.
|
||
|
||
## Workflow: Bogfør et bilag (kassekladdeline)
|
||
|
||
### Eksempel: bogfør kontantkøb af kontorartikler for 1.250,00 kr. inkl. moms (15-06-2026)
|
||
|
||
**Trin 1: Hent kunde-/kassekladde-info**
|
||
```
|
||
GET /journals
|
||
→ Find journal-ID for "Daglig" (typisk 1)
|
||
GET /journals/1/vouchers?voucherNumber=42
|
||
→ Find næste ledige bilagsnummer
|
||
```
|
||
|
||
**Trin 2: Opret kassekladdeline (visuelt, FØR API-kald)**
|
||
```json
|
||
{
|
||
"accountingYear": {
|
||
"year": 2026
|
||
},
|
||
"entries": [
|
||
{
|
||
"customerInvoiceNumber": "",
|
||
"date": "2026-06-15",
|
||
"voucherNumber": 42,
|
||
"text": "Kontorartikler — Kontorbutikken A/S",
|
||
"amount": -1250.00,
|
||
"amountInBaseCurrency": -1250.00,
|
||
"currency": "DKK",
|
||
"account": {
|
||
"accountNumber": 1690
|
||
},
|
||
"contraAccount": {
|
||
"accountNumber": 5820
|
||
},
|
||
"vatAccount": {
|
||
"vatCode": "I25"
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Trin 3: Vis brugeren og bekræft**
|
||
```
|
||
⚠️ Klar til at bogføre:
|
||
Kassekladde: Daglig (#1)
|
||
Bilagsnr: 42
|
||
Dato: 15-06-2026
|
||
Tekst: Kontorartikler — Kontorbutikken A/S
|
||
Debet: 1690 Kontorartikler 1.250,00 kr.
|
||
Kredit: 5820 Bank, drift −1.250,00 kr.
|
||
Momskode: I25 (25% indgående)
|
||
Total: 1.250,00 kr. (inkl. 250,00 kr. moms)
|
||
|
||
Vil du bogføre? (ja/nej)
|
||
```
|
||
|
||
**Trin 4: POST med Idempotency-Key**
|
||
```
|
||
POST /journals/1/vouchers/42/entries
|
||
Headers:
|
||
X-AppSecretToken: ${ECONOMIC_APP_SECRET_TOKEN}
|
||
X-AgreementGrantToken: ${ECONOMIC_AGREEMENT_GRANT_TOKEN}
|
||
Content-Type: application/json
|
||
Idempotency-Key: <UUID v4>
|
||
|
||
Body: [ovenstående entries-array]
|
||
```
|
||
|
||
⚠️ **Bogfør IKKE før brugeren har bekræftet.**
|
||
|
||
## Workflow: Synk banktransaktioner
|
||
|
||
1. **Hent konti** for bank (`/accounts?filter=accountType$eq:balance&pagesize=100`) — find bank-konto (typisk 5820)
|
||
2. **Hent kontosaldo** for indeværende periode:
|
||
```
|
||
GET /accounts/5820/accounting-years/2026/periods/6/totals
|
||
```
|
||
3. **Sammenlign** med bankens faktiske saldo (fra CSV-import eller bank-API)
|
||
4. **Vis diff** og identificer manglende/ukorrekte transaktioner
|
||
5. **Foreslå kassekladdeline** for hver manglende transaktion
|
||
|
||
## Workflow: Hent åbne fakturaer (kunder)
|
||
|
||
```
|
||
GET /invoices/booked?filter=balance$gt:0&pagesize=50
|
||
```
|
||
|
||
Returnerer alle bogførte fakturaer med ubetalt saldo > 0.
|
||
|
||
For hver faktura:
|
||
- `bookedInvoiceNumber` — fakturanr
|
||
- `customer.name` — kundenavn
|
||
- `netAmount` / `grossAmount` — beløb ekskl./inkl. moms
|
||
- `balance` — udestående
|
||
- `dueDate` — forfaldsdato (udledes af `termsNetDays` + `date`)
|
||
- `currency` — DKK/EUR/USD
|
||
|
||
Bruges typisk til:
|
||
- Inkasso-rapporter (forfaldne >30 dage)
|
||
- Aldersopdelt fordringsliste (0-30, 31-60, 61-90, 90+)
|
||
- Likviditetsforecast
|
||
|
||
## Workflow: Opret kunde
|
||
|
||
```json
|
||
POST /customers
|
||
{
|
||
"name": "Coop Danmark A/S",
|
||
"customerGroup": { "customerGroupNumber": 1 },
|
||
"paymentTerms": { "paymentTermsNumber": 1 },
|
||
"vatZone": { "vatZoneNumber": 1 },
|
||
"currency": "DKK",
|
||
"address": "Roskildevej 65",
|
||
"zip": "2620",
|
||
"city": "Albertslund",
|
||
"country": "Denmark"
|
||
}
|
||
```
|
||
|
||
⚠️ **Tjek altid for duplikat** (søg eksisterende kunder først):
|
||
```
|
||
GET /customers?filter=name$like:Coop$Danmark
|
||
```
|
||
|
||
## Almindelige fejl
|
||
|
||
- ❌ **Glemmer Idempotency-Key** ved POST → netværksfejl kan give dobbeltbogføring
|
||
- ❌ **Forkert momskode** (U25 vs UEU25) → SKAT fanger det i krydstjek
|
||
- ❌ **Brug danske datoer i API** — e-conomic bruger ISO `yyyy-MM-dd` i JSON, IKKE dansk `dd-MM-yyyy`
|
||
- ❌ **Beløb uden fortegn-konvention** — negativ = debet, positiv = kredit (modsat dansk regnskabstradition)
|
||
- ❌ **PageSize > 1000** uden pagination
|
||
- ❌ **POST uden først at have hentet den aktuelle voucher** → 409 Conflict
|
||
- ✅ ALTID brug Idempotency-Key ved alle writes
|
||
- ✅ ALTID konverter dansk dd-MM-yyyy → ISO yyyy-MM-dd FØR API-kald
|
||
- ✅ ALTID verificer kontoplanen (`/accounts`) før bogføring — kunden kan have egne konti
|
||
- ✅ ALTID tjek eksisterende kunder/leverandører før oprettelse (dublet-forebyggelse)
|
||
- ✅ ALTID vis bogføringsforslag til brugeren FØR API-kald
|
||
|
||
## Demo-mode anbefaling
|
||
|
||
Brug ALTID `?demo=true` under udvikling:
|
||
- Læs-data virker (GET)
|
||
- Skrive-data deaktiveret (POST/PUT returnerer 405)
|
||
- Forhindrer utilsigtet bogføring i produktion
|
||
- Kan derfor frit browse konti, fakturaer, kunder uden risiko
|
||
|
||
## Eksempel på aktivering
|
||
|
||
**Bruger:** "Bogfør et køb af kontorartikler for 1.250 kr. inkl. moms i e-conomic"
|
||
|
||
**Svar (forkortet):**
|
||
> ✅ Forbinder e-conomic...
|
||
>
|
||
> Klar til bogføring:
|
||
>
|
||
> | Felt | Værdi |
|
||
> |---|---|
|
||
> | Kassekladde | Daglig (#1) |
|
||
> | Bilagsnr | 42 |
|
||
> | Dato | 15-06-2026 |
|
||
> | Tekst | Kontorartikler — Kontorbutikken A/S |
|
||
> | Debet (1690 Kontorartikler) | 1.250,00 kr. |
|
||
> | Kredit (5820 Bank) | −1.250,00 kr. |
|
||
> | Momskode | I25 (indgående 25%) |
|
||
>
|
||
> ⚠️ Bekræft før jeg bogfører. Svaret "ja, bogfør" udløser API-kald med Idempotency-Key.
|