Initial import: 10 Radix skills across 3 categories

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.
This commit is contained in:
2026-06-15 14:41:04 +02:00
commit 236053cd7f
30 changed files with 4460 additions and 0 deletions
@@ -0,0 +1,290 @@
---
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.