From 56efa9266c0403aa7ecb7bdff59f3364f12fcb0d Mon Sep 17 00:00:00 2001 From: fontvielle Date: Mon, 26 Oct 2026 15:34:16 +0300 Subject: [PATCH] =?UTF-8?q?DEPO:=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8=20M2M=20=E2=80=94=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=20?= =?UTF-8?q?=D0=B8=20=D0=B4=D0=B0=D1=82=D0=B0=20=D0=BE=D1=82=D1=87=D1=91?= =?UTF-8?q?=D1=82=D0=B0=20=D0=9D=D0=A0=D0=94=20(=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=B0=2024.10=20=D1=81=20=D0=B1=D0=BE=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FTV_M2M_PROCESS_OPERATION: B_NUM/B_DATE операции зачисления/списания берутся из PARAMETERS события BJ_ORDER_ACCEPTED («<номер> от <дд.мм.гггг>», отчёт НРД), а не из M2M-поручения; комментарий операции без «Отчет НКО АО НРД …». Текст снят с тестовой DEPO (там та же правка 24.10 00:04, на боевой — 24.10 00:02; логину bj текст на боевой не виден). Без переноса повторная установка процедур из bj вернула бы старый текст. Firebird-версия — та же правка; прогон на заглушках: изменилось только основание и комментарий. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- .../fancy-m2m-firebird/10_FTV_M2M_PROCS.sql | 23 +++++++++++-------- deploy/depo/fancy-m2m-firebird/README.md | 2 +- deploy/depo/fancy-m2m-firebird/test/smoke.sql | 2 +- .../fancy-m2m/FTV_M2M_PROCESS_OPERATION.sql | 16 ++++++++----- deploy/depo/fancy-m2m/README.md | 5 ++++ internal/lkgateway/depo_procs.go | 3 ++- .../depoprocs/FTV_M2M_PROCESS_OPERATION.sql | 16 ++++++++----- 7 files changed, 42 insertions(+), 25 deletions(-) diff --git a/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql b/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql index 0f686f6..e69ddf0 100644 --- a/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql +++ b/deploy/depo/fancy-m2m-firebird/10_FTV_M2M_PROCS.sql @@ -1,5 +1,5 @@ /* Bridge&Join — процедуры обработки M2M для Fancy DEPO на Firebird 2.5. - Перенос процедур MSSQL-версии (Фонтвьель, тексты от 22.10.2026) на PSQL. Логика та же; отличия: + Перенос процедур MSSQL-версии (Фонтвьель, тексты от 22.10.2026, OPERATION — от 24.10.2026) на PSQL. Логика та же; отличия: - raiserror → FTV_M2M_FAIL: текст причины кладётся в контекст транзакции и поднимается исключение FTV_M2M_ERROR; FTV_M2M_JOB пишет этот текст в COMMENT (в Firebird 2.5 текст исключения в WHEN не доступен; контекст возвращает строку без кодировки — приводится к WIN1251, кодировке базы Fancy); @@ -207,38 +207,41 @@ BEGIN INSERT INTO OD_DOCS (ID, NUM, PARAM, D_CAT, D_DATE, STATE, DIRECTION, WHOS, KVIT) VALUES (:OPER_ID, :NUM, NULL, :D_CAT, :OPER_DATE, 0, 0, :WHOS, :CLISER_ID); + /* Отчёт НРД из PARAMETERS — «<номер отчёта> от <дд.мм.гггг>»: номер — до первого пробела, дата — после + последнего. Основание операции (B_NUM, B_DATE) и входящая запись — по отчёту НРД, а не по M2M-поручению + (MSSQL-версия, правка программиста 24.10.2026). */ + P = TRIM(PARAMETERS); + REP_NUM = LEFT(P, POSITION(' ' IN P || ' ') - 1); + REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS DATE); + IF (DIRECTION = 'IN') THEN BEGIN - CMT = 'Отчет НКО АО НРД ' || COALESCE(PARAMETERS, '') || '. Перевод M2M (без поручения), GUID ' || GUID || ', референс ' || REFERENCE; + CMT = 'Перевод M2M (без поручения), GUID ' || GUID || ', референс ' || REFERENCE; INSERT INTO U_OP_INV_ZACH (DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET, CONDITION, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT") VALUES (:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET, - NULL, NULL, NULL, :B_TYPE, :CLISER_DATE, :CLISER_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); + NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); END ELSE IF (DIRECTION = 'OUT') THEN BEGIN - CMT = 'Отчет НКО АО НРД ' || COALESCE(PARAMETERS, '') || '. Перевод M2M, GUID ' || GUID || ', референс ' || REFERENCE; + CMT = 'Перевод M2M, GUID ' || GUID || ', референс ' || REFERENCE; INSERT INTO U_OP_INV_SPIS (DOC, DD_TYPE, DD_DATE, DD_NUM, SHARE, AMOUNT, BLANKS, PLACE, D_NUM, DEPO, K_NUM, MARKET, OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, B_DATE, B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, REJECT_REASON, "COMMENT") VALUES (:OPER_ID, 1 /* клиентское */, :DD_DATE, :DD_NUM, :SHARE, :AMOUNT, NULL, :PLACE, :ACC_D, :CLIENT, :ACC_K, :MARKET, - NULL, NULL, NULL, :B_TYPE, :CLISER_DATE, :CLISER_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); + NULL, NULL, NULL, :B_TYPE, :REP_DATE, :REP_NUM, :OPER_DATE, :OPER_DATE, :OPER_DATE, 0, :FACE, NULL, :CMT); END - /* Входящая запись (отчёт НРД). PARAMETERS — «<номер отчёта> от <дд.мм.гггг>»: номер — до первого пробела, - дата — после последнего. */ + /* Входящая запись (отчёт НРД) */ FILER_ID = GEN_ID(OD_DOC_ID_GEN, 1); FILER_DATE = CURRENT_TIMESTAMP; EXECUTE PROCEDURE FU_NEXT_DOC_NUM ('D_FILER', :FILER_DATE, 1, :FILER_ID) RETURNING_VALUES :FILER_NUM, :NEW_DATE; INSERT INTO OD_DOCS (ID, NUM, D_CAT, D_DATE, STATE, DIRECTION, WHOS) VALUES (:FILER_ID, :FILER_NUM, :FILER_CAT, :FILER_DATE, 2, 1, :WHOS); - P = TRIM(PARAMETERS); - REP_NUM = LEFT(P, POSITION(' ' IN P || ' ') - 1); - REP_DATE = CAST(RIGHT(P, POSITION(' ' IN REVERSE(P)) - 1) AS DATE); INSERT INTO D_FILER (DOC, PASS_KIND, RUBRICA, "COMMENT", DOC_NUM, DOC_DATE, CORR_FACE, FUND, ACCOUNT, PLACE, ORI_DATE, CHILD_CAT, MESS) VALUES (:FILER_ID, 8, :RUBRICA, 'Отчет (перевод через MOEX-МОСТ)', :REP_NUM, :REP_DATE, :CORR_FACE, :FACE, :CLIENT, :PLACE, :FILER_DATE, NULL, 'MS010 / ' || :GUID || ' / ' || :REFERENCE); diff --git a/deploy/depo/fancy-m2m-firebird/README.md b/deploy/depo/fancy-m2m-firebird/README.md index f473a60..46c9cdf 100644 --- a/deploy/depo/fancy-m2m-firebird/README.md +++ b/deploy/depo/fancy-m2m-firebird/README.md @@ -1,7 +1,7 @@ # Обмен M2M с Fancy DEPO на Firebird 2.5 Перенос трансферных таблиц и процедур обработки MSSQL-версии (`deploy/depo/fancy-m2m`, Фонтвьель, тексты от -22.10.2026) на Firebird 2.5. Логика процедур та же; отличия перечислены в шапке `10_FTV_M2M_PROCS.sql`. +22.10.2026, `FTV_M2M_PROCESS_OPERATION` — от 24.10.2026) на Firebird 2.5. Логика процедур та же; отличия перечислены в шапке `10_FTV_M2M_PROCS.sql`. | Файл | Что делает | |---|---| diff --git a/deploy/depo/fancy-m2m-firebird/test/smoke.sql b/deploy/depo/fancy-m2m-firebird/test/smoke.sql index 72f3d51..a9f3963 100644 --- a/deploy/depo/fancy-m2m-firebird/test/smoke.sql +++ b/deploy/depo/fancy-m2m-firebird/test/smoke.sql @@ -41,7 +41,7 @@ SELECT ID, GUID, STATE, DOC, CONTRAGENT, DEPONENT, CAST("COMMENT" AS VARCHAR(300 SELECT ID, STATE, DOC, DOL, SHARE, PLACE, DEPO FROM FTV_M2M_LINES; SELECT ID, EVENT_TYPE, STATE, CAST("COMMENT" AS VARCHAR(600)) C FROM FTV_M2M_EVENTS; SELECT ID, NUM, D_CAT, STATE, KVIT, WHOS FROM OD_DOCS ORDER BY ID; -SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, CAST("COMMENT" AS VARCHAR(300)) C FROM U_OP_INV_ZACH; +SELECT DOC, D_NUM, K_NUM, MARKET, B_TYPE, B_NUM, B_DATE, CAST("COMMENT" AS VARCHAR(300)) C FROM U_OP_INV_ZACH; SELECT DOC, RUBRICA, DOC_NUM, DOC_DATE, CORR_FACE, MESS FROM D_FILER; SELECT DOC, CAST("COMMENT" AS VARCHAR(300)) C, CAST(DO_ING AS VARCHAR(100)) D FROM OD_INVALIDS; SELECT CODE, CODER, FACE FROM OD_FACE_CODERS; diff --git a/deploy/depo/fancy-m2m/FTV_M2M_PROCESS_OPERATION.sql b/deploy/depo/fancy-m2m/FTV_M2M_PROCESS_OPERATION.sql index 3f26ffe..d33ac40 100644 --- a/deploy/depo/fancy-m2m/FTV_M2M_PROCESS_OPERATION.sql +++ b/deploy/depo/fancy-m2m/FTV_M2M_PROCESS_OPERATION.sql @@ -96,7 +96,8 @@ if @DIRECTION = 'IN' begin MARKET, CONDITION, IS_REG, TAX_R, B_TYPE, - B_DATE, B_NUM, + B_DATE, + B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, @@ -116,12 +117,13 @@ if @DIRECTION = 'IN' begin 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ - @CLISER_DATE, @CLISER_NUM, + CONVERT(DATE, SUBSTRING(@PARAMETERS, LEN(@PARAMETERS) - CHARINDEX(' ', REVERSE(@PARAMETERS) + ' ') + 2, LEN(@PARAMETERS)), 103), + SUBSTRING(@PARAMETERS, 1, CHARINDEX(' ', @PARAMETERS + ' ') - 1), @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, - 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE + 'Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end @@ -140,7 +142,8 @@ if @DIRECTION = 'OUT' begin MARKET, OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, - B_DATE, B_NUM, + B_DATE, + B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, @@ -160,12 +163,13 @@ if @DIRECTION = 'OUT' begin 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ - @CLISER_DATE, @CLISER_NUM, + CONVERT(DATE, SUBSTRING(@PARAMETERS, LEN(@PARAMETERS) - CHARINDEX(' ', REVERSE(@PARAMETERS) + ' ') + 2, LEN(@PARAMETERS)), 103), + SUBSTRING(@PARAMETERS, 1, CHARINDEX(' ', @PARAMETERS + ' ') - 1), @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, - 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE + 'Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end; diff --git a/deploy/depo/fancy-m2m/README.md b/deploy/depo/fancy-m2m/README.md index 490fa0e..ca1b4c7 100644 --- a/deploy/depo/fancy-m2m/README.md +++ b/deploy/depo/fancy-m2m/README.md @@ -14,6 +14,11 @@ - `FTV_M2M_PROCESS_OPERATION`, `FTV_M2M_PROCESS_WIRING` — служебные. - `FTV_M2M_UPDATE_HANDBOOK @COMMENT out` — справочник участников M2M (`FTV_M2M_HANDBOOK`, его пишет bj) → юрлица и кодеры Fancy (`OD_FACES`, `OD_FACE_CODERS`, кодер `MNEM='M2M'`); вызывается из EVENTS по событию HANDBOOK. - 22.10.2026: в OPERATION счёт ностро `313` (98010 — ведущий депозитарий, «НОСТРО депо базовый») вместо прежнего `314`. +- 24.10.2026 (правка программиста на боевой и тестовой DEPO, перенесена сюда 26.10): в OPERATION основание операции + «Отчёт депозитария» (`B_NUM`, `B_DATE` в `U_OP_INV_ZACH/SPIS`) — номер и дата отчёта НРД из `@PARAMETERS` + («<номер> от <дд.мм.гггг>», событие `BJ_ORDER_ACCEPTED`), а не номер и дата M2M-поручения; комментарий операции — + без «Отчет НКО АО НРД <номер> от <дата>.». Без даты в `@PARAMETERS` операция не создаётся (ошибка преобразования + даты) — как и раньше во входящей записи `D_FILER`. ## От чего зависит на стороне Fancy (должно быть в DEPO клиента) Таблицы поставки Fancy с поддержкой M2M (у Фонтвьель появились 25.08.2026): `D_CLISER_M2M`, `D_CLISER_M2M_DOL`, `OD_M2M_ACCS`, diff --git a/internal/lkgateway/depo_procs.go b/internal/lkgateway/depo_procs.go index 876e786..0f24db3 100644 --- a/internal/lkgateway/depo_procs.go +++ b/internal/lkgateway/depo_procs.go @@ -6,7 +6,8 @@ package lkgateway // Процедуры встроены в bj (internal/lkgateway/depoprocs/*.sql), порядок установки — // WIRING → OPERATION → UPDATE_HANDBOOK → EVENTS → CREATE → JOB; затем GRANT EXECUTE логину bj. // Тексты — с тестовой DEPO Фонтвьель на 22.10.2026 (правки программиста 09–21.10; EVENTS вызывает -// UPDATE_HANDBOOK — без неё обработка событий падает). +// UPDATE_HANDBOOK — без неё обработка событий падает); OPERATION — на 24.10.2026 (основание операции — +// номер и дата отчёта НРД из PARAMETERS; программист внёс на боевой и тестовой DEPO). import ( "context" diff --git a/internal/lkgateway/depoprocs/FTV_M2M_PROCESS_OPERATION.sql b/internal/lkgateway/depoprocs/FTV_M2M_PROCESS_OPERATION.sql index 3f26ffe..d33ac40 100644 --- a/internal/lkgateway/depoprocs/FTV_M2M_PROCESS_OPERATION.sql +++ b/internal/lkgateway/depoprocs/FTV_M2M_PROCESS_OPERATION.sql @@ -96,7 +96,8 @@ if @DIRECTION = 'IN' begin MARKET, CONDITION, IS_REG, TAX_R, B_TYPE, - B_DATE, B_NUM, + B_DATE, + B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, @@ -116,12 +117,13 @@ if @DIRECTION = 'IN' begin 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ - @CLISER_DATE, @CLISER_NUM, + CONVERT(DATE, SUBSTRING(@PARAMETERS, LEN(@PARAMETERS) - CHARINDEX(' ', REVERSE(@PARAMETERS) + ' ') + 2, LEN(@PARAMETERS)), 103), + SUBSTRING(@PARAMETERS, 1, CHARINDEX(' ', @PARAMETERS + ' ') - 1), @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, - 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE + 'Перевод M2M (без поручения), GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end @@ -140,7 +142,8 @@ if @DIRECTION = 'OUT' begin MARKET, OLD_CONDITIONS, IS_REG, TAX_R, B_TYPE, - B_DATE, B_NUM, + B_DATE, + B_NUM, WIR_DATE, NOTIFY_DATE, REG_DATE, IS_BLOCK, FROM_FACE, @@ -160,12 +163,13 @@ if @DIRECTION = 'OUT' begin 8106, /*ММВБ - ПАО Московская Биржа*/ null, null, null, 31, /*Отчет депозитария*/ - @CLISER_DATE, @CLISER_NUM, + CONVERT(DATE, SUBSTRING(@PARAMETERS, LEN(@PARAMETERS) - CHARINDEX(' ', REVERSE(@PARAMETERS) + ' ') + 2, LEN(@PARAMETERS)), 103), + SUBSTRING(@PARAMETERS, 1, CHARINDEX(' ', @PARAMETERS + ' ') - 1), @OPER_DATE, @OPER_DATE, @OPER_DATE, 0, @FACE, null, - 'Отчет НКО АО НРД ' + @PARAMETERS + '. Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE + 'Перевод M2M, GUID ' + cast(@GUID as varchar(36)) + ', референс ' + @REFERENCE ); end;