2907 lines
161 KiB
PL/PgSQL
2907 lines
161 KiB
PL/PgSQL
-- 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 NULL THEN
|
||
v_user_id := v3.current_user_id();
|
||
END IF;
|
||
RETURN QUERY
|
||
SELECT
|
||
'META'::VARCHAR,
|
||
-1,
|
||
0::BIGINT,
|
||
jsonb_build_object(
|
||
'user_id', v_user_id,
|
||
'role', v3.user_role_code(v_user_id),
|
||
'sheet', p_sheet,
|
||
'editable', COALESCE(
|
||
(SELECT jsonb_agg(
|
||
jsonb_build_object('column', ec.column_key,
|
||
'closes_at', ec.closes_at)
|
||
ORDER BY ec.column_key)
|
||
FROM v3.editable_columns_for(p_form_id, v_user_id, p_sheet, p_direction) ec),
|
||
'[]'::JSONB)
|
||
);
|
||
|
||
IF v_form_type = 'FORM_1' THEN
|
||
|
||
IF p_sheet = 'SMETA' THEN
|
||
RETURN QUERY
|
||
SELECT
|
||
sm.row_type,
|
||
sm.depth,
|
||
ROW_NUMBER() OVER (ORDER BY sm.section_code) AS sort_order,
|
||
jsonb_build_object(
|
||
'section_code', sm.section_code,
|
||
'name', sm.name,
|
||
'plan', jsonb_build_object(
|
||
'support', jsonb_build_object('q1', sm.supp_plan_q1, 'q2', sm.supp_plan_q2,
|
||
'q3', sm.supp_plan_q3, 'q4', sm.supp_plan_q4,
|
||
'year', sm.supp_plan_year),
|
||
'development', jsonb_build_object('q1', sm.dev_plan_q1, 'q2', sm.dev_plan_q2,
|
||
'q3', sm.dev_plan_q3, 'q4', sm.dev_plan_q4,
|
||
'year', sm.dev_plan_year),
|
||
'total_year', sm.total_plan_year),
|
||
'approved', jsonb_build_object(
|
||
'support', jsonb_build_object('q1', sm.supp_appr_q1, 'q2', sm.supp_appr_q2,
|
||
'q3', sm.supp_appr_q3, 'q4', sm.supp_appr_q4,
|
||
'year', sm.supp_appr_year),
|
||
'development', jsonb_build_object('q1', sm.dev_appr_q1, 'q2', sm.dev_appr_q2,
|
||
'q3', sm.dev_appr_q3, 'q4', sm.dev_appr_q4,
|
||
'year', sm.dev_appr_year),
|
||
'total_year', sm.total_appr_year),
|
||
'fact', jsonb_build_object(
|
||
'support', jsonb_build_object('q1', sm.supp_act_q1, 'q2', sm.supp_act_q2,
|
||
'q3', sm.supp_act_q3, 'q4', sm.supp_act_q4,
|
||
'year', sm.supp_act_year),
|
||
'development', jsonb_build_object('q1', sm.dev_act_q1, 'q2', sm.dev_act_q2,
|
||
'q3', sm.dev_act_q3, 'q4', sm.dev_act_q4,
|
||
'year', sm.dev_act_year),
|
||
'total_year', sm.total_act_year),
|
||
'corrected', jsonb_build_object(
|
||
'support', jsonb_build_object('q2', sm.supp_corr_q2, 'q3', sm.supp_corr_q3, 'q4', sm.supp_corr_q4),
|
||
'development', jsonb_build_object('q2', sm.dev_corr_q2, 'q3', sm.dev_corr_q3, 'q4', sm.dev_corr_q4))
|
||
)
|
||
FROM v3.v_form1_smeta(v_year, v_org_unit_id) sm
|
||
ORDER BY sm.section_code;
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF p_sheet IN ('AHR','CAP','OPER') THEN
|
||
RETURN QUERY
|
||
SELECT
|
||
j.row_type,
|
||
j.depth,
|
||
ROW_NUMBER() OVER (ORDER BY j._sort_path) AS sort_order,
|
||
jsonb_build_object(
|
||
'line_id', j.line_id,
|
||
'header', j.header,
|
||
'plan', j.plan_data,
|
||
'contract_summary', j.contract_summary,
|
||
'allocation', j.allocation_data,
|
||
'sequestration', j.sequestration_data,
|
||
'reserve', j.reserve_data,
|
||
'approved', j.approved_data,
|
||
'collegial', j.collegial_data,
|
||
'ckk', j.ckk_data,
|
||
'contract_detail', j.contract_detail,
|
||
'q1', j.q1_data,
|
||
'q2', j.q2_data,
|
||
'q3', j.q3_data,
|
||
'q4', j.q4_data,
|
||
'totals', j.totals_data
|
||
)
|
||
FROM v3.v_form1_sheet_jsonb(p_form_id, p_sheet, p_direction, p_sections) j
|
||
ORDER BY j._sort_path;
|
||
RETURN;
|
||
END IF;
|
||
|
||
RAISE EXCEPTION 'Unknown FORM_1 sheet: %', p_sheet
|
||
USING HINT = 'Use AHR / CAP / OPER / SMETA';
|
||
END IF;
|
||
|
||
IF v_form_type = 'FORM_2' THEN
|
||
RETURN QUERY SELECT * FROM v3.v_form2_view(p_form_id, p_sheet, p_sections);
|
||
RETURN;
|
||
END IF;
|
||
|
||
IF v_form_type = 'FORM_4' THEN
|
||
RETURN QUERY SELECT * FROM v3.v_form4_view(p_form_id, p_sheet, p_sections);
|
||
RETURN;
|
||
END IF;
|
||
|
||
RAISE EXCEPTION 'Unsupported form_type=% for form_id=%', v_form_type, p_form_id;
|
||
|
||
END;
|
||
$function$
|
||
;
|
||
|
||
|
||
-- 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$
|
||
; |