Files

185 lines
8.3 KiB
SQL
Raw Permalink Normal View History

-- 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);