-- DROP FUNCTION v3.v_form2_sheet_sections(int4, varchar, _text); 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 FROM v3.mv_expense_item_tree t JOIN v3.expense_item_form_type eft ON eft.expense_item_id = t.id JOIN v3.budget_form bf ON bf.id = p_form_id AND bf.form_type_code = eft.form_type_code 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, t.parent_item_id 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, 3, 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' END::VARCHAR, t.depth, NULL::INT, CASE WHEN t.depth < 3 THEN t.item_id ELSE t.parent_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$ ; -- DROP FUNCTION v3.v_form4_sheet_sections(int4, varchar, _text); CREATE OR REPLACE FUNCTION v3.v_form4_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_justification character varying, col_internal_order 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_appr_q1 numeric, col_appr_q2 numeric, col_appr_q3 numeric, col_appr_q4 numeric, col_appr_year numeric, col_cs_amount numeric, col_cs_reference character varying, 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_cs_centralized_flag character varying, col_al_contract_ref character varying, col_al_purpose character varying, col_rsv_q1 numeric, col_rsv_q2 numeric, col_rsv_q3 numeric, col_rsv_q4 numeric, col_rsv_year numeric, col_rsv_just character varying, col_col_amount numeric, col_col_protocol character varying, col_col_note character varying, col_ckk_ceiling numeric, col_ckk_q1 numeric, col_ckk_q2 numeric, col_ckk_q3 numeric, col_ckk_q4 numeric, col_ckk_rf_schedule character varying, col_ckk_delivery_deadline character varying, col_ckk_procurement_plan character varying, col_ckk_procurement_method character varying, col_ckk_comment character varying, col_cd_counterparty character varying, col_cd_reference character varying, col_cd_addenda character varying, col_cd_date date, col_cd_subject character varying, col_cd_currency character varying, col_cd_ceiling numeric, col_cd_q1 numeric, col_cd_q2 numeric, col_cd_q3 numeric, col_cd_q4 numeric, col_cd_rf_schedule character varying, col_cd_vat_rate character varying, col_cd_exchange_rate numeric, col_cd_amount_foreign numeric, 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_rf 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_ho numeric, col_q1_pay_rf 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_rf 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_ho numeric, col_q2_pay_rf 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_rf 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_ho numeric, col_q3_pay_rf 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_rf 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_ho numeric, col_q4_pay_rf 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, _sort_path integer[]) LANGUAGE plpgsql STABLE AS $function$ #variable_conflict use_column DECLARE s_plan BOOL; s_seq_d BOOL; s_appr BOOL; s_cd BOOL; s_book BOOL; s_q1 BOOL; s_q2 BOOL; s_q3 BOOL; s_q4 BOOL; s_tot BOOL; s_cs BOOL; s_al BOOL; s_rsv BOOL; s_col BOOL; s_ckk 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_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_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_cs := p_sections IS NULL OR 'contract_summary' = ANY(p_sections); s_al := p_sections IS NULL OR 'allocation' = ANY(p_sections); s_rsv := p_sections IS NULL OR 'reserve' = ANY(p_sections); s_col := p_sections IS NULL OR 'collegial' = ANY(p_sections); s_ckk := p_sections IS NULL OR 'ckk' = 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 FROM v3.mv_expense_item_tree t JOIN v3.expense_item_form_type eft ON eft.expense_item_id = t.id JOIN v3.budget_form bf ON bf.id = p_form_id AND bf.form_type_code = eft.form_type_code 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 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'), 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), jcol AS (SELECT c.* FROM v3.collegial_approval c JOIN page pg ON c.line_id = pg.lid WHERE s_col), 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, bl_just.justification AS just, bl_just.internal_order AS io, t.parent_item_id 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(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, cd.counterparty AS cd_cp, cd.reference AS cd_ref, cd.addenda AS cd_add, cd.contract_date AS cd_dt, cd.subject AS cd_subj, cd.currency AS cd_cur, cd.ceiling_amount AS cd_ceil, cd.expenses_q1 AS cd_q1, cd.expenses_q2 AS cd_q2, cd.expenses_q3 AS cd_q3, cd.expenses_q4 AS cd_q4, cd.rf_schedule AS cd_rfsch, cd.vat_rate AS cd_vat, cd.exchange_rate AS cd_xr, cd.amount_foreign AS cd_af, 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, ck.ceiling_amount AS ck_ceil, ck.rf_schedule AS ck_rfsch, ck.delivery_deadline AS ck_dd, ck.procurement_plan AS ck_pp, ck.procurement_method AS ck_pm, ck.comment AS ck_cmt, cs.total_amount AS cs_amt, cs.reference AS cs_ref, cs.counterparty AS cs_cp, cs.deadline AS cs_dl, cs.comment AS cs_cmt, cs.future_payments_y1 AS cs_y1, cs.future_payments_y2 AS cs_y2, cs.other_ssp_amount AS cs_oss, cs.centralized_flag AS cs_cflag, al.contract_ref AS al_ref, al.allocation_purpose AS al_purp, col.approved_amount AS col_amt, col.protocol_reference AS col_pr, col.note AS col_note, q1.adj_current AS q1_ac, q1.adj_ssp AS q1_as, q1.adj_rf AS q1_arf, 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, 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_rf AS q2_arf, 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, 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_rf AS q3_arf, 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, 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_rf AS q4_arf, 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, 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(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 FROM page pg JOIN tw t ON t.id = pg.eid LEFT JOIN v3.vsp v ON v.id = pg.vsp_id LEFT JOIN v3.budget_line bl_just ON bl_just.id = pg.lid LEFT JOIN jp p ON p.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 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 jcol col ON col.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_arf,0)+COALESCE(b.q1_arv,0) - COALESCE(b.q1_tq2,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)+COALESCE(b.q2_tc,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)+COALESCE(b.q3_tc,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)+COALESCE(b.q4_tc,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_arf,0)+COALESCE(e.q2_arv,0) - COALESCE(e.q2_tq3,0) AS cp2, e.np3 + COALESCE(e.q3_ac,0)+COALESCE(e.q3_as,0)+COALESCE(e.q3_arf,0)+COALESCE(e.q3_arv,0) - COALESCE(e.q3_tq4,0) AS cp3, e.np4 + COALESCE(e.q4_ac,0)+COALESCE(e.q4_as,0)+COALESCE(e.q4_arf,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(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.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_rf) AS arf, SUM(q.adj_reserve) AS arv, SUM(q.payment_amount) AS pa, SUM(q.payment_amount_ho) AS pho, SUM(q.payment_amount_rf) AS prf, 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 book, 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(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 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.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.arf) AS arf, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.book) AS book, 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 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.arf) AS arf, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.book) AS book, 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 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.arf) AS arf, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.book) AS book, 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 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.arf) AS arf, SUM(b.arv) AS arv, SUM(b.pa) AS pa, SUM(b.book) AS book, 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, 3, f.lid::INT, f.sc, f.ic, f.ng, COALESCE(f.bname, f.ename), f.just, f.io, 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_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_cs THEN f.cs_amt END, CASE WHEN s_cs THEN f.cs_ref 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_y1 END, CASE WHEN s_cs THEN f.cs_y2 END, CASE WHEN s_cs THEN f.cs_oss END, CASE WHEN s_cs THEN f.cs_cflag END, CASE WHEN s_al THEN f.al_ref END, CASE WHEN s_al THEN f.al_purp END, CASE WHEN s_rsv THEN f.rq1 END, CASE WHEN s_rsv THEN f.rq2 END, CASE WHEN s_rsv THEN f.rq3 END, CASE WHEN s_rsv THEN f.rq4 END, CASE WHEN s_rsv THEN f.rq1+f.rq2+f.rq3+f.rq4 END, CASE WHEN s_rsv THEN f.rjust END, CASE WHEN s_col THEN f.col_amt END, CASE WHEN s_col THEN f.col_pr END, CASE WHEN s_col THEN f.col_note END, CASE WHEN s_ckk THEN f.ck_ceil END, CASE WHEN s_ckk THEN f.bk1 END, CASE WHEN s_ckk THEN f.bk2 END, CASE WHEN s_ckk THEN f.bk3 END, CASE WHEN s_ckk THEN f.bk4 END, CASE WHEN s_ckk THEN f.ck_rfsch END, CASE WHEN s_ckk THEN f.ck_dd END, CASE WHEN s_ckk THEN f.ck_pp END, CASE WHEN s_ckk THEN f.ck_pm END, CASE WHEN s_ckk THEN f.ck_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_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_q1 END, CASE WHEN s_cd THEN f.cd_q2 END, CASE WHEN s_cd THEN f.cd_q3 END, CASE WHEN s_cd THEN f.cd_q4 END, CASE WHEN s_cd THEN f.cd_rfsch END, CASE WHEN s_cd THEN f.cd_vat END, CASE WHEN s_cd THEN f.cd_xr END, CASE WHEN s_cd THEN f.cd_af 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_arf 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 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_tq2,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_arf 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 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_tq3,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_arf 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 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_tq4,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_arf 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 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 COALESCE(f.q4_te,0) END, CASE WHEN s_tot THEN f.aq1+f.aq2+f.aq3+f.aq4 END, -- fact_year 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' END::VARCHAR, t.depth, NULL::INT, CASE WHEN t.depth < 3 THEN t.item_id ELSE t.parent_item_id END, CASE WHEN t.depth = 3 THEN t.item_id ELSE NULL END, t.num_group_id, t.name, NULL::VARCHAR, NULL::VARCHAR, -- justification, internal_order 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_appr THEN COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sr1,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sr2,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sr3,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sr4,0) END, CASE WHEN s_appr THEN COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sr1,0) +COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sr2,0) +COALESCE(ta.sp3,0)+COALESCE(ta.sd3,0)+COALESCE(ta.sr3,0) +COALESCE(ta.sp4,0)+COALESCE(ta.sd4,0)+COALESCE(ta.sr4,0) END, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_rsv THEN ta.sr1 END, CASE WHEN s_rsv THEN ta.sr2 END, CASE WHEN s_rsv THEN ta.sr3 END, CASE WHEN s_rsv THEN ta.sr4 END, CASE WHEN s_rsv THEN COALESCE(ta.sr1,0)+COALESCE(ta.sr2,0)+COALESCE(ta.sr3,0)+COALESCE(ta.sr4,0) END, NULL::VARCHAR, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, CASE WHEN s_ckk THEN ta.bk1 END, CASE WHEN s_ckk THEN ta.bk2 END, CASE WHEN s_ckk THEN ta.bk3 END, CASE WHEN s_ckk THEN ta.bk4 END, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::VARCHAR, NULL::DATE, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, NULL::NUMERIC, NULL::NUMERIC, 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.arf 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.sr1,0) +COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arf,0)+COALESCE(tb1.arv,0) -COALESCE(tb1.tq2,0) END, NULL::DATE, CASE WHEN s_q1 THEN tb1.pa END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, -- pay_act CASE WHEN s_q1 THEN tb1.book END, -- booking агрегат 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.sr1,0) +COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arf,0)+COALESCE(tb1.arv,0) -COALESCE(tb1.tq2,0)) - COALESCE(tb1.book,0) END, CASE WHEN s_q1 THEN (COALESCE(ta.sp1,0)+COALESCE(ta.sd1,0)+COALESCE(ta.sr1,0) +COALESCE(tb1.ac,0)+COALESCE(tb1.as_v,0)+COALESCE(tb1.arf,0)+COALESCE(tb1.arv,0) -COALESCE(tb1.tq2,0)) - (COALESCE(tb1.m1,0)+COALESCE(tb1.m2,0)+COALESCE(tb1.m3,0)) END, CASE WHEN s_q1 THEN tb1.tq2 END, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- tq2 reasons + next comment 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.tq2,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.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.arf 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.sr2,0) +COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0) +COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arf,0)+COALESCE(tb2.arv,0) -COALESCE(tb2.tq3,0) END, NULL::DATE, CASE WHEN s_q2 THEN tb2.pa END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- pay_ho/pay_rf/pay_comment NULL::VARCHAR, -- pay_act CASE WHEN s_q2 THEN tb2.book 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.sd2,0)+COALESCE(ta.sr2,0) +COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0) +COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arf,0)+COALESCE(tb2.arv,0) -COALESCE(tb2.tq3,0)) - COALESCE(tb2.book,0) END, CASE WHEN s_q2 THEN (COALESCE(ta.sp2,0)+COALESCE(ta.sd2,0)+COALESCE(ta.sr2,0) +COALESCE(tb1.tq2,0)+COALESCE(tb2.rev,0) +COALESCE(tb2.ac,0)+COALESCE(tb2.as_v,0)+COALESCE(tb2.arf,0)+COALESCE(tb2.arv,0) -COALESCE(tb2.tq3,0)) - (COALESCE(tb2.m1,0)+COALESCE(tb2.m2,0)+COALESCE(tb2.m3,0)) END, CASE WHEN s_q2 THEN tb2.tq3 END, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, -- tq3 reasons + next comment 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.tq3,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.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.arf 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.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.arf,0)+COALESCE(tb3.arv,0) -COALESCE(tb3.tq4,0) END, NULL::DATE, CASE WHEN s_q3 THEN tb3.pa END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q3 THEN tb3.book 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.sd3,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.arf,0)+COALESCE(tb3.arv,0) -COALESCE(tb3.tq4,0)) - COALESCE(tb3.book,0) END, CASE WHEN s_q3 THEN (COALESCE(ta.sp3,0)+COALESCE(ta.sd3,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.arf,0)+COALESCE(tb3.arv,0) -COALESCE(tb3.tq4,0)) - (COALESCE(tb3.m1,0)+COALESCE(tb3.m2,0)+COALESCE(tb3.m3,0)) END, CASE WHEN s_q3 THEN tb3.tq4 END, NULL::NUMERIC, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, CASE WHEN s_q3 THEN tb3.te END, CASE WHEN s_q3 THEN COALESCE(tb3.tq4,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.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.arf 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.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.arf,0)+COALESCE(tb4.arv,0) END, NULL::DATE, CASE WHEN s_q4 THEN tb4.pa END, NULL::NUMERIC, NULL::NUMERIC, NULL::VARCHAR, NULL::VARCHAR, CASE WHEN s_q4 THEN tb4.book 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 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.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.arf,0)+COALESCE(tb4.arv,0)) - COALESCE(tb4.book,0) END, CASE WHEN s_q4 THEN (COALESCE(ta.sp4,0)+COALESCE(ta.sd4,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.arf,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 COALESCE(tb4.te,0) 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, -- fact_year 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_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 NOT NULL THEN v_user_id := v3.current_user_id; END IF; RETURN QUERY SELECT 'META'::VARCHAR, -1, 0::BIGINT, jsonb_build_object( 'user_id', p_user_id, 'role', v3.user_role_code(p_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, p_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$ ; -- DROP FUNCTION v3._apply_form_cell(int4, text, jsonb, varchar, int4); CREATE OR REPLACE FUNCTION v3._apply_form_cell(p_line_id integer, p_column text, p_value jsonb, p_sheet character varying DEFAULT NULL::character varying, p_form_id integer DEFAULT NULL::integer) RETURNS void LANGUAGE plpgsql AS $function$ DECLARE v_parts TEXT[]; v_scope TEXT; v_field TEXT; v_q SMALLINT; v_actor TEXT; v_target_table TEXT; v_target_col TEXT; v_target_type TEXT; v_key_kind TEXT; v_str TEXT; v_sql TEXT; v_sat_table TEXT; v_cnt INT; BEGIN v_parts := string_to_array(p_column, '.'); IF p_sheet = 'OTCH9F' THEN DECLARE v_far_month SMALLINT; BEGIN SELECT month INTO v_far_month FROM v3.fixed_asset_report WHERE id = p_line_id; IF v_far_month IS NULL THEN RAISE EXCEPTION 'fixed_asset_report.id=% не существует', p_line_id; END IF; IF array_length(v_parts,1) = 1 THEN IF v_parts[1] = 'equipment_name' THEN RAISE EXCEPTION 'normative_field: equipment_name (нормативная номенклатура, правится отдельным API)'; ELSIF v_parts[1] IN ('month','expense_item_id','item_id','section_code','id') THEN RAISE EXCEPTION 'key_field: % (часть ключа строки, RO)', v_parts[1]; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END IF; END IF; IF array_length(v_parts,1) <> 2 THEN RAISE EXCEPTION 'bad_column_format: %', p_column; END IF; IF v_parts[1] = 'totals' THEN IF v_parts[2] = 'go_balance_only' THEN v_target_col := 'go_balance_only_amt'; v_target_type := 'NUMERIC'; ELSIF v_parts[2] IN ('acquired_total','disposed_total','balance_qty','balance_amt') THEN RAISE EXCEPTION 'computed_field: totals.%', v_parts[2]; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END IF; ELSIF v_parts[1] IN ('b_604','b_60415') THEN IF v_parts[2] LIKE 'opening_%' AND v_far_month <> 1 THEN RAISE EXCEPTION 'computed_field: % (opening для month>1 вычисляется из base + накопит. дельты)', p_column; END IF; IF v_parts[1] = 'b_604' THEN v_target_col := CASE v_parts[2] WHEN 'opening_qty' THEN 'opening_qty_604' WHEN 'opening_amt' THEN 'opening_amt_604' WHEN 'acquired_qty' THEN 'acquired_qty_604' WHEN 'acquired_amt' THEN 'acquired_amt_604' WHEN 'disposed_qty' THEN 'disposed_qty_604' WHEN 'disposed_amt' THEN 'disposed_amt_604' END; IF v_target_col IS NULL THEN RAISE EXCEPTION 'unknown_column: %', p_column; END IF; v_target_type := CASE WHEN v_parts[2] LIKE '%_qty' THEN 'INTEGER' ELSE 'NUMERIC' END; ELSE -- b_60415 v_target_col := CASE v_parts[2] WHEN 'opening_qty' THEN 'opening_qty_60415' WHEN 'opening_amt' THEN 'opening_amt_60415' WHEN 'acquired_qty' THEN 'acquired_qty_60415' WHEN 'acquired_amt' THEN 'acquired_amt_60415' WHEN 'transferred_qty' THEN 'transferred_qty_60415' WHEN 'transferred_amt' THEN 'transferred_amt_60415' END; IF v_target_col IS NULL THEN RAISE EXCEPTION 'unknown_column: %', p_column; END IF; v_target_type := CASE WHEN v_parts[2] LIKE '%_qty' THEN 'INTEGER' ELSE 'NUMERIC' END; END IF; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END IF; EXECUTE format( 'UPDATE v3.fixed_asset_report SET %I = ($2 #>> ''{}'')::%s WHERE id = $1', v_target_col, v_target_type ) USING p_line_id, p_value; RETURN; END; END IF; IF p_sheet = 'AHR_LIMIT' THEN IF p_form_id IS NULL THEN RAISE EXCEPTION 'internal: p_form_id не передан для AHR_LIMIT'; END IF; IF NOT EXISTS (SELECT 1 FROM v3.limit_template lt WHERE lt.id = p_line_id AND lt.row_type = 'LEAF') THEN RAISE EXCEPTION 'limit_template.id=% не существует или не LEAF (SECTION/GROUP не редактируется)', p_line_id; END IF; IF array_length(v_parts,1) <> 1 THEN RAISE EXCEPTION 'bad_column_format: %, expected single key', p_column; END IF; CASE v_parts[1] WHEN 'qty_q1','qty_q2','qty_q3','qty_q4' THEN v_target_col := v_parts[1]; v_target_type := 'INTEGER'; WHEN 'comment' THEN v_target_col := 'comment'; v_target_type := 'TEXT'; WHEN 'amount_q1','amount_q2','amount_q3','amount_q4' THEN RAISE EXCEPTION 'computed_field: % (вычисляется из qty × limit × period_factor)', p_column; WHEN 'name','unit','section_no','expense_item_code', 'limit_with_vat','limit_without_vat' THEN RAISE EXCEPTION 'normative_field: % (нормативный справочник, правится админом отдельно)', p_column; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END CASE; EXECUTE format( 'INSERT INTO v3.form_limit (budget_form_id, template_id, %1$I) ' || 'VALUES ($1, $2, ($3 #>> ''{}'')::%2$s) ' || 'ON CONFLICT (budget_form_id, template_id) DO UPDATE SET %1$I = EXCLUDED.%1$I', v_target_col, v_target_type ) USING p_form_id, p_line_id, p_value; RETURN; END IF; IF p_sheet IN ('AHR_RENT','AHR_UTILITY','AHR_SECURITY') THEN v_sat_table := CASE p_sheet WHEN 'AHR_RENT' THEN 'rent_detail' WHEN 'AHR_UTILITY' THEN 'utility_detail' WHEN 'AHR_SECURITY' THEN 'security_detail' END; IF array_length(v_parts,1) = 1 THEN CASE v_parts[1] WHEN 'contract_number' THEN v_target_col := 'contract_number'; v_target_type := 'TEXT'; WHEN 'contract_end_date' THEN v_target_col := 'contract_end_date'; v_target_type := 'DATE'; WHEN 'comment' THEN v_target_col := 'comment'; v_target_type := 'TEXT'; WHEN 'address','object_type','rented_area','object_area' THEN RAISE EXCEPTION 'computed_field: % (атрибут v3.vsp, правится отдельно)', p_column; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END CASE; ELSIF array_length(v_parts,1) = 2 AND v_parts[1] = 'plan' THEN IF v_parts[2] = 'year' THEN RAISE EXCEPTION 'computed_field: %', p_column; END IF; IF v_parts[2] NOT IN ('q1','q2','q3','q4') THEN RAISE EXCEPTION 'unknown_column: %', p_column; END IF; v_target_col := 'plan_' || v_parts[2]; v_target_type := 'NUMERIC'; ELSIF array_length(v_parts,1) = 2 AND v_parts[1] LIKE 'fact_q%' THEN IF v_parts[2] = 'total' THEN RAISE EXCEPTION 'computed_field: %', p_column; END IF; IF (v_parts[1]='fact_q1' AND v_parts[2] NOT IN ('jan','feb','mar')) OR (v_parts[1]='fact_q2' AND v_parts[2] NOT IN ('apr','may','jun')) OR (v_parts[1]='fact_q3' AND v_parts[2] NOT IN ('jul','aug','sep')) OR (v_parts[1]='fact_q4' AND v_parts[2] NOT IN ('oct','nov','dec')) THEN RAISE EXCEPTION 'unknown_column: % (месяц вне квартала)', p_column; END IF; v_target_col := 'actual_' || v_parts[2]; v_target_type := 'NUMERIC'; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END IF; EXECUTE format( 'UPDATE v3.%I SET %I = ($2 #>> ''{}'')::%s WHERE id = $1', v_sat_table, v_target_col, v_target_type ) USING p_line_id, p_value; GET DIAGNOSTICS v_cnt = ROW_COUNT; IF v_cnt = 0 THEN RAISE EXCEPTION '%.id=% не существует', v_sat_table, p_line_id; END IF; RETURN; END IF; IF array_length(v_parts, 1) < 2 THEN RAISE EXCEPTION 'bad_column_format: %, expected scope.field', p_column; END IF; v_scope := v_parts[1]; v_field := v_parts[2]; IF v_scope = 'header' THEN IF v_field = 'name' THEN UPDATE v3.budget_line SET name = (p_value #>> '{}'), updated_at = now() WHERE id = p_line_id; ELSIF v_field = 'internal_order' THEN UPDATE v3.budget_line SET internal_order = (p_value #>> '{}'), updated_at = now() WHERE id = p_line_id; ELSIF v_field = 'justification' THEN UPDATE v3.budget_line SET justification = (p_value #>> '{}')::TEXT, updated_at = now() WHERE id = p_line_id; ELSIF v_field = 'vsp_id' THEN UPDATE v3.budget_line SET vsp_id = (p_value #>> '{}')::INT, updated_at = now() WHERE id = p_line_id; ELSIF v_field IN ('year','section','item_id','num_group','vsp_address') THEN RAISE EXCEPTION 'computed_field: %', p_column; ELSE RAISE EXCEPTION 'unknown_column: %', p_column; END IF; RETURN; END IF; IF v_scope IN ('approved','totals') THEN RAISE EXCEPTION 'computed_field: %', p_column; END IF; IF v_scope = 'booking' THEN IF array_length(v_parts, 1) <> 3 THEN RAISE EXCEPTION 'bad_column_format: %, expected booking.y{2026|2027}.qN', p_column; END IF; IF v_parts[2] NOT IN ('y2026','y2027') THEN RAISE EXCEPTION 'bad_booking_year: % (only y2026/y2027)', v_parts[2]; END IF; IF v_parts[3] NOT IN ('q1','q2','q3','q4') THEN RAISE EXCEPTION 'bad_booking_quarter: %', v_parts[3]; END IF; v_target_col := CASE v_parts[2] WHEN 'y2026' THEN 'expenses_' || v_parts[3] WHEN 'y2027' THEN 'expenses_next_year_' || v_parts[3] END; v_sql := format( 'INSERT INTO v3.ckk (line_id, %1$I) VALUES ($1, ($2 #>> ''{}'')::NUMERIC) ' || 'ON CONFLICT (line_id) DO UPDATE SET %1$I = EXCLUDED.%1$I', v_target_col ); EXECUTE v_sql USING p_line_id, p_value; UPDATE v3.budget_line SET updated_at = now() WHERE id = p_line_id; RETURN; END IF; IF v_scope IN ('q1','q2','q3','q4') THEN v_q := substring(v_scope FROM 2)::SMALLINT; ELSE v_q := NULL; END IF; v_actor := CASE v_scope WHEN 'sequestration' THEN 'DFIP' WHEN 'seq_dfip' THEN 'DFIP' WHEN 'seq_ssp' THEN 'SSP_GO' ELSE NULL END; SELECT m.target_table, m.target_col, m.target_type, m.key_kind INTO v_target_table, v_target_col, v_target_type, v_key_kind FROM (VALUES ('plan','q1', 'plan','plan_q1','NUMERIC','line'), ('plan','q2', 'plan','plan_q2','NUMERIC','line'), ('plan','q3', 'plan','plan_q3','NUMERIC','line'), ('plan','q4', 'plan','plan_q4','NUMERIC','line'), ('plan','comment', 'plan','comment','TEXT', 'line'), ('reserve','q1', 'reserve','amount_q1','NUMERIC','line'), ('reserve','q2', 'reserve','amount_q2','NUMERIC','line'), ('reserve','q3', 'reserve','amount_q3','NUMERIC','line'), ('reserve','q4', 'reserve','amount_q4','NUMERIC','line'), ('reserve','justification','reserve','justification','TEXT','line'), ('allocation','order', 'allocation','internal_order','TEXT','line'), ('allocation','property', 'allocation','property_object','TEXT','line'), ('allocation','contract_ref', 'allocation','contract_ref','TEXT','line'), ('allocation','allocation_purpose', 'allocation','allocation_purpose','TEXT','line'), ('contract_summary','total', 'contract_summary','total_amount', 'NUMERIC','line'), ('contract_summary','counterparty', 'contract_summary','counterparty', 'TEXT', 'line'), ('contract_summary','deadline', 'contract_summary','deadline', 'TEXT', 'line'), ('contract_summary','comment', 'contract_summary','comment', 'TEXT', 'line'), ('contract_summary','future_y1', 'contract_summary','future_payments_y1', 'NUMERIC','line'), ('contract_summary','future_y2', 'contract_summary','future_payments_y2', 'NUMERIC','line'), ('contract_summary','other_ssp', 'contract_summary','other_ssp_amount', 'NUMERIC','line'), ('contract_summary','reference', 'contract_summary','reference', 'TEXT','line'), ('contract_summary','centralized_flag', 'contract_summary','centralized_flag', 'TEXT','line'), ('collegial','approved', 'collegial_approval','approved_amount', 'NUMERIC','line'), ('collegial','protocol', 'collegial_approval','protocol_reference','TEXT', 'line'), ('collegial','note', 'collegial_approval','note', 'TEXT', 'line'), ('ckk','ceiling', 'ckk','ceiling_amount', 'NUMERIC','line'), ('ckk','q1', 'ckk','expenses_q1', 'NUMERIC','line'), ('ckk','q2', 'ckk','expenses_q2', 'NUMERIC','line'), ('ckk','q3', 'ckk','expenses_q3', 'NUMERIC','line'), ('ckk','q4', 'ckk','expenses_q4', 'NUMERIC','line'), ('ckk','next_q1', 'ckk','expenses_next_year_q1', 'NUMERIC','line'), ('ckk','next_q2', 'ckk','expenses_next_year_q2', 'NUMERIC','line'), ('ckk','next_q3', 'ckk','expenses_next_year_q3', 'NUMERIC','line'), ('ckk','next_q4', 'ckk','expenses_next_year_q4', 'NUMERIC','line'), ('ckk','rf_schedule', 'ckk','rf_schedule', 'TEXT', 'line'), ('ckk','deadline', 'ckk','delivery_deadline', 'TEXT', 'line'), ('ckk','proc_plan', 'ckk','procurement_plan', 'TEXT', 'line'), ('ckk','proc_method', 'ckk','procurement_method','TEXT', 'line'), ('ckk','comment', 'ckk','comment', 'TEXT', 'line'), ('contract_detail','counterparty', 'contract_detail','counterparty', 'TEXT', 'line'), ('contract_detail','reference', 'contract_detail','reference', 'TEXT', 'line'), ('contract_detail','addenda', 'contract_detail','addenda', 'TEXT', 'line'), ('contract_detail','subject', 'contract_detail','subject', 'TEXT', 'line'), ('contract_detail','currency', 'contract_detail','currency', 'TEXT', 'line'), ('contract_detail','ceiling', 'contract_detail','ceiling_amount','NUMERIC','line'), ('contract_detail','q1', 'contract_detail','expenses_q1', 'NUMERIC','line'), ('contract_detail','q2', 'contract_detail','expenses_q2', 'NUMERIC','line'), ('contract_detail','q3', 'contract_detail','expenses_q3', 'NUMERIC','line'), ('contract_detail','q4', 'contract_detail','expenses_q4', 'NUMERIC','line'), ('contract_detail','rf_schedule', 'contract_detail','rf_schedule', 'TEXT', 'line'), ('contract_detail','vat_rate', 'contract_detail','vat_rate', 'TEXT', 'line'), ('contract_detail','exchange_rate', 'contract_detail','exchange_rate', 'NUMERIC','line'), ('contract_detail','amount_foreign', 'contract_detail','amount_foreign','NUMERIC','line'), ('contract_detail','deadline', 'contract_detail','deadline', 'TEXT', 'line'), ('contract_detail','payment_scheme', 'contract_detail','payment_scheme','TEXT', 'line'), ('contract_detail','act', 'contract_detail','act', 'TEXT', 'line'), ('contract_detail','comment', 'contract_detail','comment', 'TEXT', 'line'), ('contract_detail','contract_date', 'contract_detail','contract_date', 'DATE', 'line'), ('contract','counterparty', 'contract_detail','counterparty', 'TEXT', 'line'), ('contract','addenda', 'contract_detail','addenda', 'TEXT', 'line'), ('contract','amount_foreign', 'contract_detail','amount_foreign','NUMERIC','line'), ('contract','q1', 'contract_detail','expenses_q1', 'NUMERIC','line'), ('contract','q2', 'contract_detail','expenses_q2', 'NUMERIC','line'), ('contract','q3', 'contract_detail','expenses_q3', 'NUMERIC','line'), ('contract','q4', 'contract_detail','expenses_q4', 'NUMERIC','line'), ('contract','rf_schedule', 'contract_detail','rf_schedule', 'TEXT', 'line'), ('contract','exchange_rate', 'contract_detail','exchange_rate', 'NUMERIC','line'), ('contract','reference', 'contract_detail','reference', 'TEXT', 'line'), ('contract','date', 'contract_detail','contract_date', 'DATE', 'line'), ('contract','subject', 'contract_detail','subject', 'TEXT', 'line'), ('contract','currency', 'contract_detail','currency', 'TEXT', 'line'), ('contract','ceiling', 'contract_detail','ceiling_amount','NUMERIC','line'), ('contract','vat_rate', 'contract_detail','vat_rate', 'TEXT', 'line'), ('contract','deadline', 'contract_detail','deadline', 'TEXT', 'line'), ('contract','scheme', 'contract_detail','payment_scheme','TEXT', 'line'), ('contract','act', 'contract_detail','act', 'TEXT', 'line'), ('contract','comment', 'contract_detail','comment', 'TEXT', 'line'), ('sequestration','q1', 'sequestration','adj_q1', 'NUMERIC','line_actor'), ('sequestration','q2', 'sequestration','adj_q2', 'NUMERIC','line_actor'), ('sequestration','q3', 'sequestration','adj_q3', 'NUMERIC','line_actor'), ('sequestration','q4', 'sequestration','adj_q4', 'NUMERIC','line_actor'), ('sequestration','justification','sequestration','justification','TEXT', 'line_actor'), ('seq_dfip','q1', 'sequestration','adj_q1', 'NUMERIC','line_actor'), ('seq_dfip','q2', 'sequestration','adj_q2', 'NUMERIC','line_actor'), ('seq_dfip','q3', 'sequestration','adj_q3', 'NUMERIC','line_actor'), ('seq_dfip','q4', 'sequestration','adj_q4', 'NUMERIC','line_actor'), ('seq_dfip','justification','sequestration','justification','TEXT', 'line_actor'), ('seq_ssp','q1', 'sequestration','adj_q1', 'NUMERIC','line_actor'), ('seq_ssp','q2', 'sequestration','adj_q2', 'NUMERIC','line_actor'), ('seq_ssp','q3', 'sequestration','adj_q3', 'NUMERIC','line_actor'), ('seq_ssp','q4', 'sequestration','adj_q4', 'NUMERIC','line_actor'), ('seq_ssp','justification','sequestration','justification','TEXT', 'line_actor'), ('q','adj_current', 'budget_line_quarter','adj_current', 'NUMERIC','line_quarter'), ('q','adj_ssp', 'budget_line_quarter','adj_ssp', 'NUMERIC','line_quarter'), ('q','adj_rf', 'budget_line_quarter','adj_rf', 'NUMERIC','line_quarter'), ('q','adj_reserve', 'budget_line_quarter','adj_reserve', 'NUMERIC','line_quarter'), ('q','adj_comment', 'budget_line_quarter','adj_comment', 'TEXT', 'line_quarter'), ('q','target_change', 'budget_line_quarter','target_change', 'NUMERIC','line_quarter'), ('q','base_correction', 'budget_line_quarter','base_plan_correction', 'NUMERIC','line_quarter'), ('q','base_correction_comment', 'budget_line_quarter','base_plan_correction_comment','TEXT', 'line_quarter'), ('q','pay_date', 'budget_line_quarter','payment_date', 'DATE', 'line_quarter'), ('q','pay_amount', 'budget_line_quarter','payment_amount', 'NUMERIC','line_quarter'), ('q','pay_ho', 'budget_line_quarter','payment_amount_ho', 'NUMERIC','line_quarter'), ('q','pay_rf', 'budget_line_quarter','payment_amount_rf', 'NUMERIC','line_quarter'), ('q','pay_comment', 'budget_line_quarter','payment_comment', 'TEXT', 'line_quarter'), ('q','pay_act', 'budget_line_quarter','payment_act', 'TEXT', 'line_quarter'), ('q','actual_m1', 'budget_line_quarter','actual_m1', 'NUMERIC','line_quarter'), ('q','actual_m2', 'budget_line_quarter','actual_m2', 'NUMERIC','line_quarter'), ('q','actual_m3', 'budget_line_quarter','actual_m3', 'NUMERIC','line_quarter'), ('q','actual_spod', 'budget_line_quarter','actual_spod', 'NUMERIC','line_quarter'), ('q','transfer_q2', 'budget_line_quarter','transfer_to_q2', 'NUMERIC','line_quarter'), ('q','transfer_q3', 'budget_line_quarter','transfer_to_q3', 'NUMERIC','line_quarter'), ('q','transfer_q4', 'budget_line_quarter','transfer_to_q4', 'NUMERIC','line_quarter'), ('q','transfer_econ', 'budget_line_quarter','transfer_to_economy', 'NUMERIC','line_quarter'), ('q','transfer_q2_delay_acts', 'budget_line_quarter','transfer_delay_acts', 'NUMERIC','line_quarter'), ('q','transfer_q2_delay_procurement', 'budget_line_quarter','transfer_delay_procurement', 'NUMERIC','line_quarter'), ('q','transfer_q2_economy_rf', 'budget_line_quarter','transfer_economy_rf', 'NUMERIC','line_quarter'), ('q','transfer_q3_delay_acts', 'budget_line_quarter','transfer_delay_acts', 'NUMERIC','line_quarter'), ('q','transfer_q3_delay_procurement', 'budget_line_quarter','transfer_delay_procurement', 'NUMERIC','line_quarter'), ('q','transfer_q3_economy_rf', 'budget_line_quarter','transfer_economy_rf', 'NUMERIC','line_quarter'), ('q','transfer_q4_delay_acts', 'budget_line_quarter','transfer_delay_acts', 'NUMERIC','line_quarter'), ('q','transfer_q4_delay_procurement', 'budget_line_quarter','transfer_delay_procurement', 'NUMERIC','line_quarter'), ('q','transfer_q4_economy_rf', 'budget_line_quarter','transfer_economy_rf', 'NUMERIC','line_quarter'), ('q','transfer_next_comment', 'budget_line_quarter','transfer_next_comment', 'TEXT', 'line_quarter'), ('q','transfer_far_comment', 'budget_line_quarter','transfer_far_comment', 'TEXT', 'line_quarter'), ('q','rev_eco', 'budget_line_quarter','plan_revision_eco_change','NUMERIC','line_quarter'), ('q','rev_item', 'budget_line_quarter','plan_revision_item_adj', 'NUMERIC','line_quarter'), ('q','rev_inc', 'budget_line_quarter','plan_revision_increase', 'NUMERIC','line_quarter'), ('q','rev_seq', 'budget_line_quarter','plan_revision_sequester', 'NUMERIC','line_quarter'), ('q','rev_comment', 'budget_line_quarter','plan_revision_comment', 'TEXT', 'line_quarter'), ('q','revision_inc', 'budget_line_quarter','plan_revision_increase', 'NUMERIC','line_quarter'), ('q','revision_seq', 'budget_line_quarter','plan_revision_sequester', 'NUMERIC','line_quarter'), ('q','revision_comment', 'budget_line_quarter','plan_revision_comment', 'TEXT', 'line_quarter'), ('q','booking_amount', 'budget_line_quarter','booking_amount', 'NUMERIC','line_quarter') ) AS m(scope, field, target_table, target_col, target_type, key_kind) WHERE m.scope = (CASE WHEN v_q IS NOT NULL THEN 'q' ELSE v_scope END) AND m.field = v_field; IF v_target_table IS NULL THEN IF v_field IN ('corrected_plan','new_plan','actual_quarter','booking', 'rem_booking','rem_actual','residual_after_booking', 'residual_after_actual','economy','total','year') THEN RAISE EXCEPTION 'computed_field: %', p_column; END IF; RAISE EXCEPTION 'unknown_column: %', p_column; END IF; IF v_key_kind = 'line' THEN IF v_target_type = 'DATE' THEN v_sql := format( 'INSERT INTO v3.%1$I (line_id, %2$I) VALUES ($1, to_date($2->>0, ''DD.MM.YYYY'')) ' || 'ON CONFLICT (line_id) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col ); ELSE v_sql := format( 'INSERT INTO v3.%1$I (line_id, %2$I) VALUES ($1, ($2 #>> ''{}'')::%3$s) ' || 'ON CONFLICT (line_id) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col, v_target_type ); END IF; EXECUTE v_sql USING p_line_id, p_value; ELSIF v_key_kind = 'line_quarter' THEN IF v_q IS NULL THEN RAISE EXCEPTION 'internal: quarter not set for %', p_column; END IF; IF v_target_type = 'DATE' THEN v_sql := format( 'INSERT INTO v3.%1$I (line_id, quarter, %2$I) VALUES ($1, $2, to_date($3->>0, ''DD.MM.YYYY'')) ' || 'ON CONFLICT (line_id, quarter) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col ); ELSE v_sql := format( 'INSERT INTO v3.%1$I (line_id, quarter, %2$I) VALUES ($1, $2, ($3 #>> ''{}'')::%3$s) ' || 'ON CONFLICT (line_id, quarter) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col, v_target_type ); END IF; EXECUTE v_sql USING p_line_id, v_q, p_value; ELSIF v_key_kind = 'line_actor' THEN IF v_actor IS NULL THEN RAISE EXCEPTION 'internal: actor not set for %', p_column; END IF; IF v_target_type = 'DATE' THEN v_sql := format( 'INSERT INTO v3.%1$I (line_id, actor, %2$I) VALUES ($1, $2, to_date($3->>0, ''DD.MM.YYYY'')) ' || 'ON CONFLICT (line_id, actor) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col, v_target_type ); ELSE v_sql := format( 'INSERT INTO v3.%1$I (line_id, actor, %2$I) VALUES ($1, $2, ($3 #>> ''{}'')::%3$s) ' || 'ON CONFLICT (line_id, actor) DO UPDATE SET %2$I = EXCLUDED.%2$I', v_target_table, v_target_col, v_target_type ); END IF; EXECUTE v_sql USING p_line_id, v_actor, p_value; ELSE RAISE EXCEPTION 'internal: unknown key_kind %', v_key_kind; END IF; UPDATE v3.budget_line SET updated_at = now() WHERE id = p_line_id; END; $function$ ; -- DROP FUNCTION v3.v_form4_sheet_lines_jsonb(int4, varchar, _text); CREATE OR REPLACE FUNCTION v3.v_form4_sheet_lines_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, approved_data jsonb, contract_summary_data jsonb, allocation_data jsonb, reserve_data jsonb, collegial_data jsonb, ckk_data jsonb, contract_data jsonb, booking_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 'approved' = ANY(p_sections)) AS s_appr, (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 'reserve' = ANY(p_sections)) AS s_rsv, (p_sections IS NULL OR 'collegial' = ANY(p_sections)) AS s_col, (p_sections IS NULL OR 'ckk' = ANY(p_sections)) AS s_ckk, (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 '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, 'justification', s.col_justification, 'internal_order', s.col_internal_order, 'vsp_id', s.col_vsp_id, 'vsp_address', s.col_vsp_address, '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_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_cs THEN jsonb_build_object( 'total', s.col_cs_amount, 'reference', s.col_cs_reference, '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, 'centralized_flag', s.col_cs_centralized_flag ) END AS contract_summary_data, CASE WHEN f.s_al THEN jsonb_build_object( 'contract_ref', s.col_al_contract_ref, 'allocation_purpose', s.col_al_purpose ) END AS allocation_data, CASE WHEN f.s_rsv THEN jsonb_build_object( 'q1', s.col_rsv_q1, 'q2', s.col_rsv_q2, 'q3', s.col_rsv_q3, 'q4', s.col_rsv_q4, 'year', s.col_rsv_year, 'justification', s.col_rsv_just ) END AS reserve_data, CASE WHEN f.s_col THEN jsonb_build_object( 'approved', s.col_col_amount, 'protocol', s.col_col_protocol, 'note', s.col_col_note ) END AS collegial_data, CASE WHEN f.s_ckk THEN jsonb_build_object( 'ceiling', s.col_ckk_ceiling, 'q1', s.col_ckk_q1, 'q2', s.col_ckk_q2, 'q3', s.col_ckk_q3, 'q4', s.col_ckk_q4, 'rf_schedule', s.col_ckk_rf_schedule, 'deadline', s.col_ckk_delivery_deadline, 'proc_plan', s.col_ckk_procurement_plan, 'proc_method', s.col_ckk_procurement_method, 'comment', s.col_ckk_comment ) END AS ckk_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_q1, 'q2', s.col_cd_q2, 'q3', s.col_cd_q3, 'q4', s.col_cd_q4, 'rf_schedule', s.col_cd_rf_schedule, '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_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_q3', s.col_q1_transfer_q3, 'transfer_q4', s.col_q1_transfer_q4, '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_q4', s.col_q2_transfer_q4, '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_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 ) END AS totals_data, s._sort_path FROM v3.v_form4_sheet_sections(p_form_id, p_sheet, p_sections) s CROSS JOIN flags f ORDER BY s._sort_path; $function$ ; -- DROP FUNCTION v3.v_form1_sheet_jsonb(int4, varchar, varchar, _text); 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, -- header (всегда). expense_item_id извлекается из _sort_path: -- для INPUT путь = {...ei_id, line_id} → предпоследний элемент -- для иерархии путь = {...ei_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$ ; -- DROP FUNCTION v3.v_form2_sheet_jsonb(int4, varchar, _text); 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_form4_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 -- ═══ AHR / CAP / OPER — с проектной иерархией ════════════════════════════ IF p_sheet IN ('AHR','CAP','OPER') THEN RETURN QUERY SELECT * FROM v3.v_form4_sheet_jsonb(p_form_id, p_sheet, p_sections); RETURN; END IF; -- ═══ Структура_Р ═══════════════════════════════════════════════════════ -- AHR + CAP + OPER в одной выдаче, отсортировано по (section_code, -- num_group, _sort_path). БЕЗ проектной иерархии. IF p_sheet = 'STRUCTURE' THEN RETURN QUERY WITH all_sheets AS ( SELECT * FROM v3.v_form4_sheet_lines_jsonb(p_form_id, 'AHR', p_sections) sq1 WHERE sq1.row_type != 'INPUT' UNION ALL SELECT * FROM v3.v_form4_sheet_lines_jsonb(p_form_id, 'CAP', p_sections) sq2 WHERE sq2.row_type != 'INPUT' UNION ALL SELECT * FROM v3.v_form4_sheet_lines_jsonb(p_form_id, 'OPER', p_sections) sq3 WHERE sq3.row_type != 'INPUT' ) SELECT j.row_type, j.depth, ROW_NUMBER() OVER ( ORDER BY (j.header->>'section_code'), (j.header->>'num_group') NULLS FIRST, 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, 'approved', j.approved_data, 'contract_summary', j.contract_summary_data, 'allocation', j.allocation_data, 'reserve', j.reserve_data, 'collegial', j.collegial_data, 'ckk', j.ckk_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 ) FROM all_sheets j ORDER BY (j.header->>'section_code'), (j.header->>'num_group') NULLS FIRST, j._sort_path; RETURN; END IF; -- ═══ Смета_2026 (с разделением Поддержка/Развитие) ═════════════════════ 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('q1', sm.corr_supp_q1, 'q2', sm.corr_supp_q2, 'q3', sm.corr_supp_q3, 'q4', sm.corr_supp_q4, 'year', sm.corr_supp_year), 'development', jsonb_build_object('q1', sm.corr_dev_q1, 'q2', sm.corr_dev_q2, 'q3', sm.corr_dev_q3, 'q4', sm.corr_dev_q4, 'year', sm.corr_dev_year) ) ) FROM v3.v_form4_smeta(p_form_id) sm ORDER BY sm.section_code; RETURN; END IF; RAISE EXCEPTION 'Unknown sheet for FORM_4: %', p_sheet USING HINT = 'Use AHR / CAP / OPER / SMETA / STRUCTURE'; END; $function$ ;