M-Bus Gateway
← Tilbage til blog
· e-conomic· bogføring· integration· CSV· OIOUBL· regnskab· API· automatisering

e-conomic integration — eksport af varmeregnskab til bogføring

Sådan eksporterer du varmeregnskab fra M-Bus Gateway til e-conomic: CSV-import, OIOUBL-faktura, REST API-integration og automatisk bogføring af á conto og efterbetaling.

Af M-Bus Gateway

e-conomic er Danmarks mest brugte regnskabssystem for SMV. Her er hvordan du forbinder varmeregnskabet fra M-Bus Gateway med e-conomic — fra manuel CSV-import til fuld API-automatisering.


Hvad skal bogføres?

Varmeregnskab genererer typisk tre typer posteringer:

PosteringTiminge-conomic konto
Á conto modtaget fra lejerMånedligt1510 (forudbetalinger)
Fjernvarmefaktura betaltÅrsligt/kvartal3110 (varmeudgifter)
Efterbetaling (fra lejer)Ved årsafregning3900 (varmeindtægter)
Tilbagebetaling (til lejer)Ved årsafregning3900 (varmeindtægter)

Metode 1: CSV-import (ingen API-opsætning)

Platformen eksporterer afregningslinjer som CSV med UTF-8 BOM (dansk Excel-kompatibel):

Eksporter fra: /portal/settlements → Eksporter CSV

CSV-format:
lejlighed_id, lejer_navn, adresse, periode_start, periode_slut,
total_kr, a_conto_kr, efterbetaling_kr, tilbagebetaling_kr, status

Import til e-conomic:

  1. Download CSV fra portalen
  2. e-conomic → Rapporter → Importer → CSV
  3. Map kolonner til e-conomic kontoplan
  4. Batch-opret debitorfakturaer

Fordel: Ingen teknisk opsætning. Ulempe: Manuelt trin pr. periode.


Metode 2: OIOUBL-faktura (direkte til e-conomic)

e-conomic understøtter OIOUBL 2.1 XML-import via NemHandel/EAN:

# Download OIOUBL-faktura pr. afregning:
GET /api/v1/settlements/{settlement_id}/oioubl

# Response: UBL 2.1 Invoice XML med:
# - InvoiceLine pr. lejlighed (varme-andel)
# - TaxTotal (ingen moms på varme til private)
# - PaymentTerms (14 dage standard)
# - AccountingSupplierParty (din virksomhed)
# - AccountingCustomerParty (lejers data)

Import til e-conomic:

  1. Download OIOUBL XML
  2. e-conomic → Køb/Salg → Importer faktura → Upload XML
  3. e-conomic matcher automatisk til debitorer

Krav: Ejendom skal have EAN-nummer sat i portalen.


Metode 3: e-conomic REST API (fuld automatisering)

e-conomic har et komplet REST API (app.e-conomic.com/api).

Opsætning

# Installer e-conomic Python SDK:
pip install economic-rest

# Eller brug requests direkte:
import requests

ECONOMIC_BASE = "https://restapi.e-conomic.com"
HEADERS = {
    "X-AppSecretToken": "demoToken",    # Din app-token
    "X-AgreementGrantToken": "demoToken",  # Kundens token
    "Content-Type": "application/json",
}

Opret debitor (lejer) automatisk

def create_or_get_debtor(lejer_navn: str, lejer_email: str) -> dict:
    # Søg eksisterende debitor
    r = requests.get(
        f"{ECONOMIC_BASE}/customers",
        params={"filter": f"email$eq:{lejer_email}"},
        headers=HEADERS,
    )
    existing = r.json().get("collection", [])
    if existing:
        return existing[0]

    # Opret ny debitor
    payload = {
        "name": lejer_navn,
        "email": lejer_email,
        "currency": "DKK",
        "customerGroup": {"customerGroupNumber": 1},
        "paymentTerms": {"paymentTermsNumber": 14},  # 14 dage netto
        "vatZone": {"vatZoneNumber": 1},  # Indland, ingen moms
    }
    r = requests.post(f"{ECONOMIC_BASE}/customers", json=payload, headers=HEADERS)
    return r.json()

Opret faktura for efterbetaling

def create_settlement_invoice(settlement_line: dict) -> str:
    """Opretter e-conomic-faktura for én lejlighedsafregning."""
    customer = create_or_get_debtor(
        settlement_line["tenant_name"],
        settlement_line["tenant_email"],
    )
    payload = {
        "date": settlement_line["sent_at"][:10],
        "currency": "DKK",
        "customer": {"customerNumber": customer["customerNumber"]},
        "layout": {"layoutNumber": 17},  # Din fakturalayout
        "lines": [{
            "lineNumber": 1,
            "product": {"productNumber": "VARME-EXTRA"},
            "description": (
                f"Varmeefterregning {settlement_line['period_start']} "
                f"– {settlement_line['period_end']}, "
                f"{settlement_line['address']}"
            ),
            "quantity": 1,
            "unitNetPrice": settlement_line["balance_kr"],  # Positivt = efterbetaling
        }],
    }
    r = requests.post(f"{ECONOMIC_BASE}/invoices/drafts", json=payload, headers=HEADERS)
    invoice = r.json()

    # Book faktura med det samme:
    r2 = requests.post(
        f"{ECONOMIC_BASE}/invoices/booked",
        json={"draftInvoice": {"draftInvoiceNumber": invoice["draftInvoiceNumber"]}},
        headers=HEADERS,
    )
    return r2.json().get("bookedInvoiceNumber")

Webhook-integration (real-time)

Platformen udsender webhooks ved nøglehændelser:

// POST til din webhook-URL ved settlement afsendelse:
{
  "event": "settlement.sent",
  "settlement_id": "SET-2025-001",
  "property_id": "EJD-001",
  "period": "2024-06-01/2025-05-31",
  "lines": [
    {
      "unit_id": "U-001",
      "tenant_name": "Anders Jensen",
      "tenant_email": "anders@example.com",
      "total_kr": 18420,
      "a_conto_kr": 21600,
      "balance_kr": -3180,  // Negativ = tilbagebetaling
      "address": "Eksempelvej 1, 1. tv."
    }
  ]
}
# Flask webhook-modtager der poster til e-conomic:
from flask import Flask, request
app = Flask(__name__)

@app.route("/webhook/settlement", methods=["POST"])
def handle_settlement():
    data = request.json
    for line in data["lines"]:
        if line["balance_kr"] > 0:
            # Efterbetaling → opret salgsfaktura
            create_settlement_invoice(line)
        elif line["balance_kr"] < 0:
            # Tilbagebetaling → opret kreditnota
            create_credit_note(line)
    return {"status": "ok"}, 200

Bogføring af fjernvarmefaktura

def book_district_heating_invoice(annual_input: dict):
    """Bogfør årets fjernvarmefaktura som kreditorfaktura."""
    payload = {
        "date": annual_input["invoice_date"],
        "currency": "DKK",
        "supplier": {"supplierNumber": 5001},  # Din fjernvarmeleverandør
        "lines": [{
            "account": {"accountNumber": 3110},  # Varmeudgifter
            "description": f"Fjernvarme {annual_input['period']}",
            "debitAmount": annual_input["total_kr"],
        }],
    }
    requests.post(f"{ECONOMIC_BASE}/supplier-invoices/drafts", json=payload, headers=HEADERS)

Kontoplan — anbefalede konti

KontoNavnType
1510Forudbetalinger varme (á conto)Passiv (kortsigtet)
3110Varmeudgifter (fjernvarme)Udgift
3900Varmeindtægter (efterbetaling)Indtægt
3901Tilbagebetaling varmeUdgift

Business Central og andre systemer

Princippet er det samme for Microsoft Business Central, Uniconta og Billy:

SystemAPICSVOIOUBL
e-conomic✅ REST
Business Central✅ OData
Uniconta✅ REST⚠️
Billy✅ REST
Dinero✅ REST

Konklusion

e-conomic integration med varmeregnskabet kan sættes op på tre niveauer: manuel CSV (ingen opsætning), OIOUBL-faktura (standardformat) eller fuld REST API-automatisering med webhooks. De fleste private udlejere starter med CSV og opgraderer til API efterhånden som porteføljen vokser.

Se dataeksport-guide eller opret API-nøgle i portalen.