--- 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` | `` | 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: 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.