diff --git a/modules/diadoc.js b/modules/diadoc.js index 54915e4..4ae2e13 100644 --- a/modules/diadoc.js +++ b/modules/diadoc.js @@ -37,6 +37,11 @@ const buildOrganizationURL = srvRoot => { return `${srvRoot.replace(/\/+$/, "")}/GetMyOrganizations`; }; +//формирования адреса запроса для получения данных о организации по идентификатору ящика +const buildOrganizationBoxIdURL = srvRoot => { + return `${srvRoot.replace(/\/+$/, "")}/GetBox`; +}; + //формирования адреса запроса для получения данных о организации по ИНН/КПП const buildOrganizationsByInnKppURL = srvRoot => { return `${srvRoot.replace(/\/+$/, "")}/GetOrganizationsByInnKpp`; @@ -202,7 +207,7 @@ const beforeMessagePost = async prms => { //Конвертируем XML из "Парус 8" в JSON let obj = await toJSON(prms.queue.blMsg.toString()); //Формируем запрос для получения FromBoxId - let rqpoptions = { + let rqpOptions = { uri: buildOrganizationURL(prms.service.sSrvRoot), headers: buildHeaders(sAPIClientId, sToken), json: true @@ -210,7 +215,7 @@ const beforeMessagePost = async prms => { let serverResp; try { //Выполним запрос - serverResp = await rqp(rqpoptions); + serverResp = await rqp(rqpOptions); //Получим идентификатор организации по ИНН/КПП поставщика документа for (let i in serverResp.Organizations) { //Если найдена подходящая организация - запомним идентификатор и выходим из цикла @@ -228,10 +233,10 @@ const beforeMessagePost = async prms => { throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`); } //Очистим предыдущий запрос - rqpoptions = null; + rqpOptions = null; serverResp = null; //Формируем запрос для получения ToBoxId - rqpoptions = { + rqpOptions = { uri: buildOrganizationsByInnKppURL(prms.service.sSrvRoot), qs: { inn: prms.options.inn_cs, @@ -242,7 +247,7 @@ const beforeMessagePost = async prms => { }; try { //Выполним запрос - serverResp = await rqp(rqpoptions); + serverResp = await rqp(rqpOptions); //Получим организацию не в роуминге (или единственную организацию в роуминге) serverResp = GetOrganizations(serverResp); //Не удалось получить ящик получателя @@ -376,14 +381,14 @@ const beforeEvent = async prms => { //Если не достали из контекста токен доступа - значит нет аутентификации на сервере if (!sToken) return { bUnAuth: true }; //Формируем запрос для получения BoxId - let rqpoptions = { + let rqpOptions = { uri: buildOrganizationURL(prms.service.sSrvRoot), headers: buildHeaders(sAPIClientId, sToken), json: true }; try { //Выполним запрос - serverResp = await rqp(rqpoptions); + serverResp = await rqp(rqpOptions); //Получим идентификатор организации по ИНН/КПП контрагента организации for (let i in serverResp.Organizations) { //Если найдена подходящая организация - запомним идентификатор и выходим из цикла @@ -457,12 +462,94 @@ const beforeEvent = async prms => { //Обработчик "После" запроса на получение новых событий к сервису "ДИАДОК" const afterEvent = async prms => { - let resu = null; + let sAPIClientId = null; //Ключ разработчика + let sToken = null; //Токен доступа + let resu = null; //Ответ сервера + let rqpOptions = null; //Параметры для запроса информации по ящику + let serverResp; //Результат запроса информации по организации + let resp = null; //Ответ сервера + let box = null; //Информация ящика + let boxIds = { boxIds: [] }; //Список уникальных ящиков контрагентов //Действие выполнено успешно if (prms.optionsResp.statusCode == 200) { + //Получим ключ разработчика + sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers); + //Проверим ключ разработчика + checkAPIClientId(sAPIClientId); + //Разберем ответ сервера + resp = JSON.parse(prms.queue.blResp.toString()); + //Получим список уникальных ящиков + for (let i in resp.Events) { + if (resp.Events[i]?.Message) { + if (!boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.FromBoxId)) { + boxIds.boxIds.push({ boxId: resp.Events[i]?.Message.FromBoxId }); + } + if (!boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.ToBoxId)) { + boxIds.boxIds.push({ boxId: resp.Events[i]?.Message.ToBoxId }); + } + } + } + //Если требуется выполнить запросы доп. информации по ящикам организации + if (boxIds.boxIds.length) { + //Считаем токен доступа из контекста сервиса + if (prms.service.sCtx) { + sToken = prms.service.sCtx; + } + //Если не достали из контекста токен доступа - значит нет аутентификации на сервере + if (!sToken) return { bUnAuth: true }; + for (let i in boxIds.boxIds) { + rqpOptions = null; + //Формируем запрос для получения BoxId + rqpOptions = { + uri: buildOrganizationBoxIdURL(prms.service.sSrvRoot), + headers: buildHeaders(sAPIClientId, sToken), + qs: { + boxId: boxIds.boxIds[i].boxId + }, + json: true + }; + try { + //Выполним запрос + serverResp = await rqp(rqpOptions); + if (serverResp?.Organization) { + //Запишем полученную информацию о контрагенте + boxIds.boxIds[i].Inn = serverResp?.Organization?.Inn; + boxIds.boxIds[i].Kpp = serverResp?.Organization?.Kpp; + boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName; + boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName; + } else { + //Не удалось получить информацию о контрагенте по ящику организации + throw new Error(`Не удалось получить информацию о контрагенте по ящику организации ${boxIds.boxIds[i].boxId}`); + } + } catch (e) { + throw Error(`Ошибка при получении информации о контрагенте по ящику организации: ${e.message}`); + } + } + //Добавим к ответу информацию о контрагентах ящика + for (let i in resp.Events) { + if (resp.Events[i]?.Message) { + //Если надо добавить информацию по ящику-отправителю + box = boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.FromBoxId); + if (box) { + resp.Events[i].Message.FromInn = box.Inn; + resp.Events[i].Message.FromKpp = box.Kpp; + resp.Events[i].Message.FromFullName = box.FullName; + resp.Events[i].Message.FromShortName = box.ShortName; + } + //Если надо добавить информацию по ящику-получателю + box = boxIds.boxIds.find(box => box.boxId === resp.Events[i]?.Message.ToBoxId); + if (box) { + resp.Events[i].Message.ToInn = box.Inn; + resp.Events[i].Message.ToKpp = box.Kpp; + resp.Events[i].Message.ToFullName = box.FullName; + resp.Events[i].Message.ToShortName = box.ShortName; + } + } + } + } try { //Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8" - resu = toXML({ root: JSON.parse(prms.queue.blResp.toString()) }); + resu = toXML({ root: resp }); } catch (e) { throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`); }