diff --git a/api/alembic/versions/0034_ahr_rf_sort_order.py b/api/alembic/versions/0034_ahr_rf_sort_order.py new file mode 100644 index 0000000..3877760 --- /dev/null +++ b/api/alembic/versions/0034_ahr_rf_sort_order.py @@ -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 diff --git a/api/alembic/versions/sql/0031_form2_ahr_satellite_sync.sql b/api/alembic/versions/sql/0031_form2_ahr_satellite_sync.sql index c9af8aa..436ba53 100644 --- a/api/alembic/versions/sql/0031_form2_ahr_satellite_sync.sql +++ b/api/alembic/versions/sql/0031_form2_ahr_satellite_sync.sql @@ -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; diff --git a/api/alembic/versions/sql/0033_form2_old_sort.sql b/api/alembic/versions/sql/0033_form2_old_sort.sql index 0492c5b..9d916ce 100644 --- a/api/alembic/versions/sql/0033_form2_old_sort.sql +++ b/api/alembic/versions/sql/0033_form2_old_sort.sql @@ -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); diff --git a/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql b/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql new file mode 100644 index 0000000..6a203fa --- /dev/null +++ b/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql @@ -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;