P8-ExchangeService/db/UDO_P_FISCDOCS_MAKE_MSG_ATOL.prc

196 lines
7.6 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

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

create or replace procedure UDO_P_FISCDOCS_MAKE_MSG_ATOL
(
NCOMPANY in number, -- Организация
NFISCDOC in number, -- Регистрационный номер фискального документа
NEXSQUEUE out number -- Регистрационный номер добавленной позиции очереди обмена
)
as
/* Локальные переменные */
CDATA clob; -- Буфер для XML-посылки
SEXSSERVICE EXSSERVICEFN.CODE%type; -- Код сервиса-обработчика
SEXSSERVICEFN EXSSERVICEFN.CODE%type; -- Код функции отправки
NTMP_RN PKG_STD.TREF; -- Буфер для вычислений
/* Добавление пустой открытой ветки */
procedure NODE
(
SNAME varchar2 -- Имя ветки
)
as
begin
/* Открываем ветку */
PKG_XMLFAST.DOWN(SNAME => SNAME);
/* Добавляем её */
PKG_XMLFAST.NODE;
end NODE;
/* Добавление ветки со значением (строка) */
procedure NODE
(
SNAME varchar2, -- Имя ветки
SVALUE varchar2 -- Значение ветки
)
as
begin
/* Открываем ветку */
PKG_XMLFAST.DOWN(SNAME => SNAME);
/* Добавляем её */
PKG_XMLFAST.NODE;
/* Выставляем значение */
PKG_XMLFAST.VALUE(SVALUE => SVALUE);
/* Закрываем ветку */
PKG_XMLFAST.UP;
end NODE;
/* Добавление ветки со значением (число) */
procedure NODE
(
SNAME varchar2, -- Имя ветки
NVALUE number -- Значение ветки
)
as
begin
/* Открываем ветку */
PKG_XMLFAST.DOWN(SNAME => SNAME);
/* Добавляем её */
PKG_XMLFAST.NODE;
/* Выставляем значение */
PKG_XMLFAST.VALUE(NVALUE => NVALUE);
/* Закрываем ветку */
PKG_XMLFAST.UP;
end NODE;
/* Добавление ветки со значением (дата) */
procedure NODE
(
SNAME varchar2, -- Имя ветки
DVALUE date -- Значение ветки
)
as
begin
/* Открываем ветку */
PKG_XMLFAST.DOWN(SNAME => SNAME);
/* Добавляем её */
PKG_XMLFAST.NODE;
/* Выставляем значение */
PKG_XMLFAST.VALUE(DVALUE => DVALUE);
/* Закрываем ветку */
PKG_XMLFAST.UP;
end NODE;
begin
/* Проверим наличие документа */
UDO_P_FISCDOCS_EXISTS(NRN => NFISCDOC, NCOMPANY => NCOMPANY, NCRN => NTMP_RN, NJUR_PERS => NTMP_RN);
/* Инициализируем сборку документа для отправки */
PKG_XMLFAST.PROLOGUE(NENCODING => PKG_XMLFAST.ENCODING_UTF8_,
NSTANDALONE => PKG_XMLFAST.STANDALONE_YES_,
BALINE => true);
/* Открываем корень XML документа */
NODE(SNAME => 'FISCDOC');
/* Курсорный цикл для доступа к данным фискального документа */
for D in (select T.*
from UDO_V_FISCDOCS T
where T.NRN = UDO_P_FISCDOCS_MAKE_MSG_ATOL.NFISCDOC
and T.NCOMPANY = UDO_P_FISCDOCS_MAKE_MSG_ATOL.NCOMPANY)
loop
/* Выбираем API обмена в зависимости от версии фискального документа */
case D.STYPE_VERSION
/* ФФД 1.05 */
when '1.05' then
begin
SEXSSERVICE := 'АТОЛ_V4_ИСХ';
SEXSSERVICEFN := 'V4_ФФД1.05_РегистрацияЧекаРПВ';
end;
/* Неизвестная версия ФФД */
else
begin
P_EXCEPTION(0,
'Версия фискального документа "%s" не поддерживается!',
D.STYPE_VERSION);
end;
end case;
/* Данные заголовка фискального документа */
NODE(SNAME => 'NRN', NVALUE => D.NRN);
NODE(SNAME => 'NCOMPANY', NVALUE => D.NCOMPANY);
NODE(SNAME => 'NCRN', NVALUE => D.NCRN);
NODE(SNAME => 'NJUR_PERS', NVALUE => D.NJUR_PERS);
NODE(SNAME => 'SJUR_PERS', SVALUE => D.SJUR_PERS);
NODE(SNAME => 'SDOC_PREF', SVALUE => trim(D.SDOC_PREF));
NODE(SNAME => 'SDOC_NUMB', SVALUE => trim(D.SDOC_NUMB));
NODE(SNAME => 'NDOC_TYPE', NVALUE => D.NDOC_TYPE);
NODE(SNAME => 'NDOC_TYPE_CODE', NVALUE => D.NDOC_TYPE_CODE);
NODE(SNAME => 'NTYPE_VERSION', NVALUE => D.NTYPE_VERSION);
NODE(SNAME => 'STYPE_VERSION', SVALUE => D.STYPE_VERSION);
NODE(SNAME => 'DDOC_DATE', DVALUE => D.DDOC_DATE);
NODE(SNAME => 'SDDOC_DATE', SVALUE => TO_CHAR(D.DDOC_DATE, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'NAGENT', NVALUE => D.NAGENT);
NODE(SNAME => 'SAGENT', SVALUE => D.SAGENT);
NODE(SNAME => 'NCALC_KIND', NVALUE => D.NCALC_KIND);
NODE(SNAME => 'NBASE_SUM', NVALUE => D.NBASE_SUM);
NODE(SNAME => 'SAUTHID', SVALUE => D.SAUTHID);
NODE(SNAME => 'DEDIT_TIME', DVALUE => D.DEDIT_TIME);
NODE(SNAME => 'SDEDIT_TIME', SVALUE => TO_CHAR(D.DEDIT_TIME, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'SNOTE', SVALUE => D.SNOTE);
NODE(SNAME => 'NSTATUS', NVALUE => D.NSTATUS);
NODE(SNAME => 'DSEND_TIME', DVALUE => D.DSEND_TIME);
NODE(SNAME => 'SDSEND_TIME', SVALUE => TO_CHAR(D.DSEND_TIME, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'DCONFIRM_DATE', DVALUE => D.DCONFIRM_DATE);
NODE(SNAME => 'SDCONFIRM_DATE', SVALUE => TO_CHAR(D.DCONFIRM_DATE, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'SNUMB_FD', SVALUE => D.SNUMB_FD);
NODE(SNAME => 'NFACEACC', NVALUE => D.NFACEACC);
NODE(SNAME => 'SFACEACC', SVALUE => D.SFACEACC);
NODE(SNAME => 'SADD_PROP', SVALUE => D.SADD_PROP);
NODE(SNAME => 'SSRC_UNITCODE', SVALUE => D.SSRC_UNITCODE);
NODE(SNAME => 'SSRC_UNITNAME', SVALUE => D.SSRC_UNITNAME);
NODE(SNAME => 'NSRC_TYPE', NVALUE => D.NSRC_TYPE);
NODE(SNAME => 'SSRC_TYPE', SVALUE => D.SSRC_TYPE);
NODE(SNAME => 'SSRC_NUMB', SVALUE => D.SSRC_NUMB);
NODE(SNAME => 'DSRC_DATE', DVALUE => D.DSRC_DATE);
NODE(SNAME => 'SDSRC_DATE', SVALUE => TO_CHAR(D.DSRC_DATE, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'NVALID_TYPE', NVALUE => D.NVALID_TYPE);
NODE(SNAME => 'SVALID_TYPE', SVALUE => D.SVALID_TYPE);
NODE(SNAME => 'SVALID_NUMB', SVALUE => D.SVALID_NUMB);
NODE(SNAME => 'DVALID_DATE', DVALUE => D.DVALID_DATE);
NODE(SNAME => 'SDVALID_DATE', SVALUE => TO_CHAR(D.DVALID_DATE, 'dd.mm.yyyy hh24:mi:ss'));
NODE(SNAME => 'SDOC_URL', SVALUE => D.SDOC_URL);
NODE(SNAME => 'NCORRECT_TYPE', NVALUE => D.NCORRECT_TYPE);
/* Список свойств фискального документа */
NODE('FISCDOC_PROPS');
for SP in (select T.*,
A.CODE SCODE,
A.NAME SNAME
from UDO_FISCDOCSPROP T,
UDO_FDKNDATT P,
UDO_FISCDOCATT A
where T.PRN = D.NRN
and T.PROP = P.RN
and P.ATTRIBUTE = A.RN)
loop
/* Свойство фискального документа */
NODE(SNAME => 'FISCDOC_PROP');
/* Данные свойства фискального документа */
NODE(SNAME => 'SCODE', SVALUE => SP.SCODE);
NODE(SNAME => 'SNAME', SVALUE => SP.SNAME);
NODE(SNAME => 'VALUE', SVALUE => UDO_GET_FISCDOCSPROP_VALUE(SP.RN));
NODE(SNAME => 'SVALUE', SVALUE => SP.VAL_STR);
NODE(SNAME => 'NVALUE', NVALUE => SP.VAL_NUMB);
NODE(SNAME => 'DVALUE', DVALUE => SP.VAL_DATE);
NODE(SNAME => 'DTVALUE', DVALUE => SP.VAL_DATETIME);
/* Закрываем свойство фискального документа */
PKG_XMLFAST.UP;
end loop;
/* Закрываем список свойств фискального документа */
PKG_XMLFAST.UP;
end loop;
/* Закрываем корневой тэг XML-документа */
PKG_XMLFAST.UP;
/* Финализируем сборку XML-документа */
PKG_XMLFAST.EPILOGUE(LDATA => CDATA);
/* Отправляем сформированный документ */
PKG_EXS.QUEUE_PUT(SEXSSERVICE => SEXSSERVICE,
SEXSSERVICEFN => SEXSSERVICEFN,
BMSG => CLOB2BLOB(LCDATA => CDATA, SCHARSET => 'UTF8'),
NNEW_EXSQUEUE => NEXSQUEUE);
end;
/