ЦИТК-955 - исправление "Найдено несколько организаций в роуминге"

This commit is contained in:
Mikhail Chechnev 2025-02-07 12:53:25 +03:00
parent bbe4edf4f3
commit 75c7336544

View File

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