form1-sub_sub-fix #171

Merged
tsygankoviva merged 2 commits from form1-sub_sub-fix into test 2026-09-22 17:20:40 +03:00
4 changed files with 220 additions and 2 deletions
Showing only changes of commit a9fd54398b - Show all commits

View File

@ -0,0 +1,15 @@
from sql_migration import run_sql_file_migration
revision = "0034"
down_revision = "0033"
branch_labels = None
depends_on = None
def upgrade() -> None:
run_sql_file_migration("0034_ahr_rf_sort_order.sql")
def downgrade() -> None:
pass

View File

@ -1301,8 +1301,8 @@ BEGIN
IF v_sequence_name IS NOT NULL THEN
PERFORM setval(
v_sequence_name,
COALESCE((SELECT MAX(id) FROM v3.budget_line), 0),
true
COALESCE((SELECT MAX(id) FROM v3.budget_line), 1),
(SELECT COUNT(*) > 0 FROM v3.budget_line)
);
END IF;
END;

View File

@ -2510,6 +2510,7 @@ BEGIN
JOIN v3.expense_item ei ON ei.id = l.expense_item_id
JOIN tw t ON t.id = l.expense_item_id
WHERE l.rf_project_report_id = p_report_id
AND cardinality(t.desc_ids) = 1
),
-- Поквартальные данные
jq AS (
@ -2919,6 +2920,13 @@ BEGIN
WHERE expense_item_id = p_expense_item_id AND form_type_code = 'FORM_3') THEN
RAISE EXCEPTION 'expense_item id=% не привязан к form_type FORM_3', p_expense_item_id;
END IF;
IF COALESCE((
SELECT cardinality(t.desc_ids) > 1
FROM v3.mv_expense_item_tree t
WHERE t.id = p_expense_item_id
), false) THEN
RAISE EXCEPTION 'Нельзя создать строку по expense_item id=%: у статьи есть дочерние статьи', p_expense_item_id;
END IF;
v_user_id := v3.current_user_id();
v_decision := v3.can_edit3(p_report_id, NULL, v_user_id);

View File

@ -0,0 +1,195 @@
-- Fix sort.docx items 1-2:
-- - AHR RF depreciation and 5.00.0 tax block order.
-- - FORM_3 R061012024 order between R061012023 and R061012121.
-- - FORM_4 SMETA excludes sections absent from the project estimate template.
-- v3.mv_expense_item_tree sorts by expense_item.id path, so the catalog ids
-- must be renumbered together with all foreign-key references.
ALTER TABLE v3.budget_line DROP CONSTRAINT IF EXISTS budget_line_expense_item_fk;
ALTER TABLE v3.expense_item DROP CONSTRAINT IF EXISTS expense_item_expense_item_fk;
ALTER TABLE v3.expense_item_form_type DROP CONSTRAINT IF EXISTS expense_item_form_type_expense_item_fk;
ALTER TABLE v3.fixed_asset_report DROP CONSTRAINT IF EXISTS fixed_asset_report_expense_item_fk;
ALTER TABLE v3.rf_project_report_line DROP CONSTRAINT IF EXISTS rf_project_report_line_expense_item_fk;
CREATE TEMP TABLE _expense_item_id_map (
old_id INT PRIMARY KEY,
new_id INT NOT NULL UNIQUE
) ON COMMIT DROP;
INSERT INTO _expense_item_id_map (old_id, new_id)
SELECT id, id + 20
FROM v3.expense_item
WHERE id BETWEEN 82 AND 94;
INSERT INTO _expense_item_id_map (old_id, new_id)
SELECT id, id + 21
FROM v3.expense_item
WHERE id BETWEEN 95 AND 745;
INSERT INTO _expense_item_id_map (old_id, new_id) VALUES
(746, 82),
(747, 83),
(752, 84),
(758, 85),
(754, 86),
(753, 87),
(757, 88),
(750, 89),
(756, 90),
(759, 91),
(748, 92),
(751, 93),
(749, 94),
(755, 95),
(760, 96),
(764, 97),
(762, 98),
(763, 99),
(765, 100),
(761, 101),
(775, 115),
(766, 775),
(772, 767),
(773, 768),
(771, 769),
(774, 770),
(767, 771),
(770, 772),
(768, 773),
(769, 774);
DO $block$
DECLARE
v_missing TEXT;
BEGIN
SELECT string_agg(expected.item_id, ', ' ORDER BY expected.item_id)
INTO v_missing
FROM (
VALUES
('1.16.0.'), ('1.16.1.'), ('1.16.2.'),
('R061161001'), ('R061161005'), ('R061161002'), ('R061161004'),
('R061161003'), ('R061161006'), ('R061161010'), ('R061161007'),
('R061161008'), ('R061161009'), ('R061161011'), ('R061161019'),
('R061162021'), ('R061162022'), ('R061162023'), ('R061162024'),
('R061162025'),
('R061012023'), ('R061012024'), ('R061012121'),
('5.00.0.'),
('R065010000'), ('R065020001'), ('R065030012'), ('R065040000'),
('R065050005'), ('R065070000'), ('R065090000'), ('R065100000')
) AS expected(item_id)
LEFT JOIN v3.expense_item ei
ON ei.item_id = expected.item_id
AND ei.sheet = 'AHR'
AND ei.direction = 'Support'
WHERE ei.id IS NULL;
IF v_missing IS NOT NULL THEN
RAISE EXCEPTION 'Missing AHR Support expense items for sort fix: %', v_missing;
END IF;
END;
$block$;
UPDATE v3.expense_item
SET id = -id
WHERE id IN (SELECT old_id FROM _expense_item_id_map);
UPDATE v3.expense_item ei
SET id = m.new_id
FROM _expense_item_id_map m
WHERE ei.id = -m.old_id;
UPDATE v3.expense_item ei
SET parent_id = m.new_id
FROM _expense_item_id_map m
WHERE ei.parent_id = m.old_id;
UPDATE v3.budget_line
SET expense_item_id = -expense_item_id
WHERE expense_item_id IN (SELECT old_id FROM _expense_item_id_map);
UPDATE v3.budget_line bl
SET expense_item_id = m.new_id
FROM _expense_item_id_map m
WHERE bl.expense_item_id = -m.old_id;
UPDATE v3.expense_item_form_type
SET expense_item_id = -expense_item_id
WHERE expense_item_id IN (SELECT old_id FROM _expense_item_id_map);
UPDATE v3.expense_item_form_type eft
SET expense_item_id = m.new_id
FROM _expense_item_id_map m
WHERE eft.expense_item_id = -m.old_id;
UPDATE v3.fixed_asset_report
SET expense_item_id = -expense_item_id
WHERE expense_item_id IN (SELECT old_id FROM _expense_item_id_map);
UPDATE v3.fixed_asset_report far
SET expense_item_id = m.new_id
FROM _expense_item_id_map m
WHERE far.expense_item_id = -m.old_id;
UPDATE v3.rf_project_report_line
SET expense_item_id = -expense_item_id
WHERE expense_item_id IN (SELECT old_id FROM _expense_item_id_map);
UPDATE v3.rf_project_report_line rprl
SET expense_item_id = m.new_id
FROM _expense_item_id_map m
WHERE rprl.expense_item_id = -m.old_id;
DELETE FROM v3.expense_item_form_type
WHERE form_type_code = 'FORM_4'
AND expense_item_id IN (
103, 104, 106, 107,
500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512,
513, 514, 515, 516, 517,
518, 519, 520, 521, 522,
525, 526, 527, 528,
547, 548, 549, 550, 551, 552, 553, 554, 555,
556, 557, 558,
734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746,
748,
755, 756, 757, 758, 759, 760, 766,
800, 801, 802, 803, 804, 805, 806, 807, 808
);
DO $block$
DECLARE
v_function_definition TEXT;
BEGIN
SELECT pg_get_functiondef('v3.v_summary_view(integer, character varying, integer[])'::regprocedure)
INTO v_function_definition;
v_function_definition := REPLACE(
v_function_definition,
'ROW_NUMBER() OVER (ORDER BY t.item_id)',
'ROW_NUMBER() OVER (ORDER BY t.path)'
);
EXECUTE v_function_definition;
END;
$block$;
ALTER TABLE v3.expense_item
ADD CONSTRAINT expense_item_expense_item_fk
FOREIGN KEY (parent_id) REFERENCES v3.expense_item(id);
ALTER TABLE v3.expense_item_form_type
ADD CONSTRAINT expense_item_form_type_expense_item_fk
FOREIGN KEY (expense_item_id) REFERENCES v3.expense_item(id);
ALTER TABLE v3.budget_line
ADD CONSTRAINT budget_line_expense_item_fk
FOREIGN KEY (expense_item_id) REFERENCES v3.expense_item(id);
ALTER TABLE v3.fixed_asset_report
ADD CONSTRAINT fixed_asset_report_expense_item_fk
FOREIGN KEY (expense_item_id) REFERENCES v3.expense_item(id);
ALTER TABLE v3.rf_project_report_line
ADD CONSTRAINT rf_project_report_line_expense_item_fk
FOREIGN KEY (expense_item_id) REFERENCES v3.expense_item(id);
REFRESH MATERIALIZED VIEW v3.mv_expense_item_tree;