From ecec0d70c1f2c76252c2f26c3591ca06c298e73e Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Fri, 28 Mar 2025 17:34:22 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-948,=20=D0=A6=D0=98?= =?UTF-8?q?=D0=A2=D0=9A-955=20-=20=D0=94=D0=98=D0=90=D0=94=D0=9E=D0=9A=20-?= =?UTF-8?q?=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B4=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=20=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BD=D0=B5=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D0=BD=D0=B0=D0=B9=D1=82?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=B0-=D0=BE=D1=82=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20=D0=B2=20"=D0=9E=D0=BF=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B5=20=D0=AD=D0=94=D0=9E"/"=D0=9A=D0=BE?= =?UTF-8?q?=D0=BD=D1=82=D1=80=D0=B0=D0=B3=D0=B5=D0=BD=D1=82=D0=B0=D1=85",?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=81=D0=BC=D0=B5=D1=82=D0=B8=D0=BA=D0=B0=20(ca?= =?UTF-8?q?melCase)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/diadoc.js | 64 +++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/modules/diadoc.js b/modules/diadoc.js index 701d56e..2778d6e 100644 --- a/modules/diadoc.js +++ b/modules/diadoc.js @@ -19,6 +19,7 @@ const { SDDAUTH_API_CLIENT_ID, SDEPARTMENT_NAME, SDEPARTMENT_ID } = require("./d // Список тегов которые должны содержать массив const tag = [ "DocumentAttachments", + "Metadata", "Signatures", "CorrectionRequests", "Receipts", @@ -55,13 +56,13 @@ const buildOrganizationsByInnKppURL = srvRoot => { //Обернуть содержимое тега в массив const toArray = (obj, tags) => { for (const prop in obj) { - const value = obj[prop]; + let value = obj[prop]; + if (typeof value === "object") { + obj[prop] = toArray(value, tag); + } if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) { obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]"); } - if (typeof value === "object") { - toArray(value, tag); - } } return obj; }; @@ -133,31 +134,31 @@ const buildHeaders = (sAPIClientId, sToken = null) => ({ }); //Отбор организций -const GetOrganizations = Organizations => { +const getOrganizations = organizations => { //Параметры отбора let isRoaming = false; let isActive = true; //Итоговая выборка - let Organization = { Organizations: [] }; + let organization = { Organizations: [] }; //Найдем активную организацию не в роуминге - Organization.Organizations[0] = Organizations.Organizations.find(Org => (Org.IsRoaming === isRoaming) && (Org.IsActive === isActive)); + organization.Organizations[0] = organizations.Organizations.find(org => (org.IsRoaming === isRoaming) && (org.IsActive === isActive)); //Если не удалось получить организацию не в роуминге - if (!Organization.Organizations[0]) { + if (!organization.Organizations[0]) { //Если нет организации не в роуминге и найдено более одной организации - if (Organizations.Organizations.length > 1) { + if (organizations.Organizations.length > 1) { throw Error(`Найдено несколько организаций в роуминге.`); } else { //Вернем единственную найденую организацию - return Organizations[0]; + return organizations[0]; } } else { //Вернем найденую организацию - return Organization; + return organization; } }; //Получение организации по ИНН/КПП контрагента -const GetOrganization = async (sSrvRoot, headers, nInn, nKpp) => { +const getOrganization = async (sSrvRoot, headers, nInn, nKpp) => { //Параметры запроса let rqpOptions; let serverResp; @@ -177,11 +178,11 @@ const GetOrganization = async (sSrvRoot, headers, nInn, nKpp) => { }; //Получение ящика организации по ИНН/КПП контрагента -const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { +const getOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { //Параметры запроса let rqpOptions; let serverResp; - let Organization = {}; + let organization = {}; //Формируем запрос для получения BoxId по ИНН/КПП rqpOptions = { uri: buildOrganizationsByInnKppURL(sSrvRoot), @@ -197,13 +198,13 @@ const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { serverResp = await rqp(rqpOptions); try { //Получим организацию не в роуминге (или единственную организацию в роуминге) - serverResp = GetOrganizations(serverResp); + serverResp = getOrganizations(serverResp); if (!serverResp?.Organizations[0]) { throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`); } } catch (e) { //Получим головную организацию по ИНН/КПП - serverResp = await GetOrganization(sSrvRoot, headers, nInn, nKpp); + serverResp = await getOrganization(sSrvRoot, headers, nInn, nKpp); }; //Проверим соответствие КПП организации if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (serverResp?.Organizations[0])) { @@ -212,7 +213,7 @@ const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { //Если найден подходящий департамент - запомним идентификатор и выходим из цикла if (serverResp.Organizations[0].Departments[i]?.Kpp == nKpp) { //Сохраняем полученный ответ - Organization.DepartmentId = serverResp.Organizations[0].Departments[i].DepartmentId; + organization.DepartmentId = serverResp.Organizations[0].Departments[i].DepartmentId; break; }; }; @@ -222,12 +223,12 @@ const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`); } //Не удалось получить департаментом с соответствующим КПП - if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (!Organization?.DepartmentId)) { + if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (!organization?.DepartmentId)) { throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}, у головной организации отсутствует подразделение с КПП: ${nKpp}`); } //Сохраняем полученный ответ - Organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId; - return Organization; + organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId; + return organization; } catch (e) { throw Error(`Ошибка при получении ящика получателя: ${e.message}`); }; @@ -298,7 +299,7 @@ const beforeMessagePost = async prms => { }; //Переменные для запросов let serverResp; - let Organization; + let organization; try { //Выполним запрос serverResp = await rqp(rqpOptions); @@ -319,11 +320,11 @@ const beforeMessagePost = async prms => { throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`); } //Получим ящик получателя - Organization = await GetOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs); - obj.ToBoxId = Organization.BoxId; + organization = await getOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs); + obj.ToBoxId = organization.BoxId; //Если не заполнен идентификатор подразделения и при получении ящика удалось его подобрать - if ((!obj.ToDepartmentId) && (Organization.DepartmentId)) { - obj.ToDepartmentId = Organization.DepartmentId; + if ((!obj.ToDepartmentId) && (organization.DepartmentId)) { + obj.ToDepartmentId = organization.DepartmentId; }; //Если пришел ответ if (prms.queue.blResp && serverResp.statusCode == 200) { @@ -583,6 +584,7 @@ const afterEvent = async prms => { boxIds.boxIds[i].Kpp = serverResp?.Organization?.Kpp; boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName; boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName; + boxIds.boxIds[i].FnsParticipantId = serverResp?.Organization?.FnsParticipantId; } else { //Не удалось получить информацию о контрагенте по ящику организации throw new Error(`Не удалось получить информацию о контрагенте по ящику организации ${boxIds.boxIds[i].boxId}`); @@ -601,6 +603,7 @@ const afterEvent = async prms => { resp.Events[i].Message.FromKpp = box.Kpp; resp.Events[i].Message.FromFullName = box.FullName; resp.Events[i].Message.FromShortName = box.ShortName; + resp.Events[i].Message.FromFnsParticipantId = box.FnsParticipantId; } //Если надо добавить информацию по ящику-получателю box = boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.ToBoxId); @@ -609,6 +612,7 @@ const afterEvent = async prms => { resp.Events[i].Message.ToKpp = box.Kpp; resp.Events[i].Message.ToFullName = box.FullName; resp.Events[i].Message.ToShortName = box.ShortName; + resp.Events[i].Message.ToFnsParticipantId = box.FnsParticipantId; } } } @@ -817,14 +821,14 @@ const beforeDepartmentIdGet = async prms => { //Обработчик "После" отправки запроса на получение списка подразделений контрагента к сервису "ДИАДОК" const afterDepartmentIdGet = async prms => { let resu = null; - let Organization = {}; + let organization = {}; //Действие выполнено успешно if (prms.optionsResp.statusCode == 200) { try { try { //Получим организацию не в роуминге (или единственную организацию в роуминге) - Organization = GetOrganizations(JSON.parse(prms.queue.blResp.toString())); - if (!Organization) { + organization = getOrganizations(JSON.parse(prms.queue.blResp.toString())); + if (!organization) { throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`); } } catch (e) { @@ -833,10 +837,10 @@ const afterDepartmentIdGet = async prms => { //Считаем токен доступа из контекста сервиса let sToken = prms.service.sCtx; //Получим головную организацию по ИНН/КПП - Organization = await GetOrganization(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.nINN, prms.options.nKPP); + organization = await getOrganization(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.nINN, prms.options.nKPP); }; //Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8" - resu = toXML({ root: Organization }); + resu = toXML({ root: organization }); } catch (e) { throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`); }