BOC v1.0: RS256 auth, Ledger integration, Prometheus metrics, CI/CD, backup
This commit is contained in:
@@ -0,0 +1,185 @@
|
||||
-- BOC Ledger Schema
|
||||
-- Fullständigt bokföringsschema för LandveX AB
|
||||
-- BAS-kontoplan, verifikationer, moms, arbetsgivaravgift
|
||||
|
||||
-- Kontoplan (BAS-standard)
|
||||
CREATE TABLE IF NOT EXISTS boc_accounts (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
account_number TEXT NOT NULL, -- BAS-kontonummer, t.ex. 1930
|
||||
name TEXT NOT NULL,
|
||||
account_type TEXT NOT NULL, -- asset, liability, equity, income, expense
|
||||
vat_code TEXT, -- moms-kod, t.ex. 25, 12, 6
|
||||
parent_account TEXT, -- överordnat konto
|
||||
is_active BOOLEAN DEFAULT TRUE,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(tenant_id, account_number)
|
||||
);
|
||||
|
||||
-- Verifikationer (bokföringsposter)
|
||||
CREATE TABLE IF NOT EXISTS boc_vouchers (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
voucher_series TEXT NOT NULL DEFAULT 'A', -- verifikationsserie
|
||||
voucher_number INTEGER NOT NULL,
|
||||
date DATE NOT NULL,
|
||||
description TEXT NOT NULL,
|
||||
reference TEXT, -- fakturanummer, referens etc
|
||||
attachments JSONB DEFAULT '[]', -- bilagor
|
||||
created_by UUID REFERENCES boc_users(id),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(tenant_id, voucher_series, voucher_number)
|
||||
);
|
||||
|
||||
-- Verifikationstransaktioner (dubbel bokföring)
|
||||
CREATE TABLE IF NOT EXISTS boc_voucher_lines (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
voucher_id UUID REFERENCES boc_vouchers(id) ON DELETE CASCADE,
|
||||
account_id UUID REFERENCES boc_accounts(id) ON DELETE RESTRICT,
|
||||
debit DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
credit DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
description TEXT,
|
||||
project TEXT, -- projektkod
|
||||
cost_center TEXT, -- kostnadsställe
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Saldon per konto och period
|
||||
CREATE TABLE IF NOT EXISTS boc_account_balances (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
account_id UUID REFERENCES boc_accounts(id) ON DELETE CASCADE,
|
||||
fiscal_year INTEGER NOT NULL,
|
||||
period INTEGER NOT NULL, -- 1-12 för månad, 0 för årssaldo
|
||||
opening_balance DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
closing_balance DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
total_debit DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
total_credit DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(tenant_id, account_id, fiscal_year, period)
|
||||
);
|
||||
|
||||
-- Momsredovisning
|
||||
CREATE TABLE IF NOT EXISTS boc_vat_reports (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
period_start DATE NOT NULL,
|
||||
period_end DATE NOT NULL,
|
||||
vat_in DECIMAL(15,2) NOT NULL DEFAULT 0, -- ingående moms
|
||||
vat_out DECIMAL(15,2) NOT NULL DEFAULT 0, -- utgående moms
|
||||
vat_payable DECIMAL(15,2) NOT NULL DEFAULT 0, -- moms att betala
|
||||
status TEXT NOT NULL DEFAULT 'draft', -- draft, filed, paid
|
||||
filed_at TIMESTAMPTZ,
|
||||
paid_at TIMESTAMPTZ,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_by UUID REFERENCES boc_users(id),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Moms-transaktioner per verifikation
|
||||
CREATE TABLE IF NOT EXISTS boc_vat_transactions (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
voucher_line_id UUID REFERENCES boc_voucher_lines(id) ON DELETE CASCADE,
|
||||
vat_rate DECIMAL(5,2) NOT NULL, -- 25.00, 12.00, 6.00
|
||||
vat_amount DECIMAL(15,2) NOT NULL,
|
||||
base_amount DECIMAL(15,2) NOT NULL,
|
||||
vat_type TEXT NOT NULL, -- input, output
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Löner och arbetsgivaravgifter
|
||||
CREATE TABLE IF NOT EXISTS boc_payroll (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
employee_id UUID REFERENCES boc_employees(id),
|
||||
period DATE NOT NULL, -- löne månad
|
||||
gross_salary DECIMAL(15,2) NOT NULL,
|
||||
net_salary DECIMAL(15,2) NOT NULL,
|
||||
tax_deduction DECIMAL(15,2) NOT NULL DEFAULT 0, -- skatteavdrag
|
||||
pension_contribution DECIMAL(15,2) DEFAULT 0, -- pensionsinbetalning
|
||||
employer_contribution DECIMAL(15,2) DEFAULT 0, -- arbetsgivaravgift
|
||||
benefits JSONB DEFAULT '{}', -- förmåner
|
||||
deductions JSONB DEFAULT '{}', -- avdrag
|
||||
status TEXT NOT NULL DEFAULT 'draft',
|
||||
paid_at TIMESTAMPTZ,
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_by UUID REFERENCES boc_users(id),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Arbetsgivaravgiftsberäkning
|
||||
CREATE TABLE IF NOT EXISTS boc_employer_contributions (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
period DATE NOT NULL,
|
||||
total_salary DECIMAL(15,2) NOT NULL,
|
||||
health_insurance DECIMAL(15,2) NOT NULL DEFAULT 0, -- sjukförsäkringsavgift
|
||||
pension_fee DECIMAL(15,2) NOT NULL DEFAULT 0, -- ålderspensionsavgift
|
||||
parental_fee DECIMAL(15,2) NOT NULL DEFAULT 0, -- föräldraförsäkringsavgift
|
||||
occupational_fee DECIMAL(15,2) NOT NULL DEFAULT 0, -- arbetsmarknadsförsäkringsavgift
|
||||
general_payroll_tax DECIMAL(15,2) NOT NULL DEFAULT 0, -- allmän löneavgift
|
||||
total_contribution DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'draft',
|
||||
paid_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Fakturor (kund och leverantör)
|
||||
CREATE TABLE IF NOT EXISTS boc_invoices_ledger (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
invoice_type TEXT NOT NULL, -- customer, supplier
|
||||
invoice_number TEXT NOT NULL,
|
||||
counterparty TEXT NOT NULL, -- kund/leverantör namn
|
||||
org_number TEXT,
|
||||
amount DECIMAL(15,2) NOT NULL,
|
||||
vat_amount DECIMAL(15,2) NOT NULL DEFAULT 0,
|
||||
total_amount DECIMAL(15,2) NOT NULL,
|
||||
currency TEXT NOT NULL DEFAULT 'SEK',
|
||||
issue_date DATE NOT NULL,
|
||||
due_date DATE NOT NULL,
|
||||
paid_date DATE,
|
||||
paid_amount DECIMAL(15,2) DEFAULT 0,
|
||||
status TEXT NOT NULL DEFAULT 'draft', -- draft, sent, paid, overdue, cancelled
|
||||
voucher_id UUID REFERENCES boc_vouchers(id),
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_by UUID REFERENCES boc_users(id),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Räkenskapsår
|
||||
CREATE TABLE IF NOT EXISTS boc_fiscal_years (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tenant_id UUID REFERENCES boc_tenants(id) ON DELETE CASCADE,
|
||||
year INTEGER NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
status TEXT NOT NULL DEFAULT 'open', -- open, closed, locked
|
||||
closed_at TIMESTAMPTZ,
|
||||
closed_by UUID REFERENCES boc_users(id),
|
||||
metadata JSONB DEFAULT '{}',
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
UNIQUE(tenant_id, year)
|
||||
);
|
||||
|
||||
-- Index
|
||||
CREATE INDEX IF NOT EXISTS idx_accounts_tenant ON boc_accounts(tenant_id, account_number);
|
||||
CREATE INDEX IF NOT EXISTS idx_vouchers_date ON boc_vouchers(tenant_id, date DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_voucher_lines_account ON boc_voucher_lines(account_id, created_at DESC);
|
||||
CREATE INDEX IF NOT EXISTS idx_balances_period ON boc_account_balances(tenant_id, fiscal_year, period);
|
||||
CREATE INDEX IF NOT EXISTS idx_vat_period ON boc_vat_reports(tenant_id, period_start, period_end);
|
||||
CREATE INDEX IF NOT EXISTS idx_payroll_period ON boc_payroll(tenant_id, period);
|
||||
CREATE INDEX IF NOT EXISTS idx_invoices_ledger ON boc_invoices_ledger(tenant_id, invoice_type, status);
|
||||
CREATE INDEX IF NOT EXISTS idx_fiscal_years ON boc_fiscal_years(tenant_id, year);
|
||||
Reference in New Issue
Block a user