NO
Macct

Accounting rules in Macct

Overview of which Norwegian laws, standards and industry conventions Macct enforces automatically. Written for auditors, bookkeepers, the Norwegian Tax Administration — or anyone who wants to verify what the system actually does. The statuses implemented, partial and missing reflect the actual code on the master branch.

The Norwegian Bookkeeping Act (Act 2004-11-19 no. 73)

RuleRequirementIn Macct
§ 4 nr. 1 Debit = credit on every voucher Hard-validated in the bookkeeping service. Unbalanced vouchers are rejected with a clear error message.
§ 5 Voucher requirements: date, description, counterparty, amount Validated via DTO validation and the service layer.
§ 9 Chart of accounts NS 4102 with 260+ accounts pre-populated.
§ 10 Traceability — recorded data must be traceable both from documentation to reporting and the other way Implemented. Vouchers are recorded with opprettet_av_bruker_id + timestamp, exchange rates have a documented source, voucher numbers are monotonic per company, and all material events (login, IDOR attempts, sanity discrepancies, approvals) are written to an immutable audit log.
§ 10 Tracking changes to master data (customers, suppliers, payroll, user permissions) Implemented via an audit trigger in the storage layer. Every change is stored with a before/after snapshot (JSON) plus who and when.
§ 11 Specifications: general ledger, customer sub-ledger, supplier sub-ledger Implemented as reports, with a daily sanity job that verifies the general ledger and the sub-ledgers match exactly.
§ 13 Retention 5 years Implemented. Vouchers are immutable after creation, regardless of whether the period is open or closed. Modification and deletion are blocked at the storage layer. Corrections are made through reversal entries.
§ 14 Correction via reversal, not deletion Implemented for vouchers — reversal creates a counter-voucher with debit/credit swapped, the original is kept unchanged, and double reversal is blocked. Partial for invoices — once sent, the invoice is immutable, and the posting can be reversed via a reversal voucher. A dedicated credit-note flow with its own invoice number is on the roadmap.

The Norwegian Accounting Act (Act 1998-07-17 no. 56)

RuleRequirementIn Macct
§ 1-6 Small entity (after 1 Nov 2024): turnover ≤ NOK 168M, total assets ≤ NOK 84M, ≤ 50 FTEs. At most one threshold may be exceeded for two years in a row. Checked in Nrs8Validator (all three conditions). Macct is primarily designed for entities below these thresholds.
§ 4-1 Fundamental principles: accrual, matching, prudence (lowest value), consistency Built in. Revenue is recognised on invoicing (not payment), depreciation matches cost over useful life, open foreign-currency receivables are revalued at year-end.
§ 4-3 Congruence principle — results must flow through the income statement, not directly against equity Hard-validated. Direct postings to 2050/2070/2080 are blocked, except for opening entries, year-end closing and reversals.
§ 4-9 Translation of foreign-currency items at the balance-sheet-date rate Implemented in year-end closing. Open receivables and payables are revalued at the 31 Dec rate; the unrealised difference is posted to 8060 (gain) or 8160 (loss) with full audit trail.
§ 5-2 Fixed assets are capitalised and depreciated Soft warning for amounts > NOK 30,000 on accounts 6500-6599 (cf. Tax Act § 14-40). The depreciation schedule is manual.

NRS 8 — Norwegian Accounting Standard for small entities

Simplification/requirementHow in Macct
Simplified note requirements (8 mandatory notes) Generated in the annual accounts via AarsregnskapService.
No cash-flow statement required Omitted — we do not generate this for the small-entity flow.
Entertainment — deduction limit NOK 592 per person (2026, Tax Payment Regulation § 6-46-1) Soft warning on account 7330 (Entertainment) when the amount exceeds NOK 592. The user gets an explanation and is referred to 7350 (gifts, non-deductible) for the excess.
Prudence for receivables — lowest value Partial via year-end revaluation. Manual assessment of bad-debt risk per customer is not automated.
Audit obligation — can be opted out if turnover < NOK 7M + assets < NOK 27M + < 10 FTEs (Companies Act § 7-6) Checked in Nrs8Validator — shows the status and refers to the Register of Business Enterprises for the actual opt-out.

The Norwegian Tax Act (Act 1999-03-26 no. 14)

RuleRequirementHow in Macct
§ 14-40 Capitalisation threshold NOK 30,000 excl. VAT for fixed assets Soft warning for amounts > NOK 30,000 on accounts 6500-6599 (tools, fixtures, operating equipment, software) — where the WorldCom pattern typically arises. The user is referred to 12xx capitalisation. For foreign-currency vouchers the amount is shown in both NOK and the original currency.
§ 14-41 Declining-balance depreciation, groups A-J with fixed rates (10–30 %) Not automated — must be entered manually with the correct rate per group.
§ 6-1 Deductions in business activity Implemented via NS 4102 posting. The posting suggestion points to the right deduction account based on text analysis.
Corporate tax 22 % (AS, 2026) Posted in year-end closing on account 8300 (Tax expense) → 2500 (Tax payable) for AS.

The Norwegian VAT Act

RuleRequirementHow in Macct
§ 2-1 Registration obligation — turnover > NOK 50,000 in the past 12 months Setting — the company is marked VAT-liable via selskap_innstillinger. There is no automatic monitoring of the threshold.
VAT rates: 25 % (high), 15 % (food), 12 % (low, transport/culture), 0 % (export/exempt) All rates as SAF-T codes (3, 31, 33, 5, 52, 6, 1, 11, 13, 14...). VAT is auto-calculated per line.
Bi-monthly return (6 terms/year) Implemented via /api/rapport/mva and posting to account 2740 (settlement account).
Term lock after the VAT return is filed Implemented — regnskapsperiode.mva_lukket is set when the VAT settlement is posted. Subsequent VAT vouchers in the term are blocked.
SAF-T v1.30 (mandatory from Jan 2025) Export via SaftExportService.
Account / VAT-code consistency Hard-validated — 1610-1619 must use an inbound VAT code, 27xx (except 2740) must use an outbound code, 3xxx allows only outbound, 4xxx-7xxx allows only inbound.

NS 4102 — Norwegian Standard Chart of Accounts

ComponentIn Macct
Account classes 1-8 (assets, equity+liabilities, sales revenue, cost of goods, payroll, depreciation, operating, finance+tax) 260+ accounts pre-populated and enforced.
Sub-ledger accounts 1500 (customer) / 2400 (supplier) require per-partner specification Hard-validated — lines on 1500/2400 without a partner are rejected both in the bookkeeping service and at the storage layer.
VAT clearing accounts 1610-1619 / 27xx Built in — used for automatic VAT posting.

Multi-currency

Rule/requirementIn Macct
General ledger in NOK Built in — bilagslinje.debet/kredit is always in NOK; converted via formula at write time.
Daily rate from Norges Bank Auto — @Scheduled cron 17:30 UTC on weekdays; lastNObservations=30 (~6 weeks of history).
Rate source must be documented for manual overrides (Bookkeeping Act § 7) Hard-validated — when the user overrides the auto-fetched rate, an explicit source text is required (e.g. "DNB exchange note no. X-12345"). Auto-fetched rates are tagged "Norges Bank YYYY-MM-DD".
Realised currency difference at payment Auto-posted to 8040 (currency gain) or 8150 (currency loss) when the payment rate differs from the invoice rate.
Unrealised currency difference at 31 Dec (Accounting Act § 4-9) Implemented at year-end. Open receivables and payables are revalued at the balance-sheet-date rate; the difference is posted to 8060 (gain) or 8160 (loss).
4 fields per accounting line: valutakode, valutakurs, belop_valuta, belop_nok NOT NULL on bilagslinje, faktura, fakturalinje, faktura_betaling. Default NOK / 1.0 / amount / amount.
Conversion factor (1 vs 100 for JPY/HUF/KRW) On the currency master — valuta.antall_per_kurs. Formula: belop_nok = belop_valuta * valutakurs / antall_per_kurs.

Controls (three layers)

LayerMechanism
User interface Inline validation and soft warnings. The user gets explanatory messages pointing to the correct posting.
Business logic Hard validation: balance requirement, partner requirement for customer/supplier receivables, locked periods, VAT-code direction, congruence principle, rate source, and that the invoice date is within a reasonable interval.
Storage Built-in rules in the data layer enforce the same invariants as the business logic: partner requirement on 1500/2400, one currency per voucher, immutability in closed periods, and monotonic voucher numbers per company.
Daily reconciliation Sub-ledger sanity (01:15 UTC / 02:15 local): verifies that the sum of customer receivables and supplier payables per partner matches the balance in the general ledger. Currency reconciliation (01:30 UTC / 02:30 local): verifies that the formula belop_nok = belop_valuta × rate / conversion factor holds across all posted rows. Discrepancies > NOK 0.01 are reported to firmapost@macct.no.

Tax return and year-end closing

RequirementIn Macct
Status flow: DRAFT → READY_FOR_REVIEW → APPROVED → SUBMITTED Implemented — status is updated in the skattemelding table. No status jumps allowed.
Never auto-submit to Altinn Hard requirement — explicit human approval is required at every step.
SHA-256 hash of the accounting data Verified at every step from draft to submission.
Audit trail skattemelding_hendelse table — logs who, when, what for every step.

Payroll and A-melding

ComponentIn Macct
Monthly payroll run (gross → tax withholding → net) LonnService.kjorLonn(aar, maaned) — idempotent per company+year+month.
Employer's national insurance (AGA) per zone Calculated per employee and settled as a separate posting.
Holiday pay 12 % default (Holidays Act) Accrued on account 5020 (holiday pay) / 2940 (holiday pay payable).
A-melding XML AmeldingService builds a simplified A-melding for export. Not auto-submitted.

EHF / PEPPOL BIS Billing 3.0

ComponentIn Macct
Export (outbound EHF XML) EhfFakturaService — UBL 2.1 with the correct DocumentCurrencyCode and currencyID for foreign currency.
Import (inbound EHF) EhfInnService — receives the XML, auto-creates the supplier, suggests posting via Claude/Ollama.

Limitations and scope boundaries

For a small entity within the NRS 8 framework, Macct covers the essentials. The following is deliberately not automated or out of scope:

  • Declining-balance depreciation per tax group (A–J) — must be entered manually with the correct rate.
  • Bank import for foreign-currency accounts — the CSV importer assumes NOK.
  • Per-line currency in the same voucher — deliberately omitted; one currency per voucher.
  • Group consolidation — not supported.
  • Payment in a different currency than the invoice — always invoice rate when the payment is registered.
  • Auto-submission of the shareholder register — XML is generated, but submitted manually via Altinn.
  • Bad-debt provisioning per customer — must be assessed manually under NRS 8 prudence.

The page reflects the implementation on the master branch and is updated continuously. Questions about a specific rule: firmapost@macct.no.

Back to About Macct