forked from CITKParus/P8-ExchangeService
ЦИТК-955 - исправление "Найдено несколько организаций в роуминге"
This commit is contained in:
parent
bbe4edf4f3
commit
75c7336544
@ -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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user