Merge pull request 'fix-columns: добавил комментарий, строки из Лимита не удаляются' (#179) from fix-columns into test
Reviewed-on: #179
This commit is contained in:
commit
cd2882dd61
15
api/alembic/versions/0040_ahr_limit_delete_guard.py
Normal file
15
api/alembic/versions/0040_ahr_limit_delete_guard.py
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
from sql_migration import run_sql_file_migration
|
||||||
|
|
||||||
|
|
||||||
|
revision = "0040"
|
||||||
|
down_revision = "0039"
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
run_sql_file_migration("0040_ahr_limit_delete_guard.sql")
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
pass
|
||||||
145
api/alembic/versions/sql/0040_ahr_limit_delete_guard.sql
Normal file
145
api/alembic/versions/sql/0040_ahr_limit_delete_guard.sql
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION v3.del_budget_line(p_id integer, p_direction character varying DEFAULT NULL::character varying, p_sheet character varying DEFAULT NULL::character varying)
|
||||||
|
RETURNS TABLE(row_type character varying, depth integer, sort_order bigint, data jsonb)
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $function$
|
||||||
|
DECLARE
|
||||||
|
v_form_id INT;
|
||||||
|
v_org_id INT;
|
||||||
|
v_sheet VARCHAR;
|
||||||
|
v_sat_table TEXT;
|
||||||
|
v_eid INT;
|
||||||
|
v_line_id INT;
|
||||||
|
v_ei_path INT[];
|
||||||
|
BEGIN
|
||||||
|
IF p_sheet IN ('AHR_RENT','AHR_UTILITY','AHR_SECURITY') THEN
|
||||||
|
v_sat_table := CASE p_sheet
|
||||||
|
WHEN 'AHR_RENT' THEN 'rent_detail'
|
||||||
|
WHEN 'AHR_UTILITY' THEN 'utility_detail'
|
||||||
|
WHEN 'AHR_SECURITY' THEN 'security_detail'
|
||||||
|
END;
|
||||||
|
|
||||||
|
EXECUTE format(
|
||||||
|
'SELECT bl.budget_form_id FROM v3.%I s
|
||||||
|
JOIN v3.budget_line bl ON bl.id = s.line_id
|
||||||
|
WHERE s.id = $1', v_sat_table
|
||||||
|
) USING p_id INTO v_form_id;
|
||||||
|
|
||||||
|
IF v_form_id IS NULL THEN
|
||||||
|
RAISE EXCEPTION '%.id=% не существует', v_sat_table, p_id;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT m.target_line_id
|
||||||
|
INTO v_line_id
|
||||||
|
FROM v3.form2_ahr_satellite_line_source m
|
||||||
|
WHERE m.source_sheet = p_sheet
|
||||||
|
AND m.source_id = p_id;
|
||||||
|
|
||||||
|
EXECUTE format('DELETE FROM v3.%I WHERE id = $1', v_sat_table) USING p_id;
|
||||||
|
|
||||||
|
IF v_line_id IS NOT NULL THEN
|
||||||
|
SELECT bl.expense_item_id
|
||||||
|
INTO v_eid
|
||||||
|
FROM v3.budget_line bl
|
||||||
|
WHERE bl.id = v_line_id;
|
||||||
|
|
||||||
|
DELETE FROM v3.plan WHERE line_id = v_line_id;
|
||||||
|
DELETE FROM v3.budget_line_quarter WHERE line_id = v_line_id;
|
||||||
|
DELETE FROM v3.budget_line WHERE id = v_line_id;
|
||||||
|
|
||||||
|
SELECT org_unit_id INTO v_org_id FROM v3.budget_form WHERE id = v_form_id;
|
||||||
|
|
||||||
|
PERFORM v3.log_event(
|
||||||
|
'ROW_DELETE', 'ROW',
|
||||||
|
jsonb_build_object(
|
||||||
|
'sheet', 'AHR',
|
||||||
|
'line_id', v_line_id,
|
||||||
|
'entity_id', v_line_id,
|
||||||
|
'expense_item_id', v_eid,
|
||||||
|
'direction', 'Support',
|
||||||
|
'source_sheet', p_sheet,
|
||||||
|
'source_id', p_id
|
||||||
|
),
|
||||||
|
v_form_id, NULL, v_org_id
|
||||||
|
);
|
||||||
|
END IF;
|
||||||
|
RETURN;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT bl.budget_form_id, ei.sheet, bl.expense_item_id
|
||||||
|
INTO v_form_id, v_sheet, v_eid
|
||||||
|
FROM v3.budget_line bl
|
||||||
|
JOIN v3.expense_item ei ON ei.id = bl.expense_item_id
|
||||||
|
WHERE bl.id = p_id;
|
||||||
|
|
||||||
|
IF v_form_id IS NULL THEN
|
||||||
|
RAISE EXCEPTION 'budget_line id=% не существует', p_id;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
IF v_sheet = 'AHR' AND (
|
||||||
|
EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM v3.form2_ahr_satellite_line_source m
|
||||||
|
WHERE m.target_line_id = p_id
|
||||||
|
)
|
||||||
|
OR EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM v3.budget_line bl
|
||||||
|
JOIN v3.expense_item ei ON ei.id = bl.expense_item_id
|
||||||
|
JOIN v3.limit_template lt
|
||||||
|
ON lt.row_type = 'LEAF'
|
||||||
|
AND (
|
||||||
|
(ei.depth = 3 AND ei.item_id = lt.expense_item_code)
|
||||||
|
OR ei.num_group_id = lt.expense_item_code
|
||||||
|
)
|
||||||
|
WHERE bl.id = p_id
|
||||||
|
AND bl.budget_form_id = v_form_id
|
||||||
|
AND ei.sheet = 'AHR'
|
||||||
|
AND ei.direction = 'Support'
|
||||||
|
)
|
||||||
|
) THEN
|
||||||
|
RAISE EXCEPTION 'Строку АХР, созданную из листа-сателлита или АХР Лимиты, нельзя удалить напрямую'
|
||||||
|
USING ERRCODE = '23503',
|
||||||
|
HINT = 'Удалите строку на исходном листе АХР Аренда / АХР Коммунальные услуги / АХР Безопасность либо измените строку на листе АХР Лимиты';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
v_ei_path := v3._expense_item_path_set(ARRAY[v_eid]);
|
||||||
|
|
||||||
|
DELETE FROM v3.plan WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.sequestration WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.reserve WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.allocation WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.contract_summary WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.collegial_approval WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.ckk WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.contract_detail WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.booking WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.budget_line_quarter WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.rent_detail WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.utility_detail WHERE line_id = p_id;
|
||||||
|
DELETE FROM v3.security_detail WHERE line_id = p_id;
|
||||||
|
|
||||||
|
DELETE FROM v3.budget_line WHERE id = p_id;
|
||||||
|
|
||||||
|
SELECT org_unit_id INTO v_org_id FROM v3.budget_form WHERE id = v_form_id;
|
||||||
|
|
||||||
|
PERFORM v3.log_event(
|
||||||
|
'ROW_DELETE', 'ROW',
|
||||||
|
jsonb_build_object(
|
||||||
|
'sheet', v_sheet,
|
||||||
|
'line_id', p_id,
|
||||||
|
'entity_id', p_id,
|
||||||
|
'expense_item_id', v_eid,
|
||||||
|
'direction', p_direction
|
||||||
|
),
|
||||||
|
v_form_id, NULL, v_org_id
|
||||||
|
);
|
||||||
|
|
||||||
|
RETURN QUERY
|
||||||
|
SELECT v.row_type, v.depth, v.sort_order, v.data
|
||||||
|
FROM v3.v_form_view(v_form_id, v_sheet, NULL, p_direction) v
|
||||||
|
WHERE v.row_type IN ('ROOT','GROUP','ITEM','SUB_ITEM')
|
||||||
|
AND (v.data->'header'->>'expense_item_id')::INT = ANY(v_ei_path)
|
||||||
|
ORDER BY v.sort_order;
|
||||||
|
END;
|
||||||
|
$function$;
|
||||||
|
|
||||||
@ -681,6 +681,10 @@ export const config = {
|
|||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.adj_reserve",
|
accessorKey: "data.q4.adj_reserve",
|
||||||
},
|
},
|
||||||
|
"data.q4.adj_comment": {
|
||||||
|
color_type: yellowColumn,
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
},
|
||||||
"data.q4.corrected_plan": {
|
"data.q4.corrected_plan": {
|
||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.corrected_plan",
|
accessorKey: "data.q4.corrected_plan",
|
||||||
@ -3663,6 +3667,25 @@ export const config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "Комментарий",
|
||||||
|
accessorKey: "4_kvartal_2026_adj_kommentariy",
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: "Сумма (без НДС)",
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
columnLetter: "GG",
|
||||||
|
size: 150,
|
||||||
|
filterFn: "contains",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
muiTableHeadCellProps: {
|
||||||
|
sx: {
|
||||||
|
backgroundColor: "#FFFF99",
|
||||||
|
color: "#000000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
header: "Скорректированный план 4 кв. {year:short}",
|
header: "Скорректированный план 4 кв. {year:short}",
|
||||||
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
||||||
|
|||||||
@ -681,6 +681,10 @@ export const config = {
|
|||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.adj_reserve",
|
accessorKey: "data.q4.adj_reserve",
|
||||||
},
|
},
|
||||||
|
"data.q4.adj_comment": {
|
||||||
|
color_type: yellowColumn,
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
},
|
||||||
"data.q4.corrected_plan": {
|
"data.q4.corrected_plan": {
|
||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.corrected_plan",
|
accessorKey: "data.q4.corrected_plan",
|
||||||
@ -3659,6 +3663,25 @@ export const config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "Комментарий",
|
||||||
|
accessorKey: "4_kvartal_2026_adj_kommentariy",
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: "Сумма (без НДС)",
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
columnLetter: "GG",
|
||||||
|
size: 150,
|
||||||
|
filterFn: "contains",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
muiTableHeadCellProps: {
|
||||||
|
sx: {
|
||||||
|
backgroundColor: "#FFFF99",
|
||||||
|
color: "#000000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
header: "Скорректированный план 4 кв. {year:short}",
|
header: "Скорректированный план 4 кв. {year:short}",
|
||||||
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
||||||
|
|||||||
@ -682,6 +682,10 @@ export const config = {
|
|||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.adj_reserve",
|
accessorKey: "data.q4.adj_reserve",
|
||||||
},
|
},
|
||||||
|
"data.q4.adj_comment": {
|
||||||
|
color_type: yellowColumn,
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
},
|
||||||
"data.q4.corrected_plan": {
|
"data.q4.corrected_plan": {
|
||||||
color_type: yellowColumn,
|
color_type: yellowColumn,
|
||||||
accessorKey: "data.q4.corrected_plan",
|
accessorKey: "data.q4.corrected_plan",
|
||||||
@ -3659,6 +3663,25 @@ export const config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "Комментарий",
|
||||||
|
accessorKey: "4_kvartal_2026_adj_kommentariy",
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: "Сумма (без НДС)",
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
columnLetter: "GG",
|
||||||
|
size: 150,
|
||||||
|
filterFn: "contains",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
muiTableHeadCellProps: {
|
||||||
|
sx: {
|
||||||
|
backgroundColor: "#FFFF99",
|
||||||
|
color: "#000000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
header: "Скорректированный план 4 кв. {year:short}",
|
header: "Скорректированный план 4 кв. {year:short}",
|
||||||
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
||||||
|
|||||||
@ -3571,13 +3571,6 @@ export const config = {
|
|||||||
size: 260,
|
size: 260,
|
||||||
filterFn: "contains",
|
filterFn: "contains",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
header: "Сумма, тыс. руб. (без НДС)",
|
|
||||||
accessorKey: "data.q4.adj_comment",
|
|
||||||
columnLetter: "GG",
|
|
||||||
size: 250,
|
|
||||||
filterFn: "contains",
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
muiTableHeadCellProps: {
|
muiTableHeadCellProps: {
|
||||||
sx: {
|
sx: {
|
||||||
@ -3688,6 +3681,25 @@ export const config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
header: "Комментарий",
|
||||||
|
accessorKey: "4_kvartal_2026_adj_kommentariy",
|
||||||
|
columns: [
|
||||||
|
{
|
||||||
|
header: "Сумма, тыс. руб. (без НДС)",
|
||||||
|
accessorKey: "data.q4.adj_comment",
|
||||||
|
columnLetter: "GG",
|
||||||
|
size: 250,
|
||||||
|
filterFn: "contains",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
muiTableHeadCellProps: {
|
||||||
|
sx: {
|
||||||
|
backgroundColor: "#FFFF66",
|
||||||
|
color: "#000000",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
header: "Скорректированный план 4 кв. {year:short}",
|
header: "Скорректированный план 4 кв. {year:short}",
|
||||||
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
accessorKey: "4_kvartal_2026_skorr_plan_4_kv_26",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user