diff --git a/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql b/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql index e22dbc1..2225729 100644 --- a/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql +++ b/api/alembic/versions/sql/0034_ahr_rf_sort_order.sql @@ -132,22 +132,6 @@ 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 - ); - CREATE OR REPLACE FUNCTION v3.sync_form2_ahr_satellite_lines(p_form_id integer) RETURNS void LANGUAGE plpgsql @@ -922,6 +906,247 @@ BEGIN END; $function$; +CREATE OR REPLACE FUNCTION v3.v_form4_smeta(p_form_id integer) + RETURNS TABLE(row_type character varying, depth integer, section_code character varying, name character varying, plan_supp_q1 numeric, plan_supp_q2 numeric, plan_supp_q3 numeric, plan_supp_q4 numeric, plan_supp_year numeric, plan_dev_q1 numeric, plan_dev_q2 numeric, plan_dev_q3 numeric, plan_dev_q4 numeric, plan_dev_year numeric, appr_supp_q1 numeric, appr_supp_q2 numeric, appr_supp_q3 numeric, appr_supp_q4 numeric, appr_supp_year numeric, appr_dev_q1 numeric, appr_dev_q2 numeric, appr_dev_q3 numeric, appr_dev_q4 numeric, appr_dev_year numeric, fact_supp_q1 numeric, fact_supp_q2 numeric, fact_supp_q3 numeric, fact_supp_q4 numeric, fact_supp_year numeric, fact_dev_q1 numeric, fact_dev_q2 numeric, fact_dev_q3 numeric, fact_dev_q4 numeric, fact_dev_year numeric, corr_supp_q1 numeric, corr_supp_q2 numeric, corr_supp_q3 numeric, corr_supp_q4 numeric, corr_supp_year numeric, corr_dev_q1 numeric, corr_dev_q2 numeric, corr_dev_q3 numeric, corr_dev_q4 numeric, corr_dev_year numeric) + LANGUAGE plpgsql + STABLE +AS $function$ +#variable_conflict use_column +BEGIN + RETURN QUERY + WITH + -- Per-line per-direction агрегаты квартальных данных + q_per_line AS ( + SELECT line_id, + SUM(CASE WHEN quarter=1 THEN COALESCE(actual_m1,0)+COALESCE(actual_m2,0)+COALESCE(actual_m3,0) END) AS fq1, + SUM(CASE WHEN quarter=2 THEN COALESCE(actual_m1,0)+COALESCE(actual_m2,0)+COALESCE(actual_m3,0) END) AS fq2, + SUM(CASE WHEN quarter=3 THEN COALESCE(actual_m1,0)+COALESCE(actual_m2,0)+COALESCE(actual_m3,0) END) AS fq3, + SUM(CASE WHEN quarter=4 THEN COALESCE(actual_m1,0)+COALESCE(actual_m2,0)+COALESCE(actual_m3,0)+COALESCE(actual_spod,0) END) AS fq4, + SUM(CASE WHEN quarter=1 THEN transfer_to_q2 END) AS t1q2, + SUM(CASE WHEN quarter=1 THEN transfer_to_q3 END) AS t1q3, + SUM(CASE WHEN quarter=1 THEN transfer_to_q4 END) AS t1q4, + SUM(CASE WHEN quarter=2 THEN transfer_to_q3 END) AS t2q3, + SUM(CASE WHEN quarter=2 THEN transfer_to_q4 END) AS t2q4, + SUM(CASE WHEN quarter=3 THEN transfer_to_q4 END) AS t3q4, + SUM(CASE WHEN quarter=1 THEN COALESCE(adj_current,0)+COALESCE(adj_ssp,0)+COALESCE(adj_reserve,0) END) AS adj1, + SUM(CASE WHEN quarter=2 THEN COALESCE(adj_current,0)+COALESCE(adj_ssp,0)+COALESCE(adj_reserve,0) END) AS adj2, + SUM(CASE WHEN quarter=3 THEN COALESCE(adj_current,0)+COALESCE(adj_ssp,0)+COALESCE(adj_reserve,0) END) AS adj3, + SUM(CASE WHEN quarter=4 THEN COALESCE(adj_current,0)+COALESCE(adj_ssp,0)+COALESCE(adj_reserve,0) END) AS adj4, + -- Δ approved → new_plan: revision_inc/seq + target_change + base_correction + -- (согласовано с v_form4_sheet_sections / Excel DJ10 = SUM(AN, CY, DH, CF, DE:DG)) + SUM(CASE WHEN quarter=2 THEN COALESCE(plan_revision_increase,0)+COALESCE(plan_revision_sequester,0)+COALESCE(target_change,0)+COALESCE(base_plan_correction,0) END) AS rev2, + SUM(CASE WHEN quarter=3 THEN COALESCE(plan_revision_increase,0)+COALESCE(plan_revision_sequester,0)+COALESCE(target_change,0)+COALESCE(base_plan_correction,0) END) AS rev3, + SUM(CASE WHEN quarter=4 THEN COALESCE(plan_revision_increase,0)+COALESCE(plan_revision_sequester,0)+COALESCE(target_change,0)+COALESCE(base_plan_correction,0) END) AS rev4 + FROM v3.budget_line_quarter GROUP BY line_id + ), + seq_dfip AS ( + SELECT line_id, SUM(adj_q1) AS s1, SUM(adj_q2) AS s2, SUM(adj_q3) AS s3, SUM(adj_q4) AS s4 + FROM v3.sequestration WHERE actor='DFIP' GROUP BY line_id + ), + seq_ssp AS ( + SELECT line_id, SUM(adj_q1) AS g1, SUM(adj_q2) AS g2, SUM(adj_q3) AS g3, SUM(adj_q4) AS g4 + FROM v3.sequestration WHERE actor='SSP_GO' GROUP BY line_id + ), + -- Per-line aggregate. + -- FORM_4 = "Расходы на развитие" (АХР_Р!F5='ПРОЕКТНАЯ ДЕЯТЕЛЬНОСТЬ' в Excel), + -- поэтому все строки идут в колонку Development независимо от + -- expense_item.direction (этот справочник общий с FORM_2 и для FORM_2 + -- проставлен 'Support'). Колонка Support по форме 4 всегда = 0. + line_agg AS ( + SELECT + bl.expense_item_id AS eid, 'Development'::VARCHAR AS dir, + SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4, + SUM(sd.s1) AS sd1, SUM(sd.s2) AS sd2, SUM(sd.s3) AS sd3, SUM(sd.s4) AS sd4, + SUM(sg.g1) AS sg1, SUM(sg.g2) AS sg2, SUM(sg.g3) AS sg3, SUM(sg.g4) AS sg4, + SUM(r.amount_q1) AS rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4, + SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4, + SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4, + SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4, + SUM(qp.adj1) AS adj1, SUM(qp.adj2) AS adj2, SUM(qp.adj3) AS adj3, SUM(qp.adj4) AS adj4, + SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4 + FROM v3.budget_line bl + LEFT JOIN v3.plan p ON p.line_id = bl.id + LEFT JOIN seq_dfip sd ON sd.line_id = bl.id + LEFT JOIN seq_ssp sg ON sg.line_id = bl.id + LEFT JOIN v3.reserve r ON r.line_id = bl.id + LEFT JOIN q_per_line qp ON qp.line_id = bl.id + WHERE bl.budget_form_id = p_form_id + AND bl.expense_item_id NOT 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 + ) + GROUP BY bl.expense_item_id + ), + -- Tree rollup с расщеплением по direction. Используем FILTER (WHERE) + tw_rollup AS ( + SELECT + t.id, t.depth, t.item_id AS section_code, t.name, + -- Поддержка + SUM(a.pq1) FILTER (WHERE a.dir='Support') AS s_pq1, + SUM(a.pq2) FILTER (WHERE a.dir='Support') AS s_pq2, + SUM(a.pq3) FILTER (WHERE a.dir='Support') AS s_pq3, + SUM(a.pq4) FILTER (WHERE a.dir='Support') AS s_pq4, + SUM(a.sd1) FILTER (WHERE a.dir='Support') AS s_sd1, + SUM(a.sd2) FILTER (WHERE a.dir='Support') AS s_sd2, + SUM(a.sd3) FILTER (WHERE a.dir='Support') AS s_sd3, + SUM(a.sd4) FILTER (WHERE a.dir='Support') AS s_sd4, + SUM(a.sg1) FILTER (WHERE a.dir='Support') AS s_sg1, + SUM(a.sg2) FILTER (WHERE a.dir='Support') AS s_sg2, + SUM(a.sg3) FILTER (WHERE a.dir='Support') AS s_sg3, + SUM(a.sg4) FILTER (WHERE a.dir='Support') AS s_sg4, + SUM(a.rq1) FILTER (WHERE a.dir='Support') AS s_rq1, + SUM(a.rq2) FILTER (WHERE a.dir='Support') AS s_rq2, + SUM(a.rq3) FILTER (WHERE a.dir='Support') AS s_rq3, + SUM(a.rq4) FILTER (WHERE a.dir='Support') AS s_rq4, + SUM(a.fq1) FILTER (WHERE a.dir='Support') AS s_fq1, + SUM(a.fq2) FILTER (WHERE a.dir='Support') AS s_fq2, + SUM(a.fq3) FILTER (WHERE a.dir='Support') AS s_fq3, + SUM(a.fq4) FILTER (WHERE a.dir='Support') AS s_fq4, + SUM(a.t1q2) FILTER (WHERE a.dir='Support') AS s_t1q2, + SUM(a.t1q3) FILTER (WHERE a.dir='Support') AS s_t1q3, + SUM(a.t1q4) FILTER (WHERE a.dir='Support') AS s_t1q4, + SUM(a.t2q3) FILTER (WHERE a.dir='Support') AS s_t2q3, + SUM(a.t2q4) FILTER (WHERE a.dir='Support') AS s_t2q4, + SUM(a.t3q4) FILTER (WHERE a.dir='Support') AS s_t3q4, + SUM(a.adj1) FILTER (WHERE a.dir='Support') AS s_adj1, + SUM(a.adj2) FILTER (WHERE a.dir='Support') AS s_adj2, + SUM(a.adj3) FILTER (WHERE a.dir='Support') AS s_adj3, + SUM(a.adj4) FILTER (WHERE a.dir='Support') AS s_adj4, + SUM(a.rev2) FILTER (WHERE a.dir='Support') AS s_rev2, + SUM(a.rev3) FILTER (WHERE a.dir='Support') AS s_rev3, + SUM(a.rev4) FILTER (WHERE a.dir='Support') AS s_rev4, + -- Развитие + SUM(a.pq1) FILTER (WHERE a.dir='Development') AS d_pq1, + SUM(a.pq2) FILTER (WHERE a.dir='Development') AS d_pq2, + SUM(a.pq3) FILTER (WHERE a.dir='Development') AS d_pq3, + SUM(a.pq4) FILTER (WHERE a.dir='Development') AS d_pq4, + SUM(a.sd1) FILTER (WHERE a.dir='Development') AS d_sd1, + SUM(a.sd2) FILTER (WHERE a.dir='Development') AS d_sd2, + SUM(a.sd3) FILTER (WHERE a.dir='Development') AS d_sd3, + SUM(a.sd4) FILTER (WHERE a.dir='Development') AS d_sd4, + SUM(a.sg1) FILTER (WHERE a.dir='Development') AS d_sg1, + SUM(a.sg2) FILTER (WHERE a.dir='Development') AS d_sg2, + SUM(a.sg3) FILTER (WHERE a.dir='Development') AS d_sg3, + SUM(a.sg4) FILTER (WHERE a.dir='Development') AS d_sg4, + SUM(a.rq1) FILTER (WHERE a.dir='Development') AS d_rq1, + SUM(a.rq2) FILTER (WHERE a.dir='Development') AS d_rq2, + SUM(a.rq3) FILTER (WHERE a.dir='Development') AS d_rq3, + SUM(a.rq4) FILTER (WHERE a.dir='Development') AS d_rq4, + SUM(a.fq1) FILTER (WHERE a.dir='Development') AS d_fq1, + SUM(a.fq2) FILTER (WHERE a.dir='Development') AS d_fq2, + SUM(a.fq3) FILTER (WHERE a.dir='Development') AS d_fq3, + SUM(a.fq4) FILTER (WHERE a.dir='Development') AS d_fq4, + SUM(a.t1q2) FILTER (WHERE a.dir='Development') AS d_t1q2, + SUM(a.t1q3) FILTER (WHERE a.dir='Development') AS d_t1q3, + SUM(a.t1q4) FILTER (WHERE a.dir='Development') AS d_t1q4, + SUM(a.t2q3) FILTER (WHERE a.dir='Development') AS d_t2q3, + SUM(a.t2q4) FILTER (WHERE a.dir='Development') AS d_t2q4, + SUM(a.t3q4) FILTER (WHERE a.dir='Development') AS d_t3q4, + SUM(a.adj1) FILTER (WHERE a.dir='Development') AS d_adj1, + SUM(a.adj2) FILTER (WHERE a.dir='Development') AS d_adj2, + SUM(a.adj3) FILTER (WHERE a.dir='Development') AS d_adj3, + SUM(a.adj4) FILTER (WHERE a.dir='Development') AS d_adj4, + SUM(a.rev2) FILTER (WHERE a.dir='Development') AS d_rev2, + SUM(a.rev3) FILTER (WHERE a.dir='Development') AS d_rev3, + SUM(a.rev4) FILTER (WHERE a.dir='Development') AS d_rev4 + FROM v3.mv_expense_item_tree t + JOIN v3.expense_item_form_type eft ON eft.expense_item_id = t.id + JOIN v3.budget_form bf ON bf.id = p_form_id AND bf.form_type_code = eft.form_type_code + LEFT JOIN line_agg a ON a.eid = ANY(t.desc_ids) + WHERE t.depth <= 2 + AND t.id NOT 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 + ) + GROUP BY t.id, t.depth, t.item_id, t.name + ) + SELECT + CASE r.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' WHEN 2 THEN 'ITEM' END::VARCHAR, + r.depth, + r.section_code::VARCHAR, + r.name::VARCHAR, + -- Plan supp / dev + r.s_pq1, r.s_pq2, r.s_pq3, r.s_pq4, + COALESCE(r.s_pq1,0)+COALESCE(r.s_pq2,0)+COALESCE(r.s_pq3,0)+COALESCE(r.s_pq4,0), + r.d_pq1, r.d_pq2, r.d_pq3, r.d_pq4, + COALESCE(r.d_pq1,0)+COALESCE(r.d_pq2,0)+COALESCE(r.d_pq3,0)+COALESCE(r.d_pq4,0), + -- Approved supp = plan + seq_dfip + seq_ssp + reserve + COALESCE(r.s_pq1,0)+COALESCE(r.s_sd1,0)+COALESCE(r.s_sg1,0)+COALESCE(r.s_rq1,0), + COALESCE(r.s_pq2,0)+COALESCE(r.s_sd2,0)+COALESCE(r.s_sg2,0)+COALESCE(r.s_rq2,0), + COALESCE(r.s_pq3,0)+COALESCE(r.s_sd3,0)+COALESCE(r.s_sg3,0)+COALESCE(r.s_rq3,0), + COALESCE(r.s_pq4,0)+COALESCE(r.s_sd4,0)+COALESCE(r.s_sg4,0)+COALESCE(r.s_rq4,0), + COALESCE(r.s_pq1,0)+COALESCE(r.s_sd1,0)+COALESCE(r.s_sg1,0)+COALESCE(r.s_rq1,0) + +COALESCE(r.s_pq2,0)+COALESCE(r.s_sd2,0)+COALESCE(r.s_sg2,0)+COALESCE(r.s_rq2,0) + +COALESCE(r.s_pq3,0)+COALESCE(r.s_sd3,0)+COALESCE(r.s_sg3,0)+COALESCE(r.s_rq3,0) + +COALESCE(r.s_pq4,0)+COALESCE(r.s_sd4,0)+COALESCE(r.s_sg4,0)+COALESCE(r.s_rq4,0), + -- Approved dev + COALESCE(r.d_pq1,0)+COALESCE(r.d_sd1,0)+COALESCE(r.d_sg1,0)+COALESCE(r.d_rq1,0), + COALESCE(r.d_pq2,0)+COALESCE(r.d_sd2,0)+COALESCE(r.d_sg2,0)+COALESCE(r.d_rq2,0), + COALESCE(r.d_pq3,0)+COALESCE(r.d_sd3,0)+COALESCE(r.d_sg3,0)+COALESCE(r.d_rq3,0), + COALESCE(r.d_pq4,0)+COALESCE(r.d_sd4,0)+COALESCE(r.d_sg4,0)+COALESCE(r.d_rq4,0), + COALESCE(r.d_pq1,0)+COALESCE(r.d_sd1,0)+COALESCE(r.d_sg1,0)+COALESCE(r.d_rq1,0) + +COALESCE(r.d_pq2,0)+COALESCE(r.d_sd2,0)+COALESCE(r.d_sg2,0)+COALESCE(r.d_rq2,0) + +COALESCE(r.d_pq3,0)+COALESCE(r.d_sd3,0)+COALESCE(r.d_sg3,0)+COALESCE(r.d_rq3,0) + +COALESCE(r.d_pq4,0)+COALESCE(r.d_sd4,0)+COALESCE(r.d_sg4,0)+COALESCE(r.d_rq4,0), + -- Fact supp / dev + r.s_fq1, r.s_fq2, r.s_fq3, r.s_fq4, + COALESCE(r.s_fq1,0)+COALESCE(r.s_fq2,0)+COALESCE(r.s_fq3,0)+COALESCE(r.s_fq4,0), + r.d_fq1, r.d_fq2, r.d_fq3, r.d_fq4, + COALESCE(r.d_fq1,0)+COALESCE(r.d_fq2,0)+COALESCE(r.d_fq3,0)+COALESCE(r.d_fq4,0), + -- Corrected supp = approved + transfers + revisions + adj + COALESCE(r.s_pq1,0)+COALESCE(r.s_sd1,0)+COALESCE(r.s_sg1,0)+COALESCE(r.s_rq1,0) + +COALESCE(r.s_adj1,0), + COALESCE(r.s_pq2,0)+COALESCE(r.s_sd2,0)+COALESCE(r.s_sg2,0)+COALESCE(r.s_rq2,0) + +COALESCE(r.s_t1q2,0)+COALESCE(r.s_rev2,0)+COALESCE(r.s_adj2,0), + COALESCE(r.s_pq3,0)+COALESCE(r.s_sd3,0)+COALESCE(r.s_sg3,0)+COALESCE(r.s_rq3,0) + +COALESCE(r.s_t1q3,0)+COALESCE(r.s_t2q3,0)+COALESCE(r.s_rev3,0)+COALESCE(r.s_adj3,0), + COALESCE(r.s_pq4,0)+COALESCE(r.s_sd4,0)+COALESCE(r.s_sg4,0)+COALESCE(r.s_rq4,0) + +COALESCE(r.s_t1q4,0)+COALESCE(r.s_t2q4,0)+COALESCE(r.s_t3q4,0)+COALESCE(r.s_rev4,0)+COALESCE(r.s_adj4,0), + COALESCE(r.s_pq1,0)+COALESCE(r.s_pq2,0)+COALESCE(r.s_pq3,0)+COALESCE(r.s_pq4,0) + +COALESCE(r.s_sd1,0)+COALESCE(r.s_sd2,0)+COALESCE(r.s_sd3,0)+COALESCE(r.s_sd4,0) + +COALESCE(r.s_sg1,0)+COALESCE(r.s_sg2,0)+COALESCE(r.s_sg3,0)+COALESCE(r.s_sg4,0) + +COALESCE(r.s_rq1,0)+COALESCE(r.s_rq2,0)+COALESCE(r.s_rq3,0)+COALESCE(r.s_rq4,0) + +COALESCE(r.s_adj1,0)+COALESCE(r.s_adj2,0)+COALESCE(r.s_adj3,0)+COALESCE(r.s_adj4,0) + +COALESCE(r.s_rev2,0)+COALESCE(r.s_rev3,0)+COALESCE(r.s_rev4,0), + -- Corrected dev + COALESCE(r.d_pq1,0)+COALESCE(r.d_sd1,0)+COALESCE(r.d_sg1,0)+COALESCE(r.d_rq1,0) + +COALESCE(r.d_adj1,0), + COALESCE(r.d_pq2,0)+COALESCE(r.d_sd2,0)+COALESCE(r.d_sg2,0)+COALESCE(r.d_rq2,0) + +COALESCE(r.d_t1q2,0)+COALESCE(r.d_rev2,0)+COALESCE(r.d_adj2,0), + COALESCE(r.d_pq3,0)+COALESCE(r.d_sd3,0)+COALESCE(r.d_sg3,0)+COALESCE(r.d_rq3,0) + +COALESCE(r.d_t1q3,0)+COALESCE(r.d_t2q3,0)+COALESCE(r.d_rev3,0)+COALESCE(r.d_adj3,0), + COALESCE(r.d_pq4,0)+COALESCE(r.d_sd4,0)+COALESCE(r.d_sg4,0)+COALESCE(r.d_rq4,0) + +COALESCE(r.d_t1q4,0)+COALESCE(r.d_t2q4,0)+COALESCE(r.d_t3q4,0)+COALESCE(r.d_rev4,0)+COALESCE(r.d_adj4,0), + COALESCE(r.d_pq1,0)+COALESCE(r.d_pq2,0)+COALESCE(r.d_pq3,0)+COALESCE(r.d_pq4,0) + +COALESCE(r.d_sd1,0)+COALESCE(r.d_sd2,0)+COALESCE(r.d_sd3,0)+COALESCE(r.d_sd4,0) + +COALESCE(r.d_sg1,0)+COALESCE(r.d_sg2,0)+COALESCE(r.d_sg3,0)+COALESCE(r.d_sg4,0) + +COALESCE(r.d_rq1,0)+COALESCE(r.d_rq2,0)+COALESCE(r.d_rq3,0)+COALESCE(r.d_rq4,0) + +COALESCE(r.d_adj1,0)+COALESCE(r.d_adj2,0)+COALESCE(r.d_adj3,0)+COALESCE(r.d_adj4,0) + +COALESCE(r.d_rev2,0)+COALESCE(r.d_rev3,0)+COALESCE(r.d_rev4,0) + FROM tw_rollup r + ORDER BY r.section_code; +END; +$function$ +; + ALTER TABLE v3.expense_item ADD CONSTRAINT expense_item_expense_item_fk FOREIGN KEY (parent_id) REFERENCES v3.expense_item(id);