1. Общее описание
Сервис Формирования документов предназначен для обеспечения возможности формирования документов, в формате XML и PDF, на основе предварительно подготовленных pebble-шаблонов, с возможностью добавления к сформированным документам электронной подписи.
Сервис Формирования документов выполняет следующие задачи:
формирует документ, на основе поступившего в Витрину запроса, в формате:
XML;
PDF.
отправляет сформированные документы на подпись в Сервис электронной подписи (например, КриптоПро);
отправляет сформированные и подписанные документы в ПОДД в виде ответа на пришедший запрос.
Формат обмена электронными сообщениями описан в разделе Спецификация модуля «Сервис Формирования документов» Приложения 1.
1.1. Общая схема взаимодействия модуля «Сервис Формирования документов»
Рисунок - 1.1 Общая схема взаимодействия модуля «Сервис Формирования документов»
1.2. Процесс обработки запроса через модуль «Сервис Формирования документов»
В топик report.rq (название топика может быть изменено на этапе внедрения) поступает запрос через Агента СМЭВ4 на предоставление сформированного документа.
ПОДД-адаптер считывает запрос из топика и передает его в Сервис Формирования документов. Сервис Формирования документов запускает соответствующий пришедшему типу документа pebble-шаблон, собирает данные из Витрины (Prostore) и формирует на основании этих данных JSON-файл.
Из содержащейся в JSON-файле информации формируется итоговая форма документа. Для этого используется Pebble-шаблон для формирования XML-документа и Pebble-шаблон для формирования PDF-документа, предназначенные для генерации документов.
В случае, если электронная подпись не требуется, то PDF-документ сразу пересылается в топик report.rs Kafka ПОДД-адаптера.
Если требуется электронная подпись:
PDF-документ и публичная часть SSH-ключа (pub) будут отправлены в Сервис электронной подписи. Сервис электронной подписи сформирует для этого PDF-документа файл подписи (p7s) и вернет его в Сервис Формирования документов.
Полученный XML или PDF-файл Сервис Формирования документов отправляет в ПОДД-адаптер, в топик report.rs Kafka ПОДД-адаптер.
Агент ПОДД проверяет топик и забирает сформированные документы для передачи в ПОДД.
Внимание
Следует обратить внимание, что при формировании XML-документов используется - присоединенная подпись (подпись содержится в самом XML-документе).
Для PDF-документов - отсоединенная подпись (подпись документа формируется отдельным файлом), т.е. при формировании PDF-документа сгенерируется два файла: PDF-документ и файл электронной подписи для этого документа.
1.2.1. Pebble-шаблон для формирования XML-документа
<root>
<passengers Id="elementToSign">
{% for p in data.passengers %}
<passenger id="{{ p.id }}">
<firstname>{{ p.firstname }}</firstname>
<middlename>{{ p.middlename }}</middlename>
<lastname>{{ p.lastname }}</lastname>
<birthday>{{ p.birthday }}</birthday>
</passenger>
<cert>
<organization>{{ certification_info.subjectDN.commonName }}</organization>
<serial>{{ dec_to_hex(certification_info.serialNumber) }}</serial>
<issuer>{{ certification_info.issuerDN.commonName }}</issuer>
<valid-from>{{ certification_info.notBefore | date("dd.MM.yyyy") }}</valid-from>
<valid-until>{{ certification_info.notAfter | date("dd.MM.yyyy") }}</valid-until>
</cert>
{% endfor %}
</passengers>
<signature/>
</root>
1.2.2. Pebble-шаблон для формирования PDF-документа
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
}
</style>
</head>
<body>
<h3>Certificate</h3>
<table>
<tr>
<th>Организация</th>
<th>Сертификат</th>
<th>Издатель</th>
<th>Действителен с</th>
<th>Действителен по</th>
</tr>
<tr>
<td>{{ certification_info.subjectDN.commonName }}</td>
<td>{{ certification_info.serialNumber }}</td>
<td>{{ certification_info.issuerDN.commonName }}</td>
<td>{{ certification_info.notBefore }}</td>
<td>{{ certification_info.notAfter }}</td>
</tr>
</table>
<h3>Passengers</h3>
<table>
<tr>
<th>id</th>
<th>firstname</th>
<th>middlename</th>
<th>lastname</th>
<th>birthday</th>
</tr>
{% for p in data.passengers %}
<tr>
<td>{{ p.id }}</td>
<td>{{ p.firstname }}</td>
<td>{{ p.middlename }}</td>
<td>{{ p.lastname }}</td>
<td>{{ p.birthday }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>