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:
@@ -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.
|
||||
Reference in New Issue
Block a user