forked from CITKParus/P8-Panels
2706 lines
156 KiB
SQL
2706 lines
156 KiB
SQL
create or replace package PKG_P8PANELS_CLNTTSKBRD as
|
||
|
||
/* Формирование набора данных с отобранными событиями */
|
||
procedure CLNEVENTS_LOAD
|
||
(
|
||
CFILTERS in clob, -- Фильтры
|
||
CORDERS in clob, -- Сортировки
|
||
NINCLUDE_ACCOUNTS in number := 1, -- Включать информацию о контрагентах с изображением (0 - нет, 1 - да)
|
||
COUT out clob -- Сериализованная таблица данных
|
||
);
|
||
|
||
/* Выбор события по рег. номеру */
|
||
procedure CLNEVENTS_SELECT
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
|
||
);
|
||
|
||
/* Считывание следующего номера события */
|
||
procedure CLNEVENTS_NEXTNUMB_GET
|
||
(
|
||
SPREFIX in varchar2, -- Префикс события
|
||
SEVENT_NUMB out varchar2 -- Номер события
|
||
);
|
||
|
||
/* Считывание параметров события */
|
||
procedure CLNEVENTS_GET
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
COUT out clob -- Данные о записи события
|
||
);
|
||
|
||
/* Инициализация параметров события */
|
||
procedure CLNEVENTS_INIT
|
||
(
|
||
SEVENT_TYPE in varchar2, -- Мнемокод типа события
|
||
SPREF out varchar2, -- Префикс события
|
||
SNUMB out varchar2, -- Номер события
|
||
SINIT_PERSON out varchar2, -- Сотрудник - инициатор
|
||
SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор
|
||
);
|
||
|
||
/* Добавление значений свойств документа */
|
||
procedure CLNEVENTS_PROPS_INSERT
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
SEVENT_TYPE in varchar2, -- Мнемокод типа события
|
||
CPROPS in clob -- Свойства документа
|
||
);
|
||
|
||
/* Добавление события */
|
||
procedure CLNEVENTS_INSERT
|
||
(
|
||
SCRN in varchar2, -- Наименование каталога
|
||
SPREF in varchar2, -- Префикс события
|
||
SNUMB in varchar2, -- Номер события
|
||
STYPE in varchar2, -- Тип события
|
||
SSTATUS in varchar2, -- Статус события
|
||
SPLAN_DATE in varchar2, -- Дата планируемого начала работ
|
||
SINIT_PERSON in varchar2, -- Инициатор
|
||
SCLIENT_CLIENT in varchar2, -- Клиент-инициатор
|
||
SCLIENT_PERSON in varchar2, -- Сотрудник-инициатор
|
||
SDESCRIPTION in varchar2, -- Описание
|
||
SREASON in varchar2, -- Причина
|
||
CPROPS in clob -- Свойства
|
||
);
|
||
|
||
/* Исправление события */
|
||
procedure CLNEVENTS_UPDATE
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
SCLIENT_CLIENT in varchar2, -- Клиент-инициатор
|
||
SCLIENT_PERSON in varchar2, -- Сотрудник-инициатор
|
||
SDESCRIPTION in varchar2, -- Описание
|
||
CPROPS in clob -- Свойства
|
||
);
|
||
|
||
/* Удаление события */
|
||
procedure CLNEVENTS_DELETE
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
);
|
||
|
||
/* Изменение статуса события */
|
||
procedure CLNEVENTS_STATE_CHANGE
|
||
(
|
||
NIDENT in out number, -- Рег. номер отмеченных записей
|
||
NSTEP in out number, -- Шаг выполнения (0-прекратить выполнение, 1,2..- номер шага)
|
||
NEVENT in out number, -- Событие, для отбора исполнителей
|
||
SEVENT_TYPE in out varchar2, -- Тип события, для отбора точек перехода и исполнителей
|
||
SEVENT_STAT in out varchar2, -- Cтатус события, текущий - для отбора точек перехода, следующий - для отбора исполнителей
|
||
SINIT_PERSON in out varchar2, -- Инициатор–сотрудник, для отбора исполнителей
|
||
SINIT_AUTHNAME in out varchar2, -- Инициатор–пользователь, для отбора исполнителей
|
||
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
|
||
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
|
||
NPOINT in out number, -- Текущая точка маршрута
|
||
NPASS in number, -- Точка перехода
|
||
NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя
|
||
SEXECUTEMETHOD out varchar2, -- Мнемокод метода
|
||
SSEND_CLIENT in varchar2, -- Направить – организация
|
||
SSEND_DIVISION in varchar2, -- Направить – подразделение
|
||
SSEND_POST in varchar2, -- Направить – должность
|
||
SSEND_PERFORM in varchar2, -- Направить – должность в подразделении
|
||
SSEND_PERSON in varchar2, -- Направить – сотрудник
|
||
SSEND_STAFFGRP in varchar2, -- Направить – нештатная структура
|
||
SSEND_USER_GROUP in varchar2, -- Направить – группа пользователей
|
||
SSEND_USER_NAME in varchar2, -- Направить – пользователь
|
||
NSEND_PREDEFINED_EXEC in number, -- Переадресация
|
||
NSEND_PREDEFINED_PROC in number, -- Процедура выбора предопределенного исполнителя
|
||
SNEXT_STAT in varchar2 := null, -- Следующий статус (при переносе события)
|
||
SNOTE_HEADER in varchar2 := null, -- Заголовок примечания (при наличии)
|
||
SNOTE in varchar2 := null -- Примечание (при наличии)
|
||
);
|
||
|
||
/* Переадресация события */
|
||
procedure CLNEVENTS_SEND
|
||
(
|
||
NIDENT in out number, -- Рег. номер отмеченных записей
|
||
NSTEP in out number, -- Шаг выполнения
|
||
NEVENT in out number, -- Событие, для отбора исполнителей
|
||
SEVENT_TYPE in out varchar2, -- Тип события, для отбора точек перехода и исполнителей
|
||
SEVENT_STAT in out varchar2, -- Текущий статус события, для отбора исполнителей
|
||
SINIT_PERSON in out varchar2, -- Инициатор–сотрудник, для отбора исполнителей
|
||
SINIT_AUTHNAME in out varchar2, -- Инициатор–пользователь, для отбора исполнителей
|
||
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
|
||
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
|
||
SEXECUTEMETHOD out varchar2, -- Мнемокод метода
|
||
SSEND_CLIENT in varchar2, -- Направить – организация
|
||
SSEND_DIVISION in varchar2, -- Направить – подразделение
|
||
SSEND_POST in varchar2, -- Направить – должность
|
||
SSEND_PERFORM in varchar2, -- Направить – должность в подразделении
|
||
SSEND_PERSON in out varchar2, -- Направить – сотрудник
|
||
SSEND_STAFFGRP in varchar2, -- Направить – нештатная структура
|
||
SSEND_USER_GROUP in varchar2, -- Направить – группа пользователей
|
||
SSEND_USER_NAME in out varchar2, -- Направить – пользователь
|
||
NSEND_PREDEFINED_EXEC in number, -- Переадресация
|
||
NSEND_PREDEFINED_PROC in number, -- Процедура выбора предопределенного исполнителя
|
||
SNOTE_HEADER in varchar2 := null, -- Заголовок примечания (при наличии)
|
||
SNOTE in varchar2 := null -- Примечание (при наличии)
|
||
);
|
||
|
||
/* Возврат в предыдущую точку события */
|
||
procedure CLNEVENTS_RETURN
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
);
|
||
|
||
/* Считывание маршрутов и исполнителей события */
|
||
procedure CLNEVENTS_GET_INFO_BY_CODE
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
);
|
||
|
||
/* Считывание учётных документов события */
|
||
procedure CLNEVENTS_DOCLINKS_GET
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
);
|
||
|
||
/* Считывание списка рег. номеров дочерних каталогов (включая основной) */
|
||
procedure CLNEVENTS_SUBCATALOGS_GET
|
||
(
|
||
SCRN_NAME in varchar2, -- Наименование каталога
|
||
NSUBCAT in number := 0, -- Признак включения подкаталогов (0 - нет, 1 - да)
|
||
SRESULT out varchar2 -- Список рег. номеров каталогов
|
||
);
|
||
|
||
/* Формирование условий отбора фильтра */
|
||
procedure CLNEVENTS_COND;
|
||
|
||
/* Считывание настройки раздела "События" для пользователя */
|
||
procedure CLNEVENTS_DP_RULES_GET
|
||
(
|
||
COUT out clob -- XML с настройкой раздела
|
||
);
|
||
|
||
/* Считывание свойств раздела "События" */
|
||
procedure CLNEVENTS_PROPS_GET
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML со свойствами раздела
|
||
);
|
||
|
||
/* Загрузка статусов типа события */
|
||
procedure CLNEVNSTATS_LOAD
|
||
(
|
||
SCLNEVNTYPES in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- Статусы типа события
|
||
);
|
||
|
||
end PKG_P8PANELS_CLNTTSKBRD;
|
||
/
|
||
create or replace package body PKG_P8PANELS_CLNTTSKBRD as
|
||
|
||
/* Константы - мнемокоды разделов */
|
||
SUNIT_CLNEVENTS constant PKG_STD.TSTRING := 'ClientEvents'; -- Раздел "События"
|
||
SUNIT_AGNLIST constant PKG_STD.TSTRING := 'AGNLIST'; -- Раздел "Контрагенты"
|
||
SUNIT_DP constant PKG_STD.TSTRING := 'DocsProperties'; -- Раздел "Свойства документов"
|
||
SSELECTLIST_ACTION constant PKG_STD.TSTRING := 'P8Panels'; -- Код действия для селектлиста
|
||
|
||
|
||
/* Константы - вспомогательные */
|
||
SDATE_PATTERN_HH_MI constant PKG_STD.TSTRING := 'dd.mm.yyyy hh24:mi'; -- Дата и время без секунд
|
||
|
||
/* Считывание префикса типа свойства документа */
|
||
function UTL_DP_PREF_TYPE_GET
|
||
(
|
||
NTYPE in number, -- Тип свойства документа
|
||
NSHORT in number := 1 -- Признак сокращенного префикса (0 - длинный "SDP", "NDP", "DDP", 1 - сокращенный "S", "N", "D")
|
||
) return varchar2 -- Префикс свойства документа
|
||
is
|
||
SRESULT PKG_STD.TSTRING; -- Префикс свойства документа
|
||
begin
|
||
/* Если требуется сокращенный */
|
||
if (NSHORT = 1) then
|
||
/* Тип строка */
|
||
case
|
||
/* Строка */
|
||
when (NTYPE = 0) then
|
||
SRESULT := 'S';
|
||
/* Число или время */
|
||
when ((NTYPE = 1) or (NTYPE = 3)) then
|
||
SRESULT := 'N';
|
||
/* Дата */
|
||
else
|
||
SRESULT := 'D';
|
||
end case;
|
||
else
|
||
/* Тип строка */
|
||
case
|
||
/* Строка */
|
||
when (NTYPE = 0) then
|
||
SRESULT := 'SDP';
|
||
/* Число или время */
|
||
when ((NTYPE = 1) or (NTYPE = 3)) then
|
||
SRESULT := 'NDP';
|
||
/* Дата */
|
||
else
|
||
SRESULT := 'DDP';
|
||
end case;
|
||
end if;
|
||
/* Возвращаем результат */
|
||
return SRESULT;
|
||
end UTL_DP_PREF_TYPE_GET;
|
||
|
||
/* Считывание отформатированного ID доп. свойства (формат "<SDP|NDP|DDP>_<РЕГ_НОМЕР>") */
|
||
function UTL_DP_FORMATTED_ID_GET
|
||
(
|
||
NTYPE in number, -- Тип свойства документа
|
||
NRN in number -- Рег. номер свойства документа
|
||
) return varchar2 -- Отформатированный ID (формат "<SDP|NDP|DDP>_<РЕГ_НОМЕР>")
|
||
is
|
||
begin
|
||
/* Возвращаем результат */
|
||
return UTL_DP_PREF_TYPE_GET(NTYPE => NTYPE, NSHORT => 0) || '_' || TO_CHAR(NRN);
|
||
end UTL_DP_FORMATTED_ID_GET;
|
||
|
||
/* Считывание записи события */
|
||
function UTL_CLNEVENTS_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
) return CLNEVENTS%rowtype -- Запись события
|
||
is
|
||
RRESULT CLNEVENTS%rowtype; -- Запись события
|
||
begin
|
||
/* Считываем событие */
|
||
begin
|
||
select T.*
|
||
into RRESULT
|
||
from CLNEVENTS T
|
||
where T.RN = NCLNEVENTS
|
||
and T.COMPANY = NCOMPANY;
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания записи события с рег. номером (%s).',
|
||
NCLNEVENTS);
|
||
end;
|
||
/* Возвращаем результат */
|
||
return RRESULT;
|
||
end UTL_CLNEVENTS_GET;
|
||
|
||
/* Считывание мнемокодов ссылок события */
|
||
procedure UTL_CLNEVENTS_JOINS_GET
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события,
|
||
STYPE out varchar2, -- Мнемокод типа события
|
||
SSTATUS out varchar2, -- Мнемокод статуса типа события
|
||
SINIT_PERSON out varchar2, -- Мнемокод инициатора сотрудника
|
||
SCLIENT_CLIENT out varchar2, -- Мнемокод клиента (организации)
|
||
SCLIENT_PERSON out varchar2, -- Мнемокод клиента (сотрудника)
|
||
SSEND_CLIENT out varchar2, -- Мнемокод направления (организация)
|
||
SSEND_DIVISION out varchar2, -- Мнемокод направления (подразделение)
|
||
SSEND_POST out varchar2, -- Мнемокод направления (должность)
|
||
SSEND_PERFORM out varchar2, -- Мнемокод направления (должность в подразделении)
|
||
SSEND_PERSON out varchar2, -- Мнемокод направления (сотрудник)
|
||
SSEND_STAFFGRP out varchar2, -- Мнемокод направления (нештатная структура)
|
||
SSEND_USER_GROUP out varchar2, -- Мнемокод направления (группа пользователей)
|
||
SSEND_USER_NAME out varchar2 -- Мнемокод направления (группа пользователь)
|
||
)
|
||
is
|
||
begin
|
||
/* Считываем все мнемокоды */
|
||
begin
|
||
select ET.EVNTYPE_CODE,
|
||
TS.EVNSTAT_CODE,
|
||
F_CLNPERSONS_FORMAT_CODE(IP.COMPANY, IP.CODE),
|
||
CC.CLIENT_CODE,
|
||
F_CLNPERSONS_FORMAT_CODE(CP.COMPANY, CP.CODE),
|
||
SC.CLIENT_CODE,
|
||
ID.CODE,
|
||
PS.CODE,
|
||
F_CLNPSDEP_FORMAT_CODE(PP.COMPANY, PP.CODE),
|
||
F_CLNPERSONS_FORMAT_CODE(SP.COMPANY, SP.CODE),
|
||
SG.CODE,
|
||
UG.CODE,
|
||
UL3.NAME
|
||
into STYPE,
|
||
SSTATUS,
|
||
SINIT_PERSON,
|
||
SCLIENT_CLIENT,
|
||
SCLIENT_PERSON,
|
||
SSEND_CLIENT,
|
||
SSEND_DIVISION,
|
||
SSEND_POST,
|
||
SSEND_PERFORM,
|
||
SSEND_PERSON,
|
||
SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP,
|
||
SSEND_USER_NAME
|
||
from CLNEVENTS T,
|
||
CLNEVNTYPES ET,
|
||
CLNEVNTYPSTS ES,
|
||
CLNEVNSTATS TS,
|
||
CLNPERSONS IP,
|
||
CLNCLIENTS CC,
|
||
CLNPERSONS CP,
|
||
CLNCLIENTS SC,
|
||
INS_DEPARTMENT ID,
|
||
CLNPOSTS PS,
|
||
CLNPSDEP PP,
|
||
CLNPERSONS SP,
|
||
FCSTAFFGRP SG,
|
||
USERGRP UG,
|
||
USERLIST UL3
|
||
where T.RN = NCLNEVENTS
|
||
and T.EVENT_TYPE = ET.RN
|
||
and T.EVENT_STAT = ES.RN
|
||
and ES.EVENT_STATUS = TS.RN
|
||
and T.INIT_PERSON = IP.RN(+)
|
||
and T.CLIENT_CLIENT = CC.RN(+)
|
||
and T.CLIENT_PERSON = CP.RN(+)
|
||
and T.SEND_CLIENT = SC.RN(+)
|
||
and T.SEND_DIVISION = ID.RN(+)
|
||
and T.SEND_POST = PS.RN(+)
|
||
and T.SEND_PERFORM = PP.RN(+)
|
||
and T.SEND_PERSON = SP.RN(+)
|
||
and T.SEND_STAFFGRP = SG.RN(+)
|
||
and T.SEND_USER_GROUP = UG.RN(+)
|
||
and T.SEND_USER_AUTHID = UL3.AUTHID(+);
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0, 'Ошибка считывания записи события с рег. номером (%s).', NCLNEVENTS);
|
||
end;
|
||
end UTL_CLNEVENTS_JOINS_GET;
|
||
|
||
/* Считывание наименования исполнителя события */
|
||
function UTL_CLNEVENTS_SENDER_GET
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
) return varchar2 -- Наименование исполнителя
|
||
is
|
||
SRESULT PKG_STD.TSTRING; -- Наименование исполнителя
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
NAGN_VER PKG_STD.TREF; -- Версия раздела "Контрагенты"
|
||
begin
|
||
/* Считываем версию организации */
|
||
FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => SUNIT_AGNLIST, NVERSION => NAGN_VER);
|
||
/* Считываем наименование исполнителя и аватар (если есть возможность) */
|
||
begin
|
||
select COALESCE(SC_A.AGNABBR,
|
||
ID.NAME,
|
||
PP.PSDEP_NAME,
|
||
PS.NAME,
|
||
SP_A.AGNABBR,
|
||
SG.NAME,
|
||
UG.NAME,
|
||
SUA.AGNABBR,
|
||
TA.AGNABBR)
|
||
into SRESULT
|
||
from CLNEVENTS T,
|
||
CLNCLIENTS SC,
|
||
AGNLIST SC_A,
|
||
INS_DEPARTMENT ID,
|
||
CLNPSDEP PP,
|
||
CLNPOSTS PS,
|
||
CLNPERSONS SP,
|
||
AGNLIST SP_A,
|
||
FCSTAFFGRP SG,
|
||
USERGRP UG,
|
||
AGNLIST TA,
|
||
AGNLIST SUA
|
||
where T.RN = NCLNEVENTS
|
||
and T.COMPANY = NCOMPANY
|
||
and T.SEND_CLIENT = SC.RN(+)
|
||
and SC.CLIENT_AGENT = SC_A.RN(+)
|
||
and T.SEND_DIVISION = ID.RN(+)
|
||
and T.SEND_PERFORM = PP.RN(+)
|
||
and T.SEND_POST = PS.RN(+)
|
||
and T.SEND_PERSON = SP.RN(+)
|
||
and SP.PERS_AGENT = SP_A.RN(+)
|
||
and T.SEND_STAFFGRP = SG.RN(+)
|
||
and T.SEND_USER_GROUP = UG.RN(+)
|
||
and (T.SEND_USER_AUTHID = SUA.PERS_AUTHID(+) and NAGN_VER = SUA.VERSION(+))
|
||
and (T.AUTHID = TA.PERS_AUTHID(+) and NAGN_VER = TA.VERSION(+));
|
||
exception
|
||
when others then
|
||
SRESULT := null;
|
||
end;
|
||
/* Возвращаем результат */
|
||
return SRESULT;
|
||
end UTL_CLNEVENTS_SENDER_GET;
|
||
|
||
/* Проверка возможности редактирования события в текущем статусе */
|
||
function UTL_CLNEVENTS_BAN_UPDATE_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
) return number -- Признак запрета исправления события в точке маршрута (0 - нет, 1 - да)
|
||
is
|
||
NRESULT PKG_STD.TNUMBER; -- Признак запрета исправления события в точке маршрута (0 - нет, 1 - да)
|
||
begin
|
||
/* Считываем событие */
|
||
begin
|
||
select EP.BAN_UPDATE
|
||
into NRESULT
|
||
from CLNEVENTS CE,
|
||
EVRTPOINTS EP
|
||
where CE.RN = NCLNEVENTS
|
||
and CE.COMPANY = NCOMPANY
|
||
and EP.EVENT_STATUS = CE.EVENT_STAT;
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания записи события с рег. номером (%s).',
|
||
NCLNEVENTS);
|
||
end;
|
||
/* Возвращаем результат */
|
||
return NRESULT;
|
||
end UTL_CLNEVENTS_BAN_UPDATE_GET;
|
||
|
||
/* Формирование блока запроса свойств документа и коллекций наименований/типов */
|
||
procedure UTL_CLNEVENTS_DP_QUERY_BLOCK
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
NCLNEVNTYPES in number, -- Рег. номер типа события
|
||
NQUERY_POS in number, -- Признак позиции блока в запросе (0 - блок находится в конце запроса, 1 - за блоком есть параметры)
|
||
CSQL out clob, -- Буфер для блока SQL
|
||
TDP_NAMES in out nocopy PKG_CONTVALLOC1S.TCONTAINER, -- Коллекция с наименованиями
|
||
TDP_TYPES in out nocopy PKG_CONTVALLOC1S.TCONTAINER -- Коллекция с типами данных
|
||
)
|
||
is
|
||
SDP_CODE PKG_STD.TSTRING; -- Код свойства документа
|
||
begin
|
||
/* Цикл по свойствам документа раздела */
|
||
for REC in (select CEP.PROPERTY,
|
||
DP.NAME,
|
||
DP.FORMAT
|
||
from CLEVTPROPS CEP,
|
||
DOCS_PROPS DP
|
||
where CEP.PRN = NCLNEVNTYPES
|
||
and CEP.COMPANY = NCOMPANY
|
||
and CEP.PROPERTY = DP.RN(+)
|
||
order by TO_CHAR(PROPERTY))
|
||
loop
|
||
/* Формирования кода */
|
||
SDP_CODE := 'DP_' || REC.PROPERTY;
|
||
/* Добавление данных в коллекции */
|
||
PKG_CONTVALLOC1S.PUTS(RCONTAINER => TDP_NAMES, SROWID => SDP_CODE, SVALUE => REC.NAME);
|
||
PKG_CONTVALLOC1S.PUTN(RCONTAINER => TDP_TYPES, SROWID => SDP_CODE, NVALUE => REC.FORMAT);
|
||
/* Формирование запроса */
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL,
|
||
SELEMENT1 => ' (select COALESCE(V.STR_VALUE, to_char(V.NUM_VALUE), to_char(V.DATE_VALUE))');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCS_PROPS_VALS V');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.RN = V.UNIT_RN(+)');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and V.DOCS_PROP_RN(+) = ' || REC.PROPERTY || ') as "' || SDP_CODE || '",');
|
||
end loop;
|
||
/* Если собрали данные */
|
||
if ((CSQL is not null) and (CSQL <> EMPTY_CLOB())) then
|
||
/* Добавляем запятую перед встраиваемым блоком */
|
||
CSQL := ',' || CSQL;
|
||
/* Если блок находится в конце запроса */
|
||
if (NQUERY_POS = 0) then
|
||
/* Удаляем последнюю запятую */
|
||
CSQL := SUBSTR(CSQL, 1, LENGTH(CSQL) - 1);
|
||
end if;
|
||
end if;
|
||
end UTL_CLNEVENTS_DP_QUERY_BLOCK;
|
||
|
||
/* Считывание мнемокода статуса типа события по умолчанию */
|
||
function UTL_CLNEVNSTATS_CODE_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
SEVENT_TYPE in varchar2 -- Мнемокод типа события
|
||
) return varchar2 -- Мнемокод статуса типа события по умолчанию
|
||
is
|
||
SRESULT PKG_STD.TSTRING; -- Мнемокод статуса типа события по умолчанию
|
||
begin
|
||
/* Считываем мнемокод статуса типа события по умолчанию */
|
||
begin
|
||
select TMP.EVNSTAT_CODE
|
||
into SRESULT
|
||
from (select S.EVNSTAT_CODE
|
||
from CLNEVNTYPES T,
|
||
CLNEVNTYPSTS TS,
|
||
CLNEVNSTATS S
|
||
where T.COMPANY = NCOMPANY
|
||
and T.EVNTYPE_CODE = SEVENT_TYPE
|
||
and TS.PRN = T.RN
|
||
and F_EVRTPOINTS_VALID_START_POINT(T.COMPANY, T.RN, TS.RN, TS.DEFAULT_STATUS) = 1
|
||
and TS.EVENT_STATUS = S.RN
|
||
order by TS.DEFAULT_STATUS desc,
|
||
S.EVNSTAT_CODE) TMP
|
||
where ROWNUM = 1;
|
||
exception
|
||
when others then
|
||
SRESULT := null;
|
||
end;
|
||
/* Возвращаем результат */
|
||
return SRESULT;
|
||
end UTL_CLNEVNSTATS_CODE_GET;
|
||
|
||
/* Считывание описателя документа */
|
||
function UTL_UNITLIST_DESCR_GET
|
||
(
|
||
SUNIT_CODE in varchar2, -- Код раздела
|
||
NDOCUMENT in number -- Рег. номер документа в разделе
|
||
) return varchar2 -- Описатель
|
||
is
|
||
SRES PKG_STD.TLSTRING; -- Буфер для результата
|
||
SDESCR_DEFAULT PKG_STD.TSTRING := 'Документ <RN> раздела <UNITNAME>'; -- Описатель по умолчанию
|
||
NDOCDESCR_RN PKG_STD.TREF; -- Рег. номер описателя
|
||
NDESCR_FOUND PKG_STD.TNUMBER := 1; -- Признак существования описателя
|
||
begin
|
||
/* Считываем рег. номер описателя */
|
||
begin
|
||
select T.RN
|
||
into NDOCDESCR_RN
|
||
from DOCDESCRS T
|
||
where T.UNITCODE = SUNIT_CODE
|
||
and T.USERPROC is not null
|
||
and ROWNUM <= 1;
|
||
exception
|
||
when NO_DATA_FOUND then
|
||
NDESCR_FOUND := 0;
|
||
end;
|
||
/* Если есть и описатель и передан идентификатор документа */
|
||
if ((NDESCR_FOUND = 1) and (NDOCUMENT is not null)) then
|
||
/* Исполним и вернём описатель */
|
||
begin
|
||
SRES := F_DOCDESCRS_GET_DESCRIPTION(SUNITCODE => SUNIT_CODE, NDOCUMENT => NDOCUMENT);
|
||
return SRES;
|
||
exception
|
||
when others then
|
||
return COALESCE(SDESCR_DEFAULT, 'Идентификатор - ' || TO_CHAR(NDOCUMENT));
|
||
end;
|
||
else
|
||
/* Описателя нет, но есть идентификатор документа */
|
||
if (NDOCUMENT is not null) then
|
||
/* Тогда вернём описатель по умолчанию или идентификатор */
|
||
return COALESCE(SDESCR_DEFAULT, 'Идентификатор - ' || TO_CHAR(NDOCUMENT));
|
||
else
|
||
/* Нет ничего */
|
||
return SDESCR_DEFAULT;
|
||
end if;
|
||
end if;
|
||
end UTL_UNITLIST_DESCR_GET;
|
||
|
||
/* Формирование набора данных с отобранными событиями */
|
||
procedure CLNEVENTS_DG_GET
|
||
(
|
||
NIDENT in number, -- Идентификатор отбора
|
||
CFILTERS in clob, -- Фильтры
|
||
CORDERS in clob, -- Сортировки
|
||
COUT out clob -- Сериализованная таблица данных
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
RF PKG_P8PANELS_VISUAL.TDG_FILTERS; -- Фильтры
|
||
RO PKG_P8PANELS_VISUAL.TDG_ORDERS; -- Сортировки
|
||
RDG PKG_P8PANELS_VISUAL.TDG; -- Описание таблицы
|
||
RDG_ROW PKG_P8PANELS_VISUAL.TDG_ROW; -- Строка таблицы
|
||
CSQL clob; -- Буфер для запроса
|
||
ICURSOR integer; -- Курсор для исполнения запроса
|
||
SEVSTAT PKG_STD.TSTRING; -- Буфер для статуса события
|
||
NCLNEVNTYPES PKG_STD.TREF; -- Рег. номер типа события
|
||
SDOC_PREF PKG_STD.TSTRING; -- Префикс события (без пробелов)
|
||
SDOC_NUMB PKG_STD.TSTRING; -- Номер события (без пробелов)
|
||
NCLNEVENTS PKG_STD.TREF; -- Рег. номер события
|
||
SSENDER PKG_STD.TSTRING; -- Наименование исполнителя
|
||
CDP_QUERY clob; -- Блок запроса со свойствами документа
|
||
TDP_NAMES PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция с наименованиями свойств документа
|
||
TDP_TYPES PKG_CONTVALLOC1S.TCONTAINER; -- Коллекция с типами свойств документа
|
||
|
||
/* Считывание типа события из фильтров */
|
||
function CLNEVNTYPES_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
RFILTERS in PKG_P8PANELS_VISUAL.TDG_FILTERS -- Фильтры
|
||
) return number -- Рег. номер типа события
|
||
is
|
||
SCLNEVNTYPES PKG_STD.TSTRING; -- Мнемокод типа события
|
||
NRESULT PKG_STD.TREF; -- Рег. номер типа события
|
||
begin
|
||
/* Обходим коллекцию фильтров */
|
||
for I in RFILTERS.FIRST .. RFILTERS.LAST
|
||
loop
|
||
/* Если это фильтр типа события */
|
||
if (RFILTERS(I).SNAME = 'SEVTYPE_CODE') then
|
||
/* Считываем мнемокод типа события */
|
||
SCLNEVNTYPES := RFILTERS(I).SFROM;
|
||
/* Выходим из цикла */
|
||
exit;
|
||
end if;
|
||
end loop;
|
||
/* Если мнемокод типа события был считан */
|
||
if (SCLNEVNTYPES is not null) then
|
||
/* Считываем рег. номер типа события */
|
||
begin
|
||
select T.RN
|
||
into NRESULT
|
||
from CLNEVNTYPES T
|
||
where T.COMPANY = NCOMPANY
|
||
and T.EVNTYPE_CODE = SCLNEVNTYPES;
|
||
exception
|
||
when others then
|
||
NRESULT := null;
|
||
end;
|
||
end if;
|
||
/* Возвращаем результат */
|
||
return NRESULT;
|
||
end CLNEVNTYPES_GET;
|
||
|
||
/* Добавление колонок/значений по коллекции свойств документа */
|
||
procedure RDG_FILL_BY_TDP
|
||
(
|
||
RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы (изменяется при добавлении колонки)
|
||
RDG_ROW in out nocopy PKG_P8PANELS_VISUAL.TDG_ROW, -- Строка таблицы (изменяется при заполнении значений строки)
|
||
TDP_NAMES in PKG_CONTVALLOC1S.TCONTAINER, -- Коллекция с наименованиями свойств документа
|
||
TDP_TYPES in PKG_CONTVALLOC1S.TCONTAINER, -- Коллекция с типами свойств документа
|
||
NFIRST_NUMB in number := 1, -- Номер первого элемента коллекции
|
||
NLAST_NUMB in number, -- Номер последнего элемента коллекции
|
||
ICURSOR in integer := null, -- Курсор для исполнения запрос (требуется при заполнении значений строки)
|
||
NACTION in number := 0 -- Действие (0 - добавление колонки в таблицу, 1 - заполнение значений строки, 2 - добавление колонки курсора)
|
||
)
|
||
is
|
||
SDP_CODE PKG_STD.TSTRING; -- Код свойства документа
|
||
SDP_NAME PKG_STD.TSTRING; -- Имя свойства документа
|
||
NDP_TYPE PKG_STD.TNUMBER; -- Тип свойства документа
|
||
SDP_PREF PKG_STD.TSTRING; -- Префикс свойства документа
|
||
begin
|
||
/* Получаем код первого элемента */
|
||
SDP_CODE := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => TDP_NAMES);
|
||
/* Цикл по именам доп. свойств */
|
||
for I in NFIRST_NUMB .. NLAST_NUMB
|
||
loop
|
||
/* Получаем код следующего элемента */
|
||
if (I > NFIRST_NUMB) then
|
||
SDP_CODE := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => TDP_NAMES, SROWID => SDP_CODE);
|
||
end if;
|
||
/* Если это добавление колонки курсора */
|
||
if (NACTION = 2) then
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => I);
|
||
else
|
||
/* Считываем тип доп. свойства */
|
||
NDP_TYPE := PKG_CONTVALLOC1S.GETN(RCONTAINER => TDP_TYPES, SROWID => SDP_CODE);
|
||
/* Определение префикса типа данных к коду */
|
||
SDP_PREF := UTL_DP_PREF_TYPE_GET(NTYPE => NDP_TYPE);
|
||
/* Если это добавление колонки в таблицу */
|
||
if (NACTION = 0) then
|
||
/* Считываем имя свойства документа */
|
||
SDP_NAME := PKG_CONTVALLOC1S.GETS(RCONTAINER => TDP_NAMES, SROWID => SDP_CODE);
|
||
/* Добавляем колонку таблицы */
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => SDP_PREF || SDP_CODE,
|
||
SCAPTION => SDP_NAME,
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
else
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => SDP_PREF || SDP_CODE,
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => I);
|
||
end if;
|
||
end if;
|
||
end loop;
|
||
end RDG_FILL_BY_TDP;
|
||
begin
|
||
/* Очистка коллекций информации о свойствах документа */
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => TDP_NAMES);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => TDP_TYPES);
|
||
/* Читаем фильтры */
|
||
RF := PKG_P8PANELS_VISUAL.TDG_FILTERS_FROM_XML(CFILTERS => CFILTERS);
|
||
/* Читаем сортировки */
|
||
RO := PKG_P8PANELS_VISUAL.TDG_ORDERS_FROM_XML(CORDERS => CORDERS);
|
||
/* Инициализируем таблицу данных */
|
||
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE();
|
||
/* Считываем рег. номер типа события */
|
||
NCLNEVNTYPES := CLNEVNTYPES_GET(NCOMPANY => NCOMPANY, RFILTERS => RF);
|
||
/* Если тип события не считан */
|
||
if (NCLNEVNTYPES is null) then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания типа события. Фильтр по типу события обязателен.');
|
||
end if;
|
||
/* Описываем колонки таблицы данных */
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NRN',
|
||
SCAPTION => 'Рег. номер записи',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NCRN',
|
||
SCAPTION => 'Каталог',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SCOND_FROM => 'BYEV_CRN',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SEVPREF',
|
||
SCAPTION => 'Префикс',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SEVNUMB',
|
||
SCAPTION => 'Номер',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SPREF_NUMB',
|
||
SCAPTION => 'Префикс и номер',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BORDER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NEVTYPE',
|
||
SCAPTION => 'Тип события (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SEVTYPE_CODE',
|
||
SCAPTION => 'Тип события',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SCOND_FROM => 'BYEV_TYPE',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DREG_DATE',
|
||
SCAPTION => 'Дата регистрации',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DCHANGE_DATE',
|
||
SCAPTION => 'Дата последнего изменения',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BORDER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DEXPIRE_DATE',
|
||
SCAPTION => 'Дата истечения времени нахождения в точке маршрута',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'DPLAN_DATE',
|
||
SCAPTION => 'Дата начала работ',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
|
||
BORDER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NINIT_PERSON',
|
||
SCAPTION => 'Инициализатор (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SINIT_PERSON',
|
||
SCAPTION => 'Инициализатор',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NEVSTAT',
|
||
SCAPTION => 'Статус (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SEVSTAT_NAME',
|
||
SCAPTION => 'Статус',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NSEND_PERSON',
|
||
SCAPTION => 'Получатель (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SSEND_PERSON',
|
||
SCAPTION => 'Получатель',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SCOND_FROM => 'BYEV_S_PERSON',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NAGNLIST_RN',
|
||
SCAPTION => 'Рег. номер контрагенты',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NSEND_DIVISION',
|
||
SCAPTION => 'Подразделение (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SSEND_DIVISION',
|
||
SCAPTION => 'Подразделение',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SCOND_FROM => 'BYEV_S_DIVISION',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NSEND_USRGRP',
|
||
SCAPTION => 'Группа пользователей (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SSEND_USRGRP',
|
||
SCAPTION => 'Группа пользователей',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
SCOND_FROM => 'BYEV_S_USER_GROUP',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SEVDESCR',
|
||
SCAPTION => 'Описание',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NCLOSED',
|
||
SCAPTION => 'Аннулировано',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
SCOND_FROM => 'BYEV_CLOSED_From',
|
||
SCOND_TO => 'BYEV_CLOSED_To',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SLINKED_UNIT',
|
||
SCAPTION => 'Учётный раздел',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'NLINKED_RN',
|
||
SCAPTION => 'Учётный документ (Рег. номер)',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
|
||
SCOND_FROM => 'BYEV_LINKED_RN',
|
||
BFILTER => true,
|
||
BVISIBLE => false);
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
|
||
SNAME => 'SSENDER',
|
||
SCAPTION => 'Наименование исполнителя',
|
||
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
|
||
BVISIBLE => false);
|
||
/* Формируем блок запроса свойств документа и коллекций наименований/типов */
|
||
UTL_CLNEVENTS_DP_QUERY_BLOCK(NCOMPANY => NCOMPANY,
|
||
NCLNEVNTYPES => NCLNEVNTYPES,
|
||
NQUERY_POS => 0,
|
||
CSQL => CDP_QUERY,
|
||
TDP_NAMES => TDP_NAMES,
|
||
TDP_TYPES => TDP_TYPES);
|
||
/* Если есть свойства документа */
|
||
if (PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) <> 0) then
|
||
/* Добавляем колонки по свойствам документа */
|
||
RDG_FILL_BY_TDP(RDG => RDG,
|
||
RDG_ROW => RDG_ROW,
|
||
TDP_NAMES => TDP_NAMES,
|
||
TDP_TYPES => TDP_TYPES,
|
||
NLAST_NUMB => PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES),
|
||
NACTION => 0);
|
||
end if;
|
||
/* Обходим данные */
|
||
begin
|
||
/* Добавляем подсказку совместимости */
|
||
CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
|
||
/* Формируем запрос */
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select T.RN NRN,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.CRN NCRN,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.TRIM_() || '(T.EVENT_PREF) SEVPREF,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.TRIM_() || '(T.EVENT_NUMB) SEVNUMB,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EVENT_TYPE NEVTYPE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select CET.EVNTYPE_CODE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNEVNTYPES CET');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where CET.RN = T.EVENT_TYPE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and CET.COMPANY = T.COMPANY) SEVTYPE_CODE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REG_DATE DREG_DATE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.CHANGE_DATE DCHANGE_DATE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EXPIRE_DATE DEXPIRE_DATE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PLAN_DATE DPLAN_DATE,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.INIT_PERSON NINIT_PERSON,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select P.CODE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPERSONS P');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.RN = T.INIT_PERSON');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = T.COMPANY) SINIT_PERSON,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EVENT_STAT NEVSTAT,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select CES.EVNSTAT_NAME');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNEVNSTATS CES');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where CES.RN = (select CETS.EVENT_STATUS');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNEVNTYPSTS CETS');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where CETS.RN = T.EVENT_STAT');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and CETS.COMPANY = T.COMPANY)');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and CES.COMPANY = T.COMPANY) SEVSTAT_NAME,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.SEND_PERSON NSEND_PERSON,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select P.CODE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPERSONS P');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.RN = T.SEND_PERSON');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = T.COMPANY) SSEND_PERSON,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select P.PERS_AGENT');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPERSONS P');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.RN = T.SEND_PERSON');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = T.COMPANY) NAGNLIST_RN,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.SEND_DIVISION NSEND_DIVISION,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select D.CODE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INS_DEPARTMENT D');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where D.RN = T.SEND_DIVISION');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and D.COMPANY = T.COMPANY) SSEND_DIVISION,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.SEND_USER_GROUP NSEND_USRGRP,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select UG.CODE');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERGRP UG');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UG.RN = T.SEND_USER_GROUP');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UG.COMPANY = T.COMPANY) SSEND_USRGRP,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EVENT_DESCR SEVDESCR,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.CLOSED NCLOSED,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LINKED_UNIT SLINKED_UNIT,');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LINKED_RN NLINKED_RN,');
|
||
/* Колонка без TRIM, только для корректной сортировки по номеру события */
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EVENT_PREF || ''-'' || T.EVENT_NUMB SPREF_NUMB');
|
||
/* Добавление блока запроса для свойств документа */
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => CDP_QUERY);
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNEVENTS T');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.COMPANY = :NCOMPANY');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT)');
|
||
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%');
|
||
/* Учтём сортировки */
|
||
PKG_P8PANELS_VISUAL.TDG_ORDERS_SET_QUERY(RDATA_GRID => RDG,
|
||
RORDERS => RO,
|
||
SPATTERN => '%ORDER_BY%',
|
||
CSQL => CSQL);
|
||
/* Учтём фильтры */
|
||
PKG_P8PANELS_VISUAL.TDG_FILTERS_SET_QUERY(NIDENT => NIDENT,
|
||
NCOMPANY => NCOMPANY,
|
||
SUNIT => SUNIT_CLNEVENTS,
|
||
SPROCEDURE => 'PKG_P8PANELS_CLNTTSKBRD.CLNEVENTS_COND',
|
||
RDATA_GRID => RDG,
|
||
RFILTERS => RF);
|
||
/* Разбираем его */
|
||
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
|
||
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
|
||
/* Делаем подстановку параметров */
|
||
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
|
||
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NIDENT', NVALUE => NIDENT);
|
||
/* Описываем структуру записи курсора */
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
|
||
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 7);
|
||
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 8);
|
||
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 9);
|
||
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 10);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 12);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 13);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 14);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 15);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 16);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 17);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 18);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 19);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 20);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 21);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 22);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 23);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 24);
|
||
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 25);
|
||
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 26);
|
||
/* Если есть свойства документа */
|
||
if (PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) <> 0) then
|
||
/* Добавляем колонок в курсор по свойствам документа */
|
||
RDG_FILL_BY_TDP(RDG => RDG,
|
||
RDG_ROW => RDG_ROW,
|
||
TDP_NAMES => TDP_NAMES,
|
||
TDP_TYPES => TDP_TYPES,
|
||
NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) - 1,
|
||
NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 2,
|
||
ICURSOR => ICURSOR,
|
||
NACTION => 2);
|
||
end if;
|
||
/* Делаем выборку */
|
||
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
|
||
null;
|
||
end if;
|
||
/* Обходим выбранные записи */
|
||
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
|
||
loop
|
||
/* Считываем рег. номер события */
|
||
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 1, NVALUE => NCLNEVENTS);
|
||
/* Считываем статус события */
|
||
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 3, SVALUE => SDOC_PREF);
|
||
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 4, SVALUE => SDOC_NUMB);
|
||
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 14, SVALUE => SEVSTAT);
|
||
/* Считываем наименование исполнителя */
|
||
SSENDER := UTL_CLNEVENTS_SENDER_GET(NCLNEVENTS => NCLNEVENTS);
|
||
/* Добавляем колонки с данными */
|
||
RDG_ROW := PKG_P8PANELS_VISUAL.TDG_ROW_MAKE(SGROUP => SEVSTAT);
|
||
/* Заполняем колонки */
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NCLNEVENTS);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'NCRN', ICURSOR => ICURSOR, NPOSITION => 2);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEVPREF', SVALUE => SDOC_PREF);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEVNUMB', SVALUE => SDOC_NUMB);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
|
||
SNAME => 'SPREF_NUMB',
|
||
SVALUE => SDOC_PREF || '-' || SDOC_NUMB);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NEVTYPE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 5);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SEVTYPE_CODE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 6);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW,
|
||
SNAME => 'DREG_DATE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 7);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW,
|
||
SNAME => 'DCHANGE_DATE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 8);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW,
|
||
SNAME => 'DEXPIRE_DATE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 9);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLD(RROW => RDG_ROW,
|
||
SNAME => 'DPLAN_DATE',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 10);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NINIT_PERSON',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 11);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SINIT_PERSON',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 12);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NEVSTAT',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 13);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SEVSTAT_NAME', SVALUE => SEVSTAT);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NSEND_PERSON',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 15);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SSEND_PERSON',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 16);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NAGNLIST_RN',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 17);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NSEND_DIVISION',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 18);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SSEND_DIVISION',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 19);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NSEND_USRGRP',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 20);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SSEND_USRGRP',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 21);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SEVDESCR',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 22);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NCLOSED',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 23);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLS(RROW => RDG_ROW,
|
||
SNAME => 'SLINKED_UNIT',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 24);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_CUR_COLN(RROW => RDG_ROW,
|
||
SNAME => 'NLINKED_RN',
|
||
ICURSOR => ICURSOR,
|
||
NPOSITION => 25);
|
||
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SSENDER', SVALUE => SSENDER);
|
||
/* Если есть свойства документа */
|
||
if (PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) <> 0) then
|
||
/* Заполняем строку по свойствам документа */
|
||
RDG_FILL_BY_TDP(RDG => RDG,
|
||
RDG_ROW => RDG_ROW,
|
||
TDP_NAMES => TDP_NAMES,
|
||
TDP_TYPES => TDP_TYPES,
|
||
NFIRST_NUMB => RDG.RCOL_DEFS.COUNT - PKG_CONTVALLOC1S.COUNT_(RCONTAINER => TDP_NAMES) - 1,
|
||
NLAST_NUMB => RDG.RCOL_DEFS.COUNT - 2,
|
||
ICURSOR => ICURSOR,
|
||
NACTION => 1);
|
||
end if;
|
||
/* Добавляем строку в таблицу */
|
||
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
|
||
end loop;
|
||
/* Освобождаем курсор */
|
||
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
|
||
exception
|
||
when others then
|
||
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
|
||
raise;
|
||
end;
|
||
/* Сериализуем описание */
|
||
COUT := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 0);
|
||
/* Очистка коллекций */
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => TDP_NAMES);
|
||
PKG_CONTVALLOC1S.PURGE(RCONTAINER => TDP_TYPES);
|
||
end CLNEVENTS_DG_GET;
|
||
|
||
/* Считывание контрагентов событий с наличием изображения */
|
||
procedure CLNEVENTS_AGENTS_WIMG_GET
|
||
(
|
||
NIDENT in number, -- Идентификатор отобранных записей событий
|
||
COUT out clob -- Информация о контрагентах с наличием изображения
|
||
)
|
||
is
|
||
RANGLIST AGNLIST%rowtype; -- Запись контрагента
|
||
|
||
/* Считывание записи контрагента */
|
||
function GET_AGNLIST_ID
|
||
(
|
||
NRN in number -- Рег. номер контрагента
|
||
) return AGNLIST%rowtype -- Запись контрагента
|
||
is
|
||
RRESULT AGNLIST%rowtype; -- Запись контрагента
|
||
begin
|
||
/* Считываем запись */
|
||
begin
|
||
select T.* into RRESULT from AGNLIST T where T.RN = NRN;
|
||
exception
|
||
when others then
|
||
RRESULT := null;
|
||
end;
|
||
/* Возвращаем результат */
|
||
return RRESULT;
|
||
end GET_AGNLIST_ID;
|
||
begin
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
/* Обходим контрагентов событий, у которых есть изображение */
|
||
for REC in (select COALESCE(SC_A.RN, SP_A.RN) RN
|
||
from CLNEVENTS T,
|
||
CLNCLIENTS SC,
|
||
AGNLIST SC_A,
|
||
CLNPERSONS SP,
|
||
AGNLIST SP_A
|
||
where T.RN in (select ID from COND_BROKER_IDSMART where IDENT = NIDENT)
|
||
and ((T.SEND_CLIENT is not null) or (T.SEND_PERSON is not null))
|
||
and T.SEND_CLIENT = SC.RN(+)
|
||
and SC.CLIENT_AGENT = SC_A.RN(+)
|
||
and T.SEND_PERSON = SP.RN(+)
|
||
and SP.PERS_AGENT = SP_A.RN(+)
|
||
and ((DBMS_LOB.GETLENGTH(SC_A.IMAGE) <> 0) or (DBMS_LOB.GETLENGTH(SP_A.IMAGE) <> 0))
|
||
group by COALESCE(SC_A.RN, SP_A.RN))
|
||
loop
|
||
/* Считываем запись контрагента */
|
||
RANGLIST := GET_AGNLIST_ID(NRN => REC.RN);
|
||
/* Если запись считана */
|
||
if (RANGLIST.RN is not null) then
|
||
/* Добавляем информацию о контрагенте */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XAGENTS');
|
||
/* Мнемокод контрагента */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SAGNABBR');
|
||
PKG_XFAST.VALUE(SVALUE => RANGLIST.AGNABBR);
|
||
PKG_XFAST.UP();
|
||
/* Изображение контрагента */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'BIMAGE');
|
||
PKG_XFAST.VALUE(LBVALUE => RANGLIST.IMAGE);
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end if;
|
||
end loop;
|
||
/* Сериализуем */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
end CLNEVENTS_AGENTS_WIMG_GET;
|
||
|
||
/* Загрузка информации о событиях */
|
||
procedure CLNEVENTS_LOAD
|
||
(
|
||
CFILTERS in clob, -- Фильтры
|
||
CORDERS in clob, -- Сортировки
|
||
NINCLUDE_ACCOUNTS in number := 1, -- Включать информацию о контрагентах с изображением (0 - нет, 1 - да)
|
||
COUT out clob -- Сериализованная информация о событиях
|
||
)
|
||
is
|
||
NIDENT PKG_STD.TREF; -- Идентификатор отбора
|
||
CCLNEVENTS clob; -- Информация о событиях
|
||
CAGNLIST_WITH_IMAGE clob; -- Информация о контрагентах с изображением
|
||
begin
|
||
/* Генерируем идентификатор */
|
||
NIDENT := GEN_IDENT();
|
||
/* Считываем данные о событиях */
|
||
CLNEVENTS_DG_GET(CFILTERS => CFILTERS,
|
||
CORDERS => CORDERS,
|
||
COUT => CCLNEVENTS,
|
||
NIDENT => NIDENT);
|
||
/* Если требуется включать информацию о контрагентах */
|
||
if (NINCLUDE_ACCOUNTS = 1) then
|
||
/* Считываем информацию о контрагентах с наличием изображения */
|
||
CLNEVENTS_AGENTS_WIMG_GET(NIDENT => NIDENT, COUT => CAGNLIST_WITH_IMAGE);
|
||
end if;
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
/* Открываем корень */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
|
||
/* Открываем события */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XCLNEVENTS');
|
||
/* Описываем события */
|
||
PKG_XFAST.VALUE_XML(LCVALUE => CCLNEVENTS);
|
||
/* Закрываем события */
|
||
PKG_XFAST.UP();
|
||
/* Если требуется включать информацию о контрагентах */
|
||
if (NINCLUDE_ACCOUNTS = 1) then
|
||
/* Открываем информацию о контрагентах с изображением */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XAGENTS_WITH_IMG');
|
||
/* Описываем контрагентов */
|
||
PKG_XFAST.VALUE_XML(LCVALUE => CAGNLIST_WITH_IMAGE);
|
||
/* Закрываем контрагентов */
|
||
PKG_XFAST.UP();
|
||
end if;
|
||
/* Закрываем корень */
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end CLNEVENTS_LOAD;
|
||
|
||
/* Выбор события по рег. номеру */
|
||
procedure CLNEVENTS_SELECT
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
NSELECTLIST PKG_STD.TREF; -- Рег. номер добавленной записи буфера подобранных
|
||
NCRN PKG_STD.TREF; -- Рег. номер каталога
|
||
|
||
/* Считывание каталога события */
|
||
function CLNEVENTS_CRN_GET
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
) return number -- Рег. номер каталога события
|
||
is
|
||
NRESULT PKG_STD.TREF; -- Рег. номер каталога события
|
||
begin
|
||
/* Считываем каталог события */
|
||
begin
|
||
select E.CRN into NRESULT from CLNEVENTS E where E.RN = NCLNEVENTS;
|
||
exception
|
||
when others then
|
||
NCRN := null;
|
||
end;
|
||
/* Возвращаем результат */
|
||
return NRESULT;
|
||
end CLNEVENTS_CRN_GET;
|
||
begin
|
||
/* Считываем рег. номер каталога события */
|
||
NCRN := CLNEVENTS_CRN_GET(NCLNEVENTS => NCLNEVENTS);
|
||
/* Если каталог считан */
|
||
if (NCRN is not null) then
|
||
/* Сформируем идентификатор буфера */
|
||
if (NIDENT is null) then
|
||
NIDENT := GEN_IDENT();
|
||
end if;
|
||
/* Добавим подобранное в список отмеченных записей */
|
||
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
|
||
NCOMPANY => NCOMPANY,
|
||
NDOCUMENT => NCLNEVENTS,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
SACTIONCODE => null,
|
||
NCRN => NCRN,
|
||
NDOCUMENT1 => null,
|
||
SUNITCODE1 => null,
|
||
SACTIONCODE1 => null,
|
||
NRN => NSELECTLIST);
|
||
end if;
|
||
end CLNEVENTS_SELECT;
|
||
|
||
/* Считывание следующего номера события */
|
||
procedure CLNEVENTS_NEXTNUMB_GET
|
||
(
|
||
SPREFIX in varchar2, -- Префикс события
|
||
SEVENT_NUMB out varchar2 -- Номер события
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
begin
|
||
/* Считываем следующий номер */
|
||
SEVENT_NUMB := GET_CLNEVENTS_NEXTNUMB(NCOMPANY => NCOMPANY, SPREF => SPREFIX);
|
||
end CLNEVENTS_NEXTNUMB_GET;
|
||
|
||
/* Считывание параметров события */
|
||
procedure CLNEVENTS_GET
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
COUT out clob -- Данные о записи события
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
RCLNEVENTS CLNEVENTS%rowtype; -- Запись события
|
||
SCRN PKG_STD.TSTRING; -- Наименование каталога
|
||
STYPE PKG_STD.TSTRING; -- Мнемокод типа события
|
||
SSTATUS PKG_STD.TSTRING; -- Мнемокод статуса типа события
|
||
SINIT_PERSON PKG_STD.TSTRING; -- Мнемокод инициатора сотрудника
|
||
SCLIENT_CLIENT PKG_STD.TSTRING; -- Мнемокод клиента (организации)
|
||
SCLIENT_PERSON PKG_STD.TSTRING; -- Мнемокод клиента (сотрудника)
|
||
SSEND_CLIENT PKG_STD.TSTRING; -- Мнемокод направления (организация)
|
||
SSEND_DIVISION PKG_STD.TSTRING; -- Мнемокод направления (подразделение)
|
||
SSEND_POST PKG_STD.TSTRING; -- Мнемокод направления (должность)
|
||
SSEND_PERFORM PKG_STD.TSTRING; -- Мнемокод направления (должность в подразделении)
|
||
SSEND_PERSON PKG_STD.TSTRING; -- Мнемокод направления (сотрудник)
|
||
SSEND_STAFFGRP PKG_STD.TSTRING; -- Мнемокод направления (нештатная структура)
|
||
SSEND_USER_GROUP PKG_STD.TSTRING; -- Мнемокод направления (группа пользователей)
|
||
SSEND_USER_NAME PKG_STD.TSTRING; -- Мнемокод направления (группа пользователь)
|
||
SDP_FORMATTED_ID PKG_STD.TSTRING; -- Отформатированный ID свойства документа
|
||
begin
|
||
/* Считываем запись события */
|
||
RCLNEVENTS := UTL_CLNEVENTS_GET(NCOMPANY => NCOMPANY, NCLNEVENTS => NCLNEVENTS);
|
||
/* Считываем наименование каталога */
|
||
FIND_ACATALOG_RN(NFLAG_SMART => 0,
|
||
NCOMPANY => NCOMPANY,
|
||
NVERSION => null,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
NRN => RCLNEVENTS.CRN,
|
||
SNAME => SCRN);
|
||
/* Считываем мнемокоды связанных записей */
|
||
UTL_CLNEVENTS_JOINS_GET(NCLNEVENTS => RCLNEVENTS.RN,
|
||
STYPE => STYPE,
|
||
SSTATUS => SSTATUS,
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME);
|
||
/* Формируем данные на выход */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XDATA');
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XEVENT');
|
||
PKG_XFAST.ATTR(SNAME => 'SCRN', SVALUE => SCRN);
|
||
PKG_XFAST.ATTR(SNAME => 'SPREF', SVALUE => RCLNEVENTS.EVENT_PREF);
|
||
PKG_XFAST.ATTR(SNAME => 'SNUMB', SVALUE => RCLNEVENTS.EVENT_NUMB);
|
||
PKG_XFAST.ATTR(SNAME => 'STYPE', SVALUE => STYPE);
|
||
PKG_XFAST.ATTR(SNAME => 'SSTATUS', SVALUE => SSTATUS);
|
||
PKG_XFAST.ATTR(SNAME => 'SDESCRIPTION', SVALUE => RCLNEVENTS.EVENT_DESCR);
|
||
PKG_XFAST.ATTR(SNAME => 'SCLIENT_CLIENT', SVALUE => SCLIENT_CLIENT);
|
||
PKG_XFAST.ATTR(SNAME => 'SCLIENT_PERSON', SVALUE => SCLIENT_PERSON);
|
||
PKG_XFAST.ATTR(SNAME => 'SPLAN_DATE', SVALUE => TO_CHAR(RCLNEVENTS.PLAN_DATE, SDATE_PATTERN_HH_MI));
|
||
PKG_XFAST.ATTR(SNAME => 'SINIT_PERSON', SVALUE => SINIT_PERSON);
|
||
PKG_XFAST.ATTR(SNAME => 'SINIT_AUTHID', SVALUE => RCLNEVENTS.INIT_AUTHID);
|
||
PKG_XFAST.ATTR(SNAME => 'SREASON', SVALUE => RCLNEVENTS.REASON);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_CLIENT', SVALUE => SSEND_CLIENT);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_DIVISION', SVALUE => SSEND_DIVISION);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_POST', SVALUE => SSEND_POST);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_PERFORM', SVALUE => SSEND_PERFORM);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_PERSON', SVALUE => SSEND_PERSON);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_STAFFGRP', SVALUE => SSEND_STAFFGRP);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_USER_GROUP', SVALUE => SSEND_USER_GROUP);
|
||
PKG_XFAST.ATTR(SNAME => 'SSEND_USER_NAME', SVALUE => SSEND_USER_NAME);
|
||
/* Цикл добавления свойств документа события */
|
||
for REC in (select DPV.*,
|
||
DP.FORMAT,
|
||
DP.DATA_SUBTYPE
|
||
from CLEVTPROPS CEP,
|
||
CLNEVNTYPES CET,
|
||
DOCS_PROPS_VALS DPV,
|
||
DOCS_PROPS DP
|
||
where CEP.PRN = CET.RN
|
||
and CET.EVNTYPE_CODE = STYPE
|
||
and CEP.COMPANY = NCOMPANY
|
||
and CEP.PROPERTY = DPV.DOCS_PROP_RN(+)
|
||
and CEP.PROPERTY = DP.RN(+)
|
||
and DPV.UNIT_RN = NCLNEVENTS)
|
||
loop
|
||
/* Считываем отформатированный ID свойства документа */
|
||
SDP_FORMATTED_ID := UTL_DP_FORMATTED_ID_GET(NTYPE => REC.FORMAT, NRN => REC.DOCS_PROP_RN);
|
||
/* Исходим от типа свойства документа */
|
||
case
|
||
/* Строка */
|
||
when (REC.FORMAT = 0) then
|
||
PKG_XFAST.ATTR(SNAME => SDP_FORMATTED_ID, SVALUE => REC.STR_VALUE);
|
||
/* Число */
|
||
when ((REC.FORMAT = 1) or (REC.FORMAT = 3)) then
|
||
PKG_XFAST.ATTR(SNAME => SDP_FORMATTED_ID, NVALUE => REC.NUM_VALUE);
|
||
/* Дата */
|
||
else
|
||
PKG_XFAST.ATTR(SNAME => SDP_FORMATTED_ID, DVALUE => REC.DATE_VALUE, IFORMAT => REC.DATA_SUBTYPE);
|
||
end case;
|
||
end loop;
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в CLOB */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end CLNEVENTS_GET;
|
||
|
||
/* Инициализация параметров события */
|
||
procedure CLNEVENTS_INIT
|
||
(
|
||
SEVENT_TYPE in varchar2, -- Мнемокод типа события
|
||
SPREF out varchar2, -- Префикс события
|
||
SNUMB out varchar2, -- Номер события
|
||
SINIT_PERSON out varchar2, -- Сотрудник - инициатор
|
||
SINIT_AUTHNAME out varchar2 -- Пользователь - инициатор
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
SOWNER_AGENT_RN PKG_STD.TSTRING; -- Рег. номер работодателя сотрудника
|
||
STAB_PREF PKG_STD.TSTRING; -- Префикс табельного номера сотрудника
|
||
STAB_NUMB PKG_STD.TSTRING; -- Таблеьный номер сотрудника
|
||
|
||
/* Считывание префикса типа события */
|
||
function CLNEVNTYPES_PREF_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
SEVENT_TYPE in varchar2 -- Мнемокод типа события
|
||
) return varchar2 -- Префикс типа события
|
||
is
|
||
SRESULT PKG_STD.TSTRING; -- Префикс типа события
|
||
begin
|
||
/* Считываем префикс типа события */
|
||
begin
|
||
select T.EVENT_PREF
|
||
into SRESULT
|
||
from CLNEVNTYPES T
|
||
where T.EVNTYPE_CODE = SEVENT_TYPE
|
||
and T.COMPANY = NCOMPANY;
|
||
exception
|
||
when NO_DATA_FOUND then
|
||
SRESULT := null;
|
||
end;
|
||
/* Возвращаем результат */
|
||
return SRESULT;
|
||
end CLNEVNTYPES_PREF_GET;
|
||
begin
|
||
/* Считываем префикс из параметра */
|
||
SPREF := GET_OPTIONS_STR(SCODE => 'EventPrefix', NCOMP_VERS => NCOMPANY);
|
||
/* Если префикс не указан в параметре и задан тип события */
|
||
if ((SPREF is null) and (SEVENT_TYPE is not null)) then
|
||
/* Считываем префикс типа события */
|
||
SPREF := CLNEVNTYPES_PREF_GET(NCOMPANY => NCOMPANY, SEVENT_TYPE => SEVENT_TYPE);
|
||
end if;
|
||
/* Если префикс определен */
|
||
if (SPREF is not null) then
|
||
/* Считываем номер */
|
||
SNUMB := GET_CLNEVENTS_NEXTNUMB(NCOMPANY => NCOMPANY, SPREF => SPREF);
|
||
end if;
|
||
/* Считываем сотрудника текущего пользователя */
|
||
FIND_PERSON_AUTHID(SPERSON => SINIT_PERSON,
|
||
SOWNER_AGENT => SOWNER_AGENT_RN,
|
||
STAB_PREF => STAB_PREF,
|
||
STAB_NUMB => STAB_NUMB);
|
||
/* Считываем имя пользователя */
|
||
FIND_USERLIST_BY_AUTHID(NFLAG_SMART => 1, SAUTHID => UTILIZER, SNAME => SINIT_AUTHNAME);
|
||
end CLNEVENTS_INIT;
|
||
|
||
/* Добавление значений свойств документа */
|
||
procedure CLNEVENTS_PROPS_INSERT
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
SEVENT_TYPE in varchar2, -- Мнемокод типа события
|
||
CPROPS in clob -- Свойства документа
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
NDP_VER PKG_STD.TREF; -- Версия раздела "Свойства документов"
|
||
RDOC PKG_XPATH.TDOCUMENT; -- Документ XML
|
||
RNODE_ROOT PKG_XPATH.TNODE; -- Корневой узел
|
||
RNODE_PROPS PKG_XPATH.TNODE; -- Узел "props"
|
||
RNODE_PROP PKG_XPATH.TNODE; -- Узел свойства (в формате "<SDP|NDP|DDP>_<РЕГ_НОМЕР>")
|
||
SPROP_ID PKG_STD.TSTRING; -- Код свойства документа из XML (в формате "<SDP|NDP|DDP>_<РЕГ_НОМЕР>")
|
||
SPROP_CODE PKG_STD.TSTRING; -- Мнемокод свойства документа
|
||
SSTR_VALUE PKG_STD.TSTRING := null; -- Строковое значение
|
||
NNUM_VALUE PKG_STD.TLNUMBER := null; -- Числовое значение
|
||
DDATE_VALUE PKG_STD.TLDATE := null; -- Дата
|
||
begin
|
||
/* Считываем версию организации */
|
||
FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => SUNIT_DP, NVERSION => NDP_VER);
|
||
/* Загрузка XML */
|
||
RDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CPROPS),
|
||
SCHARSET => PKG_CHARSET.CHARSET_UTF_()));
|
||
/* Разбор XML */
|
||
RNODE_ROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => RDOC);
|
||
RNODE_PROPS := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_ROOT, SPATTERN => 'props');
|
||
/* Если найдено событие */
|
||
if (PKG_DOCS_PROPS_VALS.PROLOGUE(SUNITCODE => SUNIT_CLNEVENTS, NDOCUMENT => NCLNEVENTS)) then
|
||
/* Цикл по свойствам документа типа события */
|
||
for REC in (select CEP.RN,
|
||
CEP.PROPERTY,
|
||
DP.FORMAT,
|
||
DP.NUM_WIDTH,
|
||
DP.NUM_PRECISION,
|
||
DP.STR_WIDTH
|
||
from CLEVTPROPS CEP,
|
||
CLNEVNTYPES CET,
|
||
DOCS_PROPS DP
|
||
where CEP.PRN = CET.RN
|
||
and CET.EVNTYPE_CODE = SEVENT_TYPE
|
||
and CEP.COMPANY = NCOMPANY
|
||
and CEP.PROPERTY = DP.RN(+))
|
||
loop
|
||
/* Считываем код свойства */
|
||
SPROP_ID := UTL_DP_FORMATTED_ID_GET(NTYPE => REC.FORMAT, NRN => REC.PROPERTY);
|
||
SPROP_CODE := GET_DOCS_PROPS_CODE_ID(NFLAG_SMART => 0, NPROP_ID => REC.PROPERTY);
|
||
/* Если в XML найдено новое значение свойства */
|
||
if (PKG_XPATH.IS_NULL(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_PROPS, SPATTERN => SPROP_ID)) =
|
||
false) then
|
||
/* Считываем узел свойства документа */
|
||
RNODE_PROP := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_PROPS, SPATTERN => SPROP_ID);
|
||
/* Исходим от типа свойства документа */
|
||
case REC.FORMAT
|
||
/* Строка */
|
||
when 0 then
|
||
SSTR_VALUE := PKG_XPATH.VALUE(RNODE => RNODE_PROP);
|
||
/* Проверка длины строки */
|
||
if (LENGTH(SSTR_VALUE) > REC.STR_WIDTH) then
|
||
P_EXCEPTION(0,
|
||
'Недопустимый формат значения для свойства "%s" (ожидалась строка длиной "%s" символов).',
|
||
SPROP_CODE,
|
||
TO_CHAR(REC.STR_WIDTH));
|
||
end if;
|
||
/* Число */
|
||
when 1 then
|
||
NNUM_VALUE := PKG_XPATH.VALUE_NUM(RNODE => RNODE_PROP);
|
||
/* Проверка длины и точности числа */
|
||
if ((LENGTH(TO_CHAR(TRUNC(ABS(NNUM_VALUE)))) > (REC.NUM_WIDTH - REC.NUM_PRECISION)) or
|
||
(ROUND(NNUM_VALUE, REC.NUM_PRECISION) <> NNUM_VALUE)) then
|
||
P_EXCEPTION(0,
|
||
'Недопустимый формат значения для свойства "%s" (ожидалось число размерностью "%s" с точностью "%s").',
|
||
SPROP_CODE,
|
||
TO_CHAR(REC.NUM_WIDTH),
|
||
TO_CHAR(REC.NUM_PRECISION));
|
||
end if;
|
||
/* Дата */
|
||
when 2 then
|
||
begin
|
||
DDATE_VALUE := PKG_XPATH.VALUE_DATE(RNODE => RNODE_PROP);
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0, 'Недопустимый формат даты.');
|
||
end;
|
||
/* Время */
|
||
else
|
||
NNUM_VALUE := TO_DATE(PKG_XPATH.VALUE(RNODE => RNODE_PROP), 'HH24:MI:SS') -
|
||
TO_DATE('00:00:00', 'HH24:MI:SS');
|
||
end case;
|
||
end if;
|
||
/* Добавление значения свойства */
|
||
PKG_DOCS_PROPS_VALS.APPEND(SPROPERTY => SPROP_CODE,
|
||
SSTR_VALUE => SSTR_VALUE,
|
||
NNUM_VALUE => NNUM_VALUE,
|
||
DDATE_VALUE => DDATE_VALUE);
|
||
/* Очищаем значения */
|
||
SSTR_VALUE := null;
|
||
NNUM_VALUE := null;
|
||
DDATE_VALUE := null;
|
||
end loop;
|
||
PKG_DOCS_PROPS_VALS.EPILOGUE;
|
||
end if;
|
||
end CLNEVENTS_PROPS_INSERT;
|
||
|
||
/* Добавление события */
|
||
procedure CLNEVENTS_INSERT
|
||
(
|
||
SCRN in varchar2, -- Наименование каталога
|
||
SPREF in varchar2, -- Префикс события
|
||
SNUMB in varchar2, -- Номер события
|
||
STYPE in varchar2, -- Тип события
|
||
SSTATUS in varchar2, -- Статус события
|
||
SPLAN_DATE in varchar2, -- Дата планируемого начала работ
|
||
SINIT_PERSON in varchar2, -- Инициатор
|
||
SCLIENT_CLIENT in varchar2, -- Клиент-инициатор
|
||
SCLIENT_PERSON in varchar2, -- Сотрудник-инициатор
|
||
SDESCRIPTION in varchar2, -- Описание
|
||
SREASON in varchar2, -- Причина
|
||
CPROPS in clob -- Свойства документа
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
NCRN PKG_STD.TREF; -- Рег. номер каталога
|
||
NCLNEVENTS PKG_STD.TREF; -- Рег. номер события
|
||
begin
|
||
/* Считываем рег. номер каталога */
|
||
FIND_ACATALOG_NAME(NFLAG_SMART => 0,
|
||
NCOMPANY => NCOMPANY,
|
||
NVERSION => null,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
SNAME => SCRN,
|
||
NRN => NCRN);
|
||
/* Добавляем событие */
|
||
P_CLNEVENTS_INSERT(NCOMPANY => NCOMPANY,
|
||
NCRN => NCRN,
|
||
SEVENT_PREF => SPREF,
|
||
SEVENT_NUMB => SNUMB,
|
||
SEVENT_TYPE => STYPE,
|
||
SEVENT_STAT => SSTATUS,
|
||
DPLAN_DATE => TO_DATE(SPLAN_DATE, SDATE_PATTERN_HH_MI),
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
SSEND_CLIENT => null,
|
||
SSEND_DIVISION => null,
|
||
SSEND_POST => null,
|
||
SSEND_PERFORM => null,
|
||
SSEND_PERSON => null,
|
||
SSEND_STAFFGRP => null,
|
||
SSEND_USER_GROUP => null,
|
||
SSEND_USER_NAME => null,
|
||
SEVENT_DESCR => SDESCRIPTION,
|
||
SREASON => SREASON,
|
||
NRN => NCLNEVENTS);
|
||
/* Добавляем значения свойств документа */
|
||
CLNEVENTS_PROPS_INSERT(NCLNEVENTS => NCLNEVENTS, SEVENT_TYPE => STYPE, CPROPS => CPROPS);
|
||
end CLNEVENTS_INSERT;
|
||
|
||
/* Исправление события */
|
||
procedure CLNEVENTS_UPDATE
|
||
(
|
||
NCLNEVENTS in number, -- Рег. номер события
|
||
SCLIENT_CLIENT in varchar2, -- Клиент-инициатор
|
||
SCLIENT_PERSON in varchar2, -- Сотрудник-инициатор
|
||
SDESCRIPTION in varchar2, -- Описание
|
||
CPROPS in clob -- Свойства
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
RCLNEVENTS CLNEVENTS%rowtype; -- Запись события
|
||
STYPE PKG_STD.TSTRING; -- Мнемокод типа события
|
||
SSTATUS PKG_STD.TSTRING; -- Мнемокод статуса типа события
|
||
SINIT_PERSON PKG_STD.TSTRING; -- Мнемокод инициатора сотрудника
|
||
SCLIENT_CLIENT_TMP PKG_STD.TSTRING; -- Мнемокод клиента (организации) (не требуется)
|
||
SCLIENT_PERSON_TMP PKG_STD.TSTRING; -- Мнемокод клиента (сотрудника) (не требуется)
|
||
SSEND_CLIENT PKG_STD.TSTRING; -- Мнемокод направления (организация)
|
||
SSEND_DIVISION PKG_STD.TSTRING; -- Мнемокод направления (подразделение)
|
||
SSEND_POST PKG_STD.TSTRING; -- Мнемокод направления (должность)
|
||
SSEND_PERFORM PKG_STD.TSTRING; -- Мнемокод направления (должность в подразделении)
|
||
SSEND_PERSON PKG_STD.TSTRING; -- Мнемокод направления (сотрудник)
|
||
SSEND_STAFFGRP PKG_STD.TSTRING; -- Мнемокод направления (нештатная структура)
|
||
SSEND_USER_GROUP PKG_STD.TSTRING; -- Мнемокод направления (группа пользователей)
|
||
SSEND_USER_NAME PKG_STD.TSTRING; -- Мнемокод направления (группа пользователь)
|
||
NBAN_UPDATE PKG_STD.TNUMBER; -- Признак запрета исправления события в точке маршрута (0 - нет, 1 - да)
|
||
begin
|
||
/* Считываем запись события */
|
||
RCLNEVENTS := UTL_CLNEVENTS_GET(NCOMPANY => NCOMPANY, NCLNEVENTS => NCLNEVENTS);
|
||
/* Считываем мнемокоды связанных записей */
|
||
UTL_CLNEVENTS_JOINS_GET(NCLNEVENTS => RCLNEVENTS.RN,
|
||
STYPE => STYPE,
|
||
SSTATUS => SSTATUS,
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT_TMP,
|
||
SCLIENT_PERSON => SCLIENT_PERSON_TMP,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME);
|
||
/* Проверка возможности редактирования события в текущем статусе */
|
||
NBAN_UPDATE := UTL_CLNEVENTS_BAN_UPDATE_GET(NCOMPANY => NCOMPANY, NCLNEVENTS => NCLNEVENTS);
|
||
/* Если редактирование запрещено */
|
||
if (NBAN_UPDATE = 1) then
|
||
/* Формируем исключение */
|
||
P_EXCEPTION(0, 'События в статусе "%s" запрещено редактировать.', SSTATUS);
|
||
end if;
|
||
/* Исправляем событие */
|
||
P_CLNEVENTS_UPDATE(NCOMPANY => NCOMPANY,
|
||
NRN => NCLNEVENTS,
|
||
NREMOTE_ACCESS => null,
|
||
SCHANGE_DATE => STAMP2S(RCLNEVENTS.CHANGE_DATE),
|
||
SEVENT_TYPE => STYPE,
|
||
SEVENT_STAT => SSTATUS,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME,
|
||
SEVENT_DESCR => SDESCRIPTION);
|
||
/* Обновляем значения свойств документа */
|
||
CLNEVENTS_PROPS_INSERT(NCLNEVENTS => NCLNEVENTS, SEVENT_TYPE => STYPE, CPROPS => CPROPS);
|
||
end CLNEVENTS_UPDATE;
|
||
|
||
/* Удаление события */
|
||
procedure CLNEVENTS_DELETE
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
begin
|
||
/* Удаляем событие */
|
||
P_CLNEVENTS_DELETE(NCOMPANY => NCOMPANY, NRN => NCLNEVENTS);
|
||
/* Удаляем значения свойств документа */
|
||
PKG_DOCS_PROPS_VALS.AFTER_DELETE(SUNITCODE => SUNIT_CLNEVENTS, NDOCUMENT => NCLNEVENTS);
|
||
end CLNEVENTS_DELETE;
|
||
|
||
/* Изменение статуса события */
|
||
procedure CLNEVENTS_STATE_CHANGE
|
||
(
|
||
NIDENT in out number, -- Рег. номер отмеченных записей
|
||
NSTEP in out number, -- Шаг выполнения (0-прекратить выполнение, 1,2..- номер шага)
|
||
NEVENT in out number, -- Событие, для отбора исполнителей
|
||
SEVENT_TYPE in out varchar2, -- Тип события, для отбора точек перехода и исполнителей
|
||
SEVENT_STAT in out varchar2, -- Cтатус события, текущий - для отбора точек перехода, следующий - для отбора исполнителей
|
||
SINIT_PERSON in out varchar2, -- Инициатор–сотрудник, для отбора исполнителей
|
||
SINIT_AUTHNAME in out varchar2, -- Инициатор–пользователь, для отбора исполнителей
|
||
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
|
||
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
|
||
NPOINT in out number, -- Текущая точка маршрута
|
||
NPASS in number, -- Точка перехода
|
||
NSELECT_EXEC out number, -- Признак необходимости выбора исполнителя
|
||
SEXECUTEMETHOD out varchar2, -- Мнемокод метода
|
||
SSEND_CLIENT in varchar2, -- Направить – организация
|
||
SSEND_DIVISION in varchar2, -- Направить – подразделение
|
||
SSEND_POST in varchar2, -- Направить – должность
|
||
SSEND_PERFORM in varchar2, -- Направить – должность в подразделении
|
||
SSEND_PERSON in varchar2, -- Направить – сотрудник
|
||
SSEND_STAFFGRP in varchar2, -- Направить – нештатная структура
|
||
SSEND_USER_GROUP in varchar2, -- Направить – группа пользователей
|
||
SSEND_USER_NAME in varchar2, -- Направить – пользователь
|
||
NSEND_PREDEFINED_EXEC in number, -- Переадресация
|
||
NSEND_PREDEFINED_PROC in number, -- Процедура выбора предопределенного исполнителя
|
||
SNEXT_STAT in varchar2 := null, -- Следующий статус (при переносе события)
|
||
SNOTE_HEADER in varchar2 := null, -- Заголовок примечания (при наличии)
|
||
SNOTE in varchar2 := null -- Примечание (при наличии)
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
NTMP PKG_STD.TREF; -- Заглушка
|
||
NSTEP_CURRENT PKG_STD.TREF; -- Номер текущего шага
|
||
NNOTE_RN PKG_STD.TREF; -- Рег. номер добавленного примечания
|
||
|
||
/* Считывание рег. номер точки маршрута */
|
||
function EVRTPTPASS_NEXT_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
SEVENT_TYPE in varchar2, -- Мнемокод типа события
|
||
NPOINT in number, -- Рег. номер текущей точки
|
||
SEVENT_STAT in varchar2, -- Мнемокод текущего статуса события
|
||
SNEXT_STAT in varchar2 -- Мнемокод следующего статуса события
|
||
) return number -- Рег. номер точки перехода
|
||
is
|
||
NNEXT_POINT PKG_STD.TREF; -- Рег. номер следующей точки
|
||
NRESULT PKG_STD.TREF; -- Рег. номер точки перехода
|
||
begin
|
||
/* Определение следующей точки маршрута */
|
||
FIND_EVRPOINTS_BY_STATUS(NFLAG_SMART => 0,
|
||
NFLAG_OPTION => 0,
|
||
NCOMPANY => NCOMPANY,
|
||
SEVENT_TYPE => SEVENT_TYPE,
|
||
SEVENT_STATUS => SNEXT_STAT,
|
||
NRN => NNEXT_POINT);
|
||
/* Считывание рег. номера точки перехода */
|
||
begin
|
||
select T.RN
|
||
into NRESULT
|
||
from EVRTPTPASS T
|
||
where T.PRN = NPOINT
|
||
and T.NEXT_POINT = NNEXT_POINT;
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания точки перехода из статуса "%s" в статус "%s".',
|
||
SEVENT_STAT,
|
||
SNEXT_STAT);
|
||
end;
|
||
/* Возвращаем результат */
|
||
return NRESULT;
|
||
end EVRTPTPASS_NEXT_GET;
|
||
begin
|
||
/* Определяем номер текущего шага */
|
||
NSTEP_CURRENT := NSTEP;
|
||
/* Если это первый шаг */
|
||
if (NSTEP_CURRENT = 1) then
|
||
/* Генерируем идентификатор отмеченных записей */
|
||
NIDENT := GEN_IDENT();
|
||
/* Добавляем запись события в отмеченные */
|
||
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
|
||
NCOMPANY => NCOMPANY,
|
||
NDOCUMENT => NEVENT,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
SACTIONCODE => SSELECTLIST_ACTION,
|
||
NCRN => null,
|
||
NDOCUMENT1 => null,
|
||
SUNITCODE1 => null,
|
||
SACTIONCODE1 => null,
|
||
NRN => NTMP);
|
||
end if;
|
||
/* Изменяем статус события */
|
||
P_CLNEVENTS_CHANGE_STATE_WEB(NCOMPANY => NCOMPANY,
|
||
NIDENT => NIDENT,
|
||
NSTEP => NSTEP,
|
||
NEVENT => NEVENT,
|
||
SEVENT_TYPE => SEVENT_TYPE,
|
||
SEVENT_STAT => SEVENT_STAT,
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SINIT_AUTHNAME => SINIT_AUTHNAME,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
NPOINT => NPOINT,
|
||
NPASS => NPASS,
|
||
NSELECT_EXEC => NSELECT_EXEC,
|
||
SEXECUTEMETHOD => SEXECUTEMETHOD,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME,
|
||
NSEND_PREDEFINED_EXEC => NSEND_PREDEFINED_EXEC,
|
||
NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC);
|
||
/* Если это первый шаг и уже известен следующий статус */
|
||
if ((NSTEP_CURRENT = 1) and (SNEXT_STAT is not null)) then
|
||
/* Сразу выполняем следующее действие */
|
||
P_CLNEVENTS_CHANGE_STATE_WEB(NCOMPANY => NCOMPANY,
|
||
NIDENT => NIDENT,
|
||
NSTEP => NSTEP,
|
||
NEVENT => NEVENT,
|
||
SEVENT_TYPE => SEVENT_TYPE,
|
||
SEVENT_STAT => SEVENT_STAT,
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SINIT_AUTHNAME => SINIT_AUTHNAME,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
NPOINT => NPOINT,
|
||
NPASS => EVRTPTPASS_NEXT_GET(NCOMPANY => NCOMPANY,
|
||
SEVENT_TYPE => SEVENT_TYPE,
|
||
NPOINT => NPOINT,
|
||
SEVENT_STAT => SEVENT_STAT,
|
||
SNEXT_STAT => SNEXT_STAT),
|
||
NSELECT_EXEC => NSELECT_EXEC,
|
||
SEXECUTEMETHOD => SEXECUTEMETHOD,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME,
|
||
NSEND_PREDEFINED_EXEC => NSEND_PREDEFINED_EXEC,
|
||
NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC);
|
||
/* Указываем следующий статус */
|
||
SEVENT_STAT := SNEXT_STAT;
|
||
end if;
|
||
/* Если это последний шаг */
|
||
if (NSTEP_CURRENT = 3) then
|
||
/* Если добавлено примечание */
|
||
if (SNOTE is not null) then
|
||
P_CLNEVNOTES_INSERT(NCOMPANY => NCOMPANY,
|
||
NPRN => NEVENT,
|
||
SNOTE_HEADER => SNOTE_HEADER,
|
||
SNOTE => SNOTE,
|
||
NRN => NNOTE_RN);
|
||
end if;
|
||
/* Очищаем отмеченные записи */
|
||
P_SELECTLIST_CLEAR(NIDENT => NIDENT);
|
||
end if;
|
||
exception
|
||
when others then
|
||
/* Если список отмеченных есть */
|
||
if (NIDENT is not null) then
|
||
/* Удаляем в автономной транзакции */
|
||
P_SELECTLIST_CLEAR_AT(NIDENT => NIDENT);
|
||
end if;
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end CLNEVENTS_STATE_CHANGE;
|
||
|
||
/* Переадресация события */
|
||
procedure CLNEVENTS_SEND
|
||
(
|
||
NIDENT in out number, -- Рег. номер отмеченных записей
|
||
NSTEP in out number, -- Шаг выполнения
|
||
NEVENT in out number, -- Событие, для отбора исполнителей
|
||
SEVENT_TYPE in out varchar2, -- Тип события, для отбора точек перехода и исполнителей
|
||
SEVENT_STAT in out varchar2, -- Текущий статус события, для отбора исполнителей
|
||
SINIT_PERSON in out varchar2, -- Инициатор–сотрудник, для отбора исполнителей
|
||
SINIT_AUTHNAME in out varchar2, -- Инициатор–пользователь, для отбора исполнителей
|
||
SCLIENT_CLIENT in out varchar2, -- Клиент–организация, для отбора исполнителей
|
||
SCLIENT_PERSON in out varchar2, -- Клиент–сотрудник, для отбора исполнителей
|
||
SEXECUTEMETHOD out varchar2, -- Мнемокод метода
|
||
SSEND_CLIENT in varchar2, -- Направить – организация
|
||
SSEND_DIVISION in varchar2, -- Направить – подразделение
|
||
SSEND_POST in varchar2, -- Направить – должность
|
||
SSEND_PERFORM in varchar2, -- Направить – должность в подразделении
|
||
SSEND_PERSON in out varchar2, -- Направить – сотрудник
|
||
SSEND_STAFFGRP in varchar2, -- Направить – нештатная структура
|
||
SSEND_USER_GROUP in varchar2, -- Направить – группа пользователей
|
||
SSEND_USER_NAME in out varchar2, -- Направить – пользователь
|
||
NSEND_PREDEFINED_EXEC in number, -- Переадресация
|
||
NSEND_PREDEFINED_PROC in number, -- Процедура выбора предопределенного исполнителя
|
||
SNOTE_HEADER in varchar2 := null, -- Заголовок примечания (при наличии)
|
||
SNOTE in varchar2 := null -- Примечание (при наличии)
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
NTMP PKG_STD.TREF; -- Заглушка
|
||
NSTEP_CURRENT PKG_STD.TREF; -- Номер текущего шага
|
||
NNOTE_RN PKG_STD.TREF; -- Рег. номер добавленного примечания
|
||
begin
|
||
/* Определяем номер текущего шага */
|
||
NSTEP_CURRENT := NSTEP;
|
||
/* Если это первый шаг */
|
||
if (NSTEP_CURRENT = 1) then
|
||
/* Генерируем идентификатор отмеченных записей */
|
||
NIDENT := GEN_IDENT();
|
||
/* Добавляем запись события в отмеченные */
|
||
P_SELECTLIST_BASE_INSERT(NIDENT => NIDENT,
|
||
NCOMPANY => NCOMPANY,
|
||
NDOCUMENT => NEVENT,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
SACTIONCODE => SSELECTLIST_ACTION,
|
||
NCRN => null,
|
||
NDOCUMENT1 => null,
|
||
SUNITCODE1 => null,
|
||
SACTIONCODE1 => null,
|
||
NRN => NTMP);
|
||
end if;
|
||
/* Выполняем переадресацию события */
|
||
P_CLNEVENTS_SEND_WEB(NCOMPANY => NCOMPANY,
|
||
NIDENT => NIDENT,
|
||
NSTEP => NSTEP,
|
||
NEVENT => NEVENT,
|
||
SEVENT_TYPE => SEVENT_TYPE,
|
||
SEVENT_STAT => SEVENT_STAT,
|
||
SINIT_PERSON => SINIT_PERSON,
|
||
SINIT_AUTHNAME => SINIT_AUTHNAME,
|
||
SCLIENT_CLIENT => SCLIENT_CLIENT,
|
||
SCLIENT_PERSON => SCLIENT_PERSON,
|
||
SEXECUTEMETHOD => SEXECUTEMETHOD,
|
||
SSEND_CLIENT => SSEND_CLIENT,
|
||
SSEND_DIVISION => SSEND_DIVISION,
|
||
SSEND_POST => SSEND_POST,
|
||
SSEND_PERFORM => SSEND_PERFORM,
|
||
SSEND_PERSON => SSEND_PERSON,
|
||
SSEND_STAFFGRP => SSEND_STAFFGRP,
|
||
SSEND_USER_GROUP => SSEND_USER_GROUP,
|
||
SSEND_USER_NAME => SSEND_USER_NAME,
|
||
NSEND_PREDEFINED_EXEC => NSEND_PREDEFINED_EXEC,
|
||
NSEND_PREDEFINED_PROC => NSEND_PREDEFINED_PROC);
|
||
/* Если это последний шаг */
|
||
if (NSTEP_CURRENT = 2) then
|
||
/* Если добавлено примечание */
|
||
if (SNOTE is not null) then
|
||
P_CLNEVNOTES_INSERT(NCOMPANY => NCOMPANY,
|
||
NPRN => NEVENT,
|
||
SNOTE_HEADER => SNOTE_HEADER,
|
||
SNOTE => SNOTE,
|
||
NRN => NNOTE_RN);
|
||
end if;
|
||
/* Очищаем отмеченные записи */
|
||
P_SELECTLIST_CLEAR(NIDENT => NIDENT);
|
||
end if;
|
||
exception
|
||
when others then
|
||
/* Если список отмеченных есть */
|
||
if (NIDENT is not null) then
|
||
/* Удаляем в автономной транзакции */
|
||
P_SELECTLIST_CLEAR_AT(NIDENT => NIDENT);
|
||
end if;
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end CLNEVENTS_SEND;
|
||
|
||
/* Возврат в предыдущую точку события */
|
||
procedure CLNEVENTS_RETURN
|
||
(
|
||
NCLNEVENTS in number -- Рег. номер события
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
begin
|
||
/* Возвращаем событие */
|
||
P_CLNEVENTS_RETURN_WEB(NCOMPANY => NCOMPANY, NIDENT => null, NEVENT => NCLNEVENTS);
|
||
end CLNEVENTS_RETURN;
|
||
|
||
/* Считывание маршрутов и исполнителей события */
|
||
procedure CLNEVENTS_GET_INFO_BY_CODE
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
SSRC PKG_STD.TSTRING; -- Наименование точки маршрута
|
||
SDEST PKG_STD.TSTRING; -- Наименование точки перехода
|
||
begin
|
||
/* Формируем XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
|
||
/* Цикл по точкам маршрута и точкам перехода */
|
||
for REC in (select CST1.EVNSTAT_CODE SSRC,
|
||
CST2.EVNSTAT_CODE SDEST
|
||
from EVRTPTPASS EPS,
|
||
EVRTPOINTS EP1,
|
||
CLNEVNTYPSTS CT1,
|
||
CLNEVNSTATS CST1,
|
||
EVRTPOINTS EP2,
|
||
CLNEVNTYPSTS CT2,
|
||
CLNEVNSTATS CST2
|
||
where EPS.PRN in (select EP.RN
|
||
from EVROUTES ER,
|
||
CLNEVNTYPES C,
|
||
EVRTPOINTS EP
|
||
where ER.COMPANY = NCOMPANY
|
||
and ER.EVENT_TYPE = C.RN
|
||
and C.EVNTYPE_CODE = SEVNTYPE_CODE
|
||
and EP.PRN = ER.RN)
|
||
and EPS.FORCE_ONLY = 0
|
||
and EPS.PRN = EP1.RN
|
||
and EP1.EVENT_STATUS = CT1.RN
|
||
and CT1.EVENT_STATUS = CST1.RN
|
||
and EPS.NEXT_POINT = EP2.RN
|
||
and EP2.EVENT_STATUS = CT2.RN
|
||
and CT2.EVENT_STATUS = CST2.RN)
|
||
loop
|
||
/* Добавляем информацию о маршруте */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XEVROUTES');
|
||
/* Начало перехода */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SSOURCE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.SSRC);
|
||
PKG_XFAST.UP();
|
||
/* Конец перехода */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SDESTINATION');
|
||
PKG_XFAST.VALUE(SVALUE => REC.SDEST);
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
/* Цикл по точкам маршрута */
|
||
for REC in (select CST.EVNSTAT_CODE,
|
||
CST.EVNSTAT_NAME,
|
||
EP.COMMENTARY,
|
||
EP.ADDNOTE_ONCHST,
|
||
EP.ADDNOTE_ONSEND,
|
||
EP.BAN_UPDATE
|
||
from EVROUTES ER,
|
||
CLNEVNTYPES C,
|
||
EVRTPOINTS EP,
|
||
CLNEVNTYPSTS CT,
|
||
CLNEVNSTATS CST
|
||
where ER.COMPANY = NCOMPANY
|
||
and ER.EVENT_TYPE = C.RN
|
||
and C.EVNTYPE_CODE = SEVNTYPE_CODE
|
||
and EP.PRN = ER.RN
|
||
and EP.EVENT_STATUS = CT.RN
|
||
and CT.EVENT_STATUS = CST.RN)
|
||
loop
|
||
/* Добавляем информацию о точке маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XEVPOINTS');
|
||
/* Мнемокод точки маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SEVPOINT');
|
||
PKG_XFAST.VALUE(SVALUE => REC.EVNSTAT_CODE);
|
||
PKG_XFAST.UP();
|
||
/* Описание в точке маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SEVPOINT_DESCR');
|
||
PKG_XFAST.VALUE(SVALUE => COALESCE(REC.COMMENTARY, REC.EVNSTAT_NAME));
|
||
PKG_XFAST.UP();
|
||
/* Признак добавления примечания при переходе в точку маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'ADDNOTE_ONCHST');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.ADDNOTE_ONCHST));
|
||
PKG_XFAST.UP();
|
||
/* Признак добавления примечания при перенаправлении в точке маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'ADDNOTE_ONSEND');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.ADDNOTE_ONSEND));
|
||
PKG_XFAST.UP();
|
||
/* Признак запрета исправления события в точке маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'BAN_UPDATE');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.BAN_UPDATE));
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
/* Цикл по типам заголовков примечаний */
|
||
for REC in (select NT.NAME
|
||
from CLNEVNTYPES ET,
|
||
CLNEVNTYPENOTES TN,
|
||
CLNEVNTNOTETYPES NT
|
||
where ET.COMPANY = NCOMPANY
|
||
and ET.EVNTYPE_CODE = SEVNTYPE_CODE
|
||
and TN.PRN = ET.RN
|
||
and NT.RN = TN.NOTE_TYPE)
|
||
loop
|
||
/* Добавляем информацию о заголовке примечания */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XNOTETYPES');
|
||
/* Наименование типа заголовка примечания */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SNAME');
|
||
PKG_XFAST.VALUE(SVALUE => REC.NAME);
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в CLOB */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
end CLNEVENTS_GET_INFO_BY_CODE;
|
||
|
||
/* Считывание учётных документов события */
|
||
procedure CLNEVENTS_DOCLINKS_GET
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML с параметрами фильтра по умолчанию
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
begin
|
||
/* Формируем XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
|
||
/* Цикл по учётным документам */
|
||
for REC in (select C.LINKED_RN NRN,
|
||
C.LINKED_UNIT SUNIT
|
||
from CLNEVENTS C,
|
||
CLNEVNTYPES CT
|
||
where C.COMPANY = NCOMPANY
|
||
and C.EVENT_TYPE = CT.RN
|
||
and CT.EVNTYPE_CODE = SEVNTYPE_CODE
|
||
and C.LINKED_RN is not null)
|
||
loop
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XDOCLINKS');
|
||
/* Идентификатор */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NRN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.NRN);
|
||
PKG_XFAST.UP();
|
||
/* Описатель документа */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SDESCR');
|
||
PKG_XFAST.VALUE(SVALUE => UTL_UNITLIST_DESCR_GET(SUNIT_CODE => REC.SUNIT, NDOCUMENT => REC.NRN));
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в CLOB */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
end CLNEVENTS_DOCLINKS_GET;
|
||
|
||
/* Считывание списка рег. номеров дочерних каталогов (включая основной) */
|
||
procedure CLNEVENTS_SUBCATALOGS_GET
|
||
(
|
||
SCRN_NAME in varchar2, -- Наименование каталога
|
||
NSUBCAT in number := 0, -- Признак включения подкаталогов (0 - нет, 1 - да)
|
||
SRESULT out varchar2 -- Список рег. номеров каталогов
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
NCRN_MAIN PKG_STD.TREF; -- Рег. номер основного каталога
|
||
begin
|
||
/* Считываем рег. номер основого каталога */
|
||
FIND_ACATALOG_NAME(NFLAG_SMART => 0,
|
||
NCOMPANY => NCOMPANY,
|
||
NVERSION => null,
|
||
SUNITCODE => SUNIT_CLNEVENTS,
|
||
SNAME => SCRN_NAME,
|
||
NRN => NCRN_MAIN);
|
||
/* Если требуется включить подкаталоги */
|
||
if (NSUBCAT = 1) then
|
||
/* Цикл по иерерахии каталогов */
|
||
for REC in (select A.RN from ACATALOG A start with A.RN = NCRN_MAIN connect by prior A.RN = A.CRN)
|
||
loop
|
||
SRESULT := SRESULT || REC.RN || ';';
|
||
end loop;
|
||
else
|
||
/* Указываем только основной каталог */
|
||
SRESULT := TO_CHAR(NCRN_MAIN);
|
||
end if;
|
||
/* Удаляем лишний ";" */
|
||
SRESULT := RTRIM(SRESULT, ';');
|
||
end CLNEVENTS_SUBCATALOGS_GET;
|
||
|
||
/* Формирование условий отбора фильтра */
|
||
procedure CLNEVENTS_COND
|
||
is
|
||
begin
|
||
/* Установка главной таблицы */
|
||
PKG_COND_BROKER.SET_TABLE(STABLE_NAME => 'CLNEVENTS');
|
||
/* Формирование условий отбора */
|
||
/* Условие по состоянию события */
|
||
PKG_COND_BROKER.ADD_CONDITION_BETWEEN(SCOLUMN_NAME => 'CLOSED',
|
||
SCONDITION_NAME_FROM => 'BYEV_CLOSED_From',
|
||
SCONDITION_NAME_TO => 'BYEV_CLOSED_To');
|
||
/* Условие по типу события */
|
||
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'EVNTYPE_CODE',
|
||
SCONDITION_NAME => 'BYEV_TYPE',
|
||
SJOINS => 'EVENT_TYPE <- RN;CLNEVNTYPES');
|
||
/* Условие по каталогу события */
|
||
PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'CRN', SCONDITION_NAME => 'BYEV_CRN');
|
||
/* Условие по исполнителю */
|
||
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'AGNABBR',
|
||
SCONDITION_NAME => 'BYEV_S_PERSON',
|
||
SJOINS => 'SEND_PERSON <- RN;CLNPERSONS;PERS_AGENT <- RN;AGNLIST');
|
||
/* Условие по подразделению */
|
||
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE',
|
||
SCONDITION_NAME => 'BYEV_S_DIVISION',
|
||
SJOINS => 'SEND_DIVISION <- RN;INS_DEPARTMENT');
|
||
/* Условие по группе пользователей */
|
||
PKG_COND_BROKER.ADD_CONDITION_CODE(SCOLUMN_NAME => 'CODE',
|
||
SCONDITION_NAME => 'BYEV_S_USER_GROUP',
|
||
SJOINS => 'SEND_USER_GROUP <- RN;USERGRP');
|
||
/* Условие по учётному документу */
|
||
PKG_COND_BROKER.ADD_CONDITION_COMPARE(SCOLUMN_NAME => 'LINKED_RN',
|
||
SOPERATION => '=',
|
||
SCONDITION_NAME => 'BYEV_LINKED_RN');
|
||
end CLNEVENTS_COND;
|
||
|
||
/* Считывание настройки раздела "События" для пользователя */
|
||
procedure CLNEVENTS_DP_RULES_GET
|
||
(
|
||
COUT out clob -- XML с настройкой раздела
|
||
)
|
||
is
|
||
SAUTHID PKG_STD.TSTRING := PKG_SESSION.GET_UTILIZER(); -- Пользователь
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
BXML blob; -- XML профиля пользователя для раздела "События"
|
||
RDOC PKG_XPATH.TDOCUMENT; -- Документ XML
|
||
RNODE_ROOT PKG_XPATH.TNODE; -- Корневой узел
|
||
RNODE_MAIN PKG_XPATH.TNODE; -- Основной узел
|
||
RNODE_GRIDFRAME PKG_XPATH.TNODE; -- Узел "gridFrame"
|
||
RNODE_DECOR_RULES PKG_XPATH.TNODE; -- Узел "decorationRules"
|
||
RNODE_RULE PKG_XPATH.TNODE; -- Узел "rule"
|
||
RNODE_RULE_LIST PKG_XPATH.TNODES; -- Список узлов "rule"
|
||
SFIELD PKG_STD.TSTRING; -- Код свойства документа (в формате "DP_<РЕГ_НОМЕР>")
|
||
SCOLOR PKG_STD.TSTRING; -- Код цвета
|
||
SDATA_TYPE PKG_STD.TSTRING; -- Тип данных
|
||
SDP_NAME PKG_STD.TSTRING; -- Наименование свойства документа
|
||
NFROM_VALUE PKG_STD.TNUMBER; -- Значение с (number)
|
||
NTO_VALUE PKG_STD.TNUMBER; -- Значение по (number)
|
||
SFROM_VALUE PKG_STD.TSTRING; -- Значение с (string)
|
||
STO_VALUE PKG_STD.TSTRING; -- Значение по (string)
|
||
DFROM_VALUE PKG_STD.TLDATE; -- Значение с (date)
|
||
DTO_VALUE PKG_STD.TLDATE; -- Значение по (date)
|
||
|
||
/* Считывание наименования свойства документа */
|
||
function DOCS_PROPS_NAME_GET
|
||
(
|
||
SFIELD in varchar2 -- Код свойства документа (в формате "DP_<РЕГ_НОМЕР>")
|
||
) return varchar2 -- Наименование свойства документа
|
||
is
|
||
NRN PKG_STD.TREF; -- Рег. номер свойства документа
|
||
SRESULT PKG_STD.TSTRING; -- Наименование доп. свойства
|
||
begin
|
||
/* Определяем рег. номер свойства документа по формату "DP_<РЕГ_НОМЕР>" */
|
||
NRN := TO_NUMBER(SUBSTR(SFIELD, INSTR(SFIELD, '_') + 1));
|
||
/* Считываем наименование из записи свойства документа */
|
||
begin
|
||
select T.NAME into SRESULT from DOCS_PROPS T where T.RN = NRN;
|
||
exception
|
||
when NO_DATA_FOUND then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания записи свойства документа с рег. номером (%s).');
|
||
when others then
|
||
P_EXCEPTION(0,
|
||
'Ошибка считывания наименования свойства документа с рег. номером (%s).');
|
||
end;
|
||
/* Возвращаем результат */
|
||
return SRESULT;
|
||
end DOCS_PROPS_NAME_GET;
|
||
|
||
/* Считывание профиля пользователя для раздела "События" */
|
||
function USERPROFILES_GET
|
||
(
|
||
NCOMPANY in number, -- Рег. номер организации
|
||
SAUTHID in varchar2 -- Мнемокод пользователя
|
||
) return blob -- Профиль пользователя для раздела "События"
|
||
is
|
||
BRESULT blob; -- Профиль пользователя для раздела "События"
|
||
begin
|
||
/* Считываем профиль пользователя для раздела "События" */
|
||
begin
|
||
select U.USERDATA
|
||
into BRESULT
|
||
from USERPROFILES U
|
||
where U.COMPANY = NCOMPANY
|
||
and U.AUTHID = SAUTHID
|
||
and U.REC_TYPE = 1
|
||
and U.UNITMODE = 0
|
||
and U.UNITCODE = SUNIT_CLNEVENTS;
|
||
exception
|
||
when others then
|
||
P_EXCEPTION(0,
|
||
'Профиль пользователя "%s" для раздела "События" не найден.',
|
||
SAUTHID);
|
||
end;
|
||
/* Возвращаем результат */
|
||
return BRESULT;
|
||
end USERPROFILES_GET;
|
||
begin
|
||
/* Считываем профиль пользователя для раздела "События" */
|
||
BXML := USERPROFILES_GET(NCOMPANY => NCOMPANY, SAUTHID => SAUTHID);
|
||
begin
|
||
/* Формируем XML данных */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
|
||
/* Загрузка XML */
|
||
RDOC := PKG_XPATH.PARSE_FROM_BLOB(LBXML => BXML);
|
||
RNODE_ROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => RDOC);
|
||
/* Обработка XML */
|
||
RNODE_MAIN := PKG_XPATH.FIRST_NODE(RPARENT_NODE => RNODE_ROOT);
|
||
RNODE_GRIDFRAME := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_MAIN, SPATTERN => 'gridFrame');
|
||
RNODE_DECOR_RULES := PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_GRIDFRAME, SPATTERN => 'decorationRules');
|
||
RNODE_RULE_LIST := PKG_XPATH.LIST_NODES(RPARENT_NODE => RNODE_DECOR_RULES, SPATTERN => 'rule');
|
||
/* Цикл по узлам внутри узла rule */
|
||
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => RNODE_RULE_LIST)
|
||
loop
|
||
/* Считываем текущее правило */
|
||
RNODE_RULE := PKG_XPATH.ITEM_NODE(RNODES => RNODE_RULE_LIST, INUMBER => I);
|
||
/* Атрибуты */
|
||
SFIELD := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'field');
|
||
SCOLOR := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'color');
|
||
SDATA_TYPE := PKG_XPATH.ATTRIBUTE(RNODE => RNODE_RULE, SNAME => 'dataType');
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XRULES');
|
||
/* Код правила */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SFIELD');
|
||
PKG_XFAST.VALUE(SVALUE => SFIELD);
|
||
PKG_XFAST.UP();
|
||
/* Считываем наименование свойства документа */
|
||
SDP_NAME := DOCS_PROPS_NAME_GET(SFIELD => SFIELD);
|
||
/* Наименование доп. свойства */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SDP_NAME');
|
||
PKG_XFAST.VALUE(SVALUE => SDP_NAME);
|
||
PKG_XFAST.UP();
|
||
/* Код цвета */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SCOLOR');
|
||
PKG_XFAST.VALUE(SVALUE => SCOLOR);
|
||
PKG_XFAST.UP();
|
||
/* Тип значения */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'STYPE');
|
||
PKG_XFAST.VALUE(SVALUE => SDATA_TYPE);
|
||
PKG_XFAST.UP();
|
||
/* Исходим от типа данных */
|
||
case SDATA_TYPE
|
||
/* Число */
|
||
when 'number' then
|
||
NFROM_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'fromValue'));
|
||
NTO_VALUE := PKG_XPATH.VALUE_NUM(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'toValue'));
|
||
/* Число с */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NFROM');
|
||
PKG_XFAST.VALUE(NVALUE => NFROM_VALUE);
|
||
PKG_XFAST.UP();
|
||
/* Число по */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NTO');
|
||
PKG_XFAST.VALUE(NVALUE => NTO_VALUE);
|
||
PKG_XFAST.UP();
|
||
/* Строка */
|
||
when 'string' then
|
||
SFROM_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'fromValue'));
|
||
STO_VALUE := PKG_XPATH.VALUE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'toValue'));
|
||
/* Строка с */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SFROM');
|
||
PKG_XFAST.VALUE(SVALUE => SFROM_VALUE);
|
||
PKG_XFAST.UP();
|
||
/* Строка по */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'STO');
|
||
PKG_XFAST.VALUE(SVALUE => STO_VALUE);
|
||
PKG_XFAST.UP();
|
||
/* Дата */
|
||
else
|
||
DFROM_VALUE := PKG_XPATH.VALUE_DATE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'fromValue'));
|
||
DTO_VALUE := PKG_XPATH.VALUE_DATE(RNODE => PKG_XPATH.SINGLE_NODE(RPARENT_NODE => RNODE_RULE,
|
||
SPATTERN => 'toValue'));
|
||
/* Дата с */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DFROM');
|
||
PKG_XFAST.VALUE(DVALUE => DFROM_VALUE);
|
||
PKG_XFAST.UP();
|
||
/* Дата по */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DTO');
|
||
PKG_XFAST.VALUE(DVALUE => DTO_VALUE);
|
||
PKG_XFAST.UP();
|
||
end case;
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
PKG_XPATH.FREE(RDOCUMENT => RDOC);
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в CLOB */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
exception
|
||
when others then
|
||
PKG_XPATH.FREE(RDOCUMENT => RDOC);
|
||
PKG_XFAST.EPILOGUE();
|
||
end;
|
||
end CLNEVENTS_DP_RULES_GET;
|
||
|
||
/* Считывание свойств раздела "События" */
|
||
procedure CLNEVENTS_PROPS_GET
|
||
(
|
||
SEVNTYPE_CODE in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- XML со свойствами раздела
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
|
||
begin
|
||
/* Формируем XML данных */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DATA');
|
||
/* Цикл по свойствам документа */
|
||
for REC in (select CEP.PROPERTY,
|
||
CEP.PROPERTY_LINK,
|
||
DPL.NAME,
|
||
DPL.READONLY,
|
||
DPL.CHECK_VALUE,
|
||
DPL.CHECK_UNIQUE,
|
||
DPL.REQUIRE,
|
||
DPL.DUPLICATE_VALUE,
|
||
DPL.ACCESS_MODE,
|
||
DPL.SHOW_IN_GRID,
|
||
DPL.DEFAULT_STR,
|
||
DPL.DEFAULT_NUM,
|
||
DPL.DEFAULT_DATE,
|
||
DP.ENTRY_TYPE,
|
||
DP.FORMAT,
|
||
DP.DATA_SUBTYPE,
|
||
DP.NUM_WIDTH,
|
||
DP.NUM_PRECISION,
|
||
DP.STR_WIDTH,
|
||
DP.UNITCODE,
|
||
DP.PARAM_RN,
|
||
UP.IN_CODE,
|
||
UP.OUT_CODE,
|
||
DP.SHOW_METHOD_RN,
|
||
UM.METHOD_CODE,
|
||
DP.EXTRA_DICT_RN,
|
||
DP.INIT_RN
|
||
from CLEVTPROPS CEP,
|
||
CLNEVNTYPES CET,
|
||
DOCS_PROPS DP,
|
||
DOCS_PROPS_LINKS DPL,
|
||
UNITPARAMS UP,
|
||
UNIT_SHOWMETHODS UM
|
||
where CEP.PRN = CET.RN
|
||
and CET.EVNTYPE_CODE = SEVNTYPE_CODE
|
||
and CEP.COMPANY = NCOMPANY
|
||
and CEP.PROPERTY = DP.RN(+)
|
||
and CEP.PROPERTY_LINK = DPL.RN(+)
|
||
and (DP.PARAM_RN = UP.RN(+) and DP.UNITCODE = UP.UNITCODE(+))
|
||
and (DP.SHOW_METHOD_RN = UM.RN(+) and DP.UNITCODE = UM.UNITCODE(+))
|
||
order by DPL.POSITION)
|
||
loop
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XPROPS');
|
||
/* Рег. номер свойства */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NRN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.PROPERTY);
|
||
PKG_XFAST.UP();
|
||
/* Наименование свойства */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SNAME');
|
||
PKG_XFAST.VALUE(SVALUE => REC.NAME);
|
||
PKG_XFAST.UP();
|
||
/* Признак "только для чтения" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'BREADONLY');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.READONLY));
|
||
PKG_XFAST.UP();
|
||
/* Признак "проверка/синхронизация вводимого значения" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'CHECK_VALUE');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.CHECK_VALUE));
|
||
PKG_XFAST.UP();
|
||
/* Признак "проверка вводимого значения на уникальность" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'CHECK_UNIQUE');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.CHECK_UNIQUE));
|
||
PKG_XFAST.UP();
|
||
/* Признак "обязательность к заполнению" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'BREQUIRE');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.REQUIRE));
|
||
PKG_XFAST.UP();
|
||
/* Признак размножения */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DUPLICATE_VALUE');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.DUPLICATE_VALUE));
|
||
PKG_XFAST.UP();
|
||
/* Уровень доступа к значениям свойства */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NACCESS_MODE');
|
||
PKG_XFAST.VALUE(NVALUE => REC.ACCESS_MODE);
|
||
PKG_XFAST.UP();
|
||
/* Признак "показывать значение свойства в гриде раздела" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'BSHOW_IN_GRID');
|
||
PKG_XFAST.VALUE(BVALUE => INT2BOOL(REC.SHOW_IN_GRID));
|
||
PKG_XFAST.UP();
|
||
/* Строка "по умолчанию" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SDEFAULT_STR');
|
||
PKG_XFAST.VALUE(SVALUE => REC.DEFAULT_STR);
|
||
PKG_XFAST.UP();
|
||
/* Число "по умолчанию" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NDEFAULT_NUM');
|
||
PKG_XFAST.VALUE(SVALUE => REC.DEFAULT_NUM);
|
||
PKG_XFAST.UP();
|
||
/* Дата "по умолчанию" */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'DDEFAULT_DATE');
|
||
PKG_XFAST.VALUE(DVALUE => REC.DEFAULT_DATE);
|
||
PKG_XFAST.UP();
|
||
/* Способ формирования */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NENTRY_TYPE');
|
||
PKG_XFAST.VALUE(NVALUE => REC.ENTRY_TYPE);
|
||
PKG_XFAST.UP();
|
||
/* Формат данных */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NFORMAT');
|
||
PKG_XFAST.VALUE(NVALUE => REC.FORMAT);
|
||
PKG_XFAST.UP();
|
||
/* Подтип */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NDATA_SUBTYPE');
|
||
PKG_XFAST.VALUE(NVALUE => REC.DATA_SUBTYPE);
|
||
PKG_XFAST.UP();
|
||
/* Длина числа */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NNUM_WIDTH');
|
||
PKG_XFAST.VALUE(NVALUE => REC.NUM_WIDTH);
|
||
PKG_XFAST.UP();
|
||
/* Точность числа */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NNUM_PRECISION');
|
||
PKG_XFAST.VALUE(NVALUE => REC.NUM_PRECISION);
|
||
PKG_XFAST.UP();
|
||
/* Длина строки */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NSTR_WIDTH');
|
||
PKG_XFAST.VALUE(NVALUE => REC.STR_WIDTH);
|
||
PKG_XFAST.UP();
|
||
/* Код раздела */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SUNITCODE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.UNITCODE);
|
||
PKG_XFAST.UP();
|
||
/* Рег. номер параметра раздела */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NPARAM_RN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.PARAM_RN);
|
||
PKG_XFAST.UP();
|
||
/* Код параметра раздела (входящий) */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SPARAM_IN_CODE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.IN_CODE);
|
||
PKG_XFAST.UP();
|
||
/* Код параметра раздела (исходящий) */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SPARAM_OUT_CODE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.OUT_CODE);
|
||
PKG_XFAST.UP();
|
||
/* Рег. номер метода вызова */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NSHOW_METHOD_RN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.SHOW_METHOD_RN);
|
||
PKG_XFAST.UP();
|
||
/* Код метода вызова */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SMETHOD_CODE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.METHOD_CODE);
|
||
PKG_XFAST.UP();
|
||
/* Рег. номер дополнительного словаря */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NEXTRA_DICT_RN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.EXTRA_DICT_RN);
|
||
PKG_XFAST.UP();
|
||
/* Рег. номер свойства инициализации */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NINIT_RN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.INIT_RN);
|
||
PKG_XFAST.UP();
|
||
/* Отформатированный рег. номер (как в доп. свойствах задачи) */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SFORMATTED_ID');
|
||
PKG_XFAST.VALUE(SVALUE => UTL_DP_FORMATTED_ID_GET(NTYPE => REC.FORMAT, NRN => REC.PROPERTY));
|
||
PKG_XFAST.UP();
|
||
PKG_XFAST.UP();
|
||
end loop;
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем в CLOB */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
PKG_XFAST.EPILOGUE();
|
||
end CLNEVENTS_PROPS_GET;
|
||
|
||
/* Загрузка статусов типа события */
|
||
procedure CLNEVNSTATS_LOAD
|
||
(
|
||
SCLNEVNTYPES in varchar2, -- Мнемокод типа события
|
||
COUT out clob -- Статусы типа события
|
||
)
|
||
is
|
||
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
|
||
NINDEX PKG_STD.TREF := 0; -- Индекс статуса
|
||
begin
|
||
/* Начинаем формирование XML */
|
||
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
|
||
/* Открываем статусы */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XCLNEVNSTATS');
|
||
/* Считываем статусы типа события */
|
||
for REC in (select S.RN,
|
||
S.EVNSTAT_CODE,
|
||
S.EVNSTAT_NAME,
|
||
(select EP.COMMENTARY
|
||
from EVROUTES ER,
|
||
EVRTPOINTS EP
|
||
where ER.EVENT_TYPE = T.RN
|
||
and EP.PRN = ER.RN
|
||
and EP.EVENT_STATUS = TS.RN
|
||
and EP.COMMENTARY is not null
|
||
and rownum = 1) COMMENTARY
|
||
from CLNEVNTYPES T,
|
||
CLNEVNTYPSTS TS,
|
||
CLNEVNSTATS S
|
||
where T.COMPANY = NCOMPANY
|
||
and T.EVNTYPE_CODE = SCLNEVNTYPES
|
||
and TS.PRN = T.RN
|
||
and TS.EVENT_STATUS = S.RN
|
||
order by TS.DEFAULT_STATUS desc,
|
||
S.EVNSTAT_CODE)
|
||
loop
|
||
/* Открываем статус */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'XSTATUS');
|
||
/* Индекс статуса */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'ID');
|
||
PKG_XFAST.VALUE(NVALUE => NINDEX);
|
||
PKG_XFAST.UP();
|
||
/* Рег. номер статуса */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'NRN');
|
||
PKG_XFAST.VALUE(NVALUE => REC.RN);
|
||
PKG_XFAST.UP();
|
||
/* Мнемокод статуса */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SEVNSTAT_CODE');
|
||
PKG_XFAST.VALUE(SVALUE => REC.EVNSTAT_CODE);
|
||
PKG_XFAST.UP();
|
||
/* Наименование статуса */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SEVNSTAT_NAME');
|
||
PKG_XFAST.VALUE(SVALUE => REC.EVNSTAT_NAME);
|
||
PKG_XFAST.UP();
|
||
/* Описание в точке маршрута */
|
||
PKG_XFAST.DOWN_NODE(SNAME => 'SEVPOINT_DESCR');
|
||
PKG_XFAST.VALUE(SVALUE => COALESCE(REC.COMMENTARY, REC.EVNSTAT_NAME));
|
||
PKG_XFAST.UP();
|
||
/* Закрываем статус */
|
||
PKG_XFAST.UP();
|
||
/* Увеличиваем индекс статуса */
|
||
NINDEX := NINDEX + 1;
|
||
end loop;
|
||
/* Закрываем статусы */
|
||
PKG_XFAST.UP();
|
||
/* Сериализуем */
|
||
COUT := PKG_XFAST.SERIALIZE_TO_CLOB();
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
exception
|
||
when others then
|
||
/* Завершаем формирование XML */
|
||
PKG_XFAST.EPILOGUE();
|
||
/* Вернем ошибку */
|
||
PKG_STATE.DIAGNOSTICS_STACKED();
|
||
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
|
||
end CLNEVNSTATS_LOAD;
|
||
|
||
end PKG_P8PANELS_CLNTTSKBRD;
|
||
/
|