-- pg_get_functiondef с dfip_1850, ревизия 0050 (AURORA-1850, D8). Не миграция: исходник для 0051, база ревью и отката. CREATE OR REPLACE FUNCTION v3.v_form2_sheet_sections(p_form_id integer, p_sheet character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, line_id integer, col_section_code character varying, col_item_id character varying, col_num_group_id character varying, col_name character varying, col_vsp_id integer, col_vsp_address character varying, col_plan_q1 numeric, col_plan_q2 numeric, col_plan_q3 numeric, col_plan_q4 numeric, col_plan_year numeric, col_plan_comment character varying, col_seq_dfip_q1 numeric, col_seq_dfip_q2 numeric, col_seq_dfip_q3 numeric, col_seq_dfip_q4 numeric, col_seq_dfip_year numeric, col_seq_dfip_just character varying, col_seq_ssp_q1 numeric, col_seq_ssp_q2 numeric, col_seq_ssp_q3 numeric, col_seq_ssp_q4 numeric, col_seq_ssp_year numeric, col_seq_ssp_just character varying, col_appr_q1 numeric, col_appr_q2 numeric, col_appr_q3 numeric, col_appr_q4 numeric, col_appr_year numeric, col_cd_counterparty character varying, col_cd_reference character varying, col_cd_date date, col_cd_subject character varying, col_cd_currency character varying, col_cd_ceiling numeric, col_cd_vat_rate character varying, col_cd_deadline character varying, col_cd_scheme character varying, col_cd_act character varying, col_cd_comment character varying, col_book_q1 numeric, col_book_q2 numeric, col_book_q3 numeric, col_book_q4 numeric, col_book_next_q1 numeric, col_book_next_q2 numeric, col_book_next_q3 numeric, col_book_next_q4 numeric, col_q1_adj_current numeric, col_q1_adj_ssp numeric, col_q1_adj_reserve numeric, col_q1_adj_comment character varying, col_q1_corrected_plan numeric, col_q1_pay_date date, col_q1_pay_amount numeric, col_q1_pay_comment character varying, col_q1_pay_act character varying, col_q1_booking numeric, col_q1_actual_m1 numeric, col_q1_actual_m2 numeric, col_q1_actual_m3 numeric, col_q1_actual_quarter numeric, col_q1_residual_after_booking numeric, col_q1_residual_after_actual numeric, col_q1_transfer_q2 numeric, col_q1_transfer_q2_delay_acts numeric, col_q1_transfer_q2_delay_procurement numeric, col_q1_transfer_q2_economy_rf numeric, col_q1_transfer_next_comment character varying, col_q1_transfer_q3 numeric, col_q1_transfer_q4 numeric, col_q1_transfer_far_comment character varying, col_q1_transfer_econ numeric, col_q1_total numeric, col_q2_target_change numeric, col_q2_base_correction numeric, col_q2_base_correction_comment character varying, col_q2_revision_inc numeric, col_q2_revision_seq numeric, col_q2_revision_comment character varying, col_q2_new_plan numeric, col_q2_adj_current numeric, col_q2_adj_ssp numeric, col_q2_adj_reserve numeric, col_q2_adj_comment character varying, col_q2_corrected_plan numeric, col_q2_pay_date date, col_q2_pay_amount numeric, col_q2_pay_comment character varying, col_q2_pay_act character varying, col_q2_booking numeric, col_q2_actual_m1 numeric, col_q2_actual_m2 numeric, col_q2_actual_m3 numeric, col_q2_actual_quarter numeric, col_q2_residual_after_booking numeric, col_q2_residual_after_actual numeric, col_q2_transfer_q3 numeric, col_q2_transfer_q3_delay_acts numeric, col_q2_transfer_q3_delay_procurement numeric, col_q2_transfer_q3_economy_rf numeric, col_q2_transfer_next_comment character varying, col_q2_transfer_q4 numeric, col_q2_transfer_far_comment character varying, col_q2_transfer_econ numeric, col_q2_total numeric, col_q3_target_change numeric, col_q3_base_correction numeric, col_q3_base_correction_comment character varying, col_q3_revision_inc numeric, col_q3_revision_seq numeric, col_q3_revision_comment character varying, col_q3_new_plan numeric, col_q3_adj_current numeric, col_q3_adj_ssp numeric, col_q3_adj_reserve numeric, col_q3_adj_comment character varying, col_q3_corrected_plan numeric, col_q3_pay_date date, col_q3_pay_amount numeric, col_q3_pay_comment character varying, col_q3_pay_act character varying, col_q3_booking numeric, col_q3_actual_m1 numeric, col_q3_actual_m2 numeric, col_q3_actual_m3 numeric, col_q3_actual_quarter numeric, col_q3_residual_after_booking numeric, col_q3_residual_after_actual numeric, col_q3_transfer_q4 numeric, col_q3_transfer_q4_delay_acts numeric, col_q3_transfer_q4_delay_procurement numeric, col_q3_transfer_q4_economy_rf numeric, col_q3_transfer_next_comment character varying, col_q3_transfer_econ numeric, col_q3_total numeric, col_q4_target_change numeric, col_q4_base_correction numeric, col_q4_base_correction_comment character varying, col_q4_revision_inc numeric, col_q4_revision_seq numeric, col_q4_revision_comment character varying, col_q4_new_plan numeric, col_q4_adj_current numeric, col_q4_adj_ssp numeric, col_q4_adj_reserve numeric, col_q4_adj_comment character varying, col_q4_corrected_plan numeric, col_q4_pay_date date, col_q4_pay_amount numeric, col_q4_pay_comment character varying, col_q4_pay_act character varying, col_q4_booking numeric, col_q4_actual_m1 numeric, col_q4_actual_m2 numeric, col_q4_actual_m3 numeric, col_q4_actual_spod numeric, col_q4_actual_quarter numeric, col_q4_residual_after_booking numeric, col_q4_residual_after_actual numeric, col_q4_transfer_econ numeric, col_q4_total numeric, col_fact_year numeric, col_pay_year numeric, col_economy_year numeric, col_internal_order character varying, col_cs_total numeric, col_cs_counterparty character varying, col_cs_deadline character varying, col_cs_comment character varying, col_cs_future_y1 numeric, col_cs_future_y2 numeric, col_cs_other_ssp numeric, col_al_contract_ref character varying, col_al_purpose character varying, col_al_order character varying, col_al_property character varying, col_ca_approved numeric, col_ca_protocol character varying, col_ca_note character varying, col_ckk_ceiling numeric, col_ckk_rf_sched character varying, col_ckk_deadline character varying, col_ckk_proc_plan character varying, col_ckk_proc_meth character varying, col_ckk_comment character varying, col_cd_addenda character varying, col_cd_exp_q1 numeric, col_cd_exp_q2 numeric, col_cd_exp_q3 numeric, col_cd_exp_q4 numeric, col_cd_rf_sched character varying, col_cd_exchange_rate numeric, col_cd_amount_foreign numeric, col_q1_adj_rf numeric, col_q1_pay_ho numeric, col_q1_pay_rf numeric, col_q2_adj_rf numeric, col_q2_pay_ho numeric, col_q2_pay_rf numeric, col_q3_adj_rf numeric, col_q3_pay_ho numeric, col_q3_pay_rf numeric, col_q4_adj_rf numeric, col_q4_pay_ho numeric, col_q4_pay_rf numeric, _sort_path integer[]) LANGUAGE plpgsql STABLE AS $function$ #variable_conflict use_column DECLARE s_plan BOOL; s_seq_d BOOL; s_seq_s BOOL; s_appr BOOL; s_cd BOOL; s_book BOOL; s_cs BOOL; s_al BOOL; s_ca BOOL; s_ckk BOOL; -- НОВЫЕ блоки s_q1 BOOL; s_q2 BOOL; s_q3 BOOL; s_q4 BOOL; s_tot BOOL; s_need_ap BOOL; -- plan/seq/reserve нужны для approved + cp1..cp4 BEGIN s_plan := p_sections IS NULL OR 'plan' = ANY(p_sections); s_seq_d := p_sections IS NULL OR 'seq_dfip' = ANY(p_sections); s_seq_s := p_sections IS NULL OR 'seq_ssp' = ANY(p_sections); s_appr := p_sections IS NULL OR 'approved' = ANY(p_sections); s_cd := p_sections IS NULL OR 'contract' = ANY(p_sections); s_book := p_sections IS NULL OR 'booking' = ANY(p_sections); s_cs := p_sections IS NULL OR 'contract_summary' = ANY(p_sections); s_al := p_sections IS NULL OR 'allocation' = ANY(p_sections); s_ca := p_sections IS NULL OR 'collegial' = ANY(p_sections); s_ckk := p_sections IS NULL OR 'ckk' = ANY(p_sections); s_q1 := p_sections IS NULL OR 'q1' = ANY(p_sections); s_q2 := p_sections IS NULL OR 'q2' = ANY(p_sections); s_q3 := p_sections IS NULL OR 'q3' = ANY(p_sections); s_q4 := p_sections IS NULL OR 'q4' = ANY(p_sections); s_tot := p_sections IS NULL OR 'totals' = ANY(p_sections); s_need_ap := s_plan OR s_appr OR s_q1 OR s_q2 OR s_q3 OR s_q4; RETURN QUERY WITH tw AS ( SELECT t.id, t.section_code, t.item_id, t.num_group_id, t.name, t.depth, t.path, t.parent_id, t.parent_item_id, t.desc_ids, p.parent_item_id AS grandparent_item_id FROM v3.mv_expense_item_tree t LEFT JOIN v3.mv_expense_item_tree p ON p.id = t.parent_id 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 WHERE t.sheet = p_sheet ), page AS ( SELECT bl.id AS lid, bl.expense_item_id AS eid, bl.name AS bname, bl.vsp_id, bl.internal_order AS io FROM v3.budget_line bl JOIN v3.expense_item ei ON ei.id = bl.expense_item_id WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet ), jp AS (SELECT p.* FROM v3.plan p JOIN page pg ON p.line_id = pg.lid WHERE s_need_ap), jsd AS (SELECT s.* FROM v3.sequestration s JOIN page pg ON s.line_id = pg.lid WHERE s_need_ap AND s.actor='DFIP'), jsg AS (SELECT s.* FROM v3.sequestration s JOIN page pg ON s.line_id = pg.lid WHERE s_need_ap AND s.actor='SSP_GO'), jr AS (SELECT r.* FROM v3.reserve r JOIN page pg ON r.line_id = pg.lid WHERE s_need_ap), jcd AS (SELECT c.* FROM v3.contract_detail c JOIN page pg ON c.line_id = pg.lid WHERE s_cd), jck AS (SELECT c.* FROM v3.ckk c JOIN page pg ON c.line_id = pg.lid WHERE s_book OR s_ckk), jcs AS (SELECT c.* FROM v3.contract_summary c JOIN page pg ON c.line_id = pg.lid WHERE s_cs), jal AS (SELECT a.* FROM v3.allocation a JOIN page pg ON a.line_id = pg.lid WHERE s_al), jca AS (SELECT c.* FROM v3.collegial_approval c JOIN page pg ON c.line_id = pg.lid WHERE s_ca), jq1 AS (SELECT q.* FROM v3.budget_line_quarter q JOIN page pg ON q.line_id = pg.lid WHERE s_q1 AND q.quarter=1), jq2 AS (SELECT q.* FROM v3.budget_line_quarter q JOIN page pg ON q.line_id = pg.lid WHERE s_q2 AND q.quarter=2), jq3 AS (SELECT q.* FROM v3.budget_line_quarter q JOIN page pg ON q.line_id = pg.lid WHERE s_q3 AND q.quarter=3), jq4 AS (SELECT q.* FROM v3.budget_line_quarter q JOIN page pg ON q.line_id = pg.lid WHERE (s_q4 OR s_tot) AND q.quarter=4), input_base AS ( SELECT pg.lid, pg.eid, pg.bname, pg.vsp_id, v.address AS vsp_addr, CASE WHEN t.depth < 3 THEN t.item_id WHEN t.depth = 3 THEN t.parent_item_id WHEN t.depth = 4 THEN t.grandparent_item_id END AS sc, t.item_id AS ic, t.num_group_id AS ng, t.name AS ename, t.path AS tree_path, COALESCE(p.plan_q1,0) AS pq1, COALESCE(p.plan_q2,0) AS pq2, COALESCE(p.plan_q3,0) AS pq3, COALESCE(p.plan_q4,0) AS pq4, p.comment AS pcmt, COALESCE(sd.adj_q1,0) AS dq1, COALESCE(sd.adj_q2,0) AS dq2, COALESCE(sd.adj_q3,0) AS dq3, COALESCE(sd.adj_q4,0) AS dq4, sd.justification AS djust, COALESCE(sg.adj_q1,0) AS gq1, COALESCE(sg.adj_q2,0) AS gq2, COALESCE(sg.adj_q3,0) AS gq3, COALESCE(sg.adj_q4,0) AS gq4, sg.justification AS gjust, COALESCE(r.amount_q1,0) AS rq1, COALESCE(r.amount_q2,0) AS rq2, COALESCE(r.amount_q3,0) AS rq3, COALESCE(r.amount_q4,0) AS rq4, cd.counterparty AS cd_cp, cd.reference AS cd_ref, cd.contract_date AS cd_dt, cd.subject AS cd_subj, cd.currency AS cd_cur, cd.ceiling_amount AS cd_ceil, cd.vat_rate AS cd_vat, cd.deadline AS cd_dl, cd.payment_scheme AS cd_sch, cd.act AS cd_act, cd.comment AS cd_cmt, ck.expenses_q1 AS bk1, ck.expenses_q2 AS bk2, ck.expenses_q3 AS bk3, ck.expenses_q4 AS bk4, ck.expenses_next_year_q1 AS bn1, ck.expenses_next_year_q2 AS bn2, ck.expenses_next_year_q3 AS bn3, ck.expenses_next_year_q4 AS bn4, pg.io AS io, cs.total_amount AS cs_total, cs.counterparty AS cs_cp, cs.deadline AS cs_dl, cs.comment AS cs_cmt, cs.future_payments_y1 AS cs_fy1, cs.future_payments_y2 AS cs_fy2, cs.other_ssp_amount AS cs_oth, al.contract_ref AS al_cref, al.allocation_purpose AS al_purp, al.internal_order AS al_io, al.property_object AS al_prop, ca.approved_amount AS ca_amt, ca.protocol_reference AS ca_proto, ca.note AS ca_note, ck.ceiling_amount AS ckk_ceil, ck.rf_schedule AS ckk_rf, ck.delivery_deadline AS ckk_dl, ck.procurement_plan AS ckk_pplan, ck.procurement_method AS ckk_pmeth, ck.comment AS ckk_cmt, cd.addenda AS cd_add, cd.expenses_q1 AS cd_e1, cd.expenses_q2 AS cd_e2, cd.expenses_q3 AS cd_e3, cd.expenses_q4 AS cd_e4, cd.rf_schedule AS cd_rf, cd.exchange_rate AS cd_rate, cd.amount_foreign AS cd_fx, q1.adj_rf AS q1_arf, q1.payment_amount_ho AS q1_pho, q1.payment_amount_rf AS q1_prf, q2.adj_rf AS q2_arf, q2.payment_amount_ho AS q2_pho, q2.payment_amount_rf AS q2_prf, q3.adj_rf AS q3_arf, q3.payment_amount_ho AS q3_pho, q3.payment_amount_rf AS q3_prf, q4.adj_rf AS q4_arf, q4.payment_amount_ho AS q4_pho, q4.payment_amount_rf AS q4_prf, q1.adj_current AS q1_ac, q1.adj_ssp AS q1_as, q1.adj_reserve AS q1_arv, q1.adj_comment AS q1_acmt, q1.payment_date AS q1_pd, q1.payment_amount AS q1_pa, q1.payment_comment AS q1_pcmt, q1.payment_act AS q1_pact, COALESCE( q1.booking_amount, CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q1 WHEN ck.expenses_q1 > 0 THEN ck.expenses_q1 ELSE cd.expenses_q1 END ) AS q1_book, q1.actual_m1 AS q1_m1, q1.actual_m2 AS q1_m2, q1.actual_m3 AS q1_m3, q1.transfer_to_q2 AS q1_tq2, q1.transfer_to_q3 AS q1_tq3, q1.transfer_to_q4 AS q1_tq4, q1.transfer_to_economy AS q1_te, q1.transfer_delay_acts AS q1_tda, q1.transfer_delay_procurement AS q1_tdp, q1.transfer_economy_rf AS q1_terf, q1.transfer_next_comment AS q1_tnc, q1.transfer_far_comment AS q1_tfc, q2.target_change AS q2_tc, q2.base_plan_correction AS q2_bc, q2.base_plan_correction_comment AS q2_bcc, q2.plan_revision_increase AS q2_rinc, q2.plan_revision_sequester AS q2_rseq, q2.plan_revision_comment AS q2_rcmt, q2.adj_current AS q2_ac, q2.adj_ssp AS q2_as, q2.adj_reserve AS q2_arv, q2.adj_comment AS q2_acmt, q2.payment_date AS q2_pd, q2.payment_amount AS q2_pa, q2.payment_comment AS q2_pcmt, q2.payment_act AS q2_pact, COALESCE( q2.booking_amount, CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q2 WHEN ck.expenses_q2 > 0 THEN ck.expenses_q2 ELSE cd.expenses_q2 END ) AS q2_book, q2.actual_m1 AS q2_m1, q2.actual_m2 AS q2_m2, q2.actual_m3 AS q2_m3, q2.transfer_to_q3 AS q2_tq3, q2.transfer_to_q4 AS q2_tq4, q2.transfer_to_economy AS q2_te, q2.transfer_delay_acts AS q2_tda, q2.transfer_delay_procurement AS q2_tdp, q2.transfer_economy_rf AS q2_terf, q2.transfer_next_comment AS q2_tnc, q2.transfer_far_comment AS q2_tfc, q3.target_change AS q3_tc, q3.base_plan_correction AS q3_bc, q3.base_plan_correction_comment AS q3_bcc, q3.plan_revision_increase AS q3_rinc, q3.plan_revision_sequester AS q3_rseq, q3.plan_revision_comment AS q3_rcmt, q3.adj_current AS q3_ac, q3.adj_ssp AS q3_as, q3.adj_reserve AS q3_arv, q3.adj_comment AS q3_acmt, q3.payment_date AS q3_pd, q3.payment_amount AS q3_pa, q3.payment_comment AS q3_pcmt, q3.payment_act AS q3_pact, COALESCE( q3.booking_amount, CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q3 WHEN ck.expenses_q3 > 0 THEN ck.expenses_q3 ELSE cd.expenses_q3 END ) AS q3_book, q3.actual_m1 AS q3_m1, q3.actual_m2 AS q3_m2, q3.actual_m3 AS q3_m3, q3.transfer_to_q4 AS q3_tq4, q3.transfer_to_economy AS q3_te, q3.transfer_delay_acts AS q3_tda, q3.transfer_delay_procurement AS q3_tdp, q3.transfer_economy_rf AS q3_terf, q3.transfer_next_comment AS q3_tnc, q4.target_change AS q4_tc, q4.base_plan_correction AS q4_bc, q4.base_plan_correction_comment AS q4_bcc, q4.plan_revision_increase AS q4_rinc, q4.plan_revision_sequester AS q4_rseq, q4.plan_revision_comment AS q4_rcmt, q4.adj_current AS q4_ac, q4.adj_ssp AS q4_as, q4.adj_reserve AS q4_arv, q4.adj_comment AS q4_acmt, q4.payment_date AS q4_pd, q4.payment_amount AS q4_pa, q4.payment_comment AS q4_pcmt, q4.payment_act AS q4_pact, COALESCE( q4.booking_amount, CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q4 WHEN ck.expenses_q4 > 0 THEN ck.expenses_q4 ELSE cd.expenses_q4 END ) AS q4_book, q4.actual_m1 AS q4_m1, q4.actual_m2 AS q4_m2, q4.actual_m3 AS q4_m3, q4.actual_spod AS q4_spod, q4.transfer_to_economy AS q4_te, COALESCE(p.plan_q1,0)+COALESCE(sd.adj_q1,0)+COALESCE(sg.adj_q1,0)+COALESCE(r.amount_q1,0) AS ap1, COALESCE(p.plan_q2,0)+COALESCE(sd.adj_q2,0)+COALESCE(sg.adj_q2,0)+COALESCE(r.amount_q2,0) AS ap2, COALESCE(p.plan_q3,0)+COALESCE(sd.adj_q3,0)+COALESCE(sg.adj_q3,0)+COALESCE(r.amount_q3,0) AS ap3, COALESCE(p.plan_q4,0)+COALESCE(sd.adj_q4,0)+COALESCE(sg.adj_q4,0)+COALESCE(r.amount_q4,0) AS ap4 FROM page pg JOIN tw t ON t.id = pg.eid LEFT JOIN v3.vsp v ON v.id = pg.vsp_id LEFT JOIN jp p ON p.line_id = pg.lid LEFT JOIN jsd sd ON sd.line_id = pg.lid LEFT JOIN jsg sg ON sg.line_id = pg.lid LEFT JOIN jr r ON r.line_id = pg.lid LEFT JOIN jcd cd ON cd.line_id = pg.lid LEFT JOIN jck ck ON ck.line_id = pg.lid LEFT JOIN jcs cs ON cs.line_id = pg.lid LEFT JOIN jal al ON al.line_id = pg.lid LEFT JOIN jca ca ON ca.line_id = pg.lid LEFT JOIN jq1 q1 ON q1.line_id = pg.lid LEFT JOIN jq2 q2 ON q2.line_id = pg.lid LEFT JOIN jq3 q3 ON q3.line_id = pg.lid LEFT JOIN jq4 q4 ON q4.line_id = pg.lid ), enriched AS ( SELECT b.*, b.ap1 + COALESCE(b.q1_ac,0)+COALESCE(b.q1_as,0)+COALESCE(b.q1_arv,0) AS cp1, COALESCE(b.q1_m1,0)+COALESCE(b.q1_m2,0)+COALESCE(b.q1_m3,0) AS aq1, b.ap2 + COALESCE(b.q1_tq2,0) + COALESCE(b.q2_rinc,0)+COALESCE(b.q2_rseq,0) + COALESCE(b.q2_bc,0) AS np2, COALESCE(b.q2_m1,0)+COALESCE(b.q2_m2,0)+COALESCE(b.q2_m3,0) AS aq2, b.ap3 + COALESCE(b.q1_tq3,0)+COALESCE(b.q2_tq3,0) + COALESCE(b.q3_rinc,0)+COALESCE(b.q3_rseq,0) + COALESCE(b.q3_bc,0) AS np3, COALESCE(b.q3_m1,0)+COALESCE(b.q3_m2,0)+COALESCE(b.q3_m3,0) AS aq3, b.ap4 + COALESCE(b.q1_tq4,0)+COALESCE(b.q2_tq4,0)+COALESCE(b.q3_tq4,0) + COALESCE(b.q4_rinc,0)+COALESCE(b.q4_rseq,0) + COALESCE(b.q4_bc,0) AS np4, COALESCE(b.q4_m1,0)+COALESCE(b.q4_m2,0)+COALESCE(b.q4_m3,0)+COALESCE(b.q4_spod,0) AS aq4 FROM input_base b ), final_input AS ( SELECT e.*, e.np2 + COALESCE(e.q2_ac,0)+COALESCE(e.q2_as,0)+COALESCE(e.q2_arv,0) AS cp2, e.np3 + COALESCE(e.q3_ac,0)+COALESCE(e.q3_as,0)+COALESCE(e.q3_arv,0) AS cp3, e.np4 + COALESCE(e.q4_ac,0)+COALESCE(e.q4_as,0)+COALESCE(e.q4_arv,0) AS cp4 FROM enriched e ), agg AS ( SELECT bl.expense_item_id AS eid, SUM(p.plan_q1) AS sp1, SUM(p.plan_q2) AS sp2, SUM(p.plan_q3) AS sp3, SUM(p.plan_q4) AS sp4, SUM(sd.adj_q1) AS sd1, SUM(sd.adj_q2) AS sd2, SUM(sd.adj_q3) AS sd3, SUM(sd.adj_q4) AS sd4, SUM(sg.adj_q1) AS sg1, SUM(sg.adj_q2) AS sg2, SUM(sg.adj_q3) AS sg3, SUM(sg.adj_q4) AS sg4, SUM(r.amount_q1) AS sr1, SUM(r.amount_q2) AS sr2, SUM(r.amount_q3) AS sr3, SUM(r.amount_q4) AS sr4, SUM(ck.expenses_q1) AS bk1, SUM(ck.expenses_q2) AS bk2, SUM(ck.expenses_q3) AS bk3, SUM(ck.expenses_q4) AS bk4, SUM(cd.expenses_q1) AS bkc1, SUM(cd.expenses_q2) AS bkc2, SUM(cd.expenses_q3) AS bkc3, SUM(cd.expenses_q4) AS bkc4, SUM(ck.expenses_next_year_q1) AS bn1, SUM(ck.expenses_next_year_q2) AS bn2, SUM(ck.expenses_next_year_q3) AS bn3, SUM(ck.expenses_next_year_q4) AS bn4 FROM v3.budget_line bl JOIN v3.expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN v3.plan p ON p.line_id = bl.id AND s_need_ap LEFT JOIN v3.sequestration sd ON sd.line_id = bl.id AND sd.actor='DFIP' AND s_need_ap LEFT JOIN v3.sequestration sg ON sg.line_id = bl.id AND sg.actor='SSP_GO' AND s_need_ap LEFT JOIN v3.reserve r ON r.line_id = bl.id AND s_need_ap LEFT JOIN v3.ckk ck ON ck.line_id = bl.id AND s_book LEFT JOIN v3.contract_detail cd ON cd.line_id = bl.id AND s_cd WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND (s_need_ap OR s_book OR s_cd) GROUP BY bl.expense_item_id ), aq_q AS ( SELECT bl.expense_item_id AS eid, qrtrs.qrtr as quarter, SUM(q.adj_current) AS ac, SUM(q.adj_ssp) AS as_v, SUM(q.adj_reserve) AS arv, SUM(q.payment_amount) AS pa, SUM( COALESCE( q.booking_amount, CASE WHEN qrtrs.qrtr = 1 THEN CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q1 WHEN ck.expenses_q1 > 0 THEN ck.expenses_q1 ELSE cd.expenses_q1 END WHEN qrtrs.qrtr = 2 THEN CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q2 WHEN ck.expenses_q2 > 0 THEN ck.expenses_q2 ELSE cd.expenses_q2 END WHEN qrtrs.qrtr = 3 THEN CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q3 WHEN ck.expenses_q3 > 0 THEN ck.expenses_q3 ELSE cd.expenses_q3 END WHEN qrtrs.qrtr = 4 THEN CASE WHEN p_sheet = 'AHR' THEN ck.expenses_q4 WHEN ck.expenses_q4 > 0 THEN ck.expenses_q4 ELSE cd.expenses_q4 END END )) AS bk, SUM(q.actual_m1) AS m1, SUM(q.actual_m2) AS m2, SUM(q.actual_m3) AS m3, SUM(q.actual_spod) AS spod, SUM(q.transfer_to_q2) AS tq2, SUM(q.transfer_to_q3) AS tq3, SUM(q.transfer_to_q4) AS tq4, SUM(q.transfer_to_economy) AS te, SUM(q.transfer_delay_acts) AS tda, SUM(q.transfer_delay_procurement) AS tdp, SUM(q.transfer_economy_rf) AS terf, SUM(COALESCE(q.plan_revision_increase,0) + COALESCE(q.plan_revision_sequester,0) + COALESCE(q.target_change,0) + COALESCE(q.base_plan_correction,0)) AS rev FROM v3.budget_line bl CROSS JOIN (VALUES (1), (2), (3), (4)) AS qrtrs(qrtr) JOIN v3.expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN v3.budget_line_quarter q ON q.line_id = bl.id AND q.quarter = qrtrs.qrtr LEFT JOIN v3.ckk ck ON bl.id = ck.line_id LEFT JOIN v3.contract_detail cd ON bl.id = cd.line_id WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet GROUP BY bl.expense_item_id, qrtrs.qrtr ), tw_agg AS ( SELECT tw.id, SUM(a.sp1) AS sp1, SUM(a.sp2) AS sp2, SUM(a.sp3) AS sp3, SUM(a.sp4) AS sp4, SUM(a.sd1) AS sd1, SUM(a.sd2) AS sd2, SUM(a.sd3) AS sd3, SUM(a.sd4) AS sd4, SUM(a.sg1) AS sg1, SUM(a.sg2) AS sg2, SUM(a.sg3) AS sg3, SUM(a.sg4) AS sg4, SUM(a.sr1) AS sr1, SUM(a.sr2) AS sr2, SUM(a.sr3) AS sr3, SUM(a.sr4) AS sr4, SUM(a.bk1) AS bk1, SUM(a.bk2) AS bk2, SUM(a.bk3) AS bk3, SUM(a.bk4) AS bk4, SUM(a.bkc1) AS bkc1, SUM(a.bkc2) AS bkc2, SUM(a.bkc3) AS bkc3, SUM(a.bkc4) AS bkc4, SUM(a.bn1) AS bn1, SUM(a.bn2) AS bn2, SUM(a.bn3) AS bn3, SUM(a.bn4) AS bn4 FROM tw LEFT JOIN agg a ON a.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_aq1 AS ( SELECT tw.id, SUM(b.ac) AS ac, SUM(b.as_v) AS as_v, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.bk) AS bk, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq2) AS tq2, SUM(b.tq3) AS tq3, SUM(b.tq4) AS tq4, SUM(b.te) AS te, SUM(b.tda) AS tda, SUM(b.tdp) AS tdp, SUM(b.terf) AS terf FROM tw LEFT JOIN aq_q b ON b.eid = ANY(tw.desc_ids) AND b.quarter=1 GROUP BY tw.id ), tw_aq2 AS ( SELECT tw.id, SUM(b.ac) AS ac, SUM(b.as_v) AS as_v, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.bk) AS bk, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq3) AS tq3, SUM(b.tq4) AS tq4, SUM(b.te) AS te, SUM(b.rev) AS rev, SUM(b.tda) AS tda, SUM(b.tdp) AS tdp, SUM(b.terf) AS terf FROM tw LEFT JOIN aq_q b ON b.eid = ANY(tw.desc_ids) AND b.quarter=2 GROUP BY tw.id ), tw_aq3 AS ( SELECT tw.id, SUM(b.ac) AS ac, SUM(b.as_v) AS as_v, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.bk) AS bk, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq4) AS tq4, SUM(b.te) AS te, SUM(b.rev) AS rev, SUM(b.tda) AS tda, SUM(b.tdp) AS tdp, SUM(b.terf) AS terf FROM tw LEFT JOIN aq_q b ON b.eid = ANY(tw.desc_ids) AND b.quarter=3 GROUP BY tw.id ), tw_aq4 AS ( SELECT tw.id, SUM(b.ac) AS ac, SUM(b.as_v) AS as_v, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.bk) AS bk, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.spod) AS spod, SUM(b.te) AS te, SUM(b.rev) AS rev FROM tw LEFT JOIN aq_q b ON b.eid = ANY(tw.desc_ids) AND b.quarter=4 GROUP BY tw.id ) SELECT * FROM ( SELECT 'INPUT'::VARCHAR, array_length(f.tree_path, 1)::INT, f.lid::INT, f.sc, f.ic, f.ng, COALESCE(f.bname, f.ename), f.vsp_id, f.vsp_addr, CASE WHEN s_plan THEN f.pq1 END, CASE WHEN s_plan THEN f.pq2 END, CASE WHEN s_plan THEN f.pq3 END, CASE WHEN s_plan THEN f.pq4 END, CASE WHEN s_plan THEN f.pq1+f.pq2+f.pq3+f.pq4 END, CASE WHEN s_plan THEN f.pcmt END, CASE WHEN s_seq_d THEN f.dq1 END, CASE WHEN s_seq_d THEN f.dq2 END, CASE WHEN s_seq_d THEN f.dq3 END, CASE WHEN s_seq_d THEN f.dq4 END, CASE WHEN s_seq_d THEN f.dq1+f.dq2+f.dq3+f.dq4 END, CASE WHEN s_seq_d THEN f.djust END, CASE WHEN s_seq_s THEN f.gq1 END, CASE WHEN s_seq_s THEN f.gq2 END, CASE WHEN s_seq_s THEN f.gq3 END, CASE WHEN s_seq_s THEN f.gq4 END, CASE WHEN s_seq_s THEN f.gq1+f.gq2+f.gq3+f.gq4 END, CASE WHEN s_seq_s THEN f.gjust END, CASE WHEN s_appr THEN f.ap1 END, CASE WHEN s_appr THEN f.ap2 END, CASE WHEN s_appr THEN f.ap3 END, CASE WHEN s_appr THEN f.ap4 END, CASE WHEN s_appr THEN f.ap1+f.ap2+f.ap3+f.ap4 END, CASE WHEN s_cd THEN f.cd_cp END, CASE WHEN s_cd THEN f.cd_ref END, CASE WHEN s_cd THEN f.cd_dt END, CASE WHEN s_cd THEN f.cd_subj END, CASE WHEN s_cd THEN f.cd_cur END, CASE WHEN s_cd THEN f.cd_ceil END, CASE WHEN s_cd THEN f.cd_vat END, CASE WHEN s_cd THEN f.cd_dl END, CASE WHEN s_cd THEN f.cd_sch END, CASE WHEN s_cd THEN f.cd_act END, CASE WHEN s_cd THEN f.cd_cmt END, CASE WHEN s_book THEN f.bk1 END, CASE WHEN s_book THEN f.bk2 END, CASE WHEN s_book THEN f.bk3 END, CASE WHEN s_book THEN f.bk4 END, CASE WHEN s_book THEN f.bn1 END, CASE WHEN s_book THEN f.bn2 END, CASE WHEN s_book THEN f.bn3 END, CASE WHEN s_book THEN f.bn4 END, CASE WHEN s_q1 THEN f.q1_ac END, CASE WHEN s_q1 THEN f.q1_as END, CASE WHEN s_q1 THEN f.q1_arv END, CASE WHEN s_q1 THEN f.q1_acmt END, CASE WHEN s_q1 THEN f.cp1 END, CASE WHEN s_q1 THEN f.q1_pd END, CASE WHEN s_q1 THEN f.q1_pa END, CASE WHEN s_q1 THEN f.q1_pcmt END, CASE WHEN s_q1 THEN f.q1_pact END, CASE WHEN s_q1 THEN f.q1_book END, CASE WHEN s_q1 THEN f.q1_m1 END, CASE WHEN s_q1 THEN f.q1_m2 END, CASE WHEN s_q1 THEN f.q1_m3 END, CASE WHEN s_q1 THEN f.aq1 END, CASE WHEN s_q1 THEN f.cp1 - COALESCE(f.q1_book,0) END, -- residual_after_booking CASE WHEN s_q1 THEN f.cp1 - f.aq1 END, -- residual_after_actual CASE WHEN s_q1 THEN f.q1_tq2 END, CASE WHEN s_q1 THEN f.q1_tda END, CASE WHEN s_q1 THEN f.q1_tdp END, CASE WHEN s_q1 THEN f.q1_terf END, CASE WHEN s_q1 THEN f.q1_tnc END, CASE WHEN s_q1 THEN f.q1_tq3 END, CASE WHEN s_q1 THEN f.q1_tq4 END, CASE WHEN s_q1 THEN f.q1_tfc END, CASE WHEN s_q1 THEN f.q1_te END, CASE WHEN s_q1 THEN COALESCE(f.q1_tda,0)+COALESCE(f.q1_tdp,0)+COALESCE(f.q1_terf,0) +COALESCE(f.q1_tq3,0)+COALESCE(f.q1_tq4,0)+COALESCE(f.q1_te,0) END, CASE WHEN s_q2 THEN f.q2_tc END, CASE WHEN s_q2 THEN f.q2_bc END, CASE WHEN s_q2 THEN f.q2_bcc END, CASE WHEN s_q2 THEN f.q2_rinc END, CASE WHEN s_q2 THEN f.q2_rseq END, CASE WHEN s_q2 THEN f.q2_rcmt END, CASE WHEN s_q2 THEN f.np2 END, CASE WHEN s_q2 THEN f.q2_ac END, CASE WHEN s_q2 THEN f.q2_as END, CASE WHEN s_q2 THEN f.q2_arv END, CASE WHEN s_q2 THEN f.q2_acmt END, CASE WHEN s_q2 THEN f.cp2 END, CASE WHEN s_q2 THEN f.q2_pd END, CASE WHEN s_q2 THEN f.q2_pa END, CASE WHEN s_q2 THEN f.q2_pcmt END, CASE WHEN s_q2 THEN f.q2_pact END, CASE WHEN s_q2 THEN f.q2_book END, CASE WHEN s_q2 THEN f.q2_m1 END, CASE WHEN s_q2 THEN f.q2_m2 END, CASE WHEN s_q2 THEN f.q2_m3 END, CASE WHEN s_q2 THEN f.aq2 END, CASE WHEN s_q2 THEN f.cp2 - COALESCE(f.q2_book,0) END, CASE WHEN s_q2 THEN f.cp2 - f.aq2 END, CASE WHEN s_q2 THEN f.q2_tq3 END, CASE WHEN s_q2 THEN f.q2_tda END, CASE WHEN s_q2 THEN f.q2_tdp END, CASE WHEN s_q2 THEN f.q2_terf END, CASE WHEN s_q2 THEN f.q2_tnc END, CASE WHEN s_q2 THEN f.q2_tq4 END, CASE WHEN s_q2 THEN f.q2_tfc END, CASE WHEN s_q2 THEN f.q2_te END, CASE WHEN s_q2 THEN COALESCE(f.q2_tda,0)+COALESCE(f.q2_tdp,0)+COALESCE(f.q2_terf,0) +COALESCE(f.q2_tq4,0)+COALESCE(f.q2_te,0) END, CASE WHEN s_q3 THEN f.q3_tc END, CASE WHEN s_q3 THEN f.q3_bc END, CASE WHEN s_q3 THEN f.q3_bcc END, CASE WHEN s_q3 THEN f.q3_rinc END, CASE WHEN s_q3 THEN f.q3_rseq END, CASE WHEN s_q3 THEN f.q3_rcmt END, CASE WHEN s_q3 THEN f.np3 END, CASE WHEN s_q3 THEN f.q3_ac END, CASE WHEN s_q3 THEN f.q3_as END, CASE WHEN s_q3 THEN f.q3_arv END, CASE WHEN s_q3 THEN f.q3_acmt END, CASE WHEN s_q3 THEN f.cp3 END, CASE WHEN s_q3 THEN f.q3_pd END, CASE WHEN s_q3 THEN f.q3_pa END, CASE WHEN s_q3 THEN f.q3_pcmt END, CASE WHEN s_q3 THEN f.q3_pact END, CASE WHEN s_q3 THEN f.q3_book END, CASE WHEN s_q3 THEN f.q3_m1 END, CASE WHEN s_q3 THEN f.q3_m2 END, CASE WHEN s_q3 THEN f.q3_m3 END, CASE WHEN s_q3 THEN f.aq3 END, CASE WHEN s_q3 THEN f.cp3 - COALESCE(f.q3_book,0) END, CASE WHEN s_q3 THEN f.cp3 - f.aq3 END, CASE WHEN s_q3 THEN f.q3_tq4 END, CASE WHEN s_q3 THEN f.q3_tda END, CASE WHEN s_q3 THEN f.q3_tdp END, CASE WHEN s_q3 THEN f.q3_terf END, CASE WHEN s_q3 THEN f.q3_tnc END, CASE WHEN s_q3 THEN f.q3_te END, CASE WHEN s_q3 THEN COALESCE(f.q3_tda,0)+COALESCE(f.q3_tdp,0)+COALESCE(f.q3_terf,0) +COALESCE(f.q3_te,0) END, CASE WHEN s_q4 THEN f.q4_tc END, CASE WHEN s_q4 THEN f.q4_bc END, CASE WHEN s_q4 THEN f.q4_bcc END, CASE WHEN s_q4 THEN f.q4_rinc END, CASE WHEN s_q4 THEN f.q4_rseq END, CASE WHEN s_q4 THEN f.q4_rcmt END, CASE WHEN s_q4 THEN f.np4 END, CASE WHEN s_q4 THEN f.q4_ac END, CASE WHEN s_q4 THEN f.q4_as END, CASE WHEN s_q4 THEN f.q4_arv END, CASE WHEN s_q4 THEN f.q4_acmt END, CASE WHEN s_q4 THEN f.cp4 END, CASE WHEN s_q4 THEN f.q4_pd END, CASE WHEN s_q4 THEN f.q4_pa END, CASE WHEN s_q4 THEN f.q4_pcmt END, CASE WHEN s_q4 THEN f.q4_pact END, CASE WHEN s_q4 THEN f.q4_book END, CASE WHEN s_q4 THEN f.q4_m1 END, CASE WHEN s_q4 THEN f.q4_m2 END, CASE WHEN s_q4 THEN f.q4_m3 END, CASE WHEN s_q4 THEN f.q4_spod END, CASE WHEN s_q4 THEN f.aq4 END, CASE WHEN s_q4 THEN f.cp4 - COALESCE(f.q4_book,0) END, CASE WHEN s_q4 THEN f.cp4 - f.aq4 END, CASE WHEN s_q4 THEN f.q4_te END, CASE WHEN s_q4 THEN f.q4_te END, CASE WHEN s_tot THEN f.aq1+f.aq2+f.aq3+f.aq4 END, CASE WHEN s_tot THEN COALESCE(f.q1_pa,0)+COALESCE(f.q2_pa,0)+COALESCE(f.q3_pa,0)+COALESCE(f.q4_pa,0) END, CASE WHEN s_tot THEN f.cp4 - f.aq4 END, f.io, CASE WHEN s_cs THEN f.cs_total END, CASE WHEN s_cs THEN f.cs_cp END, CASE WHEN s_cs THEN f.cs_dl END, CASE WHEN s_cs THEN f.cs_cmt END, CASE WHEN s_cs THEN f.cs_fy1 END, CASE WHEN s_cs THEN f.cs_fy2 END, CASE WHEN s_cs THEN f.cs_oth END, CASE WHEN s_al THEN f.al_cref END, CASE WHEN s_al THEN f.al_purp END, CASE WHEN s_al THEN f.al_io END, CASE WHEN s_al THEN f.al_prop END, CASE WHEN s_ca THEN f.ca_amt END, CASE WHEN s_ca THEN f.ca_proto END, CASE WHEN s_ca THEN f.ca_note END, CASE WHEN s_ckk THEN f.ckk_ceil END, CASE WHEN s_ckk THEN f.ckk_rf END, CASE WHEN s_ckk THEN f.ckk_dl END, CASE WHEN s_ckk THEN f.ckk_pplan END, CASE WHEN s_ckk THEN f.ckk_pmeth END, CASE WHEN s_ckk THEN f.ckk_cmt END, CASE WHEN s_cd THEN f.cd_add END, CASE WHEN s_cd THEN f.cd_e1 END, CASE WHEN s_cd THEN f.cd_e2 END, CASE WHEN s_cd THEN f.cd_e3 END, CASE WHEN s_cd THEN f.cd_e4 END, CASE WHEN s_cd THEN f.cd_rf END, CASE WHEN s_cd THEN f.cd_rate END, CASE WHEN s_cd THEN f.cd_fx END, CASE WHEN s_q1 THEN f.q1_arf END, CASE WHEN s_q1 THEN f.q1_pho END, CASE WHEN s_q1 THEN f.q1_prf END, CASE WHEN s_q2 THEN f.q2_arf END, CASE WHEN s_q2 THEN f.q2_pho END, CASE WHEN s_q2 THEN f.q2_prf END, CASE WHEN s_q3 THEN f.q3_arf END, CASE WHEN s_q3 THEN f.q3_pho END, CASE WHEN s_q3 THEN f.q3_prf END, CASE WHEN s_q4 THEN f.q4_arf END, CASE WHEN s_q4 THEN f.q4_pho END, CASE WHEN s_q4 THEN f.q4_prf END, f.tree_path || ARRAY[f.lid::INT] AS _sort FROM final_input f UNION ALL SELECT CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' WHEN 2 THEN 'ITEM' WHEN 3 THEN 'SUB_ITEM' WHEN 4 THEN 'SUB_SUB_ITEM' END::VARCHAR, t.depth, NULL::INT, CASE WHEN t.depth < 3 THEN t.item_id WHEN t.depth = 3 THEN t.parent_item_id WHEN t.depth = 4 THEN t.grandparent_item_id END, CASE WHEN t.depth >= 3 THEN t.item_id ELSE NULL END, t.num_group_id, t.name, NULL::INT, NULL::VARCHAR, CASE WHEN s_plan THEN ta.sp1 END, CASE WHEN s_plan THEN ta.sp2 END, CASE WHEN s_plan THEN ta.sp3 END, CASE WHEN s_plan THEN ta.sp4 END, CASE WHEN s_plan THEN COALESCE(ta.sp1,0)+COALESCE(ta.sp2,0)+COALESCE(ta.sp3,0)+COALESCE(ta.sp4,0) END, NULL::VARCHAR, CASE WHEN s_seq_d THEN ta.sd1 END, CASE WHEN s_seq_d THEN ta.sd2 END, CASE WHEN s_seq_d THEN ta.sd3 END, CASE WHEN s_seq_d THEN ta.sd4 END, CASE WHEN s_seq_d THEN COALESCE(ta.sd1,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sd4,0) END, NULL::VARCHAR, CASE WHEN s_seq_s THEN ta.sg1 END, CASE WHEN s_seq_s THEN ta.sg2 END, CASE WHEN s_seq_s THEN ta.sg3 END, CASE WHEN s_seq_s THEN ta.sg4 END, CASE WHEN s_seq_s THEN COALESCE(ta.sg1,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sg4,0) END, NULL::VARCHAR, CASE WHEN s_appr THEN COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sg1,0)+COALESCE(ta.sr1,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sg1,0)+COALESCE(ta.sr1,0) +COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0) +COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0) +COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0) END, NULL::VARCHAR, NULL::VARCHAR, NULL::DATE, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_book THEN ta.bk1 END, CASE WHEN s_book THEN ta.bk2 END, CASE WHEN s_book THEN ta.bk3 END, CASE WHEN s_book THEN ta.bk4 END, CASE WHEN s_book THEN ta.bn1 END, CASE WHEN s_book THEN ta.bn2 END, CASE WHEN s_book THEN ta.bn3 END, CASE WHEN s_book THEN ta.bn4 END, CASE WHEN s_q1 THEN tb1.ac END, CASE WHEN s_q1 THEN tb1.as_v END, CASE WHEN s_q1 THEN tb1.arv END, NULL::VARCHAR, CASE WHEN s_q1 THEN COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sg1,0)+COALESCE(ta.sr1,0)+COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arv,0) END, NULL::DATE, CASE WHEN s_q1 THEN tb1.pa END, NULL::VARCHAR, -- pay_comment NULL::VARCHAR, -- pay_act CASE WHEN s_q1 THEN tb1.bk END, -- booking (rollup) CASE WHEN s_q1 THEN tb1.m1 END, CASE WHEN s_q1 THEN tb1.m2 END, CASE WHEN s_q1 THEN tb1.m3 END, CASE WHEN s_q1 THEN COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sg1,0)+COALESCE(ta.sr1,0)+COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arv,0)) - COALESCE(tb1.bk,0) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sg1,0)+COALESCE(ta.sr1,0)+COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arv,0)) - (COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)) END, CASE WHEN s_q1 THEN tb1.tq2 END, CASE WHEN s_q1 THEN tb1.tda END, CASE WHEN s_q1 THEN tb1.tdp END, CASE WHEN s_q1 THEN tb1.terf END, NULL::VARCHAR, -- transfer_next_comment (text, no rollup) CASE WHEN s_q1 THEN tb1.tq3 END, CASE WHEN s_q1 THEN tb1.tq4 END, NULL::VARCHAR, -- far comment CASE WHEN s_q1 THEN tb1.te END, CASE WHEN s_q1 THEN COALESCE(tb1.tda,0)+COALESCE(tb1.tdp,0)+COALESCE(tb1.terf,0) +COALESCE(tb1.tq3,0)+COALESCE(tb1.tq4,0)+COALESCE(tb1.te,0) END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- target_change/base_correction NULL::NUMERIC, NULL::NUMERIC, -- revision_inc/revision_seq NULL::VARCHAR, -- revision_comment CASE WHEN s_q2 THEN COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0)+COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0) END, CASE WHEN s_q2 THEN tb2.ac END, CASE WHEN s_q2 THEN tb2.as_v END, CASE WHEN s_q2 THEN tb2.arv END, NULL::VARCHAR, -- adj_comment CASE WHEN s_q2 THEN COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0)+COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arv,0) END, NULL::DATE, CASE WHEN s_q2 THEN tb2.pa END, NULL::VARCHAR, -- pay_comment NULL::VARCHAR, -- pay_act CASE WHEN s_q2 THEN tb2.bk END, -- booking (rollup) CASE WHEN s_q2 THEN tb2.m1 END, CASE WHEN s_q2 THEN tb2.m2 END, CASE WHEN s_q2 THEN tb2.m3 END, CASE WHEN s_q2 THEN COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0)+COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arv,0)) - COALESCE(tb2.bk,0) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sg2,0)+COALESCE(ta.sr2,0)+COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arv,0)) - (COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)) END, CASE WHEN s_q2 THEN tb2.tq3 END, CASE WHEN s_q2 THEN tb2.tda END, CASE WHEN s_q2 THEN tb2.tdp END, CASE WHEN s_q2 THEN tb2.terf END, NULL::VARCHAR, -- transfer_next_comment (text, no rollup) CASE WHEN s_q2 THEN tb2.tq4 END, NULL::VARCHAR, -- far comment CASE WHEN s_q2 THEN tb2.te END, CASE WHEN s_q2 THEN COALESCE(tb2.tda,0)+COALESCE(tb2.tdp,0)+COALESCE(tb2.terf,0) +COALESCE(tb2.tq4,0)+COALESCE(tb2.te,0) END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- target_change/base_correction/comment NULL::NUMERIC, NULL::NUMERIC, -- revision_inc/revision_seq NULL::VARCHAR, CASE WHEN s_q3 THEN COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0)+COALESCE(tb1.tq3,0)+COALESCE(tb2.tq3,0)+COALESCE(tb3.rev,0) END, CASE WHEN s_q3 THEN tb3.ac END, CASE WHEN s_q3 THEN tb3.as_v END, CASE WHEN s_q3 THEN tb3.arv END, NULL::VARCHAR, CASE WHEN s_q3 THEN COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0)+COALESCE(tb1.tq3,0)+COALESCE(tb2.tq3,0)+COALESCE(tb3.rev,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as_v,0)+COALESCE(tb3.arv,0) END, NULL::DATE, CASE WHEN s_q3 THEN tb3.pa END, NULL::VARCHAR, -- pay_comment NULL::VARCHAR, -- pay_act CASE WHEN s_q3 THEN tb3.bk END, -- booking (rollup) CASE WHEN s_q3 THEN tb3.m1 END, CASE WHEN s_q3 THEN tb3.m2 END, CASE WHEN s_q3 THEN tb3.m3 END, CASE WHEN s_q3 THEN COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0)+COALESCE(tb1.tq3,0)+COALESCE(tb2.tq3,0)+COALESCE(tb3.rev,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as_v,0)+COALESCE(tb3.arv,0)) - COALESCE(tb3.bk,0) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sg3,0)+COALESCE(ta.sr3,0)+COALESCE(tb1.tq3,0)+COALESCE(tb2.tq3,0)+COALESCE(tb3.rev,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as_v,0)+COALESCE(tb3.arv,0)) - (COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)) END, CASE WHEN s_q3 THEN tb3.tq4 END, CASE WHEN s_q3 THEN tb3.tda END, CASE WHEN s_q3 THEN tb3.tdp END, CASE WHEN s_q3 THEN tb3.terf END, NULL::VARCHAR, -- transfer_next_comment (text, no rollup) CASE WHEN s_q3 THEN tb3.te END, CASE WHEN s_q3 THEN COALESCE(tb3.tda,0)+COALESCE(tb3.tdp,0)+COALESCE(tb3.terf,0) +COALESCE(tb3.te,0) END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- target_change/base_correction/comment NULL::NUMERIC, NULL::NUMERIC, -- revision_inc/revision_seq NULL::VARCHAR, CASE WHEN s_q4 THEN COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0)+COALESCE(tb1.tq4,0)+COALESCE(tb2.tq4,0)+COALESCE(tb3.tq4,0)+COALESCE(tb4.rev,0) END, CASE WHEN s_q4 THEN tb4.ac END, CASE WHEN s_q4 THEN tb4.as_v END, CASE WHEN s_q4 THEN tb4.arv END, NULL::VARCHAR, CASE WHEN s_q4 THEN COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0)+COALESCE(tb1.tq4,0)+COALESCE(tb2.tq4,0)+COALESCE(tb3.tq4,0)+COALESCE(tb4.rev,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as_v,0)+COALESCE(tb4.arv,0) END, NULL::DATE, CASE WHEN s_q4 THEN tb4.pa END, NULL::VARCHAR, -- pay_comment NULL::VARCHAR, -- pay_act CASE WHEN s_q4 THEN tb4.bk END, -- booking (rollup) CASE WHEN s_q4 THEN tb4.m1 END, CASE WHEN s_q4 THEN tb4.m2 END, CASE WHEN s_q4 THEN tb4.m3 END, CASE WHEN s_q4 THEN tb4.spod END, CASE WHEN s_q4 THEN COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0)+COALESCE(tb1.tq4,0)+COALESCE(tb2.tq4,0)+COALESCE(tb3.tq4,0)+COALESCE(tb4.rev,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as_v,0)+COALESCE(tb4.arv,0)) - COALESCE(tb4.bk,0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0)+COALESCE(tb1.tq4,0)+COALESCE(tb2.tq4,0)+COALESCE(tb3.tq4,0)+COALESCE(tb4.rev,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as_v,0)+COALESCE(tb4.arv,0)) - (COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0)) END, CASE WHEN s_q4 THEN tb4.te END, CASE WHEN s_q4 THEN tb4.te END, CASE WHEN s_tot THEN COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0) +COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0) +COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0) +COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0) END, CASE WHEN s_tot THEN COALESCE(tb1.pa,0)+COALESCE(tb2.pa,0)+COALESCE(tb3.pa,0)+COALESCE(tb4.pa,0) END, CASE WHEN s_tot THEN (COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sg4,0)+COALESCE(ta.sr4,0) +COALESCE(tb1.tq4,0)+COALESCE(tb2.tq4,0)+COALESCE(tb3.tq4,0)+COALESCE(tb4.rev,0) +COALESCE(tb4.ac,0)+COALESCE(tb4.as_v,0)+COALESCE(tb4.arv,0)) - (COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0)) END, NULL::VARCHAR, -- internal_order NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, -- contract_summary NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, -- allocation NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, -- collegial NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, -- ckk NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_cd THEN ta.bkc1 END, CASE WHEN s_cd THEN ta.bkc2 END, CASE WHEN s_cd THEN ta.bkc3 END, CASE WHEN s_cd THEN ta.bkc4 END, NULL::VARCHAR, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, -- q1 adj_rf/pho/prf NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, -- q2 NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, -- q3 NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, -- q4 t.path AS _sort FROM tw t LEFT JOIN tw_agg ta ON ta.id = t.id LEFT JOIN tw_aq1 tb1 ON tb1.id = t.id LEFT JOIN tw_aq2 tb2 ON tb2.id = t.id LEFT JOIN tw_aq3 tb3 ON tb3.id = t.id LEFT JOIN tw_aq4 tb4 ON tb4.id = t.id ) sub ORDER BY sub._sort; END; $function$ ; CREATE OR REPLACE FUNCTION v3.v_form2_sheet_jsonb(p_form_id integer, p_sheet character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, line_id integer, header jsonb, plan_data jsonb, seq_dfip_data jsonb, seq_ssp_data jsonb, approved_data jsonb, contract_data jsonb, booking_data jsonb, contract_summary jsonb, allocation_data jsonb, collegial_data jsonb, ckk_data jsonb, q1_data jsonb, q2_data jsonb, q3_data jsonb, q4_data jsonb, totals_data jsonb, _sort_path integer[]) LANGUAGE sql STABLE AS $function$ WITH flags AS ( SELECT (p_sections IS NULL OR 'plan' = ANY(p_sections)) AS s_plan, (p_sections IS NULL OR 'seq_dfip' = ANY(p_sections)) AS s_seq_d, (p_sections IS NULL OR 'seq_ssp' = ANY(p_sections)) AS s_seq_s, (p_sections IS NULL OR 'approved' = ANY(p_sections)) AS s_appr, (p_sections IS NULL OR 'contract' = ANY(p_sections)) AS s_cd, (p_sections IS NULL OR 'booking' = ANY(p_sections)) AS s_book, (p_sections IS NULL OR 'contract_summary' = ANY(p_sections)) AS s_cs, (p_sections IS NULL OR 'allocation' = ANY(p_sections)) AS s_al, (p_sections IS NULL OR 'collegial' = ANY(p_sections)) AS s_ca, (p_sections IS NULL OR 'ckk' = ANY(p_sections)) AS s_ckk, (p_sections IS NULL OR 'q1' = ANY(p_sections)) AS s_q1, (p_sections IS NULL OR 'q2' = ANY(p_sections)) AS s_q2, (p_sections IS NULL OR 'q3' = ANY(p_sections)) AS s_q3, (p_sections IS NULL OR 'q4' = ANY(p_sections)) AS s_q4, (p_sections IS NULL OR 'totals' = ANY(p_sections)) AS s_tot ) SELECT s.row_type, s.depth, s.line_id, jsonb_build_object( 'section_code', s.col_section_code, 'item_id', s.col_item_id, 'num_group', s.col_num_group_id, 'name', s.col_name, 'vsp_id', s.col_vsp_id, 'vsp_address', s.col_vsp_address, 'internal_order', s.col_internal_order, 'expense_item_id', CASE WHEN s.row_type = 'INPUT' THEN s._sort_path[array_upper(s._sort_path,1)-1] ELSE s._sort_path[array_upper(s._sort_path,1)] END ) AS header, CASE WHEN f.s_plan THEN jsonb_build_object( 'q1', s.col_plan_q1, 'q2', s.col_plan_q2, 'q3', s.col_plan_q3, 'q4', s.col_plan_q4, 'year', s.col_plan_year, 'comment', s.col_plan_comment ) END AS plan_data, CASE WHEN f.s_seq_d THEN jsonb_build_object( 'q1', s.col_seq_dfip_q1, 'q2', s.col_seq_dfip_q2, 'q3', s.col_seq_dfip_q3, 'q4', s.col_seq_dfip_q4, 'year', s.col_seq_dfip_year, 'justification', s.col_seq_dfip_just ) END AS seq_dfip_data, CASE WHEN f.s_seq_s THEN jsonb_build_object( 'q1', s.col_seq_ssp_q1, 'q2', s.col_seq_ssp_q2, 'q3', s.col_seq_ssp_q3, 'q4', s.col_seq_ssp_q4, 'year', s.col_seq_ssp_year, 'justification', s.col_seq_ssp_just ) END AS seq_ssp_data, CASE WHEN f.s_appr THEN jsonb_build_object( 'q1', s.col_appr_q1, 'q2', s.col_appr_q2, 'q3', s.col_appr_q3, 'q4', s.col_appr_q4, 'year', s.col_appr_year ) END AS approved_data, CASE WHEN f.s_cd THEN jsonb_build_object( 'counterparty', s.col_cd_counterparty, 'reference', s.col_cd_reference, 'addenda', s.col_cd_addenda, 'date', TO_CHAR(s.col_cd_date, 'DD.MM.YYYY'), 'subject', s.col_cd_subject, 'currency', s.col_cd_currency, 'ceiling', s.col_cd_ceiling, 'q1', s.col_cd_exp_q1, 'q2', s.col_cd_exp_q2, 'q3', s.col_cd_exp_q3, 'q4', s.col_cd_exp_q4, 'rf_schedule', s.col_cd_rf_sched, 'vat_rate', s.col_cd_vat_rate, 'exchange_rate', s.col_cd_exchange_rate, 'amount_foreign', s.col_cd_amount_foreign, 'deadline', s.col_cd_deadline, 'scheme', s.col_cd_scheme, 'act', s.col_cd_act, 'comment', s.col_cd_comment ) END AS contract_data, CASE WHEN f.s_book THEN jsonb_build_object( 'y2026', jsonb_build_object('q1', s.col_book_q1, 'q2', s.col_book_q2, 'q3', s.col_book_q3, 'q4', s.col_book_q4), 'y2027', jsonb_build_object('q1', s.col_book_next_q1, 'q2', s.col_book_next_q2, 'q3', s.col_book_next_q3, 'q4', s.col_book_next_q4) ) END AS booking_data, CASE WHEN f.s_cs THEN jsonb_build_object( 'total', s.col_cs_total, 'counterparty', s.col_cs_counterparty, 'deadline', s.col_cs_deadline, 'comment', s.col_cs_comment, 'future_y1', s.col_cs_future_y1, 'future_y2', s.col_cs_future_y2, 'other_ssp', s.col_cs_other_ssp ) END AS contract_summary, CASE WHEN f.s_al THEN jsonb_build_object( 'contract_ref', s.col_al_contract_ref, 'purpose', s.col_al_purpose, 'order', s.col_al_order, 'property', s.col_al_property ) END AS allocation_data, CASE WHEN f.s_ca THEN jsonb_build_object( 'approved', s.col_ca_approved, 'protocol', s.col_ca_protocol, 'note', s.col_ca_note ) END AS collegial_data, CASE WHEN f.s_ckk THEN jsonb_build_object( 'ceiling', s.col_ckk_ceiling, 'rf_schedule', s.col_ckk_rf_sched, 'deadline', s.col_ckk_deadline, 'proc_plan', s.col_ckk_proc_plan, 'proc_method', s.col_ckk_proc_meth, 'comment', s.col_ckk_comment ) END AS ckk_data, CASE WHEN f.s_q1 THEN jsonb_build_object( 'adj_current', s.col_q1_adj_current, 'adj_ssp', s.col_q1_adj_ssp, 'adj_rf', s.col_q1_adj_rf, 'adj_reserve', s.col_q1_adj_reserve, 'adj_comment', s.col_q1_adj_comment, 'corrected_plan', s.col_q1_corrected_plan, 'pay_date', TO_CHAR(s.col_q1_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_q1_pay_amount, 'pay_ho', s.col_q1_pay_ho, 'pay_rf', s.col_q1_pay_rf, 'pay_comment', s.col_q1_pay_comment, 'pay_act', s.col_q1_pay_act, 'booking', s.col_q1_booking, 'actual_m1', s.col_q1_actual_m1, 'actual_m2', s.col_q1_actual_m2, 'actual_m3', s.col_q1_actual_m3, 'actual_quarter', s.col_q1_actual_quarter, 'residual_after_booking', s.col_q1_residual_after_booking, 'residual_after_actual', s.col_q1_residual_after_actual, 'transfer_q2', s.col_q1_transfer_q2, 'transfer_q2_delay_acts', s.col_q1_transfer_q2_delay_acts, 'transfer_q2_delay_procurement', s.col_q1_transfer_q2_delay_procurement, 'transfer_q2_economy_rf', s.col_q1_transfer_q2_economy_rf, 'transfer_next_comment', s.col_q1_transfer_next_comment, 'transfer_q3', s.col_q1_transfer_q3, 'transfer_q4', s.col_q1_transfer_q4, 'transfer_far_comment', s.col_q1_transfer_far_comment, 'transfer_econ', s.col_q1_transfer_econ, 'total', s.col_q1_total ) END AS q1_data, CASE WHEN f.s_q2 THEN jsonb_build_object( 'target_change', s.col_q2_target_change, 'base_correction', s.col_q2_base_correction, 'base_correction_comment', s.col_q2_base_correction_comment, 'revision_inc', s.col_q2_revision_inc, 'revision_seq', s.col_q2_revision_seq, 'revision_comment', s.col_q2_revision_comment, 'new_plan', s.col_q2_new_plan, 'adj_current', s.col_q2_adj_current, 'adj_ssp', s.col_q2_adj_ssp, 'adj_rf', s.col_q2_adj_rf, 'adj_reserve', s.col_q2_adj_reserve, 'adj_comment', s.col_q2_adj_comment, 'corrected_plan', s.col_q2_corrected_plan, 'pay_date', TO_CHAR(s.col_q2_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_q2_pay_amount, 'pay_ho', s.col_q2_pay_ho, 'pay_rf', s.col_q2_pay_rf, 'pay_comment', s.col_q2_pay_comment, 'pay_act', s.col_q2_pay_act, 'booking', s.col_q2_booking, 'actual_m1', s.col_q2_actual_m1, 'actual_m2', s.col_q2_actual_m2, 'actual_m3', s.col_q2_actual_m3, 'actual_quarter', s.col_q2_actual_quarter, 'residual_after_booking', s.col_q2_residual_after_booking, 'residual_after_actual', s.col_q2_residual_after_actual, 'transfer_q3', s.col_q2_transfer_q3, 'transfer_q3_delay_acts', s.col_q2_transfer_q3_delay_acts, 'transfer_q3_delay_procurement', s.col_q2_transfer_q3_delay_procurement, 'transfer_q3_economy_rf', s.col_q2_transfer_q3_economy_rf, 'transfer_next_comment', s.col_q2_transfer_next_comment, 'transfer_q4', s.col_q2_transfer_q4, 'transfer_far_comment', s.col_q2_transfer_far_comment, 'transfer_econ', s.col_q2_transfer_econ, 'total', s.col_q2_total ) END AS q2_data, CASE WHEN f.s_q3 THEN jsonb_build_object( 'target_change', s.col_q3_target_change, 'base_correction', s.col_q3_base_correction, 'base_correction_comment', s.col_q3_base_correction_comment, 'revision_inc', s.col_q3_revision_inc, 'revision_seq', s.col_q3_revision_seq, 'revision_comment', s.col_q3_revision_comment, 'new_plan', s.col_q3_new_plan, 'adj_current', s.col_q3_adj_current, 'adj_ssp', s.col_q3_adj_ssp, 'adj_rf', s.col_q3_adj_rf, 'adj_reserve', s.col_q3_adj_reserve, 'adj_comment', s.col_q3_adj_comment, 'corrected_plan', s.col_q3_corrected_plan, 'pay_date', TO_CHAR(s.col_q3_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_q3_pay_amount, 'pay_ho', s.col_q3_pay_ho, 'pay_rf', s.col_q3_pay_rf, 'pay_comment', s.col_q3_pay_comment, 'pay_act', s.col_q3_pay_act, 'booking', s.col_q3_booking, 'actual_m1', s.col_q3_actual_m1, 'actual_m2', s.col_q3_actual_m2, 'actual_m3', s.col_q3_actual_m3, 'actual_quarter', s.col_q3_actual_quarter, 'residual_after_booking', s.col_q3_residual_after_booking, 'residual_after_actual', s.col_q3_residual_after_actual, 'transfer_q4', s.col_q3_transfer_q4, 'transfer_q4_delay_acts', s.col_q3_transfer_q4_delay_acts, 'transfer_q4_delay_procurement', s.col_q3_transfer_q4_delay_procurement, 'transfer_q4_economy_rf', s.col_q3_transfer_q4_economy_rf, 'transfer_next_comment', s.col_q3_transfer_next_comment, 'transfer_econ', s.col_q3_transfer_econ, 'total', s.col_q3_total ) END AS q3_data, CASE WHEN f.s_q4 THEN jsonb_build_object( 'target_change', s.col_q4_target_change, 'base_correction', s.col_q4_base_correction, 'base_correction_comment', s.col_q4_base_correction_comment, 'revision_inc', s.col_q4_revision_inc, 'revision_seq', s.col_q4_revision_seq, 'revision_comment', s.col_q4_revision_comment, 'new_plan', s.col_q4_new_plan, 'adj_current', s.col_q4_adj_current, 'adj_ssp', s.col_q4_adj_ssp, 'adj_rf', s.col_q4_adj_rf, 'adj_reserve', s.col_q4_adj_reserve, 'adj_comment', s.col_q4_adj_comment, 'corrected_plan', s.col_q4_corrected_plan, 'pay_date', TO_CHAR(s.col_q4_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_q4_pay_amount, 'pay_ho', s.col_q4_pay_ho, 'pay_rf', s.col_q4_pay_rf, 'pay_comment', s.col_q4_pay_comment, 'pay_act', s.col_q4_pay_act, 'booking', s.col_q4_booking, 'actual_m1', s.col_q4_actual_m1, 'actual_m2', s.col_q4_actual_m2, 'actual_m3', s.col_q4_actual_m3, 'actual_spod', s.col_q4_actual_spod, 'actual_quarter', s.col_q4_actual_quarter, 'residual_after_booking', s.col_q4_residual_after_booking, 'residual_after_actual', s.col_q4_residual_after_actual, 'transfer_econ', s.col_q4_transfer_econ, 'total', s.col_q4_total ) END AS q4_data, CASE WHEN f.s_tot THEN jsonb_build_object( 'fact_year', s.col_fact_year, 'pay_year', s.col_pay_year, 'economy_year', s.col_economy_year ) END AS totals_data, s._sort_path FROM v3.v_form2_sheet_sections(p_form_id, p_sheet, p_sections) s CROSS JOIN flags f ORDER BY s._sort_path; $function$ ; CREATE OR REPLACE FUNCTION v3.v_form2_view(p_form_id integer, p_sheet character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb) LANGUAGE plpgsql STABLE AS $function$ BEGIN IF p_sheet IN ('AHR','CAP','OPER') THEN RETURN QUERY SELECT j.row_type, j.depth, ROW_NUMBER() OVER (ORDER BY j._sort_path) AS sort_order, jsonb_build_object( 'line_id', j.line_id, 'header', j.header, 'plan', j.plan_data, 'seq_dfip', j.seq_dfip_data, 'seq_ssp', j.seq_ssp_data, 'approved', j.approved_data, 'contract', j.contract_data, 'booking', j.booking_data, 'q1', j.q1_data, 'q2', j.q2_data, 'q3', j.q3_data, 'q4', j.q4_data, 'totals', j.totals_data ) AS data FROM v3.v_form2_sheet_jsonb(p_form_id, p_sheet, p_sections) j ORDER BY j._sort_path; RETURN; END IF; IF p_sheet = 'AHR_LIMIT' THEN RETURN QUERY WITH RECURSIVE tree AS ( SELECT id AS root_id, id AS desc_id FROM v3.limit_template UNION SELECT t.root_id, child.id FROM tree t JOIN v3.limit_template child ON child.parent_id = t.desc_id ), leaf_amt AS ( SELECT lt.id, fl.qty_q1, fl.qty_q2, fl.qty_q3, fl.qty_q4, v3._form2_ahr_limit_amount(lt.name, lt.unit, lt.limit_with_vat, fl.qty_q1)AS amount_q1, v3._form2_ahr_limit_amount(lt.name, lt.unit, lt.limit_with_vat, fl.qty_q2)AS amount_q2, v3._form2_ahr_limit_amount(lt.name, lt.unit, lt.limit_with_vat, fl.qty_q3)AS amount_q3, v3._form2_ahr_limit_amount(lt.name, lt.unit, lt.limit_with_vat, fl.qty_q4)AS amount_q4 FROM v3.limit_template lt LEFT JOIN v3.form_limit fl ON fl.template_id = lt.id AND fl.budget_form_id = p_form_id WHERE lt.row_type = 'LEAF' ), agg AS ( SELECT t.root_id, SUM(la.qty_q1) AS qty_q1, SUM(la.amount_q1) AS amount_q1, SUM(la.qty_q2) AS qty_q2, SUM(la.amount_q2) AS amount_q2, SUM(la.qty_q3) AS qty_q3, SUM(la.amount_q3) AS amount_q3, SUM(la.qty_q4) AS qty_q4, SUM(la.amount_q4) AS amount_q4 FROM tree t JOIN leaf_amt la ON la.id = t.desc_id GROUP BY t.root_id ) SELECT CASE lt.row_type WHEN 'SECTION' THEN 'ROOT' WHEN 'GROUP' THEN 'GROUP' WHEN 'LEAF' THEN 'INPUT' END::VARCHAR, CASE lt.row_type WHEN 'SECTION' THEN 0 WHEN 'GROUP' THEN 1 ELSE 2 END, lt.sort_order::BIGINT, jsonb_build_object( 'id', lt.id, 'section_no', lt.section_no, 'expense_item_code',lt.expense_item_code, 'name', lt.name, 'unit', lt.unit, 'limit_with_vat', lt.limit_with_vat, 'limit_without_vat',lt.limit_without_vat, 'qty_q1', a.qty_q1, 'amount_q1', a.amount_q1, 'qty_q2', a.qty_q2, 'amount_q2', a.amount_q2, 'qty_q3', a.qty_q3, 'amount_q3', a.amount_q3, 'qty_q4', a.qty_q4, 'amount_q4', a.amount_q4, 'comment', fl.comment ) FROM v3.limit_template lt LEFT JOIN agg a ON a.root_id = lt.id LEFT JOIN v3.form_limit fl ON fl.template_id = lt.id AND fl.budget_form_id = p_form_id ORDER BY lt.sort_order; RETURN; END IF; IF p_sheet = 'AHR_RENT' THEN RETURN QUERY SELECT 'INPUT'::VARCHAR, 0, ROW_NUMBER() OVER (ORDER BY rd.id) AS sort_order, jsonb_build_object( 'id', rd.id, 'line_id', rd.line_id, 'vsp_id', rd.vsp_id, 'address', v.address, 'object_type', v.format, 'rented_area', v.total_area, 'contract_number', rd.contract_number, 'contract_end_date',rd.contract_end_date, 'plan', jsonb_build_object('q1', rd.plan_q1, 'q2', rd.plan_q2, 'q3', rd.plan_q3, 'q4', rd.plan_q4, 'year', COALESCE(rd.plan_q1,0)+COALESCE(rd.plan_q2,0)+COALESCE(rd.plan_q3,0)+COALESCE(rd.plan_q4,0)), 'fact_q1', jsonb_build_object('jan', rd.actual_jan, 'feb', rd.actual_feb, 'mar', rd.actual_mar, 'total', COALESCE(rd.actual_jan,0)+COALESCE(rd.actual_feb,0)+COALESCE(rd.actual_mar,0)), 'fact_q2', jsonb_build_object('apr', rd.actual_apr, 'may', rd.actual_may, 'jun', rd.actual_jun, 'total', COALESCE(rd.actual_apr,0)+COALESCE(rd.actual_may,0)+COALESCE(rd.actual_jun,0)), 'fact_q3', jsonb_build_object('jul', rd.actual_jul, 'aug', rd.actual_aug, 'sep', rd.actual_sep, 'total', COALESCE(rd.actual_jul,0)+COALESCE(rd.actual_aug,0)+COALESCE(rd.actual_sep,0)), 'fact_q4', jsonb_build_object('oct', rd.actual_oct, 'nov', rd.actual_nov, 'dec', rd.actual_dec, 'total', COALESCE(rd.actual_oct,0)+COALESCE(rd.actual_nov,0)+COALESCE(rd.actual_dec,0)), 'comment', rd.comment ) FROM v3.rent_detail rd JOIN v3.budget_line bl ON bl.id = rd.line_id JOIN v3.vsp v ON v.id = rd.vsp_id WHERE bl.budget_form_id = p_form_id ORDER BY rd.id; RETURN; END IF; IF p_sheet = 'AHR_UTILITY' THEN RETURN QUERY SELECT 'INPUT'::VARCHAR, 0, ROW_NUMBER() OVER (ORDER BY ud.id) AS sort_order, jsonb_build_object( 'id', ud.id, 'line_id', ud.line_id, 'vsp_id', ud.vsp_id, 'address', v.address, 'object_type', v.format, 'object_area', v.total_area, 'contract_number', ud.contract_number, 'contract_end_date',ud.contract_end_date, 'plan', jsonb_build_object('q1', ud.plan_q1, 'q2', ud.plan_q2, 'q3', ud.plan_q3, 'q4', ud.plan_q4, 'year', COALESCE(ud.plan_q1,0)+COALESCE(ud.plan_q2,0)+COALESCE(ud.plan_q3,0)+COALESCE(ud.plan_q4,0)), 'fact_q1', jsonb_build_object('jan', ud.actual_jan, 'feb', ud.actual_feb, 'mar', ud.actual_mar, 'total', COALESCE(ud.actual_jan,0)+COALESCE(ud.actual_feb,0)+COALESCE(ud.actual_mar,0)), 'fact_q2', jsonb_build_object('apr', ud.actual_apr, 'may', ud.actual_may, 'jun', ud.actual_jun, 'total', COALESCE(ud.actual_apr,0)+COALESCE(ud.actual_may,0)+COALESCE(ud.actual_jun,0)), 'fact_q3', jsonb_build_object('jul', ud.actual_jul, 'aug', ud.actual_aug, 'sep', ud.actual_sep, 'total', COALESCE(ud.actual_jul,0)+COALESCE(ud.actual_aug,0)+COALESCE(ud.actual_sep,0)), 'fact_q4', jsonb_build_object('oct', ud.actual_oct, 'nov', ud.actual_nov, 'dec', ud.actual_dec, 'total', COALESCE(ud.actual_oct,0)+COALESCE(ud.actual_nov,0)+COALESCE(ud.actual_dec,0)), 'comment', ud.comment ) FROM v3.utility_detail ud JOIN v3.budget_line bl ON bl.id = ud.line_id JOIN v3.vsp v ON v.id = ud.vsp_id WHERE bl.budget_form_id = p_form_id ORDER BY ud.id; RETURN; END IF; IF p_sheet = 'AHR_SECURITY' THEN RETURN QUERY SELECT 'INPUT'::VARCHAR, 0, ROW_NUMBER() OVER (ORDER BY sd.id) AS sort_order, jsonb_build_object( 'id', sd.id, 'line_id', sd.line_id, 'vsp_id', sd.vsp_id, 'address', v.address, 'object_type', v.format, 'object_area', v.total_area, 'contract_number', sd.contract_number, 'contract_end_date',sd.contract_end_date, 'plan', jsonb_build_object('q1', sd.plan_q1, 'q2', sd.plan_q2, 'q3', sd.plan_q3, 'q4', sd.plan_q4, 'year', COALESCE(sd.plan_q1,0)+COALESCE(sd.plan_q2,0)+COALESCE(sd.plan_q3,0)+COALESCE(sd.plan_q4,0)), 'fact_q1', jsonb_build_object('jan', sd.actual_jan, 'feb', sd.actual_feb, 'mar', sd.actual_mar, 'total', COALESCE(sd.actual_jan,0)+COALESCE(sd.actual_feb,0)+COALESCE(sd.actual_mar,0)), 'fact_q2', jsonb_build_object('apr', sd.actual_apr, 'may', sd.actual_may, 'jun', sd.actual_jun, 'total', COALESCE(sd.actual_apr,0)+COALESCE(sd.actual_may,0)+COALESCE(sd.actual_jun,0)), 'fact_q3', jsonb_build_object('jul', sd.actual_jul, 'aug', sd.actual_aug, 'sep', sd.actual_sep, 'total', COALESCE(sd.actual_jul,0)+COALESCE(sd.actual_aug,0)+COALESCE(sd.actual_sep,0)), 'fact_q4', jsonb_build_object('oct', sd.actual_oct, 'nov', sd.actual_nov, 'dec', sd.actual_dec, 'total', COALESCE(sd.actual_oct,0)+COALESCE(sd.actual_nov,0)+COALESCE(sd.actual_dec,0)), 'comment', sd.comment ) FROM v3.security_detail sd JOIN v3.budget_line bl ON bl.id = sd.line_id JOIN v3.vsp v ON v.id = sd.vsp_id WHERE bl.budget_form_id = p_form_id ORDER BY sd.id; RETURN; END IF; IF p_sheet = 'OTCH9F' THEN RETURN QUERY WITH base AS ( SELECT far.id, far.budget_form_id, far.expense_item_id, far.equipment_name, far.month, far.acquired_qty_604, far.acquired_amt_604, far.disposed_qty_604, far.disposed_amt_604, far.acquired_qty_60415, far.acquired_amt_60415, far.transferred_qty_60415, far.transferred_amt_60415, far.go_balance_only_amt, FIRST_VALUE(COALESCE(far.opening_qty_604,0)) OVER w AS base_qty_604, FIRST_VALUE(COALESCE(far.opening_amt_604,0)) OVER w AS base_amt_604, FIRST_VALUE(COALESCE(far.opening_qty_60415,0)) OVER w AS base_qty_60415, FIRST_VALUE(COALESCE(far.opening_amt_60415,0)) OVER w AS base_amt_60415, COALESCE(SUM(COALESCE(far.acquired_qty_604,0) - COALESCE(far.disposed_qty_604,0)) OVER w_prev, 0) AS cum_dq_604, COALESCE(SUM(COALESCE(far.acquired_amt_604,0) - COALESCE(far.disposed_amt_604,0)) OVER w_prev, 0) AS cum_da_604, COALESCE(SUM(COALESCE(far.acquired_qty_60415,0) - COALESCE(far.transferred_qty_60415,0)) OVER w_prev, 0) AS cum_dq_60415, COALESCE(SUM(COALESCE(far.acquired_amt_60415,0) - COALESCE(far.transferred_amt_60415,0)) OVER w_prev, 0) AS cum_da_60415 FROM v3.fixed_asset_report far WHERE far.budget_form_id = p_form_id WINDOW w AS (PARTITION BY far.budget_form_id, far.expense_item_id, far.equipment_name ORDER BY far.month), w_prev AS (PARTITION BY far.budget_form_id, far.expense_item_id, far.equipment_name ORDER BY far.month ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) ), eff AS ( SELECT b.*, (b.base_qty_604 + b.cum_dq_604) AS opening_qty_604_eff, (b.base_amt_604 + b.cum_da_604) AS opening_amt_604_eff, (b.base_qty_60415 + b.cum_dq_60415) AS opening_qty_60415_eff, (b.base_amt_60415 + b.cum_da_60415) AS opening_amt_60415_eff FROM base b ) SELECT 'INPUT'::VARCHAR, 0, ROW_NUMBER() OVER (ORDER BY eff.expense_item_id, eff.month) AS sort_order, jsonb_build_object( 'id', eff.id, 'expense_item_id', ei.id, 'item_id', ei.item_id, 'section_code', ei.section_code, 'equipment_name', eff.equipment_name, 'month', eff.month, 'b_604', jsonb_build_object( 'opening_qty', eff.opening_qty_604_eff, 'opening_amt', eff.opening_amt_604_eff, 'acquired_qty', eff.acquired_qty_604, 'acquired_amt', eff.acquired_amt_604, 'disposed_qty', eff.disposed_qty_604, 'disposed_amt', eff.disposed_amt_604 ), 'b_60415', jsonb_build_object( 'opening_qty', eff.opening_qty_60415_eff, 'opening_amt', eff.opening_amt_60415_eff, 'acquired_qty', eff.acquired_qty_60415, 'acquired_amt', eff.acquired_amt_60415, 'transferred_qty',eff.transferred_qty_60415, 'transferred_amt',eff.transferred_amt_60415 ), 'totals', jsonb_build_object( 'acquired_total', COALESCE(eff.acquired_amt_604,0)+COALESCE(eff.acquired_amt_60415,0) +COALESCE(eff.go_balance_only_amt,0)-COALESCE(eff.transferred_amt_60415,0), 'go_balance_only',eff.go_balance_only_amt, 'disposed_total', COALESCE(eff.disposed_amt_604,0), 'balance_qty', (eff.opening_qty_604_eff + COALESCE(eff.acquired_qty_604,0) - COALESCE(eff.disposed_qty_604,0)) + (eff.opening_qty_60415_eff + COALESCE(eff.acquired_qty_60415,0) - COALESCE(eff.transferred_qty_60415,0)), 'balance_amt', (eff.opening_amt_604_eff + COALESCE(eff.acquired_amt_604,0) - COALESCE(eff.disposed_amt_604,0)) + (eff.opening_amt_60415_eff + COALESCE(eff.acquired_amt_60415,0) - COALESCE(eff.transferred_amt_60415,0)) ) ) FROM eff JOIN v3.expense_item ei ON ei.id = eff.expense_item_id ORDER BY eff.expense_item_id, eff.month; RETURN; END IF; IF p_sheet = 'SMETA' THEN RETURN QUERY SELECT sm.row_type, sm.depth, ROW_NUMBER() OVER (ORDER BY sm.section_code) AS sort_order, jsonb_build_object( 'section_code', sm.section_code, 'name', sm.name, 'plan', jsonb_build_object( 'support', jsonb_build_object('q1', sm.plan_supp_q1, 'q2', sm.plan_supp_q2, 'q3', sm.plan_supp_q3, 'q4', sm.plan_supp_q4, 'year', sm.plan_supp_year), 'development', jsonb_build_object('q1', sm.plan_dev_q1, 'q2', sm.plan_dev_q2, 'q3', sm.plan_dev_q3, 'q4', sm.plan_dev_q4, 'year', sm.plan_dev_year) ), 'approved', jsonb_build_object( 'support', jsonb_build_object('q1', sm.appr_supp_q1, 'q2', sm.appr_supp_q2, 'q3', sm.appr_supp_q3, 'q4', sm.appr_supp_q4, 'year', sm.appr_supp_year), 'development', jsonb_build_object('q1', sm.appr_dev_q1, 'q2', sm.appr_dev_q2, 'q3', sm.appr_dev_q3, 'q4', sm.appr_dev_q4, 'year', sm.appr_dev_year) ), 'fact', jsonb_build_object( 'support', jsonb_build_object('q1', sm.fact_supp_q1, 'q2', sm.fact_supp_q2, 'q3', sm.fact_supp_q3, 'q4', sm.fact_supp_q4, 'year', sm.fact_supp_year), 'development', jsonb_build_object('q1', sm.fact_dev_q1, 'q2', sm.fact_dev_q2, 'q3', sm.fact_dev_q3, 'q4', sm.fact_dev_q4, 'year', sm.fact_dev_year) ), 'corrected', jsonb_build_object( 'support', jsonb_build_object('q2', sm.corr_supp_q2, 'q3', sm.corr_supp_q3, 'q4', sm.corr_supp_q4), 'development', jsonb_build_object('q2', sm.corr_dev_q2, 'q3', sm.corr_dev_q3, 'q4', sm.corr_dev_q4) ) ) FROM v3.v_form2_smeta(p_form_id) sm ORDER BY sm.section_code; RETURN; END IF; RAISE EXCEPTION 'Unknown sheet: %', p_sheet USING HINT = 'Use AHR / CAP / OPER / AHR_LIMIT / AHR_RENT / AHR_UTILITY / AHR_SECURITY / OTCH9F / SMETA'; END; $function$ ; CREATE OR REPLACE FUNCTION v3.v_form1_sheet_sections(p_form_id integer, p_sheet character varying, p_direction character varying DEFAULT NULL::character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, line_id integer, col_b_year integer, col_c_section character varying, col_d_item_id character varying, col_e_num_group character varying, col_f_name character varying, col_g_internal_order character varying, col_h_plan_q1 numeric, col_i_plan_q2 numeric, col_j_plan_q3 numeric, col_k_plan_q4 numeric, col_l_plan_year numeric, col_m_plan_comment character varying, col_n_cs_total numeric, col_o_cs_counterparty character varying, col_p_cs_deadline character varying, col_q_cs_comment character varying, col_r_cs_future_y1 numeric, col_s_cs_future_y2 numeric, col_t_cs_other_ssp numeric, col_v_al_order character varying, col_w_al_property character varying, col_y_seq_q1 numeric, col_z_seq_q2 numeric, col_aa_seq_q3 numeric, col_ab_seq_q4 numeric, col_ac_seq_year numeric, col_ad_seq_justification character varying, col_af_res_q1 numeric, col_ag_res_q2 numeric, col_ah_res_q3 numeric, col_ai_res_q4 numeric, col_aj_res_year numeric, col_ak_res_justification character varying, col_am_approved_q1 numeric, col_an_approved_q2 numeric, col_ao_approved_q3 numeric, col_ap_approved_q4 numeric, col_aq_approved_year numeric, col_as_ca_approved numeric, col_at_ca_protocol character varying, col_au_ca_note character varying, col_aw_ckk_ceiling numeric, col_ax_ckk_exp_q1 numeric, col_ay_ckk_exp_q2 numeric, col_az_ckk_exp_q3 numeric, col_ba_ckk_exp_q4 numeric, col_bb_ckk_rf_sched character varying, col_bc_ckk_deadline character varying, col_bd_ckk_proc_plan character varying, col_be_ckk_proc_meth character varying, col_bf_ckk_comment character varying, col_bh_cd_counterparty character varying, col_bi_cd_reference character varying, col_bj_cd_addenda character varying, col_bk_cd_subject character varying, col_bl_cd_currency character varying, col_bm_cd_ceiling numeric, col_bn_cd_exp_q1 numeric, col_bo_cd_exp_q2 numeric, col_bp_cd_exp_q3 numeric, col_bq_cd_exp_q4 numeric, col_br_cd_rf_sched character varying, col_bs_cd_vat character varying, col_bt_cd_rate numeric, col_bu_cd_amount_fx numeric, col_bv_cd_deadline character varying, col_bw_cd_scheme character varying, col_bx_cd_act character varying, col_by_cd_comment character varying, col_ca_q1_adj_current numeric, col_cb_q1_adj_ssp numeric, col_cc_q1_adj_rf numeric, col_cd_q1_adj_reserve numeric, col_ce_q1_adj_comment character varying, col_cf_q1_corrected_plan numeric, col_ch_q1_pay_date date, col_ci_q1_pay_amount numeric, col_cj_q1_pay_ho numeric, col_ck_q1_pay_rf numeric, col_cl_q1_pay_comment character varying, col_cm_q1_pay_act character varying, col_co_q1_booking numeric, col_cp_q1_actual_m1 numeric, col_cq_q1_actual_m2 numeric, col_cr_q1_actual_m3 numeric, col_cs_q1_actual_quarter numeric, col_ct_q1_rem_booking numeric, col_cu_q1_rem_actual numeric, col_cw_q1_trans_q2 numeric, col_cx_q1_trans_q3 numeric, col_cy_q1_trans_q4 numeric, col_cz_q1_economy numeric, col_da_q1_total numeric, col_dc_q2_rev_eco numeric, col_dd_q2_rev_item numeric, col_de_q2_rev_inc numeric, col_df_q2_rev_seq numeric, col_dg_q2_rev_comment character varying, col_dh_q2_new_plan numeric, col_dj_q2_adj_current numeric, col_dk_q2_adj_ssp numeric, col_dl_q2_adj_rf numeric, col_dm_q2_adj_reserve numeric, col_dn_q2_adj_comment character varying, col_do_q2_corrected_plan numeric, col_dq_q2_pay_date date, col_dr_q2_pay_amount numeric, col_ds_q2_pay_ho numeric, col_dt_q2_pay_rf numeric, col_du_q2_pay_comment character varying, col_dv_q2_pay_act character varying, col_dx_q2_booking numeric, col_dy_q2_actual_m1 numeric, col_dz_q2_actual_m2 numeric, col_ea_q2_actual_m3 numeric, col_eb_q2_actual_quarter numeric, col_ec_q2_rem_booking numeric, col_ed_q2_rem_actual numeric, col_ef_q2_trans_q3 numeric, col_eg_q2_trans_q4 numeric, col_eh_q2_economy numeric, col_ei_q2_total numeric, col_ek_q3_rev_eco numeric, col_el_q3_rev_item numeric, col_em_q3_rev_inc numeric, col_en_q3_rev_seq numeric, col_eo_q3_rev_comment character varying, col_ep_q3_new_plan numeric, col_er_q3_adj_current numeric, col_es_q3_adj_ssp numeric, col_et_q3_adj_rf numeric, col_eu_q3_adj_reserve numeric, col_ev_q3_adj_comment character varying, col_ew_q3_corrected_plan numeric, col_ey_q3_pay_date date, col_ez_q3_pay_amount numeric, col_fa_q3_pay_ho numeric, col_fb_q3_pay_rf numeric, col_fc_q3_pay_comment character varying, col_fd_q3_pay_act character varying, col_ff_q3_booking numeric, col_fg_q3_actual_m1 numeric, col_fh_q3_actual_m2 numeric, col_fi_q3_actual_m3 numeric, col_fj_q3_actual_quarter numeric, col_fk_q3_rem_booking numeric, col_fl_q3_rem_actual numeric, col_fn_q3_trans_q4 numeric, col_fo_q3_economy numeric, col_fp_q3_total numeric, col_fr_q4_rev_eco numeric, col_fs_q4_rev_item numeric, col_ft_q4_rev_inc numeric, col_fu_q4_rev_seq numeric, col_fv_q4_rev_comment character varying, col_fw_q4_new_plan numeric, col_fy_q4_adj_current numeric, col_fz_q4_adj_ssp numeric, col_ga_q4_adj_rf numeric, col_gb_q4_adj_reserve numeric, col_gc_q4_adj_comment character varying, col_gd_q4_corrected_plan numeric, col_gf_q4_pay_date date, col_gg_q4_pay_amount numeric, col_gh_q4_pay_ho numeric, col_gi_q4_pay_rf numeric, col_gj_q4_pay_comment character varying, col_gk_q4_pay_act character varying, col_gm_q4_booking numeric, col_gn_q4_actual_m1 numeric, col_go_q4_actual_m2 numeric, col_gp_q4_actual_m3 numeric, col_gq_q4_actual_quarter numeric, col_gr_q4_actual_spod numeric, col_gs_q4_rem_booking numeric, col_gt_q4_rem_actual numeric, col_gv_q4_economy numeric, col_gw_q4_total numeric, col_gz_fact_year numeric, col_hb_pay_year numeric, _sort_path integer[]) LANGUAGE plpgsql STABLE SET search_path TO 'v3', 'pg_catalog' AS $function$ #variable_conflict use_column DECLARE v_year INT; s_plan BOOL; s_cs BOOL; s_al BOOL; s_seq BOOL; s_res BOOL; s_appr BOOL; s_ca BOOL; s_ckk BOOL; s_cd BOOL; s_q1 BOOL; s_q2 BOOL; s_q3 BOOL; s_q4 BOOL; s_tot BOOL; s_any_q BOOL; s_need_ap BOOL; s_need_bk BOOL; BEGIN SELECT bf.year INTO v_year FROM budget_form bf WHERE bf.id = p_form_id; s_plan := p_sections IS NULL OR 'plan' = ANY(p_sections); s_cs := p_sections IS NULL OR 'contract_summary' = ANY(p_sections); s_al := p_sections IS NULL OR 'allocation' = ANY(p_sections); s_seq := p_sections IS NULL OR 'sequestration' = ANY(p_sections); s_res := p_sections IS NULL OR 'reserve' = ANY(p_sections); s_appr := p_sections IS NULL OR 'approved' = ANY(p_sections); s_ca := p_sections IS NULL OR 'collegial' = ANY(p_sections); s_ckk := p_sections IS NULL OR 'ckk' = ANY(p_sections); s_cd := p_sections IS NULL OR 'contract_detail' = ANY(p_sections); s_q1 := p_sections IS NULL OR 'q1' = ANY(p_sections); s_q2 := p_sections IS NULL OR 'q2' = ANY(p_sections); s_q3 := p_sections IS NULL OR 'q3' = ANY(p_sections); s_q4 := p_sections IS NULL OR 'q4' = ANY(p_sections); s_tot := p_sections IS NULL OR 'totals' = ANY(p_sections); s_any_q := s_q1 OR s_q2 OR s_q3 OR s_q4 OR s_tot; s_need_ap := s_plan OR s_appr OR s_q1 OR s_q2 OR s_q3 OR s_q4; s_need_bk := s_q1 OR s_q2 OR s_q3 OR s_q4; RETURN QUERY WITH tw AS ( SELECT t.id, t.section_code, t.item_id, t.num_group_id, t.name, t.depth, t.path, t.parent_id, t.parent_item_id, t.desc_ids, p.parent_item_id AS grandparent_item_id FROM mv_expense_item_tree t LEFT JOIN mv_expense_item_tree p ON p.id = t.parent_id JOIN expense_item_form_type eft ON eft.expense_item_id = t.id JOIN budget_form bf ON bf.id = p_form_id AND bf.form_type_code = eft.form_type_code WHERE t.sheet = p_sheet ), page AS ( SELECT bl.id AS lid, bl.expense_item_id AS eid, bl.internal_order AS io, bl.name AS bname FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND (p_direction IS NULL OR bl.direction IS NULL OR bl.direction = p_direction) ), jp AS (SELECT p.* FROM plan p JOIN page pg ON p.line_id = pg.lid WHERE s_plan), jcs AS (SELECT cs.* FROM contract_summary cs JOIN page pg ON cs.line_id = pg.lid WHERE s_cs), jal AS (SELECT al.* FROM allocation al JOIN page pg ON al.line_id = pg.lid WHERE s_al), jsd AS (SELECT sd.* FROM sequestration sd JOIN page pg ON sd.line_id = pg.lid WHERE s_seq AND sd.actor='DFIP'), jr AS (SELECT r.* FROM reserve r JOIN page pg ON r.line_id = pg.lid WHERE s_res), jca AS (SELECT ca.* FROM collegial_approval ca JOIN page pg ON ca.line_id = pg.lid WHERE s_ca), jck AS (SELECT ck.* FROM ckk ck JOIN page pg ON ck.line_id = pg.lid WHERE s_ckk), jcd AS (SELECT cd.* FROM contract_detail cd JOIN page pg ON cd.line_id = pg.lid WHERE s_cd), jq1 AS (SELECT blq.* FROM budget_line_quarter blq JOIN page pg ON blq.line_id = pg.lid WHERE s_q1 AND blq.quarter = 1), jq2 AS (SELECT blq.* FROM budget_line_quarter blq JOIN page pg ON blq.line_id = pg.lid WHERE s_q2 AND blq.quarter = 2), jq3 AS (SELECT blq.* FROM budget_line_quarter blq JOIN page pg ON blq.line_id = pg.lid WHERE s_q3 AND blq.quarter = 3), jq4 AS (SELECT blq.* FROM budget_line_quarter blq JOIN page pg ON blq.line_id = pg.lid WHERE (s_q4 OR s_tot) AND blq.quarter = 4), jtot AS ( SELECT blq.line_id AS tlid, SUM(CASE WHEN blq.quarter=1 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS tot_aq1, SUM(CASE WHEN blq.quarter=2 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS tot_aq2, SUM(CASE WHEN blq.quarter=3 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS tot_aq3, SUM(CASE WHEN blq.quarter=4 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0)+COALESCE(blq.actual_spod,0) END) AS tot_aq4, SUM(CASE WHEN blq.quarter=1 THEN blq.payment_amount END) AS tot_pa1, SUM(CASE WHEN blq.quarter=2 THEN blq.payment_amount END) AS tot_pa2, SUM(CASE WHEN blq.quarter=3 THEN blq.payment_amount END) AS tot_pa3, SUM(CASE WHEN blq.quarter=4 THEN blq.payment_amount END) AS tot_pa4 FROM budget_line_quarter blq JOIN page pg ON blq.line_id = pg.lid WHERE s_tot GROUP BY blq.line_id ), input_base AS ( SELECT pg.lid, pg.eid, pg.io, pg.bname, CASE WHEN t.depth < 3 THEN t.item_id WHEN t.depth = 3 THEN t.parent_item_id WHEN t.depth = 4 THEN t.grandparent_item_id END AS sc, t.item_id AS ic, t.num_group_id AS ng, t.name AS ename, COALESCE(p.plan_q1,0) AS pq1, COALESCE(p.plan_q2,0) AS pq2, COALESCE(p.plan_q3,0) AS pq3, COALESCE(p.plan_q4,0) AS pq4, p.comment AS pcmt, COALESCE(sd.adj_q1,0) AS sq1, COALESCE(sd.adj_q2,0) AS sq2, COALESCE(sd.adj_q3,0) AS sq3, COALESCE(sd.adj_q4,0) AS sq4, sd.justification AS sjust, COALESCE(r.amount_q1,0) AS rq1, COALESCE(r.amount_q2,0) AS rq2, COALESCE(r.amount_q3,0) AS rq3, COALESCE(r.amount_q4,0) AS rq4, r.justification AS rjust, cs.*, al.internal_order AS al_io, al.property_object AS al_po, ca.approved_amount AS ca_amt, ca.protocol_reference AS ca_prot, ca.note AS ca_note, ck.ceiling_amount AS ckk_ceil, COALESCE(ck.expenses_q1,0) AS ckk1, COALESCE(ck.expenses_q2,0) AS ckk2, COALESCE(ck.expenses_q3,0) AS ckk3, COALESCE(ck.expenses_q4,0) AS ckk4, ck.rf_schedule AS ckk_rf, ck.delivery_deadline AS ckk_dl, ck.procurement_plan AS ckk_pp, ck.procurement_method AS ckk_pm, ck.comment AS ckk_cmt, cd.counterparty AS cd_cp, cd.reference AS cd_ref, cd.addenda AS cd_add, cd.subject AS cd_subj, cd.currency AS cd_cur, cd.ceiling_amount AS cd_ceil, COALESCE(cd.expenses_q1,0) AS cdq1, COALESCE(cd.expenses_q2,0) AS cdq2, COALESCE(cd.expenses_q3,0) AS cdq3, COALESCE(cd.expenses_q4,0) AS cdq4, cd.rf_schedule AS cd_rf, cd.vat_rate AS cd_vat, cd.exchange_rate AS cd_rate, cd.amount_foreign AS cd_fx, cd.deadline AS cd_dl, cd.payment_scheme AS cd_sch, cd.act AS cd_act, cd.comment AS cd_cmt2, q1.adj_current AS q1_ac, q1.adj_ssp AS q1_as, q1.adj_rf AS q1_ar, q1.adj_reserve AS q1_arv, q1.adj_comment AS q1_acmt, q1.payment_date AS q1_pd, q1.payment_amount AS q1_pa, q1.payment_amount_ho AS q1_pho, q1.payment_amount_rf AS q1_prf, q1.payment_comment AS q1_pcmt, q1.payment_act AS q1_pact, q1.actual_m1 AS q1_m1, q1.actual_m2 AS q1_m2, q1.actual_m3 AS q1_m3, q1.transfer_to_q2 AS q1_tq2, q1.transfer_to_q3 AS q1_tq3, q1.transfer_to_q4 AS q1_tq4, q2.plan_revision_eco_change AS q2_reco, q2.plan_revision_item_adj AS q2_ritm, q2.plan_revision_increase AS q2_rinc, q2.plan_revision_sequester AS q2_rseq, q2.plan_revision_comment AS q2_rcmt, q2.adj_current AS q2_ac, q2.adj_ssp AS q2_as, q2.adj_rf AS q2_ar, q2.adj_reserve AS q2_arv, q2.adj_comment AS q2_acmt, q2.payment_date AS q2_pd, q2.payment_amount AS q2_pa, q2.payment_amount_ho AS q2_pho, q2.payment_amount_rf AS q2_prf, q2.payment_comment AS q2_pcmt, q2.payment_act AS q2_pact, q2.actual_m1 AS q2_m1, q2.actual_m2 AS q2_m2, q2.actual_m3 AS q2_m3, q2.transfer_to_q3 AS q2_tq3, q2.transfer_to_q4 AS q2_tq4, q3.plan_revision_eco_change AS q3_reco, q3.plan_revision_item_adj AS q3_ritm, q3.plan_revision_increase AS q3_rinc, q3.plan_revision_sequester AS q3_rseq, q3.plan_revision_comment AS q3_rcmt, q3.adj_current AS q3_ac, q3.adj_ssp AS q3_as, q3.adj_rf AS q3_ar, q3.adj_reserve AS q3_arv, q3.adj_comment AS q3_acmt, q3.payment_date AS q3_pd, q3.payment_amount AS q3_pa, q3.payment_amount_ho AS q3_pho, q3.payment_amount_rf AS q3_prf, q3.payment_comment AS q3_pcmt, q3.payment_act AS q3_pact, q3.actual_m1 AS q3_m1, q3.actual_m2 AS q3_m2, q3.actual_m3 AS q3_m3, q3.transfer_to_q4 AS q3_tq4, q4.plan_revision_eco_change AS q4_reco, q4.plan_revision_item_adj AS q4_ritm, q4.plan_revision_increase AS q4_rinc, q4.plan_revision_sequester AS q4_rseq, q4.plan_revision_comment AS q4_rcmt, q4.adj_current AS q4_ac, q4.adj_ssp AS q4_as, q4.adj_rf AS q4_ar, q4.adj_reserve AS q4_arv, q4.adj_comment AS q4_acmt, q4.payment_date AS q4_pd, q4.payment_amount AS q4_pa, q4.payment_amount_ho AS q4_pho, q4.payment_amount_rf AS q4_prf, q4.payment_comment AS q4_pcmt, q4.payment_act AS q4_pact, q4.actual_m1 AS q4_m1, q4.actual_m2 AS q4_m2, q4.actual_m3 AS q4_m3, q4.actual_spod AS q4_spod, tot.tot_aq1, tot.tot_aq2, tot.tot_aq3, tot.tot_aq4, tot.tot_pa1, tot.tot_pa2, tot.tot_pa3, tot.tot_pa4, CASE WHEN COALESCE(cd.expenses_q1,0)>0 THEN cd.expenses_q1 ELSE ck.expenses_q1 END AS bk1, CASE WHEN COALESCE(cd.expenses_q2,0)>0 THEN cd.expenses_q2 ELSE ck.expenses_q2 END AS bk2, CASE WHEN COALESCE(cd.expenses_q3,0)>0 THEN cd.expenses_q3 ELSE ck.expenses_q3 END AS bk3, CASE WHEN COALESCE(cd.expenses_q4,0)>0 THEN cd.expenses_q4 ELSE ck.expenses_q4 END AS bk4, COALESCE(p.plan_q1,0)+COALESCE(sd.adj_q1,0)+COALESCE(r.amount_q1,0) AS ap1, COALESCE(p.plan_q2,0)+COALESCE(sd.adj_q2,0)+COALESCE(r.amount_q2,0) AS ap2, COALESCE(p.plan_q3,0)+COALESCE(sd.adj_q3,0)+COALESCE(r.amount_q3,0) AS ap3, COALESCE(p.plan_q4,0)+COALESCE(sd.adj_q4,0)+COALESCE(r.amount_q4,0) AS ap4, t.path AS tree_path FROM page pg JOIN tw t ON t.id = pg.eid LEFT JOIN jp p ON p.line_id = pg.lid LEFT JOIN jcs cs ON cs.line_id = pg.lid LEFT JOIN jal al ON al.line_id = pg.lid LEFT JOIN jsd sd ON sd.line_id = pg.lid LEFT JOIN jr r ON r.line_id = pg.lid LEFT JOIN jca ca ON ca.line_id = pg.lid LEFT JOIN jck ck ON ck.line_id = pg.lid LEFT JOIN jcd cd ON cd.line_id = pg.lid LEFT JOIN jq1 q1 ON q1.line_id = pg.lid LEFT JOIN jq2 q2 ON q2.line_id = pg.lid LEFT JOIN jq3 q3 ON q3.line_id = pg.lid LEFT JOIN jq4 q4 ON q4.line_id = pg.lid LEFT JOIN jtot tot ON tot.tlid = pg.lid ), enriched AS ( SELECT b.*, b.ap1 + COALESCE(b.q1_ac,0)+COALESCE(b.q1_as,0)+COALESCE(b.q1_ar,0)+COALESCE(b.q1_arv,0) AS cp1, COALESCE(b.q1_m1,0)+COALESCE(b.q1_m2,0)+COALESCE(b.q1_m3,0) AS aq1, b.ap2 + COALESCE(b.q1_tq2,0) + COALESCE(b.q2_reco,0)+COALESCE(b.q2_ritm,0)+COALESCE(b.q2_rinc,0)+COALESCE(b.q2_rseq,0) AS np2, COALESCE(b.q2_m1,0)+COALESCE(b.q2_m2,0)+COALESCE(b.q2_m3,0) AS aq2, b.ap3 + COALESCE(b.q1_tq3,0)+COALESCE(b.q2_tq3,0) + COALESCE(b.q3_reco,0)+COALESCE(b.q3_ritm,0)+COALESCE(b.q3_rinc,0)+COALESCE(b.q3_rseq,0) AS np3, COALESCE(b.q3_m1,0)+COALESCE(b.q3_m2,0)+COALESCE(b.q3_m3,0) AS aq3, b.ap4 + COALESCE(b.q1_tq4,0)+COALESCE(b.q2_tq4,0)+COALESCE(b.q3_tq4,0) + COALESCE(b.q4_reco,0)+COALESCE(b.q4_ritm,0)+COALESCE(b.q4_rinc,0)+COALESCE(b.q4_rseq,0) AS np4, COALESCE(b.q4_m1,0)+COALESCE(b.q4_m2,0)+COALESCE(b.q4_m3,0) AS aq4_no_spod, COALESCE(b.q4_m1,0)+COALESCE(b.q4_m2,0)+COALESCE(b.q4_m3,0)+COALESCE(b.q4_spod,0) AS aq4 FROM input_base b ), final_input AS ( SELECT e.*, e.np2 + COALESCE(e.q2_ac,0)+COALESCE(e.q2_as,0)+COALESCE(e.q2_ar,0)+COALESCE(e.q2_arv,0) AS cp2, e.np3 + COALESCE(e.q3_ac,0)+COALESCE(e.q3_as,0)+COALESCE(e.q3_ar,0)+COALESCE(e.q3_arv,0) AS cp3, e.np4 + COALESCE(e.q4_ac,0)+COALESCE(e.q4_as,0)+COALESCE(e.q4_ar,0)+COALESCE(e.q4_arv,0) AS cp4 FROM enriched e ), agg AS ( SELECT bl.expense_item_id AS eid, SUM(p.plan_q1) AS sp1, SUM(p.plan_q2) AS sp2, SUM(p.plan_q3) AS sp3, SUM(p.plan_q4) AS sp4, SUM(sd.adj_q1) AS ss1, SUM(sd.adj_q2) AS ss2, SUM(sd.adj_q3) AS ss3, SUM(sd.adj_q4) AS ss4, SUM(r.amount_q1) AS sr1, SUM(r.amount_q2) AS sr2, SUM(r.amount_q3) AS sr3, SUM(r.amount_q4) AS sr4, SUM(ca.approved_amount) AS sca, SUM(ck.ceiling_amount) AS sckc, SUM(ck.expenses_q1) AS sck1, SUM(ck.expenses_q2) AS sck2, SUM(ck.expenses_q3) AS sck3, SUM(ck.expenses_q4) AS sck4, SUM(cd.ceiling_amount) AS scdc, SUM(cd.expenses_q1) AS scd1, SUM(cd.expenses_q2) AS scd2, SUM(cd.expenses_q3) AS scd3, SUM(cd.expenses_q4) AS scd4, SUM(cs.total_amount) AS scst, SUM(cs.future_payments_y1) AS sfy1, SUM(cs.future_payments_y2) AS sfy2, SUM(cs.other_ssp_amount) AS sossp FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN plan p ON p.line_id = bl.id AND s_need_ap LEFT JOIN contract_summary cs ON cs.line_id = bl.id AND s_cs LEFT JOIN sequestration sd ON sd.line_id = bl.id AND sd.actor = 'DFIP' AND s_need_ap LEFT JOIN reserve r ON r.line_id = bl.id AND s_need_ap LEFT JOIN collegial_approval ca ON ca.line_id = bl.id AND s_ca LEFT JOIN ckk ck ON ck.line_id = bl.id AND (s_ckk OR s_need_bk) LEFT JOIN contract_detail cd ON cd.line_id = bl.id AND (s_cd OR s_need_bk) WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) AND (s_need_ap OR s_cs OR s_ca OR s_ckk OR s_cd OR s_need_bk) GROUP BY bl.expense_item_id ), aq1 AS ( SELECT bl.expense_item_id AS eid, SUM(blq.adj_current) AS ac, SUM(blq.adj_ssp) AS as2, SUM(blq.adj_rf) AS ar, SUM(blq.adj_reserve) AS arv, SUM(blq.payment_amount) AS pa, SUM(blq.payment_amount_ho) AS pho, SUM(blq.payment_amount_rf) AS prf, SUM(blq.actual_m1) AS m1, SUM(blq.actual_m2) AS m2, SUM(blq.actual_m3) AS m3, SUM(blq.transfer_to_q2) AS tq2, SUM(blq.transfer_to_q3) AS tq3, SUM(blq.transfer_to_q4) AS tq4 FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN budget_line_quarter blq ON blq.line_id = bl.id AND blq.quarter = 1 WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND s_q1 AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) GROUP BY bl.expense_item_id ), aq2 AS ( SELECT bl.expense_item_id AS eid, SUM(blq.plan_revision_eco_change) AS reco, SUM(blq.plan_revision_item_adj) AS ritm, SUM(blq.plan_revision_increase) AS rinc, SUM(blq.plan_revision_sequester) AS rseq, SUM(blq.adj_current) AS ac, SUM(blq.adj_ssp) AS as2, SUM(blq.adj_rf) AS ar, SUM(blq.adj_reserve) AS arv, SUM(blq.payment_amount) AS pa, SUM(blq.payment_amount_ho) AS pho, SUM(blq.payment_amount_rf) AS prf, SUM(blq.actual_m1) AS m1, SUM(blq.actual_m2) AS m2, SUM(blq.actual_m3) AS m3, SUM(blq.transfer_to_q3) AS tq3, SUM(blq.transfer_to_q4) AS tq4 FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN budget_line_quarter blq ON blq.line_id = bl.id AND blq.quarter = 2 WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND s_q2 AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) GROUP BY bl.expense_item_id ), aq3 AS ( SELECT bl.expense_item_id AS eid, SUM(blq.plan_revision_eco_change) AS reco, SUM(blq.plan_revision_item_adj) AS ritm, SUM(blq.plan_revision_increase) AS rinc, SUM(blq.plan_revision_sequester) AS rseq, SUM(blq.adj_current) AS ac, SUM(blq.adj_ssp) AS as2, SUM(blq.adj_rf) AS ar, SUM(blq.adj_reserve) AS arv, SUM(blq.payment_amount) AS pa, SUM(blq.payment_amount_ho) AS pho, SUM(blq.payment_amount_rf) AS prf, SUM(blq.actual_m1) AS m1, SUM(blq.actual_m2) AS m2, SUM(blq.actual_m3) AS m3, SUM(blq.transfer_to_q4) AS tq4 FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN budget_line_quarter blq ON blq.line_id = bl.id AND blq.quarter = 3 WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND s_q3 AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) GROUP BY bl.expense_item_id ), aq4 AS ( SELECT bl.expense_item_id AS eid, SUM(blq.plan_revision_eco_change) AS reco, SUM(blq.plan_revision_item_adj) AS ritm, SUM(blq.plan_revision_increase) AS rinc, SUM(blq.plan_revision_sequester) AS rseq, SUM(blq.adj_current) AS ac, SUM(blq.adj_ssp) AS as2, SUM(blq.adj_rf) AS ar, SUM(blq.adj_reserve) AS arv, SUM(blq.payment_amount) AS pa, SUM(blq.payment_amount_ho) AS pho, SUM(blq.payment_amount_rf) AS prf, SUM(blq.actual_m1) AS m1, SUM(blq.actual_m2) AS m2, SUM(blq.actual_m3) AS m3, SUM(blq.actual_spod) AS spod FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN budget_line_quarter blq ON blq.line_id = bl.id AND blq.quarter = 4 WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND (s_q4 OR s_tot) AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) GROUP BY bl.expense_item_id ), atot AS ( SELECT bl.expense_item_id AS eid, SUM(CASE WHEN blq.quarter=1 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS fq1, SUM(CASE WHEN blq.quarter=2 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS fq2, SUM(CASE WHEN blq.quarter=3 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0) END) AS fq3, SUM(CASE WHEN blq.quarter=4 THEN COALESCE(blq.actual_m1,0)+COALESCE(blq.actual_m2,0)+COALESCE(blq.actual_m3,0)+COALESCE(blq.actual_spod,0) END) AS fq4, SUM(blq.payment_amount) AS pay FROM budget_line bl JOIN expense_item ei ON ei.id = bl.expense_item_id LEFT JOIN budget_line_quarter blq ON blq.line_id = bl.id WHERE bl.budget_form_id = p_form_id AND ei.sheet = p_sheet AND s_tot AND (p_direction is null OR bl.direction is null or bl.direction = p_direction) GROUP BY bl.expense_item_id ), tw_agg AS ( SELECT tw.id, SUM(a.sp1) AS sp1, SUM(a.sp2) AS sp2, SUM(a.sp3) AS sp3, SUM(a.sp4) AS sp4, SUM(a.ss1) AS ss1, SUM(a.ss2) AS ss2, SUM(a.ss3) AS ss3, SUM(a.ss4) AS ss4, SUM(a.sr1) AS sr1, SUM(a.sr2) AS sr2, SUM(a.sr3) AS sr3, SUM(a.sr4) AS sr4, SUM(a.sca) AS sca, SUM(a.sckc) AS sckc, SUM(a.sck1) AS sck1, SUM(a.sck2) AS sck2, SUM(a.sck3) AS sck3, SUM(a.sck4) AS sck4, SUM(a.scdc) AS scdc, SUM(a.scd1) AS scd1, SUM(a.scd2) AS scd2, SUM(a.scd3) AS scd3, SUM(a.scd4) AS scd4, SUM(a.scst) AS scst, SUM(a.sfy1) AS sfy1, SUM(a.sfy2) AS sfy2, SUM(a.sossp) AS sossp, SUM(CASE WHEN COALESCE(a.scd1,0)>0 THEN a.scd1 ELSE a.sck1 END) AS bk1, SUM(CASE WHEN COALESCE(a.scd2,0)>0 THEN a.scd2 ELSE a.sck2 END) AS bk2, SUM(CASE WHEN COALESCE(a.scd3,0)>0 THEN a.scd3 ELSE a.sck3 END) AS bk3, SUM(CASE WHEN COALESCE(a.scd4,0)>0 THEN a.scd4 ELSE a.sck4 END) AS bk4 FROM tw LEFT JOIN agg a ON a.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_aq1 AS ( SELECT tw.id, SUM(b.ac) AS ac, SUM(b.as2) AS as2, SUM(b.ar) AS ar, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.pho) AS pho, SUM(b.prf) AS prf, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq2) AS tq2, SUM(b.tq3) AS tq3, SUM(b.tq4) AS tq4 FROM tw LEFT JOIN aq1 b ON b.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_aq2 AS ( SELECT tw.id, SUM(b.reco) AS reco, SUM(b.ritm) AS ritm, SUM(b.rinc) AS rinc, SUM(b.rseq) AS rseq, SUM(b.ac) AS ac, SUM(b.as2) AS as2, SUM(b.ar) AS ar, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.pho) AS pho, SUM(b.prf) AS prf, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq3) AS tq3, SUM(b.tq4) AS tq4 FROM tw LEFT JOIN aq2 b ON b.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_aq3 AS ( SELECT tw.id, SUM(b.reco) AS reco, SUM(b.ritm) AS ritm, SUM(b.rinc) AS rinc, SUM(b.rseq) AS rseq, SUM(b.ac) AS ac, SUM(b.as2) AS as2, SUM(b.ar) AS ar, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.pho) AS pho, SUM(b.prf) AS prf, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.tq4) AS tq4 FROM tw LEFT JOIN aq3 b ON b.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_aq4 AS ( SELECT tw.id, SUM(b.reco) AS reco, SUM(b.ritm) AS ritm, SUM(b.rinc) AS rinc, SUM(b.rseq) AS rseq, SUM(b.ac) AS ac, SUM(b.as2) AS as2, SUM(b.ar) AS ar, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.pho) AS pho, SUM(b.prf) AS prf, SUM(b.m1) AS m1, SUM(b.m2) AS m2, SUM(b.m3) AS m3, SUM(b.spod) AS spod FROM tw LEFT JOIN aq4 b ON b.eid = ANY(tw.desc_ids) GROUP BY tw.id ), tw_atot AS ( SELECT tw.id, SUM(b.fq1) AS fq1, SUM(b.fq2) AS fq2, SUM(b.fq3) AS fq3, SUM(b.fq4) AS fq4, SUM(b.pay) AS pay FROM tw LEFT JOIN atot b ON b.eid = ANY(tw.desc_ids) GROUP BY tw.id ) SELECT * FROM ( SELECT 'INPUT'::VARCHAR, array_length(f.tree_path, 1)::INT, f.lid, v_year, f.sc, f.ic, f.ng, COALESCE(f.bname, f.ename), f.io, CASE WHEN s_plan THEN f.pq1 END, CASE WHEN s_plan THEN f.pq2 END, CASE WHEN s_plan THEN f.pq3 END, CASE WHEN s_plan THEN f.pq4 END, CASE WHEN s_plan THEN f.pq1+f.pq2+f.pq3+f.pq4 END, CASE WHEN s_plan THEN f.pcmt END, CASE WHEN s_cs THEN f.total_amount END, CASE WHEN s_cs THEN f.counterparty END, CASE WHEN s_cs THEN f.deadline END, CASE WHEN s_cs THEN f.comment END, CASE WHEN s_cs THEN f.future_payments_y1 END, CASE WHEN s_cs THEN f.future_payments_y2 END, CASE WHEN s_cs THEN f.other_ssp_amount END, CASE WHEN s_al THEN f.al_io END, CASE WHEN s_al THEN f.al_po END, CASE WHEN s_seq THEN f.sq1 END, CASE WHEN s_seq THEN f.sq2 END, CASE WHEN s_seq THEN f.sq3 END, CASE WHEN s_seq THEN f.sq4 END, CASE WHEN s_seq THEN f.sq1+f.sq2+f.sq3+f.sq4 END, CASE WHEN s_seq THEN f.sjust END, CASE WHEN s_res THEN f.rq1 END, CASE WHEN s_res THEN f.rq2 END, CASE WHEN s_res THEN f.rq3 END, CASE WHEN s_res THEN f.rq4 END, CASE WHEN s_res THEN f.rq1+f.rq2+f.rq3+f.rq4 END, CASE WHEN s_res THEN f.rjust END, CASE WHEN s_appr THEN f.ap1 END, CASE WHEN s_appr THEN f.ap2 END, CASE WHEN s_appr THEN f.ap3 END, CASE WHEN s_appr THEN f.ap4 END, CASE WHEN s_appr THEN f.ap1+f.ap2+f.ap3+f.ap4 END, CASE WHEN s_ca THEN f.ca_amt END, CASE WHEN s_ca THEN f.ca_prot END, CASE WHEN s_ca THEN f.ca_note END, CASE WHEN s_ckk THEN f.ckk_ceil END, CASE WHEN s_ckk THEN f.ckk1 END, CASE WHEN s_ckk THEN f.ckk2 END, CASE WHEN s_ckk THEN f.ckk3 END, CASE WHEN s_ckk THEN f.ckk4 END, CASE WHEN s_ckk THEN f.ckk_rf END, CASE WHEN s_ckk THEN f.ckk_dl END, CASE WHEN s_ckk THEN f.ckk_pp END, CASE WHEN s_ckk THEN f.ckk_pm END, CASE WHEN s_ckk THEN f.ckk_cmt END, CASE WHEN s_cd THEN f.cd_cp END, CASE WHEN s_cd THEN f.cd_ref END, CASE WHEN s_cd THEN f.cd_add END, CASE WHEN s_cd THEN f.cd_subj END, CASE WHEN s_cd THEN f.cd_cur END, CASE WHEN s_cd THEN f.cd_ceil END, CASE WHEN s_cd THEN f.cdq1 END, CASE WHEN s_cd THEN f.cdq2 END, CASE WHEN s_cd THEN f.cdq3 END, CASE WHEN s_cd THEN f.cdq4 END, CASE WHEN s_cd THEN f.cd_rf END, CASE WHEN s_cd THEN f.cd_vat END, CASE WHEN s_cd THEN f.cd_rate END, CASE WHEN s_cd THEN f.cd_fx END, CASE WHEN s_cd THEN f.cd_dl END, CASE WHEN s_cd THEN f.cd_sch END, CASE WHEN s_cd THEN f.cd_act END, CASE WHEN s_cd THEN f.cd_cmt2 END, CASE WHEN s_q1 THEN f.q1_ac END, CASE WHEN s_q1 THEN f.q1_as END, CASE WHEN s_q1 THEN f.q1_ar END, CASE WHEN s_q1 THEN f.q1_arv END, CASE WHEN s_q1 THEN f.q1_acmt END, CASE WHEN s_q1 THEN f.cp1 END, CASE WHEN s_q1 THEN f.q1_pd END, CASE WHEN s_q1 THEN f.q1_pa END, CASE WHEN s_q1 THEN f.q1_pho END, CASE WHEN s_q1 THEN f.q1_prf END, CASE WHEN s_q1 THEN f.q1_pcmt END, CASE WHEN s_q1 THEN f.q1_pact END, CASE WHEN s_q1 THEN COALESCE(f.bk1,0) END, CASE WHEN s_q1 THEN f.q1_m1 END, CASE WHEN s_q1 THEN f.q1_m2 END, CASE WHEN s_q1 THEN f.q1_m3 END, CASE WHEN s_q1 THEN f.aq1 END, CASE WHEN s_q1 THEN f.cp1 - COALESCE(f.bk1,0) END, CASE WHEN s_q1 THEN f.cp1 - f.aq1 END, CASE WHEN s_q1 THEN f.q1_tq2 END, CASE WHEN s_q1 THEN f.q1_tq3 END, CASE WHEN s_q1 THEN f.q1_tq4 END, CASE WHEN s_q1 THEN f.cp1 - f.aq1 - COALESCE(f.q1_tq2,0) - COALESCE(f.q1_tq3,0) - COALESCE(f.q1_tq4,0) END, CASE WHEN s_q1 THEN f.cp1 - f.aq1 END, CASE WHEN s_q2 THEN f.q2_reco END, CASE WHEN s_q2 THEN f.q2_ritm END, CASE WHEN s_q2 THEN f.q2_rinc END, CASE WHEN s_q2 THEN f.q2_rseq END, CASE WHEN s_q2 THEN f.q2_rcmt END, CASE WHEN s_q2 THEN f.np2 END, CASE WHEN s_q2 THEN f.q2_ac END, CASE WHEN s_q2 THEN f.q2_as END, CASE WHEN s_q2 THEN f.q2_ar END, CASE WHEN s_q2 THEN f.q2_arv END, CASE WHEN s_q2 THEN f.q2_acmt END, CASE WHEN s_q2 THEN f.cp2 END, CASE WHEN s_q2 THEN f.q2_pd END, CASE WHEN s_q2 THEN f.q2_pa END, CASE WHEN s_q2 THEN f.q2_pho END, CASE WHEN s_q2 THEN f.q2_prf END, CASE WHEN s_q2 THEN f.q2_pcmt END, CASE WHEN s_q2 THEN f.q2_pact END, CASE WHEN s_q2 THEN COALESCE(f.bk2,0) END, CASE WHEN s_q2 THEN f.q2_m1 END, CASE WHEN s_q2 THEN f.q2_m2 END, CASE WHEN s_q2 THEN f.q2_m3 END, CASE WHEN s_q2 THEN f.aq2 END, CASE WHEN s_q2 THEN f.cp2 - COALESCE(f.bk2,0) END, CASE WHEN s_q2 THEN f.cp2 - f.aq2 END, CASE WHEN s_q2 THEN f.q2_tq3 END, CASE WHEN s_q2 THEN f.q2_tq4 END, CASE WHEN s_q2 THEN f.cp2 - f.aq2 - COALESCE(f.q2_tq3,0) - COALESCE(f.q2_tq4,0) END, CASE WHEN s_q2 THEN f.cp2 - f.aq2 END, CASE WHEN s_q3 THEN f.q3_reco END, CASE WHEN s_q3 THEN f.q3_ritm END, CASE WHEN s_q3 THEN f.q3_rinc END, CASE WHEN s_q3 THEN f.q3_rseq END, CASE WHEN s_q3 THEN f.q3_rcmt END, CASE WHEN s_q3 THEN f.np3 END, CASE WHEN s_q3 THEN f.q3_ac END, CASE WHEN s_q3 THEN f.q3_as END, CASE WHEN s_q3 THEN f.q3_ar END, CASE WHEN s_q3 THEN f.q3_arv END, CASE WHEN s_q3 THEN f.q3_acmt END, CASE WHEN s_q3 THEN f.cp3 END, CASE WHEN s_q3 THEN f.q3_pd END, CASE WHEN s_q3 THEN f.q3_pa END, CASE WHEN s_q3 THEN f.q3_pho END, CASE WHEN s_q3 THEN f.q3_prf END, CASE WHEN s_q3 THEN f.q3_pcmt END, CASE WHEN s_q3 THEN f.q3_pact END, CASE WHEN s_q3 THEN COALESCE(f.bk3,0) END, CASE WHEN s_q3 THEN f.q3_m1 END, CASE WHEN s_q3 THEN f.q3_m2 END, CASE WHEN s_q3 THEN f.q3_m3 END, CASE WHEN s_q3 THEN f.aq3 END, CASE WHEN s_q3 THEN f.cp3 - COALESCE(f.bk3,0) END, CASE WHEN s_q3 THEN f.cp3 - f.aq3 END, CASE WHEN s_q3 THEN f.q3_tq4 END, CASE WHEN s_q3 THEN f.cp3 - f.aq3 - COALESCE(f.q3_tq4,0) END, CASE WHEN s_q3 THEN f.cp3 - f.aq3 END, CASE WHEN s_q4 THEN f.q4_reco END, CASE WHEN s_q4 THEN f.q4_ritm END, CASE WHEN s_q4 THEN f.q4_rinc END, CASE WHEN s_q4 THEN f.q4_rseq END, CASE WHEN s_q4 THEN f.q4_rcmt END, CASE WHEN s_q4 THEN f.np4 END, CASE WHEN s_q4 THEN f.q4_ac END, CASE WHEN s_q4 THEN f.q4_as END, CASE WHEN s_q4 THEN f.q4_ar END, CASE WHEN s_q4 THEN f.q4_arv END, CASE WHEN s_q4 THEN f.q4_acmt END, CASE WHEN s_q4 THEN f.cp4 END, CASE WHEN s_q4 THEN f.q4_pd END, CASE WHEN s_q4 THEN f.q4_pa END, CASE WHEN s_q4 THEN f.q4_pho END, CASE WHEN s_q4 THEN f.q4_prf END, CASE WHEN s_q4 THEN f.q4_pcmt END, CASE WHEN s_q4 THEN f.q4_pact END, CASE WHEN s_q4 THEN COALESCE(f.bk4,0) END, CASE WHEN s_q4 THEN f.q4_m1 END, CASE WHEN s_q4 THEN f.q4_m2 END, CASE WHEN s_q4 THEN f.q4_m3 END, CASE WHEN s_q4 THEN f.aq4_no_spod END, CASE WHEN s_q4 THEN f.q4_spod END, CASE WHEN s_q4 THEN f.cp4 - COALESCE(f.bk4,0) END, CASE WHEN s_q4 THEN f.cp4 - f.aq4 END, CASE WHEN s_q4 THEN f.cp4 - f.aq4 END, CASE WHEN s_q4 THEN f.cp4 - f.aq4 END, CASE WHEN s_tot THEN COALESCE(f.tot_aq1,0)+COALESCE(f.tot_aq2,0)+COALESCE(f.tot_aq3,0)+COALESCE(f.tot_aq4,0) END, CASE WHEN s_tot THEN COALESCE(f.tot_pa1,0)+COALESCE(f.tot_pa2,0)+COALESCE(f.tot_pa3,0)+COALESCE(f.tot_pa4,0) END, f.tree_path || ARRAY[f.lid] AS _sort FROM final_input f UNION ALL SELECT CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' WHEN 2 THEN 'ITEM' WHEN 3 THEN 'SUB_ITEM' WHEN 4 THEN 'SUB_SUB_ITEM' END::VARCHAR, t.depth, NULL::INT, v_year, CASE WHEN t.depth < 3 THEN t.item_id WHEN t.depth = 3 THEN t.parent_item_id WHEN t.depth = 4 THEN t.grandparent_item_id END, CASE WHEN t.depth >= 3 THEN t.item_id ELSE NULL::VARCHAR END, t.num_group_id, t.name, NULL::VARCHAR, CASE WHEN s_plan THEN ta.sp1 END, CASE WHEN s_plan THEN ta.sp2 END, CASE WHEN s_plan THEN ta.sp3 END, CASE WHEN s_plan THEN ta.sp4 END, CASE WHEN s_plan THEN (COALESCE(ta.sp1,0)+COALESCE(ta.sp2,0)+COALESCE(ta.sp3,0)+COALESCE(ta.sp4,0)) END, NULL::VARCHAR, CASE WHEN s_cs THEN ta.scst END, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_cs THEN ta.sfy1 END, CASE WHEN s_cs THEN ta.sfy2 END, CASE WHEN s_cs THEN ta.sossp END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_seq THEN ta.ss1 END, CASE WHEN s_seq THEN ta.ss2 END, CASE WHEN s_seq THEN ta.ss3 END, CASE WHEN s_seq THEN ta.ss4 END, CASE WHEN s_seq THEN (COALESCE(ta.ss1,0)+COALESCE(ta.ss2,0)+COALESCE(ta.ss3,0)+COALESCE(ta.ss4,0)) END, NULL::VARCHAR, CASE WHEN s_res THEN ta.sr1 END, CASE WHEN s_res THEN ta.sr2 END, CASE WHEN s_res THEN ta.sr3 END, CASE WHEN s_res THEN ta.sr4 END, CASE WHEN s_res THEN (COALESCE(ta.sr1,0)+COALESCE(ta.sr2,0)+COALESCE(ta.sr3,0)+COALESCE(ta.sr4,0)) END, NULL::VARCHAR, CASE WHEN s_appr THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) END, CASE WHEN s_appr THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) END, CASE WHEN s_appr THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) END, CASE WHEN s_appr THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) END, CASE WHEN s_appr THEN (COALESCE(ta.sp1,0)+COALESCE(ta.sp2,0)+COALESCE(ta.sp3,0)+COALESCE(ta.sp4,0) +COALESCE(ta.ss1,0)+COALESCE(ta.ss2,0)+COALESCE(ta.ss3,0)+COALESCE(ta.ss4,0) +COALESCE(ta.sr1,0)+COALESCE(ta.sr2,0)+COALESCE(ta.sr3,0)+COALESCE(ta.sr4,0)) END, CASE WHEN s_ca THEN ta.sca END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_ckk THEN ta.sckc END, CASE WHEN s_ckk THEN ta.sck1 END, CASE WHEN s_ckk THEN ta.sck2 END, CASE WHEN s_ckk THEN ta.sck3 END, CASE WHEN s_ckk THEN ta.sck4 END, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_cd THEN ta.scdc END, CASE WHEN s_cd THEN ta.scd1 END, CASE WHEN s_cd THEN ta.scd2 END, CASE WHEN s_cd THEN ta.scd3 END, CASE WHEN s_cd THEN ta.scd4 END, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q1 THEN tb1.ac END, CASE WHEN s_q1 THEN tb1.as2 END, CASE WHEN s_q1 THEN tb1.ar END, CASE WHEN s_q1 THEN tb1.arv END, NULL::VARCHAR, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) + COALESCE((COALESCE(tb1.ac,0)+COALESCE(tb1.as2,0)+COALESCE(tb1.ar,0)+COALESCE(tb1.arv,0)), 0) END, NULL::DATE, CASE WHEN s_q1 THEN tb1.pa END, CASE WHEN s_q1 THEN tb1.pho END, CASE WHEN s_q1 THEN tb1.prf END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q1 THEN ta.bk1 END, CASE WHEN s_q1 THEN tb1.m1 END, CASE WHEN s_q1 THEN tb1.m2 END, CASE WHEN s_q1 THEN tb1.m3 END, CASE WHEN s_q1 THEN (COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) + COALESCE((COALESCE(tb1.ac,0)+COALESCE(tb1.as2,0)+COALESCE(tb1.ar,0)+COALESCE(tb1.arv,0)),0) - COALESCE(ta.bk1,0) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) + COALESCE((COALESCE(tb1.ac,0)+COALESCE(tb1.as2,0)+COALESCE(tb1.ar,0)+COALESCE(tb1.arv,0)),0) - COALESCE((COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)),0) END, CASE WHEN s_q1 THEN tb1.tq2 END, CASE WHEN s_q1 THEN tb1.tq3 END, CASE WHEN s_q1 THEN tb1.tq4 END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) + COALESCE((COALESCE(tb1.ac,0)+COALESCE(tb1.as2,0)+COALESCE(tb1.ar,0)+COALESCE(tb1.arv,0)),0) - COALESCE((COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)),0) - COALESCE((COALESCE(tb1.tq2,0)+COALESCE(tb1.tq3,0)+COALESCE(tb1.tq4,0)),0) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.ss1,0)+COALESCE(ta.sr1,0)) + COALESCE((COALESCE(tb1.ac,0)+COALESCE(tb1.as2,0)+COALESCE(tb1.ar,0)+COALESCE(tb1.arv,0)),0) - COALESCE((COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)),0) END, CASE WHEN s_q2 THEN tb2.reco END, CASE WHEN s_q2 THEN tb2.ritm END, CASE WHEN s_q2 THEN tb2.rinc END, CASE WHEN s_q2 THEN tb2.rseq END, NULL::VARCHAR, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2, 0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)), 0) END, CASE WHEN s_q2 THEN tb2.ac END, CASE WHEN s_q2 THEN tb2.as2 END, CASE WHEN s_q2 THEN tb2.ar END, CASE WHEN s_q2 THEN tb2.arv END, NULL::VARCHAR, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2, 0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as2,0)+COALESCE(tb2.ar,0)+COALESCE(tb2.arv,0)), 0) END, NULL::DATE, CASE WHEN s_q2 THEN tb2.pa END, CASE WHEN s_q2 THEN tb2.pho END, CASE WHEN s_q2 THEN tb2.prf END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q2 THEN ta.bk2 END, CASE WHEN s_q2 THEN tb2.m1 END, CASE WHEN s_q2 THEN tb2.m2 END, CASE WHEN s_q2 THEN tb2.m3 END, CASE WHEN s_q2 THEN (COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2,0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as2,0)+COALESCE(tb2.ar,0)+COALESCE(tb2.arv,0)),0) - COALESCE(ta.bk2,0) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2,0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as2,0)+COALESCE(tb2.ar,0)+COALESCE(tb2.arv,0)),0) - COALESCE((COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)),0) END, CASE WHEN s_q2 THEN tb2.tq3 END, CASE WHEN s_q2 THEN tb2.tq4 END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2,0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as2,0)+COALESCE(tb2.ar,0)+COALESCE(tb2.arv,0)),0) - COALESCE((COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)),0) - COALESCE((COALESCE(tb2.tq3,0)+COALESCE(tb2.tq4,0)),0) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.ss2,0)+COALESCE(ta.sr2,0)) + COALESCE(tb1.tq2,0) + COALESCE((COALESCE(tb2.reco,0)+COALESCE(tb2.ritm,0)+COALESCE(tb2.rinc,0)+COALESCE(tb2.rseq,0)+COALESCE(tb2.ac,0)+COALESCE(tb2.as2,0)+COALESCE(tb2.ar,0)+COALESCE(tb2.arv,0)),0) - COALESCE((COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)),0) END, CASE WHEN s_q3 THEN tb3.reco END, CASE WHEN s_q3 THEN tb3.ritm END, CASE WHEN s_q3 THEN tb3.rinc END, CASE WHEN s_q3 THEN tb3.rseq END, NULL::VARCHAR, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3, 0) + COALESCE(tb2.tq3, 0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)), 0) END, CASE WHEN s_q3 THEN tb3.ac END, CASE WHEN s_q3 THEN tb3.as2 END, CASE WHEN s_q3 THEN tb3.ar END, CASE WHEN s_q3 THEN tb3.arv END, NULL::VARCHAR, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3, 0) + COALESCE(tb2.tq3, 0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as2,0)+COALESCE(tb3.ar,0)+COALESCE(tb3.arv,0)), 0) END, NULL::DATE, CASE WHEN s_q3 THEN tb3.pa END, CASE WHEN s_q3 THEN tb3.pho END, CASE WHEN s_q3 THEN tb3.prf END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q3 THEN ta.bk3 END, CASE WHEN s_q3 THEN tb3.m1 END, CASE WHEN s_q3 THEN tb3.m2 END, CASE WHEN s_q3 THEN tb3.m3 END, CASE WHEN s_q3 THEN (COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3,0) + COALESCE(tb2.tq3,0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as2,0)+COALESCE(tb3.ar,0)+COALESCE(tb3.arv,0)),0) - COALESCE(ta.bk3,0) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3,0) + COALESCE(tb2.tq3,0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as2,0)+COALESCE(tb3.ar,0)+COALESCE(tb3.arv,0)),0) - COALESCE((COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)),0) END, CASE WHEN s_q3 THEN tb3.tq4 END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3,0) + COALESCE(tb2.tq3,0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as2,0)+COALESCE(tb3.ar,0)+COALESCE(tb3.arv,0)),0) - COALESCE((COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)),0) - COALESCE(COALESCE(tb3.tq4,0),0) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.ss3,0)+COALESCE(ta.sr3,0)) + COALESCE(tb1.tq3,0) + COALESCE(tb2.tq3,0) + COALESCE((COALESCE(tb3.reco,0)+COALESCE(tb3.ritm,0)+COALESCE(tb3.rinc,0)+COALESCE(tb3.rseq,0)+COALESCE(tb3.ac,0)+COALESCE(tb3.as2,0)+COALESCE(tb3.ar,0)+COALESCE(tb3.arv,0)),0) - COALESCE((COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)),0) END, CASE WHEN s_q4 THEN tb4.reco END, CASE WHEN s_q4 THEN tb4.ritm END, CASE WHEN s_q4 THEN tb4.rinc END, CASE WHEN s_q4 THEN tb4.rseq END, NULL::VARCHAR, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4, 0) + COALESCE(tb2.tq4, 0) + COALESCE(tb3.tq4, 0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)), 0) END, CASE WHEN s_q4 THEN tb4.ac END, CASE WHEN s_q4 THEN tb4.as2 END, CASE WHEN s_q4 THEN tb4.ar END, CASE WHEN s_q4 THEN tb4.arv END, NULL::VARCHAR, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4, 0) + COALESCE(tb2.tq4, 0) + COALESCE(tb3.tq4, 0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as2,0)+COALESCE(tb4.ar,0)+COALESCE(tb4.arv,0)), 0) END, NULL::DATE, CASE WHEN s_q4 THEN tb4.pa END, CASE WHEN s_q4 THEN tb4.pho END, CASE WHEN s_q4 THEN tb4.prf END, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q4 THEN ta.bk4 END, CASE WHEN s_q4 THEN tb4.m1 END, CASE WHEN s_q4 THEN tb4.m2 END, CASE WHEN s_q4 THEN tb4.m3 END, CASE WHEN s_q4 THEN (COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)) END, CASE WHEN s_q4 THEN tb4.spod END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4,0) + COALESCE(tb2.tq4,0) + COALESCE(tb3.tq4,0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as2,0)+COALESCE(tb4.ar,0)+COALESCE(tb4.arv,0)),0) - COALESCE(ta.bk4,0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4,0) + COALESCE(tb2.tq4,0) + COALESCE(tb3.tq4,0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as2,0)+COALESCE(tb4.ar,0)+COALESCE(tb4.arv,0)),0) - COALESCE((COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0)),0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4,0) + COALESCE(tb2.tq4,0) + COALESCE(tb3.tq4,0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as2,0)+COALESCE(tb4.ar,0)+COALESCE(tb4.arv,0)),0) - COALESCE((COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0)),0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.ss4,0)+COALESCE(ta.sr4,0)) + COALESCE(tb1.tq4,0) + COALESCE(tb2.tq4,0) + COALESCE(tb3.tq4,0) + COALESCE((COALESCE(tb4.reco,0)+COALESCE(tb4.ritm,0)+COALESCE(tb4.rinc,0)+COALESCE(tb4.rseq,0)+COALESCE(tb4.ac,0)+COALESCE(tb4.as2,0)+COALESCE(tb4.ar,0)+COALESCE(tb4.arv,0)),0) - COALESCE((COALESCE(tb4.m1,0)+COALESCE(tb4.m2,0)+COALESCE(tb4.m3,0)+COALESCE(tb4.spod,0)),0) END, CASE WHEN s_tot THEN (COALESCE(tt.fq1,0)+COALESCE(tt.fq2,0)+COALESCE(tt.fq3,0)+COALESCE(tt.fq4,0)) END, CASE WHEN s_tot THEN tt.pay END, t.path AS _sort FROM tw t LEFT JOIN tw_agg ta ON ta.id = t.id LEFT JOIN tw_aq1 tb1 ON tb1.id = t.id LEFT JOIN tw_aq2 tb2 ON tb2.id = t.id LEFT JOIN tw_aq3 tb3 ON tb3.id = t.id LEFT JOIN tw_aq4 tb4 ON tb4.id = t.id LEFT JOIN tw_atot tt ON tt.id = t.id ) sub ORDER BY sub._sort; END; $function$ ; CREATE OR REPLACE FUNCTION v3.v_form1_sheet_jsonb(p_form_id integer, p_sheet character varying, p_direction character varying DEFAULT NULL::character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, line_id integer, header jsonb, plan_data jsonb, contract_summary jsonb, allocation_data jsonb, sequestration_data jsonb, reserve_data jsonb, approved_data jsonb, collegial_data jsonb, ckk_data jsonb, contract_detail jsonb, q1_data jsonb, q2_data jsonb, q3_data jsonb, q4_data jsonb, totals_data jsonb, _sort_path integer[]) LANGUAGE sql STABLE SET search_path TO 'v3', 'pg_catalog' AS $function$ WITH flags AS ( SELECT (p_sections IS NULL OR 'plan' = ANY(p_sections)) AS s_plan, (p_sections IS NULL OR 'contract_summary' = ANY(p_sections)) AS s_cs, (p_sections IS NULL OR 'allocation' = ANY(p_sections)) AS s_al, (p_sections IS NULL OR 'sequestration' = ANY(p_sections)) AS s_seq, (p_sections IS NULL OR 'reserve' = ANY(p_sections)) AS s_res, (p_sections IS NULL OR 'approved' = ANY(p_sections)) AS s_appr, (p_sections IS NULL OR 'collegial' = ANY(p_sections)) AS s_ca, (p_sections IS NULL OR 'ckk' = ANY(p_sections)) AS s_ckk, (p_sections IS NULL OR 'contract_detail' = ANY(p_sections)) AS s_cd, (p_sections IS NULL OR 'q1' = ANY(p_sections)) AS s_q1, (p_sections IS NULL OR 'q2' = ANY(p_sections)) AS s_q2, (p_sections IS NULL OR 'q3' = ANY(p_sections)) AS s_q3, (p_sections IS NULL OR 'q4' = ANY(p_sections)) AS s_q4, (p_sections IS NULL OR 'totals' = ANY(p_sections)) AS s_tot ) SELECT s.row_type, s.depth, s.line_id, jsonb_build_object( 'year', s.col_B_year, 'section', s.col_C_section, 'item_id', s.col_D_item_id, 'num_group', s.col_E_num_group, 'name', s.col_F_name, 'internal_order', s.col_G_internal_order, 'expense_item_id', CASE WHEN s.row_type = 'INPUT' THEN s._sort_path[array_upper(s._sort_path,1)-1] ELSE s._sort_path[array_upper(s._sort_path,1)] END ) AS header, CASE WHEN f.s_plan THEN jsonb_build_object( 'q1', s.col_H_plan_q1, 'q2', s.col_I_plan_q2, 'q3', s.col_J_plan_q3, 'q4', s.col_K_plan_q4, 'year', s.col_L_plan_year, 'comment', s.col_M_plan_comment ) END AS plan_data, CASE WHEN f.s_cs THEN jsonb_build_object( 'total', s.col_N_cs_total, 'counterparty', s.col_O_cs_counterparty, 'deadline', s.col_P_cs_deadline, 'comment', s.col_Q_cs_comment, 'future_y1', s.col_R_cs_future_y1, 'future_y2', s.col_S_cs_future_y2, 'other_ssp', s.col_T_cs_other_ssp ) END AS contract_summary, CASE WHEN f.s_al THEN jsonb_build_object( 'order', s.col_V_al_order, 'property', s.col_W_al_property ) END AS allocation_data, CASE WHEN f.s_seq THEN jsonb_build_object( 'q1', s.col_Y_seq_q1, 'q2', s.col_Z_seq_q2, 'q3', s.col_AA_seq_q3, 'q4', s.col_AB_seq_q4, 'year', s.col_AC_seq_year, 'justification', s.col_AD_seq_justification ) END AS sequestration_data, CASE WHEN f.s_res THEN jsonb_build_object( 'q1', s.col_AF_res_q1, 'q2', s.col_AG_res_q2, 'q3', s.col_AH_res_q3, 'q4', s.col_AI_res_q4, 'year', s.col_AJ_res_year, 'justification', s.col_AK_res_justification ) END AS reserve_data, CASE WHEN f.s_appr THEN jsonb_build_object( 'q1', s.col_AM_approved_q1, 'q2', s.col_AN_approved_q2, 'q3', s.col_AO_approved_q3, 'q4', s.col_AP_approved_q4, 'year', s.col_AQ_approved_year ) END AS approved_data, CASE WHEN f.s_ca THEN jsonb_build_object( 'approved', s.col_AS_ca_approved, 'protocol', s.col_AT_ca_protocol, 'note', s.col_AU_ca_note ) END AS collegial_data, CASE WHEN f.s_ckk THEN jsonb_build_object( 'ceiling', s.col_AW_ckk_ceiling, 'q1', s.col_AX_ckk_exp_q1, 'q2', s.col_AY_ckk_exp_q2, 'q3', s.col_AZ_ckk_exp_q3, 'q4', s.col_BA_ckk_exp_q4, 'rf_schedule', s.col_BB_ckk_rf_sched, 'deadline', s.col_BC_ckk_deadline, 'proc_plan', s.col_BD_ckk_proc_plan, 'proc_method', s.col_BE_ckk_proc_meth, 'comment', s.col_BF_ckk_comment ) END AS ckk_data, CASE WHEN f.s_cd THEN jsonb_build_object( 'counterparty', s.col_BH_cd_counterparty, 'reference', s.col_BI_cd_reference, 'addenda', s.col_BJ_cd_addenda, 'subject', s.col_BK_cd_subject, 'currency', s.col_BL_cd_currency, 'ceiling', s.col_BM_cd_ceiling, 'q1', s.col_BN_cd_exp_q1, 'q2', s.col_BO_cd_exp_q2, 'q3', s.col_BP_cd_exp_q3, 'q4', s.col_BQ_cd_exp_q4, 'rf_schedule', s.col_BR_cd_rf_sched, 'vat_rate', s.col_BS_cd_vat, 'exchange_rate', s.col_BT_cd_rate, 'amount_foreign', s.col_BU_cd_amount_fx, 'deadline', s.col_BV_cd_deadline, 'payment_scheme', s.col_BW_cd_scheme, 'act', s.col_BX_cd_act, 'comment', s.col_BY_cd_comment ) END AS contract_detail, CASE WHEN f.s_q1 THEN jsonb_build_object( 'adj_current', s.col_CA_q1_adj_current, 'adj_ssp', s.col_CB_q1_adj_ssp, 'adj_rf', s.col_CC_q1_adj_rf, 'adj_reserve', s.col_CD_q1_adj_reserve, 'adj_comment', s.col_CE_q1_adj_comment, 'corrected_plan', s.col_CF_q1_corrected_plan, 'pay_date', TO_CHAR(s.col_CH_q1_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_CI_q1_pay_amount, 'pay_ho', s.col_CJ_q1_pay_ho, 'pay_rf', s.col_CK_q1_pay_rf, 'pay_comment', s.col_CL_q1_pay_comment, 'pay_act', s.col_CM_q1_pay_act, 'booking', s.col_CO_q1_booking, 'actual_m1', s.col_CP_q1_actual_m1, 'actual_m2', s.col_CQ_q1_actual_m2, 'actual_m3', s.col_CR_q1_actual_m3, 'actual_quarter', s.col_CS_q1_actual_quarter, 'rem_booking', s.col_CT_q1_rem_booking, 'rem_actual', s.col_CU_q1_rem_actual, 'transfer_q2', s.col_CW_q1_trans_q2, 'transfer_q3', s.col_CX_q1_trans_q3, 'transfer_q4', s.col_CY_q1_trans_q4, 'economy', s.col_CZ_q1_economy, 'total', s.col_DA_q1_total ) END AS q1_data, CASE WHEN f.s_q2 THEN jsonb_build_object( 'rev_eco', s.col_DC_q2_rev_eco, 'rev_item', s.col_DD_q2_rev_item, 'rev_inc', s.col_DE_q2_rev_inc, 'rev_seq', s.col_DF_q2_rev_seq, 'rev_comment', s.col_DG_q2_rev_comment, 'new_plan', s.col_DH_q2_new_plan, 'adj_current', s.col_DJ_q2_adj_current, 'adj_ssp', s.col_DK_q2_adj_ssp, 'adj_rf', s.col_DL_q2_adj_rf, 'adj_reserve', s.col_DM_q2_adj_reserve, 'adj_comment', s.col_DN_q2_adj_comment, 'corrected_plan', s.col_DO_q2_corrected_plan, 'pay_date', TO_CHAR(s.col_DQ_q2_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_DR_q2_pay_amount, 'pay_ho', s.col_DS_q2_pay_ho, 'pay_rf', s.col_DT_q2_pay_rf, 'pay_comment', s.col_DU_q2_pay_comment, 'pay_act', s.col_DV_q2_pay_act, 'booking', s.col_DX_q2_booking, 'actual_m1', s.col_DY_q2_actual_m1, 'actual_m2', s.col_DZ_q2_actual_m2, 'actual_m3', s.col_EA_q2_actual_m3, 'actual_quarter', s.col_EB_q2_actual_quarter, 'rem_booking', s.col_EC_q2_rem_booking, 'rem_actual', s.col_ED_q2_rem_actual, 'transfer_q3', s.col_EF_q2_trans_q3, 'transfer_q4', s.col_EG_q2_trans_q4, 'economy', s.col_EH_q2_economy, 'total', s.col_EI_q2_total ) END AS q2_data, CASE WHEN f.s_q3 THEN jsonb_build_object( 'rev_eco', s.col_EK_q3_rev_eco, 'rev_item', s.col_EL_q3_rev_item, 'rev_inc', s.col_EM_q3_rev_inc, 'rev_seq', s.col_EN_q3_rev_seq, 'rev_comment', s.col_EO_q3_rev_comment, 'new_plan', s.col_EP_q3_new_plan, 'adj_current', s.col_ER_q3_adj_current, 'adj_ssp', s.col_ES_q3_adj_ssp, 'adj_rf', s.col_ET_q3_adj_rf, 'adj_reserve', s.col_EU_q3_adj_reserve, 'adj_comment', s.col_EV_q3_adj_comment, 'corrected_plan', s.col_EW_q3_corrected_plan, 'pay_date', TO_CHAR(s.col_EY_q3_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_EZ_q3_pay_amount, 'pay_ho', s.col_FA_q3_pay_ho, 'pay_rf', s.col_FB_q3_pay_rf, 'pay_comment', s.col_FC_q3_pay_comment, 'pay_act', s.col_FD_q3_pay_act, 'booking', s.col_FF_q3_booking, 'actual_m1', s.col_FG_q3_actual_m1, 'actual_m2', s.col_FH_q3_actual_m2, 'actual_m3', s.col_FI_q3_actual_m3, 'actual_quarter', s.col_FJ_q3_actual_quarter, 'rem_booking', s.col_FK_q3_rem_booking, 'rem_actual', s.col_FL_q3_rem_actual, 'transfer_q4', s.col_FN_q3_trans_q4, 'economy', s.col_FO_q3_economy, 'total', s.col_FP_q3_total ) END AS q3_data, CASE WHEN f.s_q4 THEN jsonb_build_object( 'rev_eco', s.col_FR_q4_rev_eco, 'rev_item', s.col_FS_q4_rev_item, 'rev_inc', s.col_FT_q4_rev_inc, 'rev_seq', s.col_FU_q4_rev_seq, 'rev_comment', s.col_FV_q4_rev_comment, 'new_plan', s.col_FW_q4_new_plan, 'adj_current', s.col_FY_q4_adj_current, 'adj_ssp', s.col_FZ_q4_adj_ssp, 'adj_rf', s.col_GA_q4_adj_rf, 'adj_reserve', s.col_GB_q4_adj_reserve, 'adj_comment', s.col_GC_q4_adj_comment, 'corrected_plan', s.col_GD_q4_corrected_plan, 'pay_date', TO_CHAR(s.col_GF_q4_pay_date, 'DD.MM.YYYY'), 'pay_amount', s.col_GG_q4_pay_amount, 'pay_ho', s.col_GH_q4_pay_ho, 'pay_rf', s.col_GI_q4_pay_rf, 'pay_comment', s.col_GJ_q4_pay_comment, 'pay_act', s.col_GK_q4_pay_act, 'booking', s.col_GM_q4_booking, 'actual_m1', s.col_GN_q4_actual_m1, 'actual_m2', s.col_GO_q4_actual_m2, 'actual_m3', s.col_GP_q4_actual_m3, 'actual_quarter', s.col_GQ_q4_actual_quarter, 'actual_spod', s.col_GR_q4_actual_spod, 'rem_booking', s.col_GS_q4_rem_booking, 'rem_actual', s.col_GT_q4_rem_actual, 'economy', s.col_GV_q4_economy, 'total', s.col_GW_q4_total ) END AS q4_data, CASE WHEN f.s_tot THEN jsonb_build_object( 'fact_year', s.col_GZ_fact_year, 'pay_year', s.col_HB_pay_year ) END AS totals_data, s._sort_path FROM v_form1_sheet_sections(p_form_id, p_sheet, p_direction, p_sections) s CROSS JOIN flags f ORDER BY s._sort_path; $function$ ; CREATE OR REPLACE FUNCTION v3.v_form_view(p_form_id integer, p_sheet character varying, p_sections text[] DEFAULT NULL::text[], p_direction character varying DEFAULT NULL::character varying, p_user_id integer DEFAULT NULL::integer) RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb) LANGUAGE plpgsql STABLE AS $function$ DECLARE v_form_type VARCHAR; v_year INT; v_org_unit_id INT; v_user_id INT; BEGIN SELECT form_type_code, year, org_unit_id INTO v_form_type, v_year, v_org_unit_id FROM v3.budget_form WHERE id = p_form_id; IF NOT FOUND THEN RAISE EXCEPTION 'budget_form id=% не существует в v3.budget_form', p_form_id; END IF; v_user_id := p_user_id; IF p_user_id IS NULL THEN v_user_id := v3.current_user_id(); END IF; RETURN QUERY SELECT 'META'::VARCHAR, -1, 0::BIGINT, jsonb_build_object( 'user_id', v_user_id, 'role', v3.user_role_code(v_user_id), 'sheet', p_sheet, 'editable', COALESCE( (SELECT jsonb_agg( jsonb_build_object('column', ec.column_key, 'closes_at', ec.closes_at) ORDER BY ec.column_key) FROM v3.editable_columns_for(p_form_id, v_user_id, p_sheet, p_direction) ec), '[]'::JSONB) ); IF v_form_type = 'FORM_1' THEN IF p_sheet = 'SMETA' THEN RETURN QUERY SELECT sm.row_type, sm.depth, ROW_NUMBER() OVER (ORDER BY sm.section_code) AS sort_order, jsonb_build_object( 'section_code', sm.section_code, 'name', sm.name, 'plan', jsonb_build_object( 'support', jsonb_build_object('q1', sm.supp_plan_q1, 'q2', sm.supp_plan_q2, 'q3', sm.supp_plan_q3, 'q4', sm.supp_plan_q4, 'year', sm.supp_plan_year), 'development', jsonb_build_object('q1', sm.dev_plan_q1, 'q2', sm.dev_plan_q2, 'q3', sm.dev_plan_q3, 'q4', sm.dev_plan_q4, 'year', sm.dev_plan_year), 'total_year', sm.total_plan_year), 'approved', jsonb_build_object( 'support', jsonb_build_object('q1', sm.supp_appr_q1, 'q2', sm.supp_appr_q2, 'q3', sm.supp_appr_q3, 'q4', sm.supp_appr_q4, 'year', sm.supp_appr_year), 'development', jsonb_build_object('q1', sm.dev_appr_q1, 'q2', sm.dev_appr_q2, 'q3', sm.dev_appr_q3, 'q4', sm.dev_appr_q4, 'year', sm.dev_appr_year), 'total_year', sm.total_appr_year), 'fact', jsonb_build_object( 'support', jsonb_build_object('q1', sm.supp_act_q1, 'q2', sm.supp_act_q2, 'q3', sm.supp_act_q3, 'q4', sm.supp_act_q4, 'year', sm.supp_act_year), 'development', jsonb_build_object('q1', sm.dev_act_q1, 'q2', sm.dev_act_q2, 'q3', sm.dev_act_q3, 'q4', sm.dev_act_q4, 'year', sm.dev_act_year), 'total_year', sm.total_act_year), 'corrected', jsonb_build_object( 'support', jsonb_build_object('q2', sm.supp_corr_q2, 'q3', sm.supp_corr_q3, 'q4', sm.supp_corr_q4), 'development', jsonb_build_object('q2', sm.dev_corr_q2, 'q3', sm.dev_corr_q3, 'q4', sm.dev_corr_q4)) ) FROM v3.v_form1_smeta(v_year, v_org_unit_id) sm ORDER BY sm.section_code; RETURN; END IF; IF p_sheet IN ('AHR','CAP','OPER') THEN RETURN QUERY SELECT j.row_type, j.depth, ROW_NUMBER() OVER (ORDER BY j._sort_path) AS sort_order, jsonb_build_object( 'line_id', j.line_id, 'header', j.header, 'plan', j.plan_data, 'contract_summary', j.contract_summary, 'allocation', j.allocation_data, 'sequestration', j.sequestration_data, 'reserve', j.reserve_data, 'approved', j.approved_data, 'collegial', j.collegial_data, 'ckk', j.ckk_data, 'contract_detail', j.contract_detail, 'q1', j.q1_data, 'q2', j.q2_data, 'q3', j.q3_data, 'q4', j.q4_data, 'totals', j.totals_data ) FROM v3.v_form1_sheet_jsonb(p_form_id, p_sheet, p_direction, p_sections) j ORDER BY j._sort_path; RETURN; END IF; RAISE EXCEPTION 'Unknown FORM_1 sheet: %', p_sheet USING HINT = 'Use AHR / CAP / OPER / SMETA'; END IF; IF v_form_type = 'FORM_2' THEN RETURN QUERY SELECT * FROM v3.v_form2_view(p_form_id, p_sheet, p_sections); RETURN; END IF; IF v_form_type = 'FORM_4' THEN RETURN QUERY SELECT * FROM v3.v_form4_view(p_form_id, p_sheet, p_sections); RETURN; END IF; RAISE EXCEPTION 'Unsupported form_type=% for form_id=%', v_form_type, p_form_id; END; $function$ ; CREATE OR REPLACE FUNCTION v3._form_affected_rows(p_form_id integer, p_sheet character varying, p_ids integer[], p_direction character varying DEFAULT NULL::character varying, p_sections text[] DEFAULT NULL::text[]) RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb) LANGUAGE plpgsql AS $function$ DECLARE v_form_type VARCHAR; v_strip TEXT[] := ARRAY[]::TEXT[]; v_lc_path INT[]; v_eid_set INT[]; v_ei_path INT[]; BEGIN SELECT bf.form_type_code INTO v_form_type FROM v3.budget_form bf WHERE bf.id = p_form_id; IF p_sections IS NOT NULL THEN SELECT COALESCE(array_agg(k), ARRAY[]::TEXT[]) INTO v_strip FROM unnest(ARRAY['plan','seq_dfip','seq_ssp','approved','contract','booking', 'contract_summary','allocation','collegial','ckk', 'sequestration','reserve','contract_detail', 'q1','q2','q3','q4','totals', 'fact_q1','fact_q2','fact_q3','fact_q4']) AS k WHERE NOT (k = ANY(p_sections)); END IF; IF p_sheet IN ('AHR_RENT','AHR_UTILITY','AHR_SECURITY') THEN RETURN QUERY SELECT v.row_type, v.depth, v.sort_order, v.data - v_strip FROM v3.v_form_view(p_form_id, p_sheet, p_sections, p_direction) v WHERE v.row_type = 'INPUT' AND (v.data->>'id')::INT = ANY(p_ids) ORDER BY v.sort_order; ELSIF p_sheet = 'AHR_LIMIT' THEN v_lc_path := v3._limit_template_path_set(p_ids); RETURN QUERY SELECT v.row_type, v.depth, v.sort_order, v.data - v_strip FROM v3.v_form_view(p_form_id, p_sheet, p_sections, p_direction) v WHERE (v.data->>'id')::INT = ANY(v_lc_path) ORDER BY v.sort_order; ELSIF p_sheet = 'OTCH9F' THEN RETURN QUERY SELECT v.row_type, v.depth, v.sort_order, v.data - v_strip FROM v3.v_form_view(p_form_id, p_sheet, p_sections, p_direction) v WHERE EXISTS ( SELECT 1 FROM v3.fixed_asset_report far WHERE far.id = ANY(p_ids) AND far.expense_item_id = (v.data->>'expense_item_id')::INT AND far.equipment_name IS NOT DISTINCT FROM (v.data->>'equipment_name')) ORDER BY v.sort_order; ELSE SELECT array_agg(DISTINCT bl.expense_item_id) INTO v_eid_set FROM v3.budget_line bl WHERE bl.id = ANY(p_ids); v_ei_path := v3._expense_item_path_set(v_eid_set); IF v_form_type = 'FORM_4' THEN RETURN QUERY WITH vv AS MATERIALIZED ( SELECT f.row_type, f.depth, f.sort_order, f.data FROM v3.v_form_view(p_form_id, p_sheet, p_sections, p_direction) f WHERE f.row_type <> 'META' ), chg AS ( SELECT DISTINCT (x.data->'header'->>'program_id')::INT AS program_id, (x.data->'header'->>'project_id')::INT AS project_id FROM vv x WHERE x.row_type = 'INPUT' AND (x.data->>'line_id')::INT = ANY(p_ids) ) SELECT v.row_type, v.depth, v.sort_order, v.data - v_strip FROM vv v WHERE (v.row_type = 'INPUT' AND (v.data->>'line_id')::INT = ANY(p_ids)) OR (v.row_type = 'ROOT' AND (v.data->'header'->>'expense_item_id')::INT = ANY(v_ei_path)) OR (v.row_type = 'GROUP' AND (v.data->'header'->>'expense_item_id')::INT = ANY(v_ei_path) AND (v.data->'header'->>'program_id')::INT IN (SELECT c.program_id FROM chg c)) OR (v.row_type = 'ITEM' AND (v.data->'header'->>'expense_item_id')::INT = ANY(v_ei_path) AND (v.data->'header'->>'project_id')::INT IN (SELECT c.project_id FROM chg c)) ORDER BY v.sort_order; ELSE RETURN QUERY SELECT v.row_type, v.depth, v.sort_order, v.data - v_strip FROM v3.v_form_view(p_form_id, p_sheet, p_sections, p_direction) v WHERE (v.row_type IN ('ROOT','GROUP','ITEM','SUB_ITEM','SUB_SUB_ITEM') AND (v.data->'header'->>'expense_item_id')::INT = ANY(v_ei_path)) OR (v.row_type = 'INPUT' AND (v.data->>'line_id')::INT = ANY(p_ids)) ORDER BY v.sort_order; END IF; END IF; END; $function$ ; CREATE OR REPLACE FUNCTION v3.get_form2_ahr_satellite_delta(p_form_id integer, p_source_sheet character varying, p_source_row_id integer) RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb) LANGUAGE sql STABLE AS $function$ WITH target_lines AS ( SELECT m.target_line_id AS line_id FROM v3.form2_ahr_satellite_line_source m JOIN v3.budget_line bl ON bl.id = m.target_line_id WHERE m.source_sheet = p_source_sheet AND m.source_id = p_source_row_id AND bl.budget_form_id = p_form_id AND p_source_sheet IN ('AHR_RENT', 'AHR_UTILITY', 'AHR_SECURITY') UNION SELECT bl.id AS line_id FROM v3.limit_template lt JOIN v3.expense_item ei ON ei.sheet = 'AHR' AND ei.direction = 'Support' AND ( (ei.depth = 3 AND ei.item_id = lt.expense_item_code) OR ei.num_group_id = lt.expense_item_code ) JOIN v3.budget_line bl ON bl.budget_form_id = p_form_id AND bl.expense_item_id = ei.id AND bl.name = regexp_replace( lt.name, '^[[:space:]]*-[[:space:]]*', '' ) WHERE p_source_sheet = 'AHR_LIMIT' AND lt.id = p_source_row_id AND lt.row_type = 'LEAF' ), target_path AS ( SELECT unnest( v3._expense_item_path_set( COALESCE(array_agg(bl.expense_item_id), ARRAY[]::integer[]) ) ) AS expense_item_id FROM target_lines tl JOIN v3.budget_line bl ON bl.id = tl.line_id ) SELECT v.row_type, v.depth, v.sort_order, v.data FROM v3.v_form_view(p_form_id, 'AHR', NULL, 'Support') v WHERE ( v.row_type IN ('ROOT', 'GROUP', 'ITEM', 'SUB_ITEM') AND (v.data->'header'->>'expense_item_id')::INT IN ( SELECT expense_item_id FROM target_path ) ) OR ( v.row_type = 'INPUT' AND (v.data->>'line_id')::INT IN ( SELECT line_id FROM target_lines ) ) ORDER BY v.sort_order; $function$ ;