diff --git a/init-scripts/init-script.sql b/init-scripts/init-script.sql index 117b5cd..460bd64 100644 --- a/init-scripts/init-script.sql +++ b/init-scripts/init-script.sql @@ -1548,17 +1548,20 @@ CREATE OR REPLACE FUNCTION enable_vat_registration( ) RETURNS TABLE ( payments_updated INT, + till_sales_updated INT, total_vat_calculated NUMERIC(12,2), total_net_calculated NUMERIC(12,2), registration_effective_date DATE, settings_updated BOOLEAN ) AS $$ DECLARE - updated_count INT; + pay_updated_count INT; + till_updated_count INT; total_vat NUMERIC(12,2); total_net NUMERIC(12,2); settings_ok BOOLEAN := FALSE; BEGIN + -- Retrospectively apply VAT to completed payments UPDATE payments SET vat_rate = enable_vat_registration.vat_rate, @@ -1570,8 +1573,23 @@ BEGIN AND created_at::date >= registration_date AND vat_amount IS NULL; - GET DIAGNOSTICS updated_count = ROW_COUNT; + GET DIAGNOSTICS pay_updated_count = ROW_COUNT; + -- Retrospectively apply VAT to completed till sales (gift card purchases etc.) + UPDATE till_sales + SET + vat_rate = enable_vat_registration.vat_rate, + vat_amount = ROUND(total_amount - (total_amount / (1 + enable_vat_registration.vat_rate / 100)), 2), + net_amount = ROUND(total_amount / (1 + enable_vat_registration.vat_rate / 100), 2), + is_vat_applicable = TRUE, + updated_at = NOW() + WHERE status = 'completed' + AND created_at::date >= registration_date + AND vat_amount IS NULL; + + GET DIAGNOSTICS till_updated_count = ROW_COUNT; + + -- Aggregate totals SELECT COALESCE(SUM(p.vat_amount), 0), COALESCE(SUM(p.net_amount), 0) @@ -1581,6 +1599,17 @@ BEGIN AND created_at::date >= registration_date AND vat_amount IS NOT NULL; + -- Also include till_sales in the aggregate totals + SELECT + total_vat + COALESCE(SUM(ts.vat_amount), 0), + total_net + COALESCE(SUM(ts.net_amount), 0) + INTO total_vat, total_net + FROM till_sales ts + WHERE status = 'completed' + AND created_at::date >= registration_date + AND vat_amount IS NOT NULL; + + -- Update business_settings record UPDATE business_settings SET is_vat_registered = TRUE, @@ -1594,7 +1623,8 @@ BEGIN END IF; RETURN QUERY SELECT - updated_count, + pay_updated_count, + till_updated_count, total_vat, total_net, registration_date, @@ -2038,7 +2068,11 @@ CREATE TABLE gift_cards ( is_inventory BOOLEAN NOT NULL DEFAULT FALSE, expiry_date TIMESTAMPTZ, -- Rolling expiry: 24 months from last usage (redeem, topup, balance check) - last_used_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + last_used_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + -- Voucher type at time of purchase ('SPV' or 'MPV'). Read at redemption to + -- determine whether VAT was already paid at sale (SPV) or must be applied + -- now (MPV). NULL if the card was created before this column was added. + voucher_type_at_purchase VARCHAR(3) ); CREATE INDEX idx_gift_cards_last_used_at ON gift_cards(last_used_at) @@ -2360,3 +2394,6 @@ CREATE TABLE IF NOT EXISTS refresh_tokens ( CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user_id ON refresh_tokens (user_id); CREATE INDEX IF NOT EXISTS idx_refresh_tokens_expires_at ON refresh_tokens (expires_at); + +-- Migration: add voucher_type_at_purchase to gift_cards (for SPV/MPV per-card tracking) +ALTER TABLE gift_cards ADD COLUMN IF NOT EXISTS voucher_type_at_purchase VARCHAR(3);