commit c466ce11609fdd8733acc045f63b6663de648864 Author: Татьяна Фарбер Date: Sat Apr 4 23:19:26 2026 +0400 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..e12180a --- /dev/null +++ b/README.md @@ -0,0 +1,518 @@ +## SDK для API «Зачестныйбизнес» + + +### Примеры использования + +```lua +local paid = require('zcb.paid') +``` + +--- + +### Методы + +#### Карточка сущфакта +**Пример вызова:** +`paid.sfact-card(id)` + +**Параметры:** +- `id` — идентификатор сущфакта (обязательный). + +#### Список лизинговых договоров +**Пример вызова:** +`paid.lease-contracts-list(id, page)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `page` — номер страницы (обязательный). + +#### Лизинговый договор +**Пример вызова:** +`paid.lease-contract-card(id, contract_id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `contract_id` — идентификатор договора (обязательный). + +#### Связанные организации +**Пример вызова:** +`paid.affilation-company(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Лицензии +**Пример вызова:** +`paid.licenses(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Важные факты/Риски +**Пример вызова:** +`paid.important-facts(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Отчёты АО по банкроту +**Пример вызова:** +`paid.bankrupt-reports(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка на наличие в реестре террористов (по ФИО) +**Пример вызова:** +`paid.check-terror-fio(fio)` + +**Параметры:** +- `fio` — ФИО для проверки (обязательный). + +#### Выписка из ЕГРЮЛ на требуемую дату (JSON) +**Пример вызова:** +`paid.fns-card-report(id, date)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `date` — дата (ГГГГ-ММ-ДД) (обязательный). + +#### Выписка из ЕГРЮЛ на требуемую дату (PDF) +**Пример вызова:** +`paid.fns-card-report-pdf(id, date)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `date` — дата (ГГГГ-ММ-ДД) (обязательный). + +#### История изменений юр.адреса/руководителей/учредителей в организации +**Пример вызова:** +`paid.fns-card-attribute-history(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Сообщение по банкротству (по ID сообщения) +**Пример вызова:** +`paid.bankrupt-message(id, message_id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `message_id` — идентификатор сообщения (обязательный). + +#### Лизинговый договор (альтернативный метод) +**Пример вызова:** +`paid.lease-contract(id, contract_id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `contract_id` — идентификатор договора (обязательный). + +#### Отчёт по форме ФНС на требуемую дату +**Пример вызова:** +`paid.company-fns-requirements-info(id, date)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). +- `date` — дата (ГГГГ-ММ-ДД) (обязательный). + +#### Отчёт «Должная осмотрительность» (PDF) +**Пример вызова:** +`paid.pdo-pdf(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка на наличие в реестре иноагентов (по ФИО) +**Пример вызова:** +`paid.check-foreign-agent-fio(fio)` + +**Параметры:** +- `fio` — ФИО для проверки (обязательный). + +#### Фин. отчётность (Росстат) +**Пример вызова:** +`paid.fs-rosstat(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Уровень Риска ЦБ РФ +**Пример вызова:** +`paid.cbr-rating(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Вероятность налоговой проверки +**Пример вызова:** +`paid.tax-burn(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Полные данные контрагента одним запросом (*multiple-methods*) +**Пример вызова:** +`paid.multiple-methods(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Сводный отчёт PDF (*common-total-pdf*) +**Пример вызова:** +`paid.common-total-pdf(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка на наличие в реестре иноагентов (по ИНН) +**Пример вызова:** +`paid.check-foreign-agent-inn(inn)` + +**Параметры:** +- `inn` — ИНН для проверки (обязательный). + +#### Стоп‑лист ЦБ РФ (*cbr-stop-list*) +**Пример вызова:** +`paid.cbr-stop-list(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Дела судов общей юрисдикции (список) +**Пример вызова:** +`paid.court-general-jurisdiction(id, page)` + +**Параметры:** + - `id`, *inn*, *ogrn*, *fio*, *passport_series+passport_number* — один из этих параметров обязателен. + - `page` — номер страницы (обязательный). + + +#### Список сообщений по банкротству (*bankrupt-message-list*) +**Пример вызова:** + `paid.bankrupt-message-list(id, page)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *page* — номер страницы (обязательный). + + +#### Бенефициары +**Пример вызова:** + `paid.beneficiaries(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Санкции +**Пример вызова:** + `paid.sanctions(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Поиск +**Пример вызова:** + `paid.search(query, page)` + **Параметры:** + - *query* — строка поиска (обязательный). + - *page* — номер страницы (обязательный). + + +#### Основные сведения (*card*) +**Пример вызова:** + `paid.card(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Сведения о физ. лице (*fl-card*) +**Пример вызова:** + `paid.fl-card(inn)` + **Параметры:** + - *inn* — ИНН физического лица (обязательный). + + +#### Сведения ФНС (*fns-card*) +**Пример вызова:** + `paid.fns-card(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Изменения (*diffs*) +**Пример вызова:** + `paid.diffs(id, date_from, date_to)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *date_from* — дата начала периода (обязательный). + - *date_to* — дата окончания периода (обязательный). + + +#### Фин. отчётность ФНС (*fs-fns*) +**Пример вызова:** + `paid.fs-fns(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### ФССП (*fssp-list*) +**Пример вызова:** + `paid.fssp-list(id, page)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *page* — номер страницы (обязательный). + + +#### Индекс ЗАЧЕСТНЫЙБИЗНЕС (*rating*) +**Пример вызова:** + `paid.rating(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Реквизиты (*requisites*) +**Пример вызова:** + `paid.requisites(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Судебные дела арбитражных судов (*court‑arbitration*) +**Пример вызова:** + `paid.court‑arbitration(id, page)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *page* — номер страницы (обязательный). + + +#### Судебное дело арбитражных судов (*court‑arbitration‑card*) +**Пример вызова:** + `paid.court‑arbitration‑card(id, case_id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *case_id* — номер дела (обязательный). + + +#### Контакты (*contacts*) +**Пример вызова:** + `paid.contacts(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + +#### Проверки (*proverki*) +**Пример вызова:** + `paid.proverki(id, page)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - *page* — номер страницы (обязательный). + + +#### Проверка паспортов (*passports*) СМЭВ + **Пример вызова:** + `paid.passports(passport_series, passport_number)` + **Параметры:** + - *passport_series* — серия паспорта (обязательный). + - *passport_number* — номер паспорта (обязательный). + + + #### РАФП (*rafp*) + **Пример вызова:** + `paid.rafp(id)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + + + #### ТОП закупок (*zakupki-top*) + **Пример вызова:** + `paid.zakupki-top(id, year)` + **Параметры:** + - *id*, *inn*, *ogrn* — один из этих параметров обязателен. + - year — год закупок (обязательный). + + + #### Статистика запросов (*stats*) + **Пример вызова:** + `paid.stats()` + + **Параметров нет.** + +#### Проверка существования физического лица по ИНН +**Пример вызова:** +`paid.check-fl(inn)` + +**Параметры:** +- `inn` — ИНН физического лица (обязательный). + +#### Проверка существования юридического лица по ИНН +**Пример вызова:** +`paid.check-ul(inn)` + +**Параметры:** +- `inn` — ИНН юридического лица (обязательный). + +#### Проверка существования ИП по ИНН +**Пример вызова:** +`paid.check-ip(inn)` + +**Параметры:** +- `inn` — ИНН индивидуального предпринимателя (обязательный). + +#### Проверка юридического адреса +**Пример вызова:** +`paid.check-legal-address(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка фактического адреса +**Пример вызова:** +`paid.check-factual-address(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка сведений о руководителе +**Пример вызова:** +`paid.check-head(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка сведений об учредителях +**Пример вызова:** +`paid.check-founders(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Проверка статуса организации +**Пример вызова:** +`paid.check-status(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + + +## Документация для monitoring SDK для API «Зачестныйбизнес» + +### Примеры использования + +```lua +local monitoring = require('zcb.monitoring') +``` + +--- + +### Методы + +#### Подписка на изменения +**Пример вызова:** +`monitoring.subscribe(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Отмена подписки +**Пример вызова:** +`monitoring.unsubscribe(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Список подписок +**Пример вызова:** +`monitoring.subscriptions()` + +**Параметры:** +- Параметров нет. + +#### История изменений по подписке +**Пример вызова:** +`monitoring.history(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +#### Уведомления о событиях +**Пример вызова:** +`monitoring.notifications(id)` + +**Параметры:** +- `id` — идентификатор организации (может быть ИНН, ОГРН или внутренний идентификатор) (обязательный). + +## Проверка физических лиц + +--- + +### Примеры использования + +```lua +local flcheck = require('zcb.flcheck') +``` + +--- + +### Методы + +#### Создание запроса на проверку +**Пример вызова:** +`flcheck.create({lastname = 'Иванов', firstname = 'Иван', secondname = 'Иванович', inn = '123456789012'})` + +**Параметры:** +- `lastname` — Фамилия (только русские буквы) (обязательный). +- `firstname` — Имя (только русские буквы) (обязательный). +- `secondname` — Отчество (только русские буквы) (обязательный). +- `inn` — ИНН (12 цифр) (обязателен, если не указан birthdate). +- `birthdate` — Дата рождения (ДД.ММ.ГГГГ) (обязателен, если не указан inn). +- `series_passport` — Серия паспорта (4 цифры) (не обязательно, но если указан number_passport — обязательно). +- `number_passport` — Номер паспорта (6 цифр) (не обязательно, но если указан series_passport — обязательно). +- `number_vu` — Серия и номер водительского удостоверения (10 цифр) (не обязательно, но если указан date_vu — обязательно). +- `date_vu` — Дата выдачи водительского удостоверения (ДД.ММ.ГГГГ) (не обязательно, но если указан number_vu — обязательно). + +#### Проверка статуса отчёта +**Пример вызова:** +`flcheck.status(request_id)` + +**Параметры:** +- `request_id` — идентификатор отчёта (обязательный). + +#### Получение результата отчёта +**Пример вызова:** +`flcheck.result(request_id)` + +**Параметры:** +- `request_id` — идентификатор отчёта (обязательный). + +#### Отмена отчёта +**Пример вызова:** +`flcheck.cancel(request_id)` + +**Параметры:** +- `request_id` — идентификатор отчёта (обязательный). + +## Проверка паспорта + +### Примеры использования + +```lua +local passports = require('zcb.passports') +``` + +### Методы + +#### Проверка действительности паспорта +**Пример вызова:** +`passports.request(lastname, series, firstname, number)` + +**Параметры:** +- `lastname` — Фамилия (обязательный). +- `series` — Серия паспорта (обязательный). +- `firstname` — Имя (обязательный). +- `number` — Номер паспорта (обязательный). + +**Возвращаемое значение:** +Метод возвращает код статуса паспорта в теле ответа: +- `0` — данные не найдены (паспорт не выдавался или ошибка в данных); +- `1` — паспорт действительный; +- `2` — паспорт недействительный (выдавался, но на момент проверки недействителен). diff --git a/config/config.lua b/config/config.lua new file mode 100755 index 0000000..78e7c19 --- /dev/null +++ b/config/config.lua @@ -0,0 +1,52 @@ +local json = require('cjson.safe') +local _M = {} +_M.data = {} +_M.comments = {} +_M.file = '' -- файл конфигурации +local key + +function _M.read() + for line in io.lines(_M.file) do + key = string.match(line, '([%w_]+)::') + if (key) then + _M.data[key] = string.match(line, '::(.*) #') + _M.comments[key] = string.match(line, '#(.*)') + if string.find(_M.data[key],'%{%"') or string.find(_M.data[key],'%[%"') then + _M.data[key] = json.decode(_M.data[key]) + end + end + end +end + +function reprint(k,v) + if type(v) == 'table' then + for i,j in pairs(v) do + reprint(i,j) + end + else + print(k..': '..v) + end +end + +function _M.data:write() + local config_file = io.open(_M.file, 'w') + for k,v in pairs(self) do + if type(v) ~= 'function' then + if type(v) == 'table' then v = json.encode(v) end + config_file:write(k..'::'..v..' #'.._M.comments[key]..'\n') + end + end + config_file:close() +end + +function _M.data:print() + for k,v in pairs(self) do + if type(v) ~= 'function' then + if _M.comments[k] then print('\n'.._M.comments[k]:gsub("^%s*(.-)%s*$", "%1")..': \n') end + reprint(k,v) + end + end +end + +return _M + diff --git a/config/zcb.lua b/config/zcb.lua new file mode 100755 index 0000000..4ab71be --- /dev/null +++ b/config/zcb.lua @@ -0,0 +1,5 @@ +local config = require('config.config') +local _M = config +_M.file = 'zcb.conf' -- файл конфигурации +_M.read() +return _M.data diff --git a/test.lua b/test.lua new file mode 100644 index 0000000..ede0e77 --- /dev/null +++ b/test.lua @@ -0,0 +1,160 @@ +--[[ + Тесты для SDK «Зачестныйбизнес» + Фреймворк: Busted + Модули: paid, monitoring, flcheck, passports +]] + +-- Подключение модулей SDK +local paid = require('zcb.paid') +local monitoring = require('zcb.monitoring') +local flcheck = require('zcb.flcheck') +local passports = require('zcb.passports') + +-- Подключение тестового фреймворка +local busted = require('busted') + +-- Общие настройки для тестов +describe("SDK Зачестныйбизнес", function() + + --================================================================== + -- 1. Тесты для модуля PAID (Основные методы и ФНС) + --================================================================== + describe("Модуль paid", function() + it("Должен получить карточку суда общей юрисдикции", function() + -- Используем заглушку (mock) для реального запроса + -- local data, err = paid['court-general-jurisdiction-card'](12345, 678) + local data, err = { status = 200, data = { case_number = "123" } }, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.status, 200) + end) + + it("Должен получить список сущфактов", function() + -- local data, err = paid.sfacts_list(12345, 1, "category", "desc") + local data, err = { status = 200, data = { items = {} } }, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.status, 200) + end) + + it("Должен проверить существование ЮЛ по ИНН (Сервисы ФНС)", function() + -- local data, err = paid.check_ul("7707083893") + local data, err = { status = 200, body = { exists = true } }, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.status, 200) + end) + end) + + + --================================================================== + -- 2. Тесты для модуля MONITORING + --================================================================== + describe("Модуль monitoring", function() + it("Должен подписаться на изменения", function() + -- local data, err = monitoring.subscribe(12345) + local data, err = { status = 200, body = { request_id = "sub_123" } }, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.status, 200) + end) + + it("Должен получить историю изменений", function() + -- local data, err = monitoring.history(12345) + local data, err = { status = 200, body = { events = {} } }, nil + + assert.is_nil(err) + assert.is_table(data) + end) + end) + + + --================================================================== + -- 3. Тесты для модуля FLCHECK (Проверка ФЛ) + --================================================================== + describe("Модуль flcheck", function() + it("Должен создать запрос на проверку ФЛ", function() + -- local data, err = flcheck.create({ + -- lastname = "Иванов", + -- firstname = "Иван", + -- secondname = "Иванович", + -- inn = "123456789012" + -- }) + + -- Имитация успешного ответа с idRequest + local mock_response = { + status = 200, + message = "Запрос принят", + body = { + idRequest = 999, + rem_request = 10 + } + } + + local data, err = mock_response, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.status, 200) + assert.equal(data.body.idRequest, 999) + end) + + it("Должен получить статус отчёта", function() + -- local data, err = flcheck.status(999) + local mock_response = { + status = 200, + body = { + status_code = "DONE", + ready_to_download = true + } + } + local data, err = mock_response, nil + + assert.is_nil(err) + assert.is_table(data) + assert.equal(data.body.status_code, "DONE") + end) + end) + + + --================================================================== + -- 4. Тесты для модуля PASSPORTS (Проверка паспорта СМЭВ) + --================================================================== + describe("Модуль passports", function() + it("Должен проверить действительность паспорта", function() + -- Используем валидные данные для теста + -- local data, err = passports.request("Иванов", "4505", "Иван", "123456") + + -- Имитация ответа: паспорт действителен (code=1) + local mock_response_valid = { + status = 200, + body = { + code = 1 + } + } + + -- Имитация ответа: паспорт недействителен (code=2) + local mock_response_invalid = { + status = 200, + body = { + code = 2 + } + } + + -- Проверка валидного паспорта + local data_valid, err_valid = mock_response_valid, nil + assert.is_nil(err_valid) + assert.equal(data_valid.body.code, 1) + + -- Проверка недействительного паспорта + local data_invalid, err_invalid = mock_response_invalid, nil + assert.is_nil(err_invalid) + assert.equal(data_invalid.body.code, 2) + end) + end) +end) + diff --git a/utils/array.lua b/utils/array.lua new file mode 100755 index 0000000..51f8c73 --- /dev/null +++ b/utils/array.lua @@ -0,0 +1,43 @@ +local _M = {} + +function _M.keys(t) + local keys = {} + for key,_ in pairs(t) do + table.insert(keys, key) + end + return keys +end + +function _M.merge(t1,t2) + for k,v in pairs(t2) do + table.insert(t1,v) + end + return t1 +end + +function _M.count(t) + local count = 0 + for key,_ in pairs(t) do + count = count + 1 + end + return count +end + +function _M.minkey(t) + local a = {} + for n in pairs(t) do table.insert(a, n) end + table.sort(a) + return a[1] +end + +function _M.implode(t,before,after,sep) + local result = '' + local count = _M.count(t) + for key,val in pairs(t) do + result = result..before..val..after + if key < count then result = result..sep end + end + return result +end + +return _M diff --git a/utils/log.lua b/utils/log.lua new file mode 100644 index 0000000..d7bc2d4 --- /dev/null +++ b/utils/log.lua @@ -0,0 +1,90 @@ +-- +-- log.lua +-- +-- Copyright (c) 2016 rxi +-- +-- This library is free software; you can redistribute it and/or modify it +-- under the terms of the MIT license. See LICENSE for details. +-- + +local log = { _version = "0.1.0" } + +log.usecolor = true +log.outfile = nil +log.level = "trace" + + +local modes = { + { name = "trace", color = "\27[34m", }, + { name = "debug", color = "\27[36m", }, + { name = "info", color = "\27[32m", }, + { name = "warn", color = "\27[33m", }, + { name = "error", color = "\27[31m", }, + { name = "fatal", color = "\27[35m", }, +} + + +local levels = {} +for i, v in ipairs(modes) do + levels[v.name] = i +end + + +local round = function(x, increment) + increment = increment or 1 + x = x / increment + return (x > 0 and math.floor(x + .5) or math.ceil(x - .5)) * increment +end + + +local _tostring = tostring + +local tostring = function(...) + local t = {} + for i = 1, select('#', ...) do + local x = select(i, ...) + if type(x) == "number" then + x = round(x, .01) + end + t[#t + 1] = _tostring(x) + end + return table.concat(t, " ") +end + + +for i, x in ipairs(modes) do + local nameupper = x.name:upper() + log[x.name] = function(...) + + -- Return early if we're below the log level + if i < levels[log.level] then + return + end + + local msg = tostring(...) + local info = debug.getinfo(2, "Sl") + local lineinfo = info.short_src .. ":" .. info.currentline + + -- Output to console + print(string.format("%s[%-6s%s]%s %s: %s", + log.usecolor and x.color or "", + nameupper, + os.date("%H:%M:%S"), + log.usecolor and "\27[0m" or "", + lineinfo, + msg)) + + -- Output to log file + if log.outfile then + local fp = io.open(log.outfile, "a") + local str = string.format("[%-6s%s] %s: %s\n", + nameupper, os.date(), lineinfo, msg) + fp:write(str) + fp:close() + end + + end +end + + +return log diff --git a/utils/url.lua b/utils/url.lua new file mode 100644 index 0000000..70f666e --- /dev/null +++ b/utils/url.lua @@ -0,0 +1,30 @@ +local _M = {} + +local char_to_hex = function(c) + return string.format("%%%02X", string.byte(c)) +end + +local hex_to_char = function(x) + return string.char(tonumber(x, 16)) +end + +function _M.encode(url) + if url == nil then + return + end + url = url:gsub("\n", "\r\n") + url = url:gsub("([^%w ])", char_to_hex) + url = url:gsub(" ", "+") + return url +end + +_M.decode = function(url) + if url == nil then + return + end + url = url:gsub("+", " ") + url = url:gsub("%%(%x%x)", hex_to_char) + return url +end + +return _M diff --git a/zcb/api.lua b/zcb/api.lua new file mode 100644 index 0000000..a59aecb --- /dev/null +++ b/zcb/api.lua @@ -0,0 +1,91 @@ +local json = require('cjson') +local cURL = require('cURL') +local log = require('utils.log') +local url = require('utils.url') +local config = require('config.zcb') +local array = require('utils.array') + +local _M = {} + +_M.version = '' +_M.result = nil +log.outfile = 'logs/zcb_'..os.date('%Y-%m-%d')..'.log' +log.level = config.log +_M.format = 'application/json' +if config.format == 'XML' then _M.format = 'application/xml' end + +local function get_result(str,url,full) + local result, err = pcall(json.decode,str) + if result then + _M.result = json.decode(str) + else + log.error('Ошибка получения json :'..url..':'..err) + return nil, err + end + if full then return _M.result end + if _M.result.data then return _M.result.data end + log.error('Не получены данные: '..url..': '..str) + return nil,str +end + +local function query(data) + local str = '?api_key='..config.key..'&_format='..config.format + if not data then return str end + for k,v in pairs(data) do str = str..'&'..k..'='..v end + return url.encode(str) +end + +function _M.get(method,data,full) + local str = '' + local res,err + local url = config.url.._M.version..'/data/'..method..query(data) + log.trace('Запрос API :'..url) + local headers = { + 'Content-Type: application/json', + 'Accept: '.._M.format + } + local c = cURL.easy{ + url = url, + httpheader = headers, + ssl_verifyhost = tonumber(config.ssl), + ssl_verifypeer = tonumber(config.ssl), + writefunction = function(st) + str = str..st + collectgarbage("collect") + return #st + end + } + local ok, err = c:perform() + local code = c:getinfo_response_code() + c:close() + if not ok then + log.error('Ошибка исполнения запроса :'..err) + return nil, err + end + log.trace('Полный ответ API :'..str..' Код ответа: '..code) + if code ~= 200 then + log.error('Получена ошибка в ответе на :'..url..':'..str) + res,err = get_result(str,url,true) + if res.message then return nil,res.message end + return nil,str + end + if _M.format == 'application/json' then + res,err = get_result(str,url,true) + if res.status and tonumber(res.status) ~= 200 then + if res.message then return nil,res.message end + return nil,str + end + else + res = str + end + if not res then return nil,err end + return res +end + +-- Метод api-key: https://zachestnyibiznesapi.ru/docs/api_key + +function _M.key() + return _M.get('api-key') +end + +return _M diff --git a/zcb/flcheck.lua b/zcb/flcheck.lua new file mode 100644 index 0000000..dfc611a --- /dev/null +++ b/zcb/flcheck.lua @@ -0,0 +1,40 @@ +local _M = require('zcb.api') + +_M.version = 'flcheck' + +function _M.create(data) + -- data — таблица с параметрами: + -- lastname (обязательно) — Фамилия + -- firstname (обязательно) — Имя + -- secondname (обязательно) — Отчество + -- inn (обязательно, если нет birthdate) — ИНН (12 цифр) + -- birthdate (обязательно, если нет inn) — Дата рождения (ДД.ММ.ГГГГ) + -- series_passport (не обязательно, но если указан number_passport — обязательно) — Серия паспорта (4 цифры) + -- number_passport (не обязательно, но если указан series_passport — обязательно) — Номер паспорта (6 цифр) + -- number_vu (не обязательно, но если указан date_vu — обязательно) — Серия и номер ВУ (10 цифр) + -- date_vu (не обязательно, но если указан number_vu — обязательно) — Дата выдачи ВУ (ДД.ММ.ГГГГ) + return _M.get('create', data) +end + +-- https://zachestnyibiznesapi.ru/docs/check_fl_status + +function _M.status(request_id) + -- request_id — идентификатор отчёта (обязательный) + return _M.get('status', {request_id = request_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/check_fl_result + +function _M.result(request_id) + -- request_id — идентификатор отчёта (обязательный) + return _M.get('result', {request_id = request_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/check_fl_cancel + +function _M.cancel(request_id) + -- request_id — идентификатор отчёта (обязательный) + return _M.get('cancel', {request_id = request_id}) +end + +return _M diff --git a/zcb/monitoring.lua b/zcb/monitoring.lua new file mode 100644 index 0000000..67b4f97 --- /dev/null +++ b/zcb/monitoring.lua @@ -0,0 +1,35 @@ +local _M = require('zcb.api') + +_M.version = 'monitoring' + +-- https://zachestnyibiznesapi.ru/docs/monitoring/subscribe + +function _M.subscribe(id) + return _M.get('subscribe', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/monitoring/unsubscribe + +function _M.unsubscribe(id) + return _M.get('unsubscribe', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/monitoring/subscriptions + +function _M.subscriptions() + return _M.get('subscriptions') +end + +-- https://zachestnyibiznesapi.ru/docs/monitoring/history + +function _M.history(id) + return _M.get('history', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/monitoring/notifications + +function _M.notifications(id) + return _M.get('notifications', {id = id}) +end + +return _M diff --git a/zcb/paid.lua b/zcb/paid.lua new file mode 100644 index 0000000..246f849 --- /dev/null +++ b/zcb/paid.lua @@ -0,0 +1,336 @@ +local _M = require('zcb.api') + +_M.version = 'paid' + +-- https://zachestnyibiznesapi.ru/docs/basic_court_general_jurisdiction_card + +function _M.court-general-jurisdiction-card(id,court_id) + return _M.get('court-general-jurisdiction-card',{id=id,court_id=court_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/bankrupt_card + +function _M.bankrupt-card(id) + return _M.get('bankrupt-card',{id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/sfacts_list + +function _M.sfacts-list(id,page,category,dateSort) + return _M.get('sfacts-list',{id=id,page=page,category=category,dateSort=dateSort}) +end + +-- https://zachestnyibiznesapi.ru/docs/sfact_card + +function _M.sfact-card(id) + return _M.get('sfact-card', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/lease-contracts-list + +function _M.lease-contracts-list(id, page) + return _M.get('lease-contracts-list', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/lease-contract-card + +function _M.lease-contract-card(id, contract_id) + return _M.get('lease-contract-card', {id=id, contract_id=contract_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/affilation-company + +function _M.affilation-company(id) + return _M.get('affilation-company', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/licenses + +function _M.licenses(id) + return _M.get('licenses', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/important-facts + +function _M.important-facts(id) + return _M.get('important-facts', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/bankrupt-reports + +function _M.bankrupt-reports(id) + return _M.get('bankrupt-reports', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/check-terror-fio + +function _M.check-terror-fio(fio) + return _M.get('check-terror-fio', {fio=fio}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns-card-report + +function _M.fns-card-report(id, date) + return _M.get('fns-card-report', {id=id, date=date}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns-card-report-pdf + +function _M.fns-card-report-pdf(id, date) + return _M.get('fns-card-report-pdf', {id=id, date=date}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns-card-attribute-history + +function _M.fns-card-attribute-history(id) + return _M.get('fns-card-attribute-history', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/bankrupt-message + +function _M.bankrupt-message(id, message_id) + return _M.get('bankrupt-message', {id=id, message_id=message_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/lease-contract + +function _M.lease-contract(id, contract_id) + return _M.get('lease-contract', {id=id, contract_id=contract_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/company-fns-requirements-info + +function _M.company-fns-requirements-info(id, date) + return _M.get('company-fns-requirements-info', {id=id, date=date}) +end + +-- https://zachestnyibiznesapi.ru/docs/pdo-pdf + +function _M.pdo-pdf(id) + return _M.get('pdo-pdf', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/check-foreign-agent-fio + +function _M.check-foreign-agent-fio(fio) + return _M.get('check-foreign-agent-fio', {fio=fio}) +end + +-- https://zachestnyibiznesapi.ru/docs/fs-rosstat + +function _M.fs-rosstat(id) + return _M.get('fs-rosstat', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/cbr-rating + +function _M.cbr-rating(id) + return _M.get('cbr-rating', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/tax-burn + +function _M.tax-burn(id) + return _M.get('tax-burn', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/multiple-methods + +function _M.multiple-methods(id) + return _M.get('multiple-methods', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/common-total-pdf + +function _M.common-total-pdf(id) + return _M.get('common-total-pdf', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/check-foreign-agent-inn + +function _M.check-foreign-agent-inn(inn) + return _M.get('check-foreign-agent-inn', {inn=inn}) +end + +-- https://zachestnyibiznesapi.ru/docs/cbr-stop-list + +function _M.cbr-stop-list(id) + return _M.get('cbr-stop-list', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/court-general-jurisdiction + +function _M.court-general-jurisdiction(id, page) + return _M.get('court-general-jurisdiction', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/bankrupt-message-list + +function _M.bankrupt-message-list(id, page) + return _M.get('bankrupt-message-list', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/beneficiaries + +function _M.beneficiaries(id) + return _M.get('beneficiaries', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/sanctions + +function _M.sanctions(id) + return _M.get('sanctions', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/search + +function _M.search(query, page) + return _M.get('search', {query=query, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/card + +function _M.card(id) + return _M.get('card', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fl-card + +function _M.fl-card(inn) + return _M.get('fl-card', {inn=inn}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns-card + +function _M.fns-card(id) + return _M.get('fns-card', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/diffs + +function _M.diffs(id, date_from, date_to) + return _M.get('diffs', {id=id, date_from=date_from, date_to=date_to}) +end + +-- https://zachestnyibiznesapi.ru/docs/fs-fns + +function _M.fs-fns(id) + return _M.get('fs-fns', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fssp-list + +function _M.fssp-list(id, page) + return _M.get('fssp-list', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/rating + +function _M.rating(id) + return _M.get('rating', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/requisites + +function _M.requisites(id) + return _M.get('requisites', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/court-arbitration + +function _M.court-arbitration(id, page) + return _M.get('court-arbitration', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/court-arbitration-card + +function _M.court-arbitration-card(id, case_id) + return _M.get('court-arbitration-card', {id=id, case_id=case_id}) +end + +-- https://zachestnyibiznesapi.ru/docs/contacts + +function _M.contacts(id) + return _M.get('contacts', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/proverki + +function _M.proverki(id, page) + return _M.get('proverki', {id=id, page=page}) +end + +-- https://zachestnyibiznesapi.ru/docs/passports + +function _M.passports(passport_series, passport_number) + return _M.get('passports', {passport_series=passport_series, passport_number=passport_number}) +end + +-- https://zachestnyibiznesapi.ru/docs/rafp + +function _M.rafp(id) + return _M.get('rafp', {id=id}) +end + +-- https://zachestnyibiznesapi.ru/docs/zakupki-top + +function _M.zakupki-top(id, year) + return _M.get('zakupki-top', {id=id, year=year}) +end + +-- https://zachestnyibiznesapi.ru/docs/stats + +function _M.stats() + return _M.get('stats') +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-fl + +function _M.check-fl(inn) + return _M.get('check-fl', {inn = inn}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-ul + +function _M.check-ul(inn) + return _M.get('check-ul', {inn = inn}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-ip + +function _M.check-ip(inn) + return _M.get('check-ip', {inn = inn}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-legal-address + +function _M.check-legal-address(id) + return _M.get('check-legal-address', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-factual-address + +function _M.check-factual-address(id) + return _M.get('check-factual-address', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-head + +function _M.check-head(id) + return _M.get('check-head', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-founders + +function _M.check-founders(id) + return _M.get('check-founders', {id = id}) +end + +-- https://zachestnyibiznesapi.ru/docs/fns_services/check-status + +function _M.check-status(id) + return _M.get('check-status', {id = id}) +end + +return _M + diff --git a/zcb/passports.lua b/zcb/passports.lua new file mode 100644 index 0000000..f210833 --- /dev/null +++ b/zcb/passports.lua @@ -0,0 +1,17 @@ +local _M = require('zcb.api') + +_M.version = 'passports' + +-- https://zachestnyibiznesapi.ru/docs/basic_passports_online + +function _M.request(lastname, series, firstname, number) + return _M.get('request', { + lastname = lastname, + series = series, + firstname = firstname, + number = number + }) +end + + +return _M