Проблема

Счета по умолчанию определяются не по правилам

Решение

1. Ознакомьтесь с документацией Счета по умолчанию
2. Выполните скрипты для отладки 



Протоколирование механизма
Протокол работы фильтров

Для включения логирования необходимо настроить PUB_SETUP:

  • PUBLIC_DEBUG_TRACE_DEFAULT_ACC = TRUE
  • LOGGER_LOG_LEVEL = 0

Протокол работы фильтров находится в общем протоколе. Посмотреть его можно в Kibana или непосредственно SQL-запросом.

Информация о сделке пишется в протокол в любом случае, вне зависимости от того, была ли она зарегистрирована.

В протоколе идет указание на каждый фильтр, каждый счет фильтра и на каждую обработанную сущность. Как только сущность не подпадает под условия фильтра, счет считается не подошедшим, и в протокол добавляется соответствующая запись. Если у тредейра нет прав на соответствующий счет, он не попадает в фильтр поиска и в протоколе не отображается. 

  • ENTITY_ID - сущность которая проверяется.
  • VALUE - переданное значение сущности.
  • FILTERVALUE - значение сущности указанное в фильтре. 

Пример протокола из SQL-запроса:


Пример SQL запроса

Запрос протокола в SQL

SELECT d.xmldata.getclobval(),
d.event_time,
  XT.VLEVEL,
  xt.vcategory ,
  d.id ,
  XT.VRECORD_ID ,
  NVL(NVL(
  ( SELECT username FROM t_users u WHERE id=XT.USER_ID AND rownum=1
  ), XT.VUSER), XT.DBUSER) AS username ,
  XT.USER_ID USER_ID ,
  XT.IP IP ,
  XT.APP_NAME ,
  XT.DBUSER ,
  XT.MESS
FROM resman.tbl_log_data d,
  XMLTABLE('/root' passing d.xmldata columns VLEVEL VARCHAR2(32) path 'level' ,VRECORD_ID VARCHAR2(32) path 'fields/record_id' ,VCATEGORY VARCHAR2(32) path 'fields/category' ,VUSER VARCHAR2(128) path 'fields/user' ,APP_NAME VARCHAR2(128) path 'app_name' ,USER_ID VARCHAR2(128) path 'user_id' ,IP VARCHAR2(128) path 'app_ip' ,DBUSER VARCHAR2(128) path 'fields/db/user' ,MESS VARCHAR2(2000) path 'message' ) xt
WHERE  VCATEGORY = 'ACCOUNTS_DEFAULT' and trunc(event_time) = trunc(sysdate) 
order by id desc;

Запрос сущности указанной в ENTITY_ID 

SELECT a.id, a.aliase, a.name, a.vsql, a.isbitmask, a.columntype,
       a.description
  FROM accnts_default_ent a where id=1

Параметры PUB_SETUP

select * from pub_setup where parameter_code in ('PUBLIC_DEBUG_TRACE_DEFAULT_ACC','LOGGER_LOG_LEVEL');


Глубокая отладка

После отработки запроса счета в пакетные переменные будут записаны указанные параметры. 

-- последний сработавший фильтр 
-- (можно использовать это значение где-то для своих протоколов)
   pkg_def_accnt_lastfilter number;  
-- последняя сработавшая запись фильтра
   pkg_def_accnt_lasthead_id number;


В привычной для разработчика среде можно выполнить запрос, который выведет номер фильтра, запись внутри фильтра и найденный счёт.

Например, предположим, что нас интересует

  • сделка Reuters FxSpot, 
  • на филиале с идентификатором 1, 
  • трейдер с идентификатором 1. 

Чтобы узнать, из какого фильтра взялся расчётный счёт для платежа в российских рублях, следует выполнить следующий код:

DECLARE
    v_account_id   INTEGER;
BEGIN
    pkg_accnt_default.def_acc_get_clear;
    pkg_accnt_default.def_acc_get_set_value ('product_id', pkg_products.fx_id);
    pkg_accnt_default.def_acc_get_set_value ('filial_id', 1);
    pkg_accnt_default.def_acc_get_set_value ('trader_id', 1);
    pkg_accnt_default.def_acc_get_set_value ('ext_system_id', 1);
    v_account_id   := pkg_accnt_default.def_acc_get_get_accnt (2, f_ccy_instrument ('RUB'), 'True', 1);
    zzz_ex ('account id = ' || v_account_id
           ,'filter_id = ' || pkg_accnt_default.pkg_def_accnt_lastfilter
           ,'head_id = ' || pkg_accnt_default.pkg_def_accnt_lasthead_id);
END;
/

Похожие статьи