diff --git a/modules/diadoc.js b/modules/diadoc.js index 6b7f94b..701d56e 100644 --- a/modules/diadoc.js +++ b/modules/diadoc.js @@ -33,7 +33,7 @@ const tag = [ //------------ //формирования адреса запроса для получения данных о текущей организации пользователя -const buildOrganizationURL = srvRoot => { +const buildMyOrganizationURL = srvRoot => { return `${srvRoot.replace(/\/+$/, "")}/GetMyOrganizations`; }; @@ -42,6 +42,11 @@ const buildOrganizationBoxIdURL = srvRoot => { return `${srvRoot.replace(/\/+$/, "")}/GetBox`; }; +//формирования адреса запроса для получения данных о организации по ИНН/КПП +const buildOrganizationURL = srvRoot => { + return `${srvRoot.replace(/\/+$/, "")}/GetOrganization`; +}; + //формирования адреса запроса для получения данных о организации по ИНН/КПП const buildOrganizationsByInnKppURL = srvRoot => { return `${srvRoot.replace(/\/+$/, "")}/GetOrganizationsByInnKpp`; @@ -131,10 +136,11 @@ const buildHeaders = (sAPIClientId, sToken = null) => ({ const GetOrganizations = Organizations => { //Параметры отбора let isRoaming = false; + let isActive = true; //Итоговая выборка let Organization = { Organizations: [] }; - //Найдем организацию не в роуминге - Organization.Organizations[0] = Organizations.Organizations.find(Org => Org.IsRoaming === isRoaming); + //Найдем активную организацию не в роуминге + Organization.Organizations[0] = Organizations.Organizations.find(Org => (Org.IsRoaming === isRoaming) && (Org.IsActive === isActive)); //Если не удалось получить организацию не в роуминге if (!Organization.Organizations[0]) { //Если нет организации не в роуминге и найдено более одной организации @@ -142,7 +148,7 @@ const GetOrganizations = Organizations => { throw Error(`Найдено несколько организаций в роуминге.`); } else { //Вернем единственную найденую организацию - return Organizations; + return Organizations[0]; } } else { //Вернем найденую организацию @@ -150,6 +156,83 @@ const GetOrganizations = Organizations => { } }; +//Получение организации по ИНН/КПП контрагента +const GetOrganization = async (sSrvRoot, headers, nInn, nKpp) => { + //Параметры запроса + let rqpOptions; + let serverResp; + //Формируем запрос для получения BoxId + rqpOptions = { + uri: buildOrganizationURL(sSrvRoot), + qs: { + inn: nInn, + kpp: nKpp + }, + headers: headers, + json: true + }; + //Выполним запрос + serverResp = { Organizations: [await rqp(rqpOptions)] }; + return serverResp; +}; + +//Получение ящика организации по ИНН/КПП контрагента +const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => { + //Параметры запроса + let rqpOptions; + let serverResp; + let Organization = {}; + //Формируем запрос для получения BoxId по ИНН/КПП + rqpOptions = { + uri: buildOrganizationsByInnKppURL(sSrvRoot), + qs: { + inn: nInn, + kpp: nKpp + }, + headers: headers, + json: true + }; + try { + //Выполним запрос + serverResp = await rqp(rqpOptions); + try { + //Получим организацию не в роуминге (или единственную организацию в роуминге) + serverResp = GetOrganizations(serverResp); + if (!serverResp?.Organizations[0]) { + throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`); + } + } catch (e) { + //Получим головную организацию по ИНН/КПП + serverResp = await GetOrganization(sSrvRoot, headers, nInn, nKpp); + }; + //Проверим соответствие КПП организации + if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (serverResp?.Organizations[0])) { + //Если КПП не соответстует заданному - проверим, что в полученной организации есть департамент с заданным КПП + for (let i in serverResp.Organizations[0].Departments) { + //Если найден подходящий департамент - запомним идентификатор и выходим из цикла + if (serverResp.Organizations[0].Departments[i]?.Kpp == nKpp) { + //Сохраняем полученный ответ + Organization.DepartmentId = serverResp.Organizations[0].Departments[i].DepartmentId; + break; + }; + }; + }; + //Не удалось получить ящик получателя или полученая организация не соответствует заданному ИНН + if ((!serverResp?.Organizations[0]?.Boxes[0]?.BoxId) || (serverResp?.Organizations[0]?.Inn != nInn)) { + throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`); + } + //Не удалось получить департаментом с соответствующим КПП + if ((serverResp?.Organizations[0]?.Kpp != nKpp) && (!Organization?.DepartmentId)) { + throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}, у головной организации отсутствует подразделение с КПП: ${nKpp}`); + } + //Сохраняем полученный ответ + Organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId; + return Organization; + } catch (e) { + throw Error(`Ошибка при получении ящика получателя: ${e.message}`); + }; +}; + //Обработчик "До" подключения к сервису const beforeConnect = async prms => { //Подготовим параметры аутентификации @@ -209,11 +292,13 @@ const beforeMessagePost = async prms => { let obj = await toJSON(prms.queue.blMsg.toString()); //Формируем запрос для получения FromBoxId let rqpOptions = { - uri: buildOrganizationURL(prms.service.sSrvRoot), + uri: buildMyOrganizationURL(prms.service.sSrvRoot), headers: buildHeaders(sAPIClientId, sToken), json: true }; + //Переменные для запросов let serverResp; + let Organization; try { //Выполним запрос serverResp = await rqp(rqpOptions); @@ -233,33 +318,13 @@ const beforeMessagePost = async prms => { } catch (e) { throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`); } - //Очистим предыдущий запрос - rqpOptions = null; - serverResp = null; - //Формируем запрос для получения ToBoxId - rqpOptions = { - uri: buildOrganizationsByInnKppURL(prms.service.sSrvRoot), - qs: { - inn: prms.options.inn_cs, - kpp: prms.options.kpp_cs - }, - headers: buildHeaders(sAPIClientId, sToken), - json: true + //Получим ящик получателя + 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; }; - try { - //Выполним запрос - serverResp = await rqp(rqpOptions); - //Получим организацию не в роуминге (или единственную организацию в роуминге) - serverResp = GetOrganizations(serverResp); - //Не удалось получить ящик получателя - if (!serverResp.Organizations[0].Boxes[0].BoxId) { - throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${prms.options.inn_cs} и КПП: ${prms.options.kpp_cs}`); - } - //Сохраняем полученный ответ - obj.ToBoxId = serverResp.Organizations[0].Boxes[0].BoxId; - } catch (e) { - throw Error(`Ошибка при получении ящика получателя: ${e.message}`); - } //Если пришел ответ if (prms.queue.blResp && serverResp.statusCode == 200) { //Вернем загруженный документ @@ -383,7 +448,7 @@ const beforeEvent = async prms => { if (!sToken) return { bUnAuth: true }; //Формируем запрос для получения BoxId let rqpOptions = { - uri: buildOrganizationURL(prms.service.sSrvRoot), + uri: buildMyOrganizationURL(prms.service.sSrvRoot), headers: buildHeaders(sAPIClientId, sToken), json: true }; @@ -756,8 +821,20 @@ const afterDepartmentIdGet = async prms => { //Действие выполнено успешно if (prms.optionsResp.statusCode == 200) { try { - //Получим организацию не в роуминге (или единственную организацию в роуминге) - Organization = GetOrganizations(JSON.parse(prms.queue.blResp.toString())); + try { + //Получим организацию не в роуминге (или единственную организацию в роуминге) + Organization = GetOrganizations(JSON.parse(prms.queue.blResp.toString())); + if (!Organization) { + throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`); + } + } catch (e) { + //Получим ключ разработчика + let sAPIClientId = getAPIClientId(prms.options.nCompany, prms.options.nJurPers); + //Считаем токен доступа из контекста сервиса + let sToken = prms.service.sCtx; + //Получим головную организацию по ИНН/КПП + Organization = await GetOrganization(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.nINN, prms.options.nKPP); + }; //Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8" resu = toXML({ root: Organization }); } catch (e) {