Модуль обмена с АТОЛ-онлайн - универсальная часть, процедура сборки фискального документа для постановки в очередь

This commit is contained in:
Mikhail Chechnev 2018-12-26 15:01:10 +03:00
parent 8962defb1d
commit 08ccd54274

View File

@ -0,0 +1,195 @@
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_PROPS');
/* Äàííûå ñâîéñòâà ôèñêàëüíîãî äîêóìåíòà */
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 => 'CL8MSWIN1251'),
NNEW_EXSQUEUE => NEXSQUEUE);
end;
/