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