DFiP_Budget_planing/api/alembic/versions/sql/0021_summary_views.sql
2026-08-27 16:52:58 +03:00

1798 lines
112 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- МИГРАЦИЯ: итоговые своды (зеркала листов «смета»/«свод» исходных форм)
-- Источник требований: «Свод 1 - АВРОРА - СУЖЦ ПО Confluence», раздел 10.3.
--
-- * 1форм_ССП — форма «Смета ГО» (FORM_1): функция v_1form_ssp(p_year, p_org_unit_ids) + view v_1form_ssp
-- * 2форм_РФ_П — форма «РФ Поддержка» (FORM_2): функция v_2form_rf_p(p_year, p_org_unit_ids) + view v_2form_rf_p (только Поддержка)
-- * 3форм_РФ_Р — форма «Отчёт РФ развитие» (FORM_3): функция v_3form_rf_r(p_year, p_org_unit_ids) + view v_3form_rf_r (только Развитие)
-- * 4форм_ПРОЕКТ — форма «Проектная деятельность» (FORM_4): функция v_4form_project(p_year, p_org_unit_ids) + view v_4form_project (только Развитие)
-- * main_format — консолидированный свод: функция v_main_format(p_year, p_org_unit_ids) + view v_main_format
-- * v_summary_view — API-диспетчер по листам свода (sheet: FORM_1/FORM_2/FORM_3/FORM_4/MAIN)
-- =============================================================================
-- =============================================================================
-- 1форм_ССП — ФУНКЦИЯ
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_1form_ssp(integer);
CREATE OR REPLACE FUNCTION v3.v_1form_ssp(p_year integer, p_org_unit_ids integer[] DEFAULT NULL)
RETURNS TABLE(
section_code character varying,
name character varying,
plan_support_q1 numeric,
plan_support_q2 numeric,
plan_support_q3 numeric,
plan_support_q4 numeric,
plan_support_year numeric,
plan_development_q1 numeric,
plan_development_q2 numeric,
plan_development_q3 numeric,
plan_development_q4 numeric,
plan_development_year numeric,
plan_total_year numeric,
approved_support_q1 numeric,
approved_support_q2 numeric,
approved_support_q3 numeric,
approved_support_q4 numeric,
approved_support_year numeric,
approved_development_q1 numeric,
approved_development_q2 numeric,
approved_development_q3 numeric,
approved_development_q4 numeric,
approved_development_year numeric,
approved_total_year numeric,
fact_support_q1 numeric,
fact_support_q2 numeric,
fact_support_q3 numeric,
fact_support_q4 numeric,
fact_support_year numeric,
fact_development_q1 numeric,
fact_development_q2 numeric,
fact_development_q3 numeric,
fact_development_q4 numeric,
fact_development_year numeric,
fact_total_year numeric,
corrected_support_q2 numeric,
corrected_support_q3 numeric,
corrected_support_q4 numeric,
corrected_development_q2 numeric,
corrected_development_q3 numeric,
corrected_development_q4 numeric
)
LANGUAGE sql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
WITH
form_lines AS (
SELECT
bl.id AS line_id,
bl.expense_item_id AS eid,
CASE WHEN bl.direction = 'Development' THEN 'Development' ELSE 'Support' END AS bucket
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_1'
AND bf.year = p_year
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
AND (p_org_unit_ids IS NULL OR cardinality(p_org_unit_ids) = 0 OR bf.org_unit_id = ANY(p_org_unit_ids))
),
-- Квартальные данные, свёрнутые по строке (избегаем размножения при JOIN)
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
-- Агрегаты уровня «статья × направление»
line_agg AS (
SELECT
fl.eid,
fl.bucket,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.eid, fl.bucket
),
-- Узлы дерева, отображаемые на листе «смета» (ROOT/GROUP/ITEM)
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_1'
WHERE t.depth < 3
),
-- Свёртка по иерархии: узел = сумма по всем потомкам
rolled AS (
SELECT
tn.item_id,
tn.name,
SUM(a.pq1) FILTER (WHERE a.bucket = 'Support') AS s_pq1,
SUM(a.pq2) FILTER (WHERE a.bucket = 'Support') AS s_pq2,
SUM(a.pq3) FILTER (WHERE a.bucket = 'Support') AS s_pq3,
SUM(a.pq4) FILTER (WHERE a.bucket = 'Support') AS s_pq4,
SUM(a.sd1) FILTER (WHERE a.bucket = 'Support') AS s_sd1,
SUM(a.sd2) FILTER (WHERE a.bucket = 'Support') AS s_sd2,
SUM(a.sd3) FILTER (WHERE a.bucket = 'Support') AS s_sd3,
SUM(a.sd4) FILTER (WHERE a.bucket = 'Support') AS s_sd4,
SUM(a.rq1) FILTER (WHERE a.bucket = 'Support') AS s_rq1,
SUM(a.rq2) FILTER (WHERE a.bucket = 'Support') AS s_rq2,
SUM(a.rq3) FILTER (WHERE a.bucket = 'Support') AS s_rq3,
SUM(a.rq4) FILTER (WHERE a.bucket = 'Support') AS s_rq4,
SUM(a.fq1) FILTER (WHERE a.bucket = 'Support') AS s_fq1,
SUM(a.fq2) FILTER (WHERE a.bucket = 'Support') AS s_fq2,
SUM(a.fq3) FILTER (WHERE a.bucket = 'Support') AS s_fq3,
SUM(a.fq4) FILTER (WHERE a.bucket = 'Support') AS s_fq4,
SUM(a.t1q2) FILTER (WHERE a.bucket = 'Support') AS s_t1q2,
SUM(a.t1q3) FILTER (WHERE a.bucket = 'Support') AS s_t1q3,
SUM(a.t1q4) FILTER (WHERE a.bucket = 'Support') AS s_t1q4,
SUM(a.t2q3) FILTER (WHERE a.bucket = 'Support') AS s_t2q3,
SUM(a.t2q4) FILTER (WHERE a.bucket = 'Support') AS s_t2q4,
SUM(a.t3q4) FILTER (WHERE a.bucket = 'Support') AS s_t3q4,
SUM(a.rev2) FILTER (WHERE a.bucket = 'Support') AS s_rev2,
SUM(a.rev3) FILTER (WHERE a.bucket = 'Support') AS s_rev3,
SUM(a.rev4) FILTER (WHERE a.bucket = 'Support') AS s_rev4,
SUM(a.pq1) FILTER (WHERE a.bucket = 'Development') AS d_pq1,
SUM(a.pq2) FILTER (WHERE a.bucket = 'Development') AS d_pq2,
SUM(a.pq3) FILTER (WHERE a.bucket = 'Development') AS d_pq3,
SUM(a.pq4) FILTER (WHERE a.bucket = 'Development') AS d_pq4,
SUM(a.sd1) FILTER (WHERE a.bucket = 'Development') AS d_sd1,
SUM(a.sd2) FILTER (WHERE a.bucket = 'Development') AS d_sd2,
SUM(a.sd3) FILTER (WHERE a.bucket = 'Development') AS d_sd3,
SUM(a.sd4) FILTER (WHERE a.bucket = 'Development') AS d_sd4,
SUM(a.rq1) FILTER (WHERE a.bucket = 'Development') AS d_rq1,
SUM(a.rq2) FILTER (WHERE a.bucket = 'Development') AS d_rq2,
SUM(a.rq3) FILTER (WHERE a.bucket = 'Development') AS d_rq3,
SUM(a.rq4) FILTER (WHERE a.bucket = 'Development') AS d_rq4,
SUM(a.fq1) FILTER (WHERE a.bucket = 'Development') AS d_fq1,
SUM(a.fq2) FILTER (WHERE a.bucket = 'Development') AS d_fq2,
SUM(a.fq3) FILTER (WHERE a.bucket = 'Development') AS d_fq3,
SUM(a.fq4) FILTER (WHERE a.bucket = 'Development') AS d_fq4,
SUM(a.t1q2) FILTER (WHERE a.bucket = 'Development') AS d_t1q2,
SUM(a.t1q3) FILTER (WHERE a.bucket = 'Development') AS d_t1q3,
SUM(a.t1q4) FILTER (WHERE a.bucket = 'Development') AS d_t1q4,
SUM(a.t2q3) FILTER (WHERE a.bucket = 'Development') AS d_t2q3,
SUM(a.t2q4) FILTER (WHERE a.bucket = 'Development') AS d_t2q4,
SUM(a.t3q4) FILTER (WHERE a.bucket = 'Development') AS d_t3q4,
SUM(a.rev2) FILTER (WHERE a.bucket = 'Development') AS d_rev2,
SUM(a.rev3) FILTER (WHERE a.bucket = 'Development') AS d_rev3,
SUM(a.rev4) FILTER (WHERE a.bucket = 'Development') AS d_rev4
FROM tree_nodes AS tn
LEFT JOIN line_agg AS a ON a.eid = ANY (tn.desc_ids)
GROUP BY tn.item_id, tn.name
)
SELECT
r.item_id AS section_code,
r.name,
COALESCE(r.s_pq1, 0) AS plan_support_q1,
COALESCE(r.s_pq2, 0) AS plan_support_q2,
COALESCE(r.s_pq3, 0) AS plan_support_q3,
COALESCE(r.s_pq4, 0) AS plan_support_q4,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_pq2, 0) + COALESCE(r.s_pq3, 0) + COALESCE(r.s_pq4, 0) AS plan_support_year,
COALESCE(r.d_pq1, 0) AS plan_development_q1,
COALESCE(r.d_pq2, 0) AS plan_development_q2,
COALESCE(r.d_pq3, 0) AS plan_development_q3,
COALESCE(r.d_pq4, 0) AS plan_development_q4,
COALESCE(r.d_pq1, 0) + COALESCE(r.d_pq2, 0) + COALESCE(r.d_pq3, 0) + COALESCE(r.d_pq4, 0) AS plan_development_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_pq2, 0) + COALESCE(r.s_pq3, 0) + COALESCE(r.s_pq4, 0)
+ COALESCE(r.d_pq1, 0) + COALESCE(r.d_pq2, 0) + COALESCE(r.d_pq3, 0) + COALESCE(r.d_pq4, 0) AS plan_total_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0) AS approved_support_q1,
COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0) AS approved_support_q2,
COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0) AS approved_support_q3,
COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0) AS approved_support_q4,
(COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0))
+ (COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0))
+ (COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0))
+ (COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)) AS approved_support_year,
COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0) AS approved_development_q1,
COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0) AS approved_development_q2,
COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0) AS approved_development_q3,
COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0) AS approved_development_q4,
(COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0))
+ (COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0))
+ (COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0))
+ (COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0)) AS approved_development_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0)
+ COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0)
+ COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0)
+ COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)
+ COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0)
+ COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0)
+ COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0)
+ COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0) AS approved_total_year,
COALESCE(r.s_fq1, 0) AS fact_support_q1,
COALESCE(r.s_fq2, 0) AS fact_support_q2,
COALESCE(r.s_fq3, 0) AS fact_support_q3,
COALESCE(r.s_fq4, 0) AS fact_support_q4,
COALESCE(r.s_fq1, 0) + COALESCE(r.s_fq2, 0) + COALESCE(r.s_fq3, 0) + COALESCE(r.s_fq4, 0) AS fact_support_year,
COALESCE(r.d_fq1, 0) AS fact_development_q1,
COALESCE(r.d_fq2, 0) AS fact_development_q2,
COALESCE(r.d_fq3, 0) AS fact_development_q3,
COALESCE(r.d_fq4, 0) AS fact_development_q4,
COALESCE(r.d_fq1, 0) + COALESCE(r.d_fq2, 0) + COALESCE(r.d_fq3, 0) + COALESCE(r.d_fq4, 0) AS fact_development_year,
COALESCE(r.s_fq1, 0) + COALESCE(r.s_fq2, 0) + COALESCE(r.s_fq3, 0) + COALESCE(r.s_fq4, 0)
+ COALESCE(r.d_fq1, 0) + COALESCE(r.d_fq2, 0) + COALESCE(r.d_fq3, 0) + COALESCE(r.d_fq4, 0) AS fact_total_year,
COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0)
+ COALESCE(r.s_t1q2, 0) + COALESCE(r.s_rev2, 0) AS corrected_support_q2,
COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0)
+ COALESCE(r.s_t1q3, 0) + COALESCE(r.s_t2q3, 0) + COALESCE(r.s_rev3, 0) AS corrected_support_q3,
COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)
+ COALESCE(r.s_t1q4, 0) + COALESCE(r.s_t2q4, 0) + COALESCE(r.s_t3q4, 0) + COALESCE(r.s_rev4, 0) AS corrected_support_q4,
COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0)
+ COALESCE(r.d_t1q2, 0) + COALESCE(r.d_rev2, 0) AS corrected_development_q2,
COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0)
+ COALESCE(r.d_t1q3, 0) + COALESCE(r.d_t2q3, 0) + COALESCE(r.d_rev3, 0) AS corrected_development_q3,
COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0)
+ COALESCE(r.d_t1q4, 0) + COALESCE(r.d_t2q4, 0) + COALESCE(r.d_t3q4, 0) + COALESCE(r.d_rev4, 0) AS corrected_development_q4
FROM rolled AS r;
$function$;
-- =============================================================================
-- 1форм_ССП — VIEW
-- =============================================================================
-- DROP VIEW IF EXISTS v3.v_1form_ssp;
CREATE OR REPLACE VIEW v3.v_1form_ssp AS
WITH
form_lines AS (
SELECT
bf.year,
bl.id AS line_id,
bl.expense_item_id AS eid,
CASE WHEN bl.direction = 'Development' THEN 'Development' ELSE 'Support' END AS bucket
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_1'
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
),
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
line_agg AS (
SELECT
fl.year,
fl.eid,
fl.bucket,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.year, fl.eid, fl.bucket
),
years AS (
SELECT DISTINCT bf.year
FROM v3.budget_form AS bf
WHERE bf.form_type_code = 'FORM_1'
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_1'
WHERE t.depth < 3
),
rolled AS (
SELECT
y.year,
tn.item_id,
tn.name,
SUM(a.pq1) FILTER (WHERE a.bucket = 'Support') AS s_pq1,
SUM(a.pq2) FILTER (WHERE a.bucket = 'Support') AS s_pq2,
SUM(a.pq3) FILTER (WHERE a.bucket = 'Support') AS s_pq3,
SUM(a.pq4) FILTER (WHERE a.bucket = 'Support') AS s_pq4,
SUM(a.sd1) FILTER (WHERE a.bucket = 'Support') AS s_sd1,
SUM(a.sd2) FILTER (WHERE a.bucket = 'Support') AS s_sd2,
SUM(a.sd3) FILTER (WHERE a.bucket = 'Support') AS s_sd3,
SUM(a.sd4) FILTER (WHERE a.bucket = 'Support') AS s_sd4,
SUM(a.rq1) FILTER (WHERE a.bucket = 'Support') AS s_rq1,
SUM(a.rq2) FILTER (WHERE a.bucket = 'Support') AS s_rq2,
SUM(a.rq3) FILTER (WHERE a.bucket = 'Support') AS s_rq3,
SUM(a.rq4) FILTER (WHERE a.bucket = 'Support') AS s_rq4,
SUM(a.fq1) FILTER (WHERE a.bucket = 'Support') AS s_fq1,
SUM(a.fq2) FILTER (WHERE a.bucket = 'Support') AS s_fq2,
SUM(a.fq3) FILTER (WHERE a.bucket = 'Support') AS s_fq3,
SUM(a.fq4) FILTER (WHERE a.bucket = 'Support') AS s_fq4,
SUM(a.t1q2) FILTER (WHERE a.bucket = 'Support') AS s_t1q2,
SUM(a.t1q3) FILTER (WHERE a.bucket = 'Support') AS s_t1q3,
SUM(a.t1q4) FILTER (WHERE a.bucket = 'Support') AS s_t1q4,
SUM(a.t2q3) FILTER (WHERE a.bucket = 'Support') AS s_t2q3,
SUM(a.t2q4) FILTER (WHERE a.bucket = 'Support') AS s_t2q4,
SUM(a.t3q4) FILTER (WHERE a.bucket = 'Support') AS s_t3q4,
SUM(a.rev2) FILTER (WHERE a.bucket = 'Support') AS s_rev2,
SUM(a.rev3) FILTER (WHERE a.bucket = 'Support') AS s_rev3,
SUM(a.rev4) FILTER (WHERE a.bucket = 'Support') AS s_rev4,
SUM(a.pq1) FILTER (WHERE a.bucket = 'Development') AS d_pq1,
SUM(a.pq2) FILTER (WHERE a.bucket = 'Development') AS d_pq2,
SUM(a.pq3) FILTER (WHERE a.bucket = 'Development') AS d_pq3,
SUM(a.pq4) FILTER (WHERE a.bucket = 'Development') AS d_pq4,
SUM(a.sd1) FILTER (WHERE a.bucket = 'Development') AS d_sd1,
SUM(a.sd2) FILTER (WHERE a.bucket = 'Development') AS d_sd2,
SUM(a.sd3) FILTER (WHERE a.bucket = 'Development') AS d_sd3,
SUM(a.sd4) FILTER (WHERE a.bucket = 'Development') AS d_sd4,
SUM(a.rq1) FILTER (WHERE a.bucket = 'Development') AS d_rq1,
SUM(a.rq2) FILTER (WHERE a.bucket = 'Development') AS d_rq2,
SUM(a.rq3) FILTER (WHERE a.bucket = 'Development') AS d_rq3,
SUM(a.rq4) FILTER (WHERE a.bucket = 'Development') AS d_rq4,
SUM(a.fq1) FILTER (WHERE a.bucket = 'Development') AS d_fq1,
SUM(a.fq2) FILTER (WHERE a.bucket = 'Development') AS d_fq2,
SUM(a.fq3) FILTER (WHERE a.bucket = 'Development') AS d_fq3,
SUM(a.fq4) FILTER (WHERE a.bucket = 'Development') AS d_fq4,
SUM(a.t1q2) FILTER (WHERE a.bucket = 'Development') AS d_t1q2,
SUM(a.t1q3) FILTER (WHERE a.bucket = 'Development') AS d_t1q3,
SUM(a.t1q4) FILTER (WHERE a.bucket = 'Development') AS d_t1q4,
SUM(a.t2q3) FILTER (WHERE a.bucket = 'Development') AS d_t2q3,
SUM(a.t2q4) FILTER (WHERE a.bucket = 'Development') AS d_t2q4,
SUM(a.t3q4) FILTER (WHERE a.bucket = 'Development') AS d_t3q4,
SUM(a.rev2) FILTER (WHERE a.bucket = 'Development') AS d_rev2,
SUM(a.rev3) FILTER (WHERE a.bucket = 'Development') AS d_rev3,
SUM(a.rev4) FILTER (WHERE a.bucket = 'Development') AS d_rev4
FROM tree_nodes AS tn
CROSS JOIN years AS y
LEFT JOIN line_agg AS a
ON a.eid = ANY (tn.desc_ids)
AND a.year = y.year
GROUP BY y.year, tn.item_id, tn.name
)
SELECT
r.year,
r.item_id AS section_code,
r.name,
COALESCE(r.s_pq1, 0) AS plan_support_q1,
COALESCE(r.s_pq2, 0) AS plan_support_q2,
COALESCE(r.s_pq3, 0) AS plan_support_q3,
COALESCE(r.s_pq4, 0) AS plan_support_q4,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_pq2, 0) + COALESCE(r.s_pq3, 0) + COALESCE(r.s_pq4, 0) AS plan_support_year,
COALESCE(r.d_pq1, 0) AS plan_development_q1,
COALESCE(r.d_pq2, 0) AS plan_development_q2,
COALESCE(r.d_pq3, 0) AS plan_development_q3,
COALESCE(r.d_pq4, 0) AS plan_development_q4,
COALESCE(r.d_pq1, 0) + COALESCE(r.d_pq2, 0) + COALESCE(r.d_pq3, 0) + COALESCE(r.d_pq4, 0) AS plan_development_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_pq2, 0) + COALESCE(r.s_pq3, 0) + COALESCE(r.s_pq4, 0)
+ COALESCE(r.d_pq1, 0) + COALESCE(r.d_pq2, 0) + COALESCE(r.d_pq3, 0) + COALESCE(r.d_pq4, 0) AS plan_total_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0) AS approved_support_q1,
COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0) AS approved_support_q2,
COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0) AS approved_support_q3,
COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0) AS approved_support_q4,
(COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0))
+ (COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0))
+ (COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0))
+ (COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)) AS approved_support_year,
COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0) AS approved_development_q1,
COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0) AS approved_development_q2,
COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0) AS approved_development_q3,
COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0) AS approved_development_q4,
(COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0))
+ (COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0))
+ (COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0))
+ (COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0)) AS approved_development_year,
COALESCE(r.s_pq1, 0) + COALESCE(r.s_sd1, 0) + COALESCE(r.s_rq1, 0)
+ COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0)
+ COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0)
+ COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)
+ COALESCE(r.d_pq1, 0) + COALESCE(r.d_sd1, 0) + COALESCE(r.d_rq1, 0)
+ COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0)
+ COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0)
+ COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0) AS approved_total_year,
COALESCE(r.s_fq1, 0) AS fact_support_q1,
COALESCE(r.s_fq2, 0) AS fact_support_q2,
COALESCE(r.s_fq3, 0) AS fact_support_q3,
COALESCE(r.s_fq4, 0) AS fact_support_q4,
COALESCE(r.s_fq1, 0) + COALESCE(r.s_fq2, 0) + COALESCE(r.s_fq3, 0) + COALESCE(r.s_fq4, 0) AS fact_support_year,
COALESCE(r.d_fq1, 0) AS fact_development_q1,
COALESCE(r.d_fq2, 0) AS fact_development_q2,
COALESCE(r.d_fq3, 0) AS fact_development_q3,
COALESCE(r.d_fq4, 0) AS fact_development_q4,
COALESCE(r.d_fq1, 0) + COALESCE(r.d_fq2, 0) + COALESCE(r.d_fq3, 0) + COALESCE(r.d_fq4, 0) AS fact_development_year,
COALESCE(r.s_fq1, 0) + COALESCE(r.s_fq2, 0) + COALESCE(r.s_fq3, 0) + COALESCE(r.s_fq4, 0)
+ COALESCE(r.d_fq1, 0) + COALESCE(r.d_fq2, 0) + COALESCE(r.d_fq3, 0) + COALESCE(r.d_fq4, 0) AS fact_total_year,
COALESCE(r.s_pq2, 0) + COALESCE(r.s_sd2, 0) + COALESCE(r.s_rq2, 0)
+ COALESCE(r.s_t1q2, 0) + COALESCE(r.s_rev2, 0) AS corrected_support_q2,
COALESCE(r.s_pq3, 0) + COALESCE(r.s_sd3, 0) + COALESCE(r.s_rq3, 0)
+ COALESCE(r.s_t1q3, 0) + COALESCE(r.s_t2q3, 0) + COALESCE(r.s_rev3, 0) AS corrected_support_q3,
COALESCE(r.s_pq4, 0) + COALESCE(r.s_sd4, 0) + COALESCE(r.s_rq4, 0)
+ COALESCE(r.s_t1q4, 0) + COALESCE(r.s_t2q4, 0) + COALESCE(r.s_t3q4, 0) + COALESCE(r.s_rev4, 0) AS corrected_support_q4,
COALESCE(r.d_pq2, 0) + COALESCE(r.d_sd2, 0) + COALESCE(r.d_rq2, 0)
+ COALESCE(r.d_t1q2, 0) + COALESCE(r.d_rev2, 0) AS corrected_development_q2,
COALESCE(r.d_pq3, 0) + COALESCE(r.d_sd3, 0) + COALESCE(r.d_rq3, 0)
+ COALESCE(r.d_t1q3, 0) + COALESCE(r.d_t2q3, 0) + COALESCE(r.d_rev3, 0) AS corrected_development_q3,
COALESCE(r.d_pq4, 0) + COALESCE(r.d_sd4, 0) + COALESCE(r.d_rq4, 0)
+ COALESCE(r.d_t1q4, 0) + COALESCE(r.d_t2q4, 0) + COALESCE(r.d_t3q4, 0) + COALESCE(r.d_rev4, 0) AS corrected_development_q4
FROM rolled AS r;
-- =============================================================================
-- 2форм_РФ_П — ФУНКЦИЯ
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_2form_rf_p(integer);
CREATE OR REPLACE FUNCTION v3.v_2form_rf_p(p_year integer, p_org_unit_ids integer[] DEFAULT NULL)
RETURNS TABLE(
section_code character varying,
name character varying,
plan_support_q1 numeric,
plan_support_q2 numeric,
plan_support_q3 numeric,
plan_support_q4 numeric,
plan_support_year numeric,
approved_support_q1 numeric,
approved_support_q2 numeric,
approved_support_q3 numeric,
approved_support_q4 numeric,
approved_support_year numeric,
fact_support_q1 numeric,
fact_support_q2 numeric,
fact_support_q3 numeric,
fact_support_q4 numeric,
fact_support_year numeric,
corrected_support_q2 numeric,
corrected_support_q3 numeric,
corrected_support_q4 numeric
)
LANGUAGE sql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
WITH
form_lines AS (
SELECT bl.id AS line_id, bl.expense_item_id AS eid
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_2'
AND bf.year = p_year
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
AND (p_org_unit_ids IS NULL OR cardinality(p_org_unit_ids) = 0 OR bf.org_unit_id = ANY(p_org_unit_ids))
),
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 1 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
line_agg AS (
SELECT
fl.eid,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.adj1) AS adj1, SUM(qp.adj2) AS adj2, SUM(qp.adj3) AS adj3, SUM(qp.adj4) AS adj4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.sequestration AS sg ON sg.line_id = fl.line_id AND sg.actor = 'SSP_GO'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.eid
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_2'
WHERE t.depth < 3
),
rolled AS (
SELECT
tn.item_id,
tn.name,
SUM(a.pq1) AS pq1, SUM(a.pq2) AS pq2, SUM(a.pq3) AS pq3, SUM(a.pq4) AS pq4,
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.rq1) AS rq1, SUM(a.rq2) AS rq2, SUM(a.rq3) AS rq3, SUM(a.rq4) AS rq4,
SUM(a.fq1) AS fq1, SUM(a.fq2) AS fq2, SUM(a.fq3) AS fq3, SUM(a.fq4) AS fq4,
SUM(a.t1q2) AS t1q2, SUM(a.t1q3) AS t1q3, SUM(a.t1q4) AS t1q4,
SUM(a.t2q3) AS t2q3, SUM(a.t2q4) AS t2q4, SUM(a.t3q4) AS t3q4,
SUM(a.adj1) AS adj1, SUM(a.adj2) AS adj2, SUM(a.adj3) AS adj3, SUM(a.adj4) AS adj4,
SUM(a.rev2) AS rev2, SUM(a.rev3) AS rev3, SUM(a.rev4) AS rev4
FROM tree_nodes AS tn
LEFT JOIN line_agg AS a ON a.eid = ANY (tn.desc_ids)
GROUP BY tn.item_id, tn.name
)
SELECT
r.item_id AS section_code, r.name,
COALESCE(r.pq1, 0) AS plan_support_q1, COALESCE(r.pq2, 0) AS plan_support_q2, COALESCE(r.pq3, 0) AS plan_support_q3, COALESCE(r.pq4, 0) AS plan_support_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0) AS plan_support_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0) AS approved_support_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0) AS approved_support_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0) AS approved_support_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0) AS approved_support_q4,
(COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0))
+ (COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0))
+ (COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0))
+ (COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)) AS approved_support_year,
COALESCE(r.fq1, 0) AS fact_support_q1, COALESCE(r.fq2, 0) AS fact_support_q2, COALESCE(r.fq3, 0) AS fact_support_q3, COALESCE(r.fq4, 0) AS fact_support_q4,
COALESCE(r.fq1, 0) + COALESCE(r.fq2, 0) + COALESCE(r.fq3, 0) + COALESCE(r.fq4, 0) AS fact_support_year,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0)
+ COALESCE(r.t1q2, 0) + COALESCE(r.rev2, 0) + COALESCE(r.adj2, 0) AS corrected_support_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0)
+ COALESCE(r.t1q3, 0) + COALESCE(r.t2q3, 0) + COALESCE(r.rev3, 0) + COALESCE(r.adj3, 0) AS corrected_support_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.t1q4, 0) + COALESCE(r.t2q4, 0) + COALESCE(r.t3q4, 0) + COALESCE(r.rev4, 0) + COALESCE(r.adj4, 0) AS corrected_support_q4
FROM rolled AS r;
$function$;
-- =============================================================================
-- 2форм_РФ_П — VIEW
-- =============================================================================
DROP VIEW IF EXISTS v3.v_2form_rf_p CASCADE;
CREATE OR REPLACE VIEW v3.v_2form_rf_p AS
WITH
form_lines AS (
SELECT bf.year, bl.id AS line_id, bl.expense_item_id AS eid
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_2'
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
),
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 1 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_eco_change, 0) + COALESCE(plan_revision_item_adj, 0) + COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
line_agg AS (
SELECT
fl.year,
fl.eid,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.adj1) AS adj1, SUM(qp.adj2) AS adj2, SUM(qp.adj3) AS adj3, SUM(qp.adj4) AS adj4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.sequestration AS sg ON sg.line_id = fl.line_id AND sg.actor = 'SSP_GO'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.year, fl.eid
),
years AS (
SELECT DISTINCT bf.year
FROM v3.budget_form AS bf
WHERE bf.form_type_code = 'FORM_2'
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_2'
WHERE t.depth < 3
),
rolled AS (
SELECT
y.year,
tn.item_id,
tn.name,
SUM(a.pq1) AS pq1, SUM(a.pq2) AS pq2, SUM(a.pq3) AS pq3, SUM(a.pq4) AS pq4,
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.rq1) AS rq1, SUM(a.rq2) AS rq2, SUM(a.rq3) AS rq3, SUM(a.rq4) AS rq4,
SUM(a.fq1) AS fq1, SUM(a.fq2) AS fq2, SUM(a.fq3) AS fq3, SUM(a.fq4) AS fq4,
SUM(a.t1q2) AS t1q2, SUM(a.t1q3) AS t1q3, SUM(a.t1q4) AS t1q4,
SUM(a.t2q3) AS t2q3, SUM(a.t2q4) AS t2q4, SUM(a.t3q4) AS t3q4,
SUM(a.adj1) AS adj1, SUM(a.adj2) AS adj2, SUM(a.adj3) AS adj3, SUM(a.adj4) AS adj4,
SUM(a.rev2) AS rev2, SUM(a.rev3) AS rev3, SUM(a.rev4) AS rev4
FROM tree_nodes AS tn
CROSS JOIN years AS y
LEFT JOIN line_agg AS a ON a.eid = ANY (tn.desc_ids) AND a.year = y.year
GROUP BY y.year, tn.item_id, tn.name
)
SELECT
r.year, r.item_id AS section_code, r.name,
COALESCE(r.pq1, 0) AS plan_support_q1, COALESCE(r.pq2, 0) AS plan_support_q2, COALESCE(r.pq3, 0) AS plan_support_q3, COALESCE(r.pq4, 0) AS plan_support_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0) AS plan_support_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0) AS approved_support_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0) AS approved_support_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0) AS approved_support_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0) AS approved_support_q4,
(COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0))
+ (COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0))
+ (COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0))
+ (COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)) AS approved_support_year,
COALESCE(r.fq1, 0) AS fact_support_q1, COALESCE(r.fq2, 0) AS fact_support_q2, COALESCE(r.fq3, 0) AS fact_support_q3, COALESCE(r.fq4, 0) AS fact_support_q4,
COALESCE(r.fq1, 0) + COALESCE(r.fq2, 0) + COALESCE(r.fq3, 0) + COALESCE(r.fq4, 0) AS fact_support_year,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0)
+ COALESCE(r.t1q2, 0) + COALESCE(r.rev2, 0) + COALESCE(r.adj2, 0) AS corrected_support_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0)
+ COALESCE(r.t1q3, 0) + COALESCE(r.t2q3, 0) + COALESCE(r.rev3, 0) + COALESCE(r.adj3, 0) AS corrected_support_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.t1q4, 0) + COALESCE(r.t2q4, 0) + COALESCE(r.t3q4, 0) + COALESCE(r.rev4, 0) + COALESCE(r.adj4, 0) AS corrected_support_q4
FROM rolled AS r;
-- =============================================================================
-- 3форм_РФ_Р — ФУНКЦИЯ
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_3form_rf_r(integer);
CREATE OR REPLACE FUNCTION v3.v_3form_rf_r(p_year integer, p_org_unit_ids integer[] DEFAULT NULL)
RETURNS TABLE(
section_code character varying,
name character varying,
plan_development_q1 numeric,
plan_development_q2 numeric,
plan_development_q3 numeric,
plan_development_q4 numeric,
plan_development_year numeric,
approved_development_q1 numeric,
approved_development_q2 numeric,
approved_development_q3 numeric,
approved_development_q4 numeric,
approved_development_year numeric,
fact_development_q1 numeric,
fact_development_q2 numeric,
fact_development_q3 numeric,
fact_development_q4 numeric,
fact_development_year numeric,
corrected_development_q2 numeric,
corrected_development_q3 numeric,
corrected_development_q4 numeric
)
LANGUAGE sql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
WITH
-- Источник данных: отчёт РФ развитие (FORM_3). Направление всегда «Развитие».
-- Маппинг на структуру листа «2форм_РФ_П»:
-- план = base_plan
-- утверждено = base_plan + adj_by_items + adj_increase
-- факт = actual_m1 + actual_m2 + actual_m3 (+ actual_spod в Q4)
-- скорректировано = corrected_plan (IIIV квартал)
report_lines AS (
SELECT
l.expense_item_id AS eid,
q.quarter,
q.base_plan,
q.adj_by_items,
q.adj_increase,
q.actual_m1,
q.actual_m2,
q.actual_m3,
q.actual_spod,
q.corrected_plan
FROM v3.rf_project_report AS r
JOIN v3.rf_project_year AS rpry ON rpry.id = r.rf_project_year_id
JOIN v3.project AS p ON p.id = r.project_id
JOIN v3.rf_project_report_line AS l ON l.rf_project_report_id = r.id
JOIN v3.rf_project_report_quarter AS q ON q.rf_project_report_line_id = l.id
WHERE rpry.year = p_year
AND (p_org_unit_ids IS NULL OR cardinality(p_org_unit_ids) = 0 OR p.org_unit_id = ANY(p_org_unit_ids))
),
agg AS (
SELECT
eid,
SUM(CASE WHEN quarter = 1 THEN base_plan END) AS bp1,
SUM(CASE WHEN quarter = 2 THEN base_plan END) AS bp2,
SUM(CASE WHEN quarter = 3 THEN base_plan END) AS bp3,
SUM(CASE WHEN quarter = 4 THEN base_plan END) AS bp4,
SUM(CASE WHEN quarter = 1 THEN adj_by_items END) AS abi1,
SUM(CASE WHEN quarter = 2 THEN adj_by_items END) AS abi2,
SUM(CASE WHEN quarter = 3 THEN adj_by_items END) AS abi3,
SUM(CASE WHEN quarter = 4 THEN adj_by_items END) AS abi4,
SUM(CASE WHEN quarter = 1 THEN adj_increase END) AS ai1,
SUM(CASE WHEN quarter = 2 THEN adj_increase END) AS ai2,
SUM(CASE WHEN quarter = 3 THEN adj_increase END) AS ai3,
SUM(CASE WHEN quarter = 4 THEN adj_increase END) AS ai4,
SUM(CASE WHEN quarter = 1 THEN actual_m1 END) AS m1_1,
SUM(CASE WHEN quarter = 2 THEN actual_m1 END) AS m1_2,
SUM(CASE WHEN quarter = 3 THEN actual_m1 END) AS m1_3,
SUM(CASE WHEN quarter = 4 THEN actual_m1 END) AS m1_4,
SUM(CASE WHEN quarter = 1 THEN actual_m2 END) AS m2_1,
SUM(CASE WHEN quarter = 2 THEN actual_m2 END) AS m2_2,
SUM(CASE WHEN quarter = 3 THEN actual_m2 END) AS m2_3,
SUM(CASE WHEN quarter = 4 THEN actual_m2 END) AS m2_4,
SUM(CASE WHEN quarter = 1 THEN actual_m3 END) AS m3_1,
SUM(CASE WHEN quarter = 2 THEN actual_m3 END) AS m3_2,
SUM(CASE WHEN quarter = 3 THEN actual_m3 END) AS m3_3,
SUM(CASE WHEN quarter = 4 THEN actual_m3 END) AS m3_4,
SUM(CASE WHEN quarter = 4 THEN actual_spod END) AS spod4,
SUM(CASE WHEN quarter = 2 THEN corrected_plan END) AS cp2,
SUM(CASE WHEN quarter = 3 THEN corrected_plan END) AS cp3,
SUM(CASE WHEN quarter = 4 THEN corrected_plan END) AS cp4
FROM report_lines
GROUP BY eid
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_3'
WHERE t.depth < 3
),
rolled AS (
SELECT
tn.item_id,
tn.name,
SUM(a.bp1) AS bp1, SUM(a.bp2) AS bp2, SUM(a.bp3) AS bp3, SUM(a.bp4) AS bp4,
SUM(a.abi1) AS abi1, SUM(a.abi2) AS abi2, SUM(a.abi3) AS abi3, SUM(a.abi4) AS abi4,
SUM(a.ai1) AS ai1, SUM(a.ai2) AS ai2, SUM(a.ai3) AS ai3, SUM(a.ai4) AS ai4,
SUM(a.m1_1) AS m1_1, SUM(a.m1_2) AS m1_2, SUM(a.m1_3) AS m1_3, SUM(a.m1_4) AS m1_4,
SUM(a.m2_1) AS m2_1, SUM(a.m2_2) AS m2_2, SUM(a.m2_3) AS m2_3, SUM(a.m2_4) AS m2_4,
SUM(a.m3_1) AS m3_1, SUM(a.m3_2) AS m3_2, SUM(a.m3_3) AS m3_3, SUM(a.m3_4) AS m3_4,
SUM(a.spod4) AS spod4,
SUM(a.cp2) AS cp2, SUM(a.cp3) AS cp3, SUM(a.cp4) AS cp4
FROM tree_nodes AS tn
LEFT JOIN agg AS a ON a.eid = ANY (tn.desc_ids)
GROUP BY tn.item_id, tn.name
)
SELECT
r.item_id AS section_code,
r.name,
COALESCE(r.bp1, 0) AS plan_development_q1,
COALESCE(r.bp2, 0) AS plan_development_q2,
COALESCE(r.bp3, 0) AS plan_development_q3,
COALESCE(r.bp4, 0) AS plan_development_q4,
COALESCE(r.bp1, 0) + COALESCE(r.bp2, 0) + COALESCE(r.bp3, 0) + COALESCE(r.bp4, 0) AS plan_development_year,
COALESCE(r.bp1, 0) + COALESCE(r.abi1, 0) + COALESCE(r.ai1, 0) AS approved_development_q1,
COALESCE(r.bp2, 0) + COALESCE(r.abi2, 0) + COALESCE(r.ai2, 0) AS approved_development_q2,
COALESCE(r.bp3, 0) + COALESCE(r.abi3, 0) + COALESCE(r.ai3, 0) AS approved_development_q3,
COALESCE(r.bp4, 0) + COALESCE(r.abi4, 0) + COALESCE(r.ai4, 0) AS approved_development_q4,
(COALESCE(r.bp1, 0) + COALESCE(r.abi1, 0) + COALESCE(r.ai1, 0))
+ (COALESCE(r.bp2, 0) + COALESCE(r.abi2, 0) + COALESCE(r.ai2, 0))
+ (COALESCE(r.bp3, 0) + COALESCE(r.abi3, 0) + COALESCE(r.ai3, 0))
+ (COALESCE(r.bp4, 0) + COALESCE(r.abi4, 0) + COALESCE(r.ai4, 0)) AS approved_development_year,
COALESCE(r.m1_1, 0) + COALESCE(r.m2_1, 0) + COALESCE(r.m3_1, 0) AS fact_development_q1,
COALESCE(r.m1_2, 0) + COALESCE(r.m2_2, 0) + COALESCE(r.m3_2, 0) AS fact_development_q2,
COALESCE(r.m1_3, 0) + COALESCE(r.m2_3, 0) + COALESCE(r.m3_3, 0) AS fact_development_q3,
COALESCE(r.m1_4, 0) + COALESCE(r.m2_4, 0) + COALESCE(r.m3_4, 0) + COALESCE(r.spod4, 0) AS fact_development_q4,
COALESCE(r.m1_1, 0) + COALESCE(r.m2_1, 0) + COALESCE(r.m3_1, 0)
+ COALESCE(r.m1_2, 0) + COALESCE(r.m2_2, 0) + COALESCE(r.m3_2, 0)
+ COALESCE(r.m1_3, 0) + COALESCE(r.m2_3, 0) + COALESCE(r.m3_3, 0)
+ COALESCE(r.m1_4, 0) + COALESCE(r.m2_4, 0) + COALESCE(r.m3_4, 0) + COALESCE(r.spod4, 0) AS fact_development_year,
COALESCE(r.cp2, 0) AS corrected_development_q2,
COALESCE(r.cp3, 0) AS corrected_development_q3,
COALESCE(r.cp4, 0) AS corrected_development_q4
FROM rolled AS r;
$function$;
-- =============================================================================
-- 3форм_РФ_Р — VIEW
-- =============================================================================
DROP VIEW IF EXISTS v3.v_3form_rf_r CASCADE;
CREATE OR REPLACE VIEW v3.v_3form_rf_r AS
WITH
report_lines AS (
SELECT
rpry.year,
l.expense_item_id AS eid,
q.quarter,
q.base_plan,
q.adj_by_items,
q.adj_increase,
q.actual_m1,
q.actual_m2,
q.actual_m3,
q.actual_spod,
q.corrected_plan
FROM v3.rf_project_report AS r
JOIN v3.rf_project_year AS rpry ON rpry.id = r.rf_project_year_id
JOIN v3.rf_project_report_line AS l ON l.rf_project_report_id = r.id
JOIN v3.rf_project_report_quarter AS q ON q.rf_project_report_line_id = l.id
),
agg AS (
SELECT
year,
eid,
SUM(CASE WHEN quarter = 1 THEN base_plan END) AS bp1,
SUM(CASE WHEN quarter = 2 THEN base_plan END) AS bp2,
SUM(CASE WHEN quarter = 3 THEN base_plan END) AS bp3,
SUM(CASE WHEN quarter = 4 THEN base_plan END) AS bp4,
SUM(CASE WHEN quarter = 1 THEN adj_by_items END) AS abi1,
SUM(CASE WHEN quarter = 2 THEN adj_by_items END) AS abi2,
SUM(CASE WHEN quarter = 3 THEN adj_by_items END) AS abi3,
SUM(CASE WHEN quarter = 4 THEN adj_by_items END) AS abi4,
SUM(CASE WHEN quarter = 1 THEN adj_increase END) AS ai1,
SUM(CASE WHEN quarter = 2 THEN adj_increase END) AS ai2,
SUM(CASE WHEN quarter = 3 THEN adj_increase END) AS ai3,
SUM(CASE WHEN quarter = 4 THEN adj_increase END) AS ai4,
SUM(CASE WHEN quarter = 1 THEN actual_m1 END) AS m1_1,
SUM(CASE WHEN quarter = 2 THEN actual_m1 END) AS m1_2,
SUM(CASE WHEN quarter = 3 THEN actual_m1 END) AS m1_3,
SUM(CASE WHEN quarter = 4 THEN actual_m1 END) AS m1_4,
SUM(CASE WHEN quarter = 1 THEN actual_m2 END) AS m2_1,
SUM(CASE WHEN quarter = 2 THEN actual_m2 END) AS m2_2,
SUM(CASE WHEN quarter = 3 THEN actual_m2 END) AS m2_3,
SUM(CASE WHEN quarter = 4 THEN actual_m2 END) AS m2_4,
SUM(CASE WHEN quarter = 1 THEN actual_m3 END) AS m3_1,
SUM(CASE WHEN quarter = 2 THEN actual_m3 END) AS m3_2,
SUM(CASE WHEN quarter = 3 THEN actual_m3 END) AS m3_3,
SUM(CASE WHEN quarter = 4 THEN actual_m3 END) AS m3_4,
SUM(CASE WHEN quarter = 4 THEN actual_spod END) AS spod4,
SUM(CASE WHEN quarter = 2 THEN corrected_plan END) AS cp2,
SUM(CASE WHEN quarter = 3 THEN corrected_plan END) AS cp3,
SUM(CASE WHEN quarter = 4 THEN corrected_plan END) AS cp4
FROM report_lines
GROUP BY year, eid
),
years AS (
SELECT DISTINCT rpry.year
FROM v3.rf_project_report AS r
JOIN v3.rf_project_year AS rpry ON rpry.id = r.rf_project_year_id
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_3'
WHERE t.depth < 3
),
rolled AS (
SELECT
y.year,
tn.item_id,
tn.name,
SUM(a.bp1) AS bp1, SUM(a.bp2) AS bp2, SUM(a.bp3) AS bp3, SUM(a.bp4) AS bp4,
SUM(a.abi1) AS abi1, SUM(a.abi2) AS abi2, SUM(a.abi3) AS abi3, SUM(a.abi4) AS abi4,
SUM(a.ai1) AS ai1, SUM(a.ai2) AS ai2, SUM(a.ai3) AS ai3, SUM(a.ai4) AS ai4,
SUM(a.m1_1) AS m1_1, SUM(a.m1_2) AS m1_2, SUM(a.m1_3) AS m1_3, SUM(a.m1_4) AS m1_4,
SUM(a.m2_1) AS m2_1, SUM(a.m2_2) AS m2_2, SUM(a.m2_3) AS m2_3, SUM(a.m2_4) AS m2_4,
SUM(a.m3_1) AS m3_1, SUM(a.m3_2) AS m3_2, SUM(a.m3_3) AS m3_3, SUM(a.m3_4) AS m3_4,
SUM(a.spod4) AS spod4,
SUM(a.cp2) AS cp2, SUM(a.cp3) AS cp3, SUM(a.cp4) AS cp4
FROM tree_nodes AS tn
CROSS JOIN years AS y
LEFT JOIN agg AS a
ON a.eid = ANY (tn.desc_ids)
AND a.year = y.year
GROUP BY y.year, tn.item_id, tn.name
)
SELECT
r.year,
r.item_id AS section_code,
r.name,
COALESCE(r.bp1, 0) AS plan_development_q1,
COALESCE(r.bp2, 0) AS plan_development_q2,
COALESCE(r.bp3, 0) AS plan_development_q3,
COALESCE(r.bp4, 0) AS plan_development_q4,
COALESCE(r.bp1, 0) + COALESCE(r.bp2, 0) + COALESCE(r.bp3, 0) + COALESCE(r.bp4, 0) AS plan_development_year,
COALESCE(r.bp1, 0) + COALESCE(r.abi1, 0) + COALESCE(r.ai1, 0) AS approved_development_q1,
COALESCE(r.bp2, 0) + COALESCE(r.abi2, 0) + COALESCE(r.ai2, 0) AS approved_development_q2,
COALESCE(r.bp3, 0) + COALESCE(r.abi3, 0) + COALESCE(r.ai3, 0) AS approved_development_q3,
COALESCE(r.bp4, 0) + COALESCE(r.abi4, 0) + COALESCE(r.ai4, 0) AS approved_development_q4,
(COALESCE(r.bp1, 0) + COALESCE(r.abi1, 0) + COALESCE(r.ai1, 0))
+ (COALESCE(r.bp2, 0) + COALESCE(r.abi2, 0) + COALESCE(r.ai2, 0))
+ (COALESCE(r.bp3, 0) + COALESCE(r.abi3, 0) + COALESCE(r.ai3, 0))
+ (COALESCE(r.bp4, 0) + COALESCE(r.abi4, 0) + COALESCE(r.ai4, 0)) AS approved_development_year,
COALESCE(r.m1_1, 0) + COALESCE(r.m2_1, 0) + COALESCE(r.m3_1, 0) AS fact_development_q1,
COALESCE(r.m1_2, 0) + COALESCE(r.m2_2, 0) + COALESCE(r.m3_2, 0) AS fact_development_q2,
COALESCE(r.m1_3, 0) + COALESCE(r.m2_3, 0) + COALESCE(r.m3_3, 0) AS fact_development_q3,
COALESCE(r.m1_4, 0) + COALESCE(r.m2_4, 0) + COALESCE(r.m3_4, 0) + COALESCE(r.spod4, 0) AS fact_development_q4,
COALESCE(r.m1_1, 0) + COALESCE(r.m2_1, 0) + COALESCE(r.m3_1, 0)
+ COALESCE(r.m1_2, 0) + COALESCE(r.m2_2, 0) + COALESCE(r.m3_2, 0)
+ COALESCE(r.m1_3, 0) + COALESCE(r.m2_3, 0) + COALESCE(r.m3_3, 0)
+ COALESCE(r.m1_4, 0) + COALESCE(r.m2_4, 0) + COALESCE(r.m3_4, 0) + COALESCE(r.spod4, 0) AS fact_development_year,
COALESCE(r.cp2, 0) AS corrected_development_q2,
COALESCE(r.cp3, 0) AS corrected_development_q3,
COALESCE(r.cp4, 0) AS corrected_development_q4
FROM rolled AS r;
-- =============================================================================
-- 4форм_ПРОЕКТ — ФУНКЦИЯ
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_4form_project(integer);
CREATE OR REPLACE FUNCTION v3.v_4form_project(p_year integer, p_org_unit_ids integer[] DEFAULT NULL)
RETURNS TABLE(
section_code character varying,
name character varying,
plan_development_q1 numeric,
plan_development_q2 numeric,
plan_development_q3 numeric,
plan_development_q4 numeric,
plan_development_year numeric,
approved_development_q1 numeric,
approved_development_q2 numeric,
approved_development_q3 numeric,
approved_development_q4 numeric,
approved_development_year numeric,
fact_development_q1 numeric,
fact_development_q2 numeric,
fact_development_q3 numeric,
fact_development_q4 numeric,
fact_development_year numeric,
corrected_development_q1 numeric,
corrected_development_q2 numeric,
corrected_development_q3 numeric,
corrected_development_q4 numeric,
corrected_development_year numeric
)
LANGUAGE sql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
WITH
form_lines AS (
SELECT bl.id AS line_id, bl.expense_item_id AS eid
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_4'
AND bf.year = p_year
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
AND (p_org_unit_ids IS NULL OR cardinality(p_org_unit_ids) = 0 OR bf.org_unit_id = ANY(p_org_unit_ids))
),
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 1 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
line_agg AS (
SELECT
fl.eid,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.adj1) AS adj1, SUM(qp.adj2) AS adj2, SUM(qp.adj3) AS adj3, SUM(qp.adj4) AS adj4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.sequestration AS sg ON sg.line_id = fl.line_id AND sg.actor = 'SSP_GO'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.eid
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_4'
WHERE t.depth < 3
),
rolled AS (
SELECT
tn.item_id,
tn.name,
SUM(a.pq1) AS pq1, SUM(a.pq2) AS pq2, SUM(a.pq3) AS pq3, SUM(a.pq4) AS pq4,
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.rq1) AS rq1, SUM(a.rq2) AS rq2, SUM(a.rq3) AS rq3, SUM(a.rq4) AS rq4,
SUM(a.fq1) AS fq1, SUM(a.fq2) AS fq2, SUM(a.fq3) AS fq3, SUM(a.fq4) AS fq4,
SUM(a.t1q2) AS t1q2, SUM(a.t1q3) AS t1q3, SUM(a.t1q4) AS t1q4,
SUM(a.t2q3) AS t2q3, SUM(a.t2q4) AS t2q4, SUM(a.t3q4) AS t3q4,
SUM(a.adj1) AS adj1, SUM(a.adj2) AS adj2, SUM(a.adj3) AS adj3, SUM(a.adj4) AS adj4,
SUM(a.rev2) AS rev2, SUM(a.rev3) AS rev3, SUM(a.rev4) AS rev4
FROM tree_nodes AS tn
LEFT JOIN line_agg AS a ON a.eid = ANY (tn.desc_ids)
GROUP BY tn.item_id, tn.name
)
SELECT
r.item_id AS section_code, r.name,
COALESCE(r.pq1, 0) AS plan_development_q1, COALESCE(r.pq2, 0) AS plan_development_q2, COALESCE(r.pq3, 0) AS plan_development_q3, COALESCE(r.pq4, 0) AS plan_development_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0) AS plan_development_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0) AS approved_development_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0) AS approved_development_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0) AS approved_development_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0) AS approved_development_q4,
(COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0))
+ (COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0))
+ (COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0))
+ (COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)) AS approved_development_year,
COALESCE(r.fq1, 0) AS fact_development_q1, COALESCE(r.fq2, 0) AS fact_development_q2, COALESCE(r.fq3, 0) AS fact_development_q3, COALESCE(r.fq4, 0) AS fact_development_q4,
COALESCE(r.fq1, 0) + COALESCE(r.fq2, 0) + COALESCE(r.fq3, 0) + COALESCE(r.fq4, 0) AS fact_development_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0)
+ COALESCE(r.adj1, 0) AS corrected_development_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0)
+ COALESCE(r.t1q2, 0) + COALESCE(r.rev2, 0) + COALESCE(r.adj2, 0) AS corrected_development_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0)
+ COALESCE(r.t1q3, 0) + COALESCE(r.t2q3, 0) + COALESCE(r.rev3, 0) + COALESCE(r.adj3, 0) AS corrected_development_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.t1q4, 0) + COALESCE(r.t2q4, 0) + COALESCE(r.t3q4, 0) + COALESCE(r.rev4, 0) + COALESCE(r.adj4, 0) AS corrected_development_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0)
+ COALESCE(r.sd1, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sd4, 0)
+ COALESCE(r.sg1, 0) + COALESCE(r.sg2, 0) + COALESCE(r.sg3, 0) + COALESCE(r.sg4, 0)
+ COALESCE(r.rq1, 0) + COALESCE(r.rq2, 0) + COALESCE(r.rq3, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.adj1, 0) + COALESCE(r.adj2, 0) + COALESCE(r.adj3, 0) + COALESCE(r.adj4, 0)
+ COALESCE(r.rev2, 0) + COALESCE(r.rev3, 0) + COALESCE(r.rev4, 0) AS corrected_development_year
FROM rolled AS r;
$function$;
-- =============================================================================
-- 4форм_ПРОЕКТ — VIEW
-- =============================================================================
DROP VIEW IF EXISTS v3.v_4form_project CASCADE;
CREATE OR REPLACE VIEW v3.v_4form_project AS
WITH
form_lines AS (
SELECT bf.year, bl.id AS line_id, bl.expense_item_id AS eid
FROM v3.budget_line AS bl
JOIN v3.budget_form AS bf ON bf.id = bl.budget_form_id
JOIN v3.expense_item AS ei ON ei.id = bl.expense_item_id
WHERE bf.form_type_code = 'FORM_4'
AND ei.sheet IN ('AHR', 'CAP', 'OPER')
),
q_per_line AS (
SELECT line_id,
SUM(CASE WHEN quarter = 1 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) END) AS fq3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(actual_m1, 0) + COALESCE(actual_m2, 0) + COALESCE(actual_m3, 0) + COALESCE(actual_spod, 0) END) AS fq4,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q2 END) AS t1q2,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q3 END) AS t1q3,
SUM(CASE WHEN quarter = 1 THEN transfer_to_q4 END) AS t1q4,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q3 END) AS t2q3,
SUM(CASE WHEN quarter = 2 THEN transfer_to_q4 END) AS t2q4,
SUM(CASE WHEN quarter = 3 THEN transfer_to_q4 END) AS t3q4,
SUM(CASE WHEN quarter = 1 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj1,
SUM(CASE WHEN quarter = 2 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(adj_current, 0) + COALESCE(adj_ssp, 0) + COALESCE(adj_reserve, 0) END) AS adj4,
SUM(CASE WHEN quarter = 2 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev2,
SUM(CASE WHEN quarter = 3 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev3,
SUM(CASE WHEN quarter = 4 THEN COALESCE(plan_revision_increase, 0) + COALESCE(plan_revision_sequester, 0) + COALESCE(target_change, 0) + COALESCE(base_plan_correction, 0) END) AS rev4
FROM v3.budget_line_quarter
GROUP BY line_id
),
line_agg AS (
SELECT
fl.year,
fl.eid,
SUM(p.plan_q1) AS pq1, SUM(p.plan_q2) AS pq2, SUM(p.plan_q3) AS pq3, SUM(p.plan_q4) AS pq4,
SUM(sd.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 rq1, SUM(r.amount_q2) AS rq2, SUM(r.amount_q3) AS rq3, SUM(r.amount_q4) AS rq4,
SUM(qp.fq1) AS fq1, SUM(qp.fq2) AS fq2, SUM(qp.fq3) AS fq3, SUM(qp.fq4) AS fq4,
SUM(qp.t1q2) AS t1q2, SUM(qp.t1q3) AS t1q3, SUM(qp.t1q4) AS t1q4,
SUM(qp.t2q3) AS t2q3, SUM(qp.t2q4) AS t2q4, SUM(qp.t3q4) AS t3q4,
SUM(qp.adj1) AS adj1, SUM(qp.adj2) AS adj2, SUM(qp.adj3) AS adj3, SUM(qp.adj4) AS adj4,
SUM(qp.rev2) AS rev2, SUM(qp.rev3) AS rev3, SUM(qp.rev4) AS rev4
FROM form_lines AS fl
LEFT JOIN v3.plan AS p ON p.line_id = fl.line_id
LEFT JOIN v3.sequestration AS sd ON sd.line_id = fl.line_id AND sd.actor = 'DFIP'
LEFT JOIN v3.sequestration AS sg ON sg.line_id = fl.line_id AND sg.actor = 'SSP_GO'
LEFT JOIN v3.reserve AS r ON r.line_id = fl.line_id
LEFT JOIN q_per_line AS qp ON qp.line_id = fl.line_id
GROUP BY fl.year, fl.eid
),
years AS (
SELECT DISTINCT bf.year
FROM v3.budget_form AS bf
WHERE bf.form_type_code = 'FORM_4'
),
tree_nodes AS (
SELECT t.id, t.item_id, t.name, t.desc_ids
FROM v3.mv_expense_item_tree AS t
JOIN v3.expense_item_form_type AS eft
ON eft.expense_item_id = t.id
AND eft.form_type_code = 'FORM_4'
WHERE t.depth < 3
),
rolled AS (
SELECT
y.year,
tn.item_id,
tn.name,
SUM(a.pq1) AS pq1, SUM(a.pq2) AS pq2, SUM(a.pq3) AS pq3, SUM(a.pq4) AS pq4,
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.rq1) AS rq1, SUM(a.rq2) AS rq2, SUM(a.rq3) AS rq3, SUM(a.rq4) AS rq4,
SUM(a.fq1) AS fq1, SUM(a.fq2) AS fq2, SUM(a.fq3) AS fq3, SUM(a.fq4) AS fq4,
SUM(a.t1q2) AS t1q2, SUM(a.t1q3) AS t1q3, SUM(a.t1q4) AS t1q4,
SUM(a.t2q3) AS t2q3, SUM(a.t2q4) AS t2q4, SUM(a.t3q4) AS t3q4,
SUM(a.adj1) AS adj1, SUM(a.adj2) AS adj2, SUM(a.adj3) AS adj3, SUM(a.adj4) AS adj4,
SUM(a.rev2) AS rev2, SUM(a.rev3) AS rev3, SUM(a.rev4) AS rev4
FROM tree_nodes AS tn
CROSS JOIN years AS y
LEFT JOIN line_agg AS a ON a.eid = ANY (tn.desc_ids) AND a.year = y.year
GROUP BY y.year, tn.item_id, tn.name
)
SELECT
r.year, r.item_id AS section_code, r.name,
COALESCE(r.pq1, 0) AS plan_development_q1, COALESCE(r.pq2, 0) AS plan_development_q2, COALESCE(r.pq3, 0) AS plan_development_q3, COALESCE(r.pq4, 0) AS plan_development_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0) AS plan_development_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0) AS approved_development_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0) AS approved_development_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0) AS approved_development_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0) AS approved_development_q4,
(COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0))
+ (COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0))
+ (COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0))
+ (COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)) AS approved_development_year,
COALESCE(r.fq1, 0) AS fact_development_q1, COALESCE(r.fq2, 0) AS fact_development_q2, COALESCE(r.fq3, 0) AS fact_development_q3, COALESCE(r.fq4, 0) AS fact_development_q4,
COALESCE(r.fq1, 0) + COALESCE(r.fq2, 0) + COALESCE(r.fq3, 0) + COALESCE(r.fq4, 0) AS fact_development_year,
COALESCE(r.pq1, 0) + COALESCE(r.sd1, 0) + COALESCE(r.sg1, 0) + COALESCE(r.rq1, 0)
+ COALESCE(r.adj1, 0) AS corrected_development_q1,
COALESCE(r.pq2, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sg2, 0) + COALESCE(r.rq2, 0)
+ COALESCE(r.t1q2, 0) + COALESCE(r.rev2, 0) + COALESCE(r.adj2, 0) AS corrected_development_q2,
COALESCE(r.pq3, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sg3, 0) + COALESCE(r.rq3, 0)
+ COALESCE(r.t1q3, 0) + COALESCE(r.t2q3, 0) + COALESCE(r.rev3, 0) + COALESCE(r.adj3, 0) AS corrected_development_q3,
COALESCE(r.pq4, 0) + COALESCE(r.sd4, 0) + COALESCE(r.sg4, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.t1q4, 0) + COALESCE(r.t2q4, 0) + COALESCE(r.t3q4, 0) + COALESCE(r.rev4, 0) + COALESCE(r.adj4, 0) AS corrected_development_q4,
COALESCE(r.pq1, 0) + COALESCE(r.pq2, 0) + COALESCE(r.pq3, 0) + COALESCE(r.pq4, 0)
+ COALESCE(r.sd1, 0) + COALESCE(r.sd2, 0) + COALESCE(r.sd3, 0) + COALESCE(r.sd4, 0)
+ COALESCE(r.sg1, 0) + COALESCE(r.sg2, 0) + COALESCE(r.sg3, 0) + COALESCE(r.sg4, 0)
+ COALESCE(r.rq1, 0) + COALESCE(r.rq2, 0) + COALESCE(r.rq3, 0) + COALESCE(r.rq4, 0)
+ COALESCE(r.adj1, 0) + COALESCE(r.adj2, 0) + COALESCE(r.adj3, 0) + COALESCE(r.adj4, 0)
+ COALESCE(r.rev2, 0) + COALESCE(r.rev3, 0) + COALESCE(r.rev4, 0) AS corrected_development_year
FROM rolled AS r;
-- =============================================================================
-- main_format — ФУНКЦИЯ
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_main_format(integer);
-- DROP FUNCTION v3.v_main_format(int4, _int4);
CREATE OR REPLACE FUNCTION v3.v_main_format(p_year integer, p_org_unit_ids integer[] DEFAULT NULL::integer[])
RETURNS TABLE(section_code character varying, name character varying, plan_support_q1 numeric, plan_support_q2 numeric, plan_support_q3 numeric, plan_support_q4 numeric, plan_support_year numeric, plan_development_q1 numeric, plan_development_q2 numeric, plan_development_q3 numeric, plan_development_q4 numeric, plan_development_year numeric, plan_total_year numeric, approved_support_q1 numeric, approved_support_q2 numeric, approved_support_q3 numeric, approved_support_q4 numeric, approved_support_year numeric, approved_development_q1 numeric, approved_development_q2 numeric, approved_development_q3 numeric, approved_development_q4 numeric, approved_development_year numeric, approved_total_year numeric, fact_support_q1 numeric, fact_support_q2 numeric, fact_support_q3 numeric, fact_support_q4 numeric, fact_support_year numeric, fact_development_q1 numeric, fact_development_q2 numeric, fact_development_q3 numeric, fact_development_q4 numeric, fact_development_year numeric, fact_total_year numeric, corrected_support_q2 numeric, corrected_support_q3 numeric, corrected_support_q4 numeric, corrected_development_q2 numeric, corrected_development_q3 numeric, corrected_development_q4 numeric)
LANGUAGE sql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
WITH unioned AS (
( SELECT f.section_code, f.name, f.plan_support_q1, f.plan_support_q2, f.plan_support_q3, f.plan_support_q4, f.plan_support_year, f.approved_support_q1, f.approved_support_q2, f.approved_support_q3, f.approved_support_q4, f.approved_support_year, f.fact_support_q1, f.fact_support_q2, f.fact_support_q3, f.fact_support_q4, f.fact_support_year, f.corrected_support_q2, f.corrected_support_q3, f.corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_1form_ssp(p_year, p_org_unit_ids) AS f)
UNION ALL
( SELECT f.section_code, f.name, f.plan_support_q1, f.plan_support_q2, f.plan_support_q3, f.plan_support_q4, f.plan_support_year, f.approved_support_q1, f.approved_support_q2, f.approved_support_q3, f.approved_support_q4, f.approved_support_year, f.fact_support_q1, f.fact_support_q2, f.fact_support_q3, f.fact_support_q4, f.fact_support_year, f.corrected_support_q2, f.corrected_support_q3, f.corrected_support_q4, 0 AS plan_development_q1, 0 AS plan_development_q2, 0 AS plan_development_q3, 0 AS plan_development_q4, 0 AS plan_development_year, 0 AS approved_development_q1, 0 AS approved_development_q2, 0 AS approved_development_q3, 0 AS approved_development_q4, 0 AS approved_development_year, 0 AS fact_development_q1, 0 AS fact_development_q2, 0 AS fact_development_q3, 0 AS fact_development_q4, 0 AS fact_development_year, 0 AS corrected_development_q2, 0 AS corrected_development_q3, 0 AS corrected_development_q4
FROM v3.v_2form_rf_p(p_year, p_org_unit_ids) AS f)
UNION ALL
( SELECT f.section_code, f.name, 0 AS plan_support_q1, 0 AS plan_support_q2, 0 AS plan_support_q3, 0 AS plan_support_q4, 0 AS plan_support_year, 0 AS approved_support_q1, 0 AS approved_support_q2, 0 AS approved_support_q3, 0 AS approved_support_q4, 0 AS approved_support_year, 0 AS fact_support_q1, 0 AS fact_support_q2, 0 AS fact_support_q3, 0 AS fact_support_q4, 0 AS fact_support_year, 0 AS corrected_support_q2, 0 AS corrected_support_q3, 0 AS corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_3form_rf_r(p_year, p_org_unit_ids) AS f)
UNION ALL
( SELECT f.section_code, f.name, 0 AS plan_support_q1, 0 AS plan_support_q2, 0 AS plan_support_q3, 0 AS plan_support_q4, 0 AS plan_support_year, 0 AS approved_support_q1, 0 AS approved_support_q2, 0 AS approved_support_q3, 0 AS approved_support_q4, 0 AS approved_support_year, 0 AS fact_support_q1, 0 AS fact_support_q2, 0 AS fact_support_q3, 0 AS fact_support_q4, 0 AS fact_support_year, 0 AS corrected_support_q2, 0 AS corrected_support_q3, 0 AS corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_4form_project(p_year, p_org_unit_ids) AS f)
),
summed AS (
SELECT
u.section_code, u.name,
SUM(u.plan_support_q1) AS plan_support_q1,
SUM(u.plan_support_q2) AS plan_support_q2,
SUM(u.plan_support_q3) AS plan_support_q3,
SUM(u.plan_support_q4) AS plan_support_q4,
SUM(u.plan_support_year) AS plan_support_year,
SUM(u.approved_support_q1) AS approved_support_q1,
SUM(u.approved_support_q2) AS approved_support_q2,
SUM(u.approved_support_q3) AS approved_support_q3,
SUM(u.approved_support_q4) AS approved_support_q4,
SUM(u.approved_support_year) AS approved_support_year,
SUM(u.fact_support_q1) AS fact_support_q1,
SUM(u.fact_support_q2) AS fact_support_q2,
SUM(u.fact_support_q3) AS fact_support_q3,
SUM(u.fact_support_q4) AS fact_support_q4,
SUM(u.fact_support_year) AS fact_support_year,
SUM(u.corrected_support_q2) AS corrected_support_q2,
SUM(u.corrected_support_q3) AS corrected_support_q3,
SUM(u.corrected_support_q4) AS corrected_support_q4,
SUM(u.plan_development_q1) AS plan_development_q1,
SUM(u.plan_development_q2) AS plan_development_q2,
SUM(u.plan_development_q3) AS plan_development_q3,
SUM(u.plan_development_q4) AS plan_development_q4,
SUM(u.plan_development_year) AS plan_development_year,
SUM(u.approved_development_q1) AS approved_development_q1,
SUM(u.approved_development_q2) AS approved_development_q2,
SUM(u.approved_development_q3) AS approved_development_q3,
SUM(u.approved_development_q4) AS approved_development_q4,
SUM(u.approved_development_year) AS approved_development_year,
SUM(u.fact_development_q1) AS fact_development_q1,
SUM(u.fact_development_q2) AS fact_development_q2,
SUM(u.fact_development_q3) AS fact_development_q3,
SUM(u.fact_development_q4) AS fact_development_q4,
SUM(u.fact_development_year) AS fact_development_year,
SUM(u.corrected_development_q2) AS corrected_development_q2,
SUM(u.corrected_development_q3) AS corrected_development_q3,
SUM(u.corrected_development_q4) AS corrected_development_q4
FROM unioned AS u
GROUP BY u.section_code, u.name
)
SELECT
s.section_code, s.name,
s.plan_support_q1, s.plan_support_q2, s.plan_support_q3, s.plan_support_q4, s.plan_support_year,
s.plan_development_q1, s.plan_development_q2, s.plan_development_q3, s.plan_development_q4, s.plan_development_year,
s.plan_support_year + s.plan_development_year AS plan_total_year,
s.approved_support_q1, s.approved_support_q2, s.approved_support_q3, s.approved_support_q4, s.approved_support_year,
s.approved_development_q1, s.approved_development_q2, s.approved_development_q3, s.approved_development_q4, s.approved_development_year,
s.approved_support_year + s.approved_development_year AS approved_total_year,
s.fact_support_q1, s.fact_support_q2, s.fact_support_q3, s.fact_support_q4, s.fact_support_year,
s.fact_development_q1, s.fact_development_q2, s.fact_development_q3, s.fact_development_q4, s.fact_development_year,
s.fact_support_year + s.fact_development_year AS fact_total_year,
s.corrected_support_q2, s.corrected_support_q3, s.corrected_support_q4,
s.corrected_development_q2, s.corrected_development_q3, s.corrected_development_q4
FROM summed AS s;
$function$
;
-- =============================================================================
-- main_format — VIEW
-- =============================================================================
DROP VIEW IF EXISTS v3.v_main_format;
CREATE OR REPLACE VIEW v3.v_main_format AS
WITH unioned AS (
( SELECT f.year, f.section_code, f.name, f.plan_support_q1, f.plan_support_q2, f.plan_support_q3, f.plan_support_q4, f.plan_support_year, f.approved_support_q1, f.approved_support_q2, f.approved_support_q3, f.approved_support_q4, f.approved_support_year, f.fact_support_q1, f.fact_support_q2, f.fact_support_q3, f.fact_support_q4, f.fact_support_year, f.corrected_support_q2, f.corrected_support_q3, f.corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_1form_ssp AS f)
UNION ALL
( SELECT f.year, f.section_code, f.name, f.plan_support_q1, f.plan_support_q2, f.plan_support_q3, f.plan_support_q4, f.plan_support_year, f.approved_support_q1, f.approved_support_q2, f.approved_support_q3, f.approved_support_q4, f.approved_support_year, f.fact_support_q1, f.fact_support_q2, f.fact_support_q3, f.fact_support_q4, f.fact_support_year, f.corrected_support_q2, f.corrected_support_q3, f.corrected_support_q4, 0 AS plan_development_q1, 0 AS plan_development_q2, 0 AS plan_development_q3, 0 AS plan_development_q4, 0 AS plan_development_year, 0 AS approved_development_q1, 0 AS approved_development_q2, 0 AS approved_development_q3, 0 AS approved_development_q4, 0 AS approved_development_year, 0 AS fact_development_q1, 0 AS fact_development_q2, 0 AS fact_development_q3, 0 AS fact_development_q4, 0 AS fact_development_year, 0 AS corrected_development_q2, 0 AS corrected_development_q3, 0 AS corrected_development_q4
FROM v3.v_2form_rf_p AS f)
UNION ALL
( SELECT f.year, f.section_code, f.name, 0 AS plan_support_q1, 0 AS plan_support_q2, 0 AS plan_support_q3, 0 AS plan_support_q4, 0 AS plan_support_year, 0 AS approved_support_q1, 0 AS approved_support_q2, 0 AS approved_support_q3, 0 AS approved_support_q4, 0 AS approved_support_year, 0 AS fact_support_q1, 0 AS fact_support_q2, 0 AS fact_support_q3, 0 AS fact_support_q4, 0 AS fact_support_year, 0 AS corrected_support_q2, 0 AS corrected_support_q3, 0 AS corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_3form_rf_r AS f)
UNION ALL
( SELECT f.year, f.section_code, f.name, 0 AS plan_support_q1, 0 AS plan_support_q2, 0 AS plan_support_q3, 0 AS plan_support_q4, 0 AS plan_support_year, 0 AS approved_support_q1, 0 AS approved_support_q2, 0 AS approved_support_q3, 0 AS approved_support_q4, 0 AS approved_support_year, 0 AS fact_support_q1, 0 AS fact_support_q2, 0 AS fact_support_q3, 0 AS fact_support_q4, 0 AS fact_support_year, 0 AS corrected_support_q2, 0 AS corrected_support_q3, 0 AS corrected_support_q4, f.plan_development_q1, f.plan_development_q2, f.plan_development_q3, f.plan_development_q4, f.plan_development_year, f.approved_development_q1, f.approved_development_q2, f.approved_development_q3, f.approved_development_q4, f.approved_development_year, f.fact_development_q1, f.fact_development_q2, f.fact_development_q3, f.fact_development_q4, f.fact_development_year, f.corrected_development_q2, f.corrected_development_q3, f.corrected_development_q4
FROM v3.v_4form_project AS f)
),
summed AS (
SELECT
u.year, u.section_code, u.name,
SUM(u.plan_support_q1) AS plan_support_q1,
SUM(u.plan_support_q2) AS plan_support_q2,
SUM(u.plan_support_q3) AS plan_support_q3,
SUM(u.plan_support_q4) AS plan_support_q4,
SUM(u.plan_support_year) AS plan_support_year,
SUM(u.approved_support_q1) AS approved_support_q1,
SUM(u.approved_support_q2) AS approved_support_q2,
SUM(u.approved_support_q3) AS approved_support_q3,
SUM(u.approved_support_q4) AS approved_support_q4,
SUM(u.approved_support_year) AS approved_support_year,
SUM(u.fact_support_q1) AS fact_support_q1,
SUM(u.fact_support_q2) AS fact_support_q2,
SUM(u.fact_support_q3) AS fact_support_q3,
SUM(u.fact_support_q4) AS fact_support_q4,
SUM(u.fact_support_year) AS fact_support_year,
SUM(u.corrected_support_q2) AS corrected_support_q2,
SUM(u.corrected_support_q3) AS corrected_support_q3,
SUM(u.corrected_support_q4) AS corrected_support_q4,
SUM(u.plan_development_q1) AS plan_development_q1,
SUM(u.plan_development_q2) AS plan_development_q2,
SUM(u.plan_development_q3) AS plan_development_q3,
SUM(u.plan_development_q4) AS plan_development_q4,
SUM(u.plan_development_year) AS plan_development_year,
SUM(u.approved_development_q1) AS approved_development_q1,
SUM(u.approved_development_q2) AS approved_development_q2,
SUM(u.approved_development_q3) AS approved_development_q3,
SUM(u.approved_development_q4) AS approved_development_q4,
SUM(u.approved_development_year) AS approved_development_year,
SUM(u.fact_development_q1) AS fact_development_q1,
SUM(u.fact_development_q2) AS fact_development_q2,
SUM(u.fact_development_q3) AS fact_development_q3,
SUM(u.fact_development_q4) AS fact_development_q4,
SUM(u.fact_development_year) AS fact_development_year,
SUM(u.corrected_development_q2) AS corrected_development_q2,
SUM(u.corrected_development_q3) AS corrected_development_q3,
SUM(u.corrected_development_q4) AS corrected_development_q4
FROM unioned AS u
GROUP BY u.year, u.section_code, u.name
)
SELECT
r.year, r.section_code, r.name,
r.plan_support_q1, r.plan_support_q2, r.plan_support_q3, r.plan_support_q4, r.plan_support_year,
r.approved_support_q1, r.approved_support_q2, r.approved_support_q3, r.approved_support_q4, r.approved_support_year,
r.plan_support_year + r.plan_development_year AS plan_total_year,
r.fact_support_q1, r.fact_support_q2, r.fact_support_q3, r.fact_support_q4, r.fact_support_year,
r.corrected_support_q2, r.corrected_support_q3, r.corrected_support_q4, r.plan_development_q1, r.plan_development_q2,
r.approved_support_year + r.approved_development_year AS approved_total_year,
r.plan_development_q3, r.plan_development_q4, r.plan_development_year, r.approved_development_q1, r.approved_development_q2,
r.approved_development_q3, r.approved_development_q4, r.approved_development_year, r.fact_development_q1, r.fact_development_q2,
r.fact_support_year + r.fact_development_year AS fact_total_year,
r.fact_development_q3, r.fact_development_q4, r.fact_development_year,
r.corrected_development_q2, r.corrected_development_q3, r.corrected_development_q4
FROM summed AS r;
-- =============================================================================
-- СВОДНЫЙ VIEW ДЛЯ API — диспетчер по листам свода (аналог v_form_view)
-- Возвращает данные в том же виде, что и лист «смета» формы:
-- (row_type, depth, sort_order, data jsonb)
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_summary_view(integer, character varying, integer[]);
CREATE OR REPLACE FUNCTION v3.v_summary_view(
p_year integer,
p_sheet character varying,
p_org_unit_ids integer[] DEFAULT NULL
)
RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb)
LANGUAGE plpgsql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
BEGIN
-- ── 1форм_ССП (FORM_1) ──────────────────────────────────────────────────
IF p_sheet = 'FORM_1' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year),
'total_year', s.plan_total_year
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year),
'total_year', s.approved_total_year
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year),
'total_year', s.fact_total_year
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_1form_ssp(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 2форм_РФ_П (FORM_2, только Поддержка) ──────────────────────────────
IF p_sheet = 'FORM_2' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', NULL
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', NULL
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', NULL
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', NULL
)
)
FROM v3.v_2form_rf_p(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 3форм_РФ_Р (FORM_3, только Развитие) ───────────────────────────────
IF p_sheet = 'FORM_3' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year)
),
'approved', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year)
),
'fact', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year)
),
'corrected', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_3form_rf_r(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 4форм_ПРОЕКТ (FORM_4, только Развитие) ─────────────────────────────
IF p_sheet = 'FORM_4' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year)
),
'approved', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year)
),
'fact', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year)
),
'corrected', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.corrected_development_q1, 'q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4, 'year', s.corrected_development_year)
)
)
FROM v3.v_4form_project(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── main_format (консолидированный свод) ───────────────────────────────
IF p_sheet = 'MAIN' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year),
'total_year', s.plan_total_year
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year),
'total_year', s.approved_total_year
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year),
'total_year', s.fact_total_year
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_main_format(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
RAISE EXCEPTION 'Unknown summary sheet: %', p_sheet
USING HINT = 'Use FORM_1 / FORM_2 / FORM_3 / FORM_4 / MAIN';
END;
$function$;
-- =============================================================================
-- СВОДНЫЙ VIEW ДЛЯ API — диспетчер по листам свода (аналог v_form_view)
-- Возвращает данные в том же виде, что и лист «смета» формы:
-- (row_type, depth, sort_order, data jsonb)
-- =============================================================================
DROP FUNCTION IF EXISTS v3.v_summary_view(integer, character varying, integer[]);
CREATE OR REPLACE FUNCTION v3.v_summary_view(
p_year integer,
p_sheet character varying,
p_org_unit_ids integer[] DEFAULT NULL
)
RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb)
LANGUAGE plpgsql
STABLE
SET search_path TO 'v3', 'pg_catalog'
AS $function$
BEGIN
-- ── 1форм_ССП (FORM_1) ──────────────────────────────────────────────────
IF p_sheet = 'FORM_1' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year),
'total_year', s.plan_total_year
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year),
'total_year', s.approved_total_year
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year),
'total_year', s.fact_total_year
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_1form_ssp(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 2форм_РФ_П (FORM_2, только Поддержка) ──────────────────────────────
IF p_sheet = 'FORM_2' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', NULL
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', NULL
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', NULL
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', NULL
)
)
FROM v3.v_2form_rf_p(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 3форм_РФ_Р (FORM_3, только Развитие) ───────────────────────────────
IF p_sheet = 'FORM_3' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year)
),
'approved', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year)
),
'fact', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year)
),
'corrected', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_3form_rf_r(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── 4форм_ПРОЕКТ (FORM_4, только Развитие) ─────────────────────────────
IF p_sheet = 'FORM_4' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year)
),
'approved', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year)
),
'fact', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year)
),
'corrected', jsonb_build_object(
'support', NULL,
'development', jsonb_build_object('q1', s.corrected_development_q1, 'q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4, 'year', s.corrected_development_year)
)
)
FROM v3.v_4form_project(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
-- ── main_format (консолидированный свод) ───────────────────────────────
IF p_sheet = 'MAIN' THEN
RETURN QUERY
SELECT
(CASE t.depth WHEN 0 THEN 'ROOT' WHEN 1 THEN 'GROUP' ELSE 'ITEM' END)::character varying,
t.depth,
ROW_NUMBER() OVER (ORDER BY t.item_id),
jsonb_build_object(
'section_code', s.section_code,
'name', s.name,
'plan', jsonb_build_object(
'support', jsonb_build_object('q1', s.plan_support_q1, 'q2', s.plan_support_q2, 'q3', s.plan_support_q3, 'q4', s.plan_support_q4, 'year', s.plan_support_year),
'development', jsonb_build_object('q1', s.plan_development_q1, 'q2', s.plan_development_q2, 'q3', s.plan_development_q3, 'q4', s.plan_development_q4, 'year', s.plan_development_year),
'total_year', s.plan_total_year
),
'approved', jsonb_build_object(
'support', jsonb_build_object('q1', s.approved_support_q1, 'q2', s.approved_support_q2, 'q3', s.approved_support_q3, 'q4', s.approved_support_q4, 'year', s.approved_support_year),
'development', jsonb_build_object('q1', s.approved_development_q1, 'q2', s.approved_development_q2, 'q3', s.approved_development_q3, 'q4', s.approved_development_q4, 'year', s.approved_development_year),
'total_year', s.approved_total_year
),
'fact', jsonb_build_object(
'support', jsonb_build_object('q1', s.fact_support_q1, 'q2', s.fact_support_q2, 'q3', s.fact_support_q3, 'q4', s.fact_support_q4, 'year', s.fact_support_year),
'development', jsonb_build_object('q1', s.fact_development_q1, 'q2', s.fact_development_q2, 'q3', s.fact_development_q3, 'q4', s.fact_development_q4, 'year', s.fact_development_year),
'total_year', s.fact_total_year
),
'corrected', jsonb_build_object(
'support', jsonb_build_object('q2', s.corrected_support_q2, 'q3', s.corrected_support_q3, 'q4', s.corrected_support_q4),
'development', jsonb_build_object('q2', s.corrected_development_q2, 'q3', s.corrected_development_q3, 'q4', s.corrected_development_q4)
)
)
FROM v3.v_main_format(p_year, p_org_unit_ids) s
JOIN v3.mv_expense_item_tree t ON t.item_id = s.section_code AND t.depth < 3;
RETURN;
END IF;
RAISE EXCEPTION 'Unknown summary sheet: %', p_sheet
USING HINT = 'Use FORM_1 / FORM_2 / FORM_3 / FORM_4 / MAIN';
END;
$function$;