Files
yourpart-daemon/migrations/017_falukant_money_precision_14_2.sql

77 lines
2.0 KiB
PL/PgSQL

-- Erhoeht Geld-Praezision fuer sehr hohe Kontostaende.
-- Ziel: max. Betrag von 99.999.999,99 auf 999.999.999.999,99 anheben.
-- Hauptkontostand
ALTER TABLE falukant_data.falukant_user
ALTER COLUMN money TYPE NUMERIC(14,2);
-- Verlaufseintraege (best effort-Logging im Daemon)
ALTER TABLE falukant_log.money_history
ALTER COLUMN change TYPE NUMERIC(14,2);
-- Moneyflow auf dieselbe Praezision bringen (falls die Tabelle existiert).
ALTER TABLE IF EXISTS falukant_log.moneyflow
ALTER COLUMN money_before TYPE NUMERIC(14,2),
ALTER COLUMN money_after TYPE NUMERIC(14,2),
ALTER COLUMN change_value TYPE NUMERIC(14,2);
-- Kernfunktion auf neue Praezision umstellen.
CREATE OR REPLACE FUNCTION falukant_data.update_money(
p_falukant_user_id integer,
p_money_change numeric,
p_activity text,
p_changed_by integer DEFAULT NULL::integer
)
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
v_money_before numeric(14,2);
v_money_after numeric(14,2);
v_moneyflow_id bigint;
BEGIN
SELECT money
INTO v_money_before
FROM falukant_data.falukant_user
WHERE id = p_falukant_user_id;
IF NOT FOUND THEN
RAISE EXCEPTION 'FalukantUser mit ID % nicht gefunden', p_falukant_user_id;
END IF;
v_money_after := v_money_before + p_money_change;
INSERT INTO falukant_log.moneyflow (
falukant_user_id,
activity,
money_before,
money_after,
change_value,
changed_by,
time
)
VALUES (
p_falukant_user_id,
p_activity,
v_money_before,
NULL, -- wird gleich aktualisiert
p_money_change,
p_changed_by,
NOW()
)
RETURNING id INTO v_moneyflow_id;
UPDATE falukant_data.falukant_user
SET money = v_money_after
WHERE id = p_falukant_user_id;
UPDATE falukant_log.moneyflow
SET money_after = (
SELECT money
FROM falukant_data.falukant_user
WHERE id = p_falukant_user_id
)
WHERE id = v_moneyflow_id;
END;
$function$;