Implement tax handling for branches by adding tax percent to regions, updating product sell costs, and enhancing UI for tax summaries in BranchView

This commit is contained in:
Torsten Schulz (local)
2025-12-09 16:16:08 +01:00
parent 25d7c70058
commit 43d86cce18
15 changed files with 477 additions and 19 deletions

View File

@@ -0,0 +1,69 @@
-- Backup original sell_cost values (just in case)
-- Run this once: will add a column original_sell_cost and copy existing sell_cost into it
ALTER TABLE IF EXISTS falukant_type.product
ADD COLUMN IF NOT EXISTS original_sell_cost numeric;
UPDATE falukant_type.product
SET sell_cost = sell_cost * ((6 * 7 / 100) + 100);
-- Compute min and max cumulative tax across all regions
WITH RECURSIVE ancestors AS (
SELECT id AS start_id, id, parent_id, tax_percent FROM falukant_data.region
UNION ALL
SELECT a.start_id, r.id, r.parent_id, r.tax_percent
FROM falukant_data.region r
JOIN ancestors a ON r.id = a.parent_id
), totals AS (
SELECT start_id, COALESCE(SUM(tax_percent),0) AS total FROM ancestors GROUP BY start_id
), mm AS (
SELECT COALESCE(MIN(total),0) AS min_total, COALESCE(MAX(total),0) AS max_total FROM totals
)
SELECT * FROM mm;
-- Choose one of the following update blocks to run:
-- 1) MIN-STRATEGY: increase sell_cost so that taxes at the minimal cumulative tax have no effect
-- (this will set sell_cost = CEIL(original_sell_cost * (1 / (1 - min_total/100))))
-- BEGIN MIN-STRATEGY
-- WITH mm AS (
-- WITH RECURSIVE ancestors AS (
-- SELECT id AS start_id, id, parent_id, tax_percent FROM falukant_data.region
-- UNION ALL
-- SELECT a.start_id, r.id, r.parent_id, r.tax_percent
-- FROM falukant_data.region r
-- JOIN ancestors a ON r.id = a.parent_id
-- ), totals AS (
-- SELECT start_id, COALESCE(SUM(tax_percent),0) AS total FROM ancestors GROUP BY start_id
-- )
-- SELECT COALESCE(MIN(total),0) AS min_total FROM totals
-- )
-- UPDATE falukant_type.product
-- SET sell_cost = CEIL(original_sell_cost * (CASE WHEN (1 - (SELECT min_total FROM mm)/100) <= 0 THEN 1 ELSE (1 / (1 - (SELECT min_total FROM mm)/100)) END));
-- END MIN-STRATEGY
-- 2) MAX-STRATEGY: increase sell_cost so that taxes at the maximal cumulative tax have no effect
-- (this will set sell_cost = CEIL(original_sell_cost * (1 / (1 - max_total/100))))
-- BEGIN MAX-STRATEGY
-- WITH mm AS (
-- WITH RECURSIVE ancestors AS (
-- SELECT id AS start_id, id, parent_id, tax_percent FROM falukant_data.region
-- UNION ALL
-- SELECT a.start_id, r.id, r.parent_id, r.tax_percent
-- FROM falukant_data.region r
-- JOIN ancestors a ON r.id = a.parent_id
-- ), totals AS (
-- SELECT start_id, COALESCE(SUM(tax_percent),0) AS total FROM ancestors GROUP BY start_id
-- )
-- SELECT COALESCE(MAX(total),0) AS max_total FROM totals
-- )
-- UPDATE falukant_type.product
-- SET sell_cost = CEIL(original_sell_cost * (CASE WHEN (1 - (SELECT max_total FROM mm)/100) <= 0 THEN 1 ELSE (1 / (1 - (SELECT max_total FROM mm)/100)) END));
-- END MAX-STRATEGY
-- Notes:
-- 1) Uncomment exactly one strategy block (MIN or MAX) and run the script.
-- 2) The script creates `original_sell_cost` as a backup; keep it for safety.
-- 3) CEIL is used to avoid undercompensating due to rounding. If you prefer ROUND use ROUND(...).
-- 4) Test on a staging DB first.