AnyStat на примере 4512-У

AnyStat – Универсальный механизм сбора и учета информации о направленных/принятых файлах и квитанциях модулем statmonitordb для дальнейшего ее отображения в Мониторе Отчетности. Описание данного механизма содержится в документации к модулю statmonitordb.

Для работы данного механизма потребуются дополнительные таблицы в БД. Исходные данные уже содержат информацию по сбору информации, касающейся отчетности 3412-У. Далее рассмотрим стратегию сбора этих данных более подробно.

Для хранения информации используются две таблицы

Основная таблица для хранения информации STAT_4512

S4512_IDидентификатор записи
S4512_DATEдата
S4512_TYPEтип сообщения (ЭСВТ/ЭСКР)
S4512_FILEимя файла
S4512_PASSPORTномер паспорта
S4512_CONDATEдата контракта
S4512_FNSфлаг квитанции ФНС (0 – квитанции нет, 1 – положительная, 2 – отрицательная)
S4512_FTSфлаг квитанции ФТС
S4512_STATEобщий статус для записи
S4512_XMLполе для сохранения xml файла


Вторичная таблица. Файлы, связанные с основным (файлы ЭККР/ЭКВТ, квитанции) STAT_4512_FILES

S4512F_IDидентификатор
S4512F_SRCссылка на первичный файл в (S4512_ID в STAT_4512)
S4512F_DATEдата файла
S4512F_FILENAMEимя файла
S4512F_STATEстатус файла
S4512F_COMMENTкомментарий (если были ошибки)
S4512F_XMLдля хранения xml квитанции

В рамках Указания ходят следующие типы файлов:

  1. первичные ЭКВТ/ЭСКР (PS*.xml)
  2. вложения к первичным ЭСКР/ЭККР (DC.)
  3. Квитанции ФТС
  4. Квитанции ФНС

Касаемо квитанций. Префиксы файлов по типам и результату:

ТипРез.ФТСФНС
PS+FSNS
ESнет
DC+FCNC
ECнет

Класс отчетности определим как “4512” и вызываться в последствии будет с помощью run0_statutils= -ANYSTAT_4512

На первом этапе необходимо классифицировать файл (понять тип файла). Это описано в таблице STAT_CLASS, в строках с указанным CS_CLASS=4512

ЭСВТ:

SC_QUERY – правила классификацииFILE:IN:1,2,3,4,9:%N22&1% – 22 символ имени файла 1,2,3,4,9
FILE:=:PS:%N1&2% – и первые два символа имени файла PS
SC_LINK – ссылка на запись в таблице STAT_WORK451202
SC_CHECK – проверка перед обработкой451200:>:0:Файл уже присутствует в БД:select count(*) from stat_4512 where S4512_FILE=:FNAME
в соответствии с записью 451200 в STAT_WORK извлекаются данные, sql выбирает количество записей с таким же именем файла, и если записи есть, файл отбраковывается как повторный

ЭСКР:

SC_QUERY – правила классификацииFILE:IN:5,6:%N22&1% – 22 символ имени файла 5,6
FILE:=:PS:%N1&2% – и первые два символа имени файла PS
SC_LINK – ссылка на STAT_WORK451203
SC_CHECK – проверка перед обработкой451200:>:0:Файл уже присутствует в БД:select count(*) from stat_4512 where S4512_FILE=:FNAME
проверка уникальности файла аналогична ЭСВТ

ЭСКР/ЭККР:

SC_QUERY – правила классификацииFILE:=:DC:%N1&2% – первые два символа имени файла DC
SC_LINK – ссылка на запись в таблице STAT_WORK451204
SC_CHECK – проверка перед обработкойпроверка уникальности имени файла в таблице вторичных файлов и проверка наличия первичного файла
451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

Положительные квитанции ФТС ЭСВТ/ЭСКР:

SC_QUERY – правила классификацииFILE:=:FS:%N1&2% – первые два символа именги файла FS
SC_LINK – ссылка на запись в таблице STAT_WORK451205
SC_CHECK – проверка перед обработкойпроверка уникальности имени файла в таблице вторичных файлов и проверка наличия первичного файла
451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

Положительные квитанции ФНС/ФТС ЭКВТ/ЭККР

SC_QUERY – правила классификацииFILE:IN:NC,FC:%N1&2% – первые два символа именги файла FS
SC_LINK – ссылка на запись в таблице STAT_WORK451207
SC_CHECK – проверка перед обработкойпроверка уникальности имени файла в таблице вторичных файлов и проверка наличия первичного файла
451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

Положительные квитанции ФНС ЭСВТ/ЭСКР

SC_QUERY – правила классификацииFILE:=:NS:%N1&2%
SC_LINK – ссылка на запись в таблице STAT_WORK451208
SC_CHECK – проверка перед обработкой451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

Отрицательные квитанции ФТС ЭСВТ/ЭСКР

SC_QUERY – правила классификацииFILE:=:ES:%N1&2%
SC_LINK – ссылка на запись в таблице STAT_WORK451206
SC_CHECK – проверка перед обработкой451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

Отрицательные квитанции ЭСКР/ЭККР

SC_QUERY – правила классификацииFILE:=:EC:%N1&2%
SC_LINK – ссылка на запись в таблице STAT_WORK451209
SC_CHECK – проверка перед обработкой451200:>:0:Файл уже присутствует в БД:select count() from stat_4512_files where S4512F_FILENAME=:FNAME 451200:=:0:Отсутствует первичный файл:select count() from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)

При проверках перед обработкой (SC_CHECK) используется запись из STAT_WORK с идентификатором 451200
Из записи требуется только поле SW_QUERY:
FNAME:FILE:%N%.%E% – Полное имя файла
FNAME2:FILE:%N3&32% – имя файла без первых двух символов

Далее можно обработать файл, в соответствии со стратегией сбора и добавления информации из STAT_WORK, используя записи с SW_ID совпадающим с полученным на этапе классификации SC_LINK

ЭСВТ (SW_ID=451202)

SW_QUERY – извлечение данныхFILENAME:XPATH://TRANSPORT/THEADER/@file – извлекаем в переменную FILENAME имя файла в соответствии с XPath (извлекаем значение параметра file тэга THEADER, находящегося внутри TRANSPORT)
PASSPORT:XPATH://TRANSPORT/THEADER/Pasport/text() – извлекаем в переменную PASSPORT номер паспорта в соответствии с XPath (извлекаем текст внутри тэга Pasport, находящегося внутри тэга THEADER, находящегося внутри TRANSPORT)
CONDATE:XPATH://TRANSPORT/THEADER/Date/text() – извлекаем в переменную CONDATE дату контракта в соответствии с XPath (извлекаем текст внутри тэга Date, находящегося внутри тэга THEADER, находящегося внутри TRANSPORT)
XML:XPATH://* – В переменную XML сохраним весь xml документ с корня
SW_SQL – sql инструкции добавления данных в таблицыINSERT INTO STAT_4512 ( S4512_DATE, S4512_TYPE, S4512_FILE, S4512_PASSPORT, S4512_CONDATE, S4512_FNS, S4512_FTS, S4512_STATE,S4512_XML) VALUES (current_timestamp,’ЭСВТ’,:FILENAME,:PASSPORT,:CONDATE,0,0,0,:XML)

ЭСКР (SW_ID=451203)

SW_QUERY – извлечение данныхFILENAME:XPATH://TRANSPORT/THEADER/@file – извлекаем в переменную FILENAME имя файла в соответствии с XPath (извлекаем значение параметра file тэга THEADER, находящегося внутри TRANSPORT)
PASSPORT:XPATH://TRANSPORT/THEADER/Pasport/text() – извлекаем в переменную PASSPORT номер паспорта в соответствии с XPath (извлекаем текст внутри тэга Pasport, находящегося внутри тэга THEADER, находящегося внутри TRANSPORT)
CONDATE:XPATH://TRANSPORT/THEADER/Date/text() – извлекаем в переменную CONDATE дату контракта в соответствии с XPath (извлекаем текст внутри тэга Date, находящегося внутри тэга THEADER, находящегося внутри TRANSPORT)
XML:XPATH://* – В переменную XML сохраним весь xml документ с корня
SW_SQL – sql инструкции добавления данных в таблицыINSERT INTO STAT_4512 ( S4512_DATE, S4512_TYPE, S4512_FILE, S4512_PASSPORT, S4512_CONDATE, S4512_FNS, S4512_FTS, S4512_STATE,S4512_XML) VALUES (current_timestamp,’ЭСКР’,:FILENAME,:PASSPORT,:CONDATE,0,0,0,:XML)

ЭСКР/ЭККР (SW_ID=451204)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E% – Полное имя файла
FNAME2:FILE:%N3&32% – имя файла без первых двух символов
SW_SQL – sql инструкции добавления данных в таблицыПервой инструкцией ищем идентификатор первичного файла (результат будет помещен в переменную Q_1_1) и затем добавляем извлеченную информацию в таблицу STAT_4512_FILES
select S4512_ID from STAT_4512 where upper(S4512_FILE)=upper(‘PS%FNAME2%.XML’)
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE) VALUES (:Q_1_1, current_timestamp,:FNAME, 0)

Положительные квитанции ФТС ЭСВТ/ЭСКР (SW_ID=451205)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E%
SRCFILENAME:XPATH://KVIT/ES/text() – из квитанции извлекаем имя исходного файла
XML:XPATH://* – сохраняем текст xml
SW_SQL – sql инструкции добавления данных в таблицыСначала обновляем основную таблицу (ставим отметку о получении квитанции) и затем добавляем файл во вторичную таблицу
update STAT_4512 set S4512_FTS=1 where upper(S4512_FILE)=upper(:SRCFILENAME) returning S4512_ID
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE,S4512F_XML) VALUES (:Q_1_1, current_timestamp,:FNAME, 1,:XML)

Отрицательные квитанции ФТС ЭСВТ/ЭСКР (SW_ID=451206)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E%
SRCFILENAME:XPATH://KVIT/ES/text() – из квитанции извлекаем имя исходного файла
ERRORS:XPATH://KVIT/ERRORS_ES/ERR_REC/NAM_ERR/text() – извлекаем текст ошибок
XML:XPATH://*
SW_SQL – sql инструкции добавления данных в таблицыСначала обновляем основную таблицу (ставим отметку о получении отрицательной квитанции), затем добавляем файл во вторичную таблицу и затем ставим общий статус для записи – ошибка
update STAT_4512 set S4512_FTS=2 where upper(S4512_FILE)=upper(:SRCFILENAME) returning S4512_ID
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE,S4512F_XML) VALUES (:Q_1_1, current_timestamp,:FNAME, -1,:XML)
update STAT_4512 set S4512_STATE=2 where S4512_ID=:Q_1_1‘)

Положительные квитанции ФНС/ФТС ЭКВТ/ЭККР (SW_ID=451207)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E%
SRCFILENAME:XPATH://KVIT/ES/text()
XML:XPATH://*
SW_SQL – sql инструкции добавления данных в таблицыselect S4512F_SRC from STAT_4512_FILES where upper(S4512F_FILENAME)=upper(:SRCFILENAME)
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE,S4512F_COMMENT,S4512F_XML) VALUES (:Q_1_1, current_timestamp,:FNAME, 1,”,:XML
)

Положительные квитанции ФНС ЭСВТ/ЭСКР (SW_ID=451208)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E%
SRCFILENAME:XPATH://KVIT/ES/text()
XML:XPATH://*
SW_SQL – sql инструкции добавления данных в таблицыupdate STAT_4512 set S4512_FNS=1 where upper(S4512_FILE)=upper(:SRCFILENAME) returning S4512_ID
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE,S4512F_XML) VALUES (:Q_1_1, current_timestamp,:FNAME, 1,:XML
)

Отрицательные квитанции ЭСКР/ЭККР (SW_ID=451209)

SW_QUERY – извлечение данныхFNAME:FILE:%N%.%E%
SRCFILENAME:XPATH://KVIT/ES/text()
ERRORS:XPATHSPLIT://KVIT/ERRORS_ES/ERR_REC/NAM_ERR/text()
XML:XPATH://*
SW_SQL – sql инструкции добавления данных в таблицыupdate STAT_4512_FILES set S4512F_STATE=2 where upper(S4512F_FILENAME)=upper(:SRCFILENAME) returning S4512F_SRC
INSERT INTO STAT_4512_FILES (S4512F_SRC, S4512F_DATE, S4512F_FILENAME, S4512F_STATE,S4512F_COMMENT,S4512F_XML) VALUES (:Q_1_1, current_timestamp,:FNAME, -1,:ERRORS,:XML
update STAT_4512 set S4512_STATE=2 where S4512_ID=:Q_1_1′

Рассмотрим работу на примере исходного файла PS18010001_0920_0000_1_0_0920_0000.xml

<?xml version="1.0" encoding="windows-1251"?>
<TRANSPORT verspo="string">
  <THEADER len="6669" date="68/72/6474" time="80:36:09" regn="8860/1960" file="PS18010001_0920_0000_1_0_0920_0000.xml">
    <RepType>ps_ei4</RepType>
    <Bank>string</Bank>
    <Pasport>7739T78V/8224/7691/1/1</Pasport>
    <Date>12/12/2020</Date>
  </THEADER>
  <TBODY len="8216" nTabl="8870">
<!-- ............................ -->
  </TBODY>
</TRANSPORT>

Файл классифицируется как ЭСВТ:

FILE:IN:1,2,3,4,9:%N22&1% - в нашем случае - 1
FILE:=:PS:%N1&2% - и первые два символа имени файла PS


Т.о. получаем SC_LINK=451202

Проверка перед добавлением:

451200:>:0:Файл уже присутствует в БД:select count(*) from stat_4512 where S4512_FILE=:FNAME

Если файла в таблице нет, запрос вернет 0, и условие отбраковки не сработает.


Извлечение данных:
В соответствии с SW_QUERY записи, извлекаем необходимые данные

FILENAME:XPATH://TRANSPORT/THEADER/@filePS18010001_0920_0000_1_0_0920_0000.xml
PASSPORT:XPATH://TRANSPORT/THEADER/Pasport/text()7739T78V/8224/7691/1/1
CONDATE:XPATH://TRANSPORT/THEADER/Date/text()12/12/2020
XML:XPATH://*(Полный текст xml)

Добавление данных в таблицу:

INSERT INTO STAT_4512 ( S4512_DATE, S4512_TYPE, S4512_FILE, S4512_PASSPORT, S4512_CONDATE, S4512_FNS, S4512_FTS, S4512_STATE,S4512_XML) VALUES (current_timestamp,'ЭСВТ',:FILENAME,:PASSPORT,:CONDATE,0,0,0,:XML)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *