СЕВ ОВВ 2.0 Клієнт
Бібліотека підтримки національного сервісу СЕВ ОВВ версії 2.0 (dir.gov.ua) для розробників та інтеграторів СЕД систем на мовах Erlang і Elixir. Сервіс верхнього рівня складається з наступних функцій:
- inbox from, count=100
- send from, to, document
- ack from, to, msg_id, type, regnum=""
- download from, msg_id, delete=1
- download_all from
Перевірка вхідної скриньки облікового запису
Перший параметр -- ЄРДПО організації зареєстрованої в СЕВ. Другий параметр -- перші N повідомлень, які цікавлять.
> SEV.inbox "34239035"
{:incoming,
[
CreationDate: "2020-02-10T05:25:21Z",
Creator: "Sev",
Format: "Plain",
FromOrgId: "34239036",
FromSysId: "fcabd96e-06b5-47c3-801c-b5da8caab7c7",
MessageId: "49DF6EA1-1783-4279-AE32-1152E2202B2B",
Size: "226716",
ToOrgId: "34239035",
ToSysId: "99999999",
Type: "Document"
]}
Завантаження повідомлення
Перший параметр -- ЄРДПО організації зареєстрованої в СЕВ.
> SEV.download "34239035", "49DF6EA1-1783-4279-AE32-1152E2202B2B"
{:downloading, #PID<0.926.0>}
iex(26)>
03:28:00.860 [info] SEV {partial,{download,226716,0,226716,<<"37851912">>,226716,0}}
03:28:05.686 [info] SEV {final,{download,226716,226716,0,<<"37851912">>,0,0}}
03:28:05.844 [info] SEV hash verified 49DF6EA1-1783-4279-AE32-1152E2202B2B
nil
Вивантаження повідомлення
Перший параметр -- ЄРДПО організації зареєстрованої в СЕВ від імені якої посилається повідомлення. Другий параметр -- ЄРДПО організації зареєстрованої в СЕВ, адресату повідомлення. Третій параметр -- Бізнес-об'єкт документу як Erlang кортеж.
defmodule Test do
require ERP
def testDoc(guid) do
ERP.sevDoc(
date: "2020-02-10",
id: "12/19/12-15",
kind: "Лист",
annotation: "Інформування",
msg_type: 1,
msg_acknow: 2,
guid: guid,
attachments: [
ERP.fileDesc(
id: :sev.guid(),
seq_id: 1000,
fileName: "Повідомлення.pdf",
signed: "2020-02-10T13:12:07",
type: "pdf"
)
]
)
end
end
> SEV.send "34239035", "34239036", Test.testDoc(:sev.guid)
{:uploading, #PID<0.954.0>}
iex(28)>
03:29:52.332 [info] SEV {partial,{upload,6428292,0,2500000,<<"37851914">>,6428292}}
03:29:54.370 [info] SEV {partial,{upload,6428292,2500000,2500000,<<"37851914">>,3928292}}
03:29:56.379 [info] SEV {partial,{upload,6428292,5000000,1428292,<<"37851914">>,1428292}}
03:30:04.454 [info] SEV {final,{upload,6428292,6428292,0,<<"37851914">>,0}}
03:30:04.779 [info] SEV 91844747-BF51-4804-895E-3A6844B69A0E Upload Processed 221135
nil
Ізоляція та відмовостійкість потоків завантаження
Дана бібліотека переживає рестарти як всього серверу, так і окремих збоїв всередині окремих процесів завантаження для кожного файлу. Усі Erlang процеси бібліотеки створюються під n2o супервізором.
> :supervisor.which_children SEV
[
{{:sev, "78317F66-127D-4601-9CA9-E956525A7D56"}, #PID<0.955.0>, :worker, [SEV.UP]},
{{:sev, "49DF6EA1-1783-4279-AE32-1152E2202B2B"}, #PID<0.927.0>, :worker, [SEV.DOWN]},
{{:sev, "187108DB-FBE4-4A7D-8AD5-A2DE2BDEAC0D"}, #PID<0.789.0>, :worker, [SEV.UP]},
{{:sev, "34239035"}, #PID<0.785.0>, :worker, [SEV]},
{{:sev, "34239036"}, #PID<0.107.0>, :worker, [SEV]},
{{:sev, "34239034"}, #PID<0.105.0>, :worker, [SEV]}
]
СЕРТИФІКАЦІЯ
Тут дається опис повної перевірки усіх можливих протокольних повідомлень (не даються гарантії на повний простір повідомлень з варіацією усіх атрибутів). На верхньому рівні протоколу є два вида повідомлень: 0) нотифікації та 1) документи. Нотифифікації: 1) доставка, 2) прийняття, 3) реєстрація та 4) відхилення. Документи: 0) інформаційний лист, 1) погодження, 2) узагальнення, 3) доручення. Також існує п'ять документів-відповідей: чотири для документів, плюс один додатковий варіант для відхилення погодження.
В процесі сертифікації передбачається перевірка 4 типів нотифікацій для усіх 9 типів повідомлень (вхідні документи та докменти відповіді). Разом з самими повідомленнями система СЕД повинна вміти відсилати та приймати по 45 різних типів пакетів. Загалом сертифікація передбачає траспортування 90 пакетів які валідуються наочно.
Скрипт сертифікації
def certify() do
{:incoming, []} = SEV.inbox @to
{:incoming, []} = SEV.inbox @from
x = outgoing @from, @to
:timer.sleep(60000)
SEV.download_all @to
:timer.sleep(60000)
acks @to, @from, x
:timer.sleep(120000)
SEV.download_all @from
:timer.sleep(60000) # 20 + 20
y = replies @to, @from, x
:timer.sleep(120000)
acks @from, @to, y
:timer.sleep(120000)
SEV.download_all @to
:timer.sleep(60000)
SEV.download_all @from
end
def outgoing(from, to) do
{i, a, g, e} = {:sev.guid(), :sev.guid(), :sev.guid(), :sev.guid()}
SEV.send(from, to, testInformation(i))
SEV.send(from, to, testApproval(a))
SEV.send(from, to, testGeneralization(g))
SEV.send(from, to, testExecutionTask(e))
{i, a, g, e}
end
def acks(from, to, mem) do
:erlang.tuple_to_list(mem)
|> Enum.map(fn guid ->
SEV.ack(from, to, guid, 1)
SEV.ack(from, to, guid, 2)
SEV.ack(from, to, guid, 3, "OK")
SEV.ack(from, to, guid, 4)
end)
end
def replies(from, to, {i, a, g, e}) do
{ni, na, nr, ng, ne} = {:sev.guid(), :sev.guid(), :sev.guid(), :sev.guid(), :sev.guid()}
SEV.send(from, to, testInformation(ni, i))
SEV.send(from, to, testApproval(na, a))
SEV.send(from, to, testReject(nr, a))
SEV.send(from, to, testGeneralization(ng, g))
SEV.send(from, to, testExecutionTask(ne, e))
{ni, na, nr, ng, ne}
end
ДП "Інфотех"