ЦИТК-948, ЦИТК-955 - ДИАДОК - импорта документов даже если не удалось найти контрагента-отправителя в "Операторе ЭДО"/"Контрагентах", косметика (camelCase)

This commit is contained in:
Mikhail Chechnev 2025-03-28 17:34:22 +03:00
parent de03774ca4
commit ecec0d70c1

View File

@ -19,6 +19,7 @@ const { SDDAUTH_API_CLIENT_ID, SDEPARTMENT_NAME, SDEPARTMENT_ID } = require("./d
// Список тегов которые должны содержать массив // Список тегов которые должны содержать массив
const tag = [ const tag = [
"DocumentAttachments", "DocumentAttachments",
"Metadata",
"Signatures", "Signatures",
"CorrectionRequests", "CorrectionRequests",
"Receipts", "Receipts",
@ -55,13 +56,13 @@ const buildOrganizationsByInnKppURL = srvRoot => {
//Обернуть содержимое тега в массив //Обернуть содержимое тега в массив
const toArray = (obj, tags) => { const toArray = (obj, tags) => {
for (const prop in obj) { 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])) { if (tags.indexOf(prop) != -1 && !_.isArray(obj[prop])) {
obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]"); obj[prop] = JSON.parse("[" + JSON.stringify(value) + "]");
} }
if (typeof value === "object") {
toArray(value, tag);
}
} }
return obj; return obj;
}; };
@ -133,31 +134,31 @@ const buildHeaders = (sAPIClientId, sToken = null) => ({
}); });
//Отбор организций //Отбор организций
const GetOrganizations = Organizations => { const getOrganizations = organizations => {
//Параметры отбора //Параметры отбора
let isRoaming = false; let isRoaming = false;
let isActive = true; 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(`Найдено несколько организаций в роуминге.`); throw Error(`Найдено несколько организаций в роуминге.`);
} else { } else {
//Вернем единственную найденую организацию //Вернем единственную найденую организацию
return Organizations[0]; return organizations[0];
} }
} else { } else {
//Вернем найденую организацию //Вернем найденую организацию
return Organization; return organization;
} }
}; };
//Получение организации по ИНН/КПП контрагента //Получение организации по ИНН/КПП контрагента
const GetOrganization = async (sSrvRoot, headers, nInn, nKpp) => { const getOrganization = async (sSrvRoot, headers, nInn, nKpp) => {
//Параметры запроса //Параметры запроса
let rqpOptions; let rqpOptions;
let serverResp; 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 rqpOptions;
let serverResp; let serverResp;
let Organization = {}; let organization = {};
//Формируем запрос для получения BoxId по ИНН/КПП //Формируем запрос для получения BoxId по ИНН/КПП
rqpOptions = { rqpOptions = {
uri: buildOrganizationsByInnKppURL(sSrvRoot), uri: buildOrganizationsByInnKppURL(sSrvRoot),
@ -197,13 +198,13 @@ const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
serverResp = await rqp(rqpOptions); serverResp = await rqp(rqpOptions);
try { try {
//Получим организацию не в роуминге (или единственную организацию в роуминге) //Получим организацию не в роуминге (или единственную организацию в роуминге)
serverResp = GetOrganizations(serverResp); serverResp = getOrganizations(serverResp);
if (!serverResp?.Organizations[0]) { if (!serverResp?.Organizations[0]) {
throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`); throw Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}`);
} }
} catch (e) { } 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])) { 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) { 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; break;
}; };
}; };
@ -222,12 +223,12 @@ const GetOrganizationBoxId = async (sSrvRoot, headers, nInn, nKpp) => {
throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${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}`); throw new Error(`Не удалось получить ящик получателя для контрагента с ИНН: ${nInn} и КПП: ${nKpp}, у головной организации отсутствует подразделение с КПП: ${nKpp}`);
} }
//Сохраняем полученный ответ //Сохраняем полученный ответ
Organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId; organization.BoxId = serverResp.Organizations[0].Boxes[0].BoxId;
return Organization; return organization;
} catch (e) { } catch (e) {
throw Error(`Ошибка при получении ящика получателя: ${e.message}`); throw Error(`Ошибка при получении ящика получателя: ${e.message}`);
}; };
@ -298,7 +299,7 @@ const beforeMessagePost = async prms => {
}; };
//Переменные для запросов //Переменные для запросов
let serverResp; let serverResp;
let Organization; let organization;
try { try {
//Выполним запрос //Выполним запрос
serverResp = await rqp(rqpOptions); serverResp = await rqp(rqpOptions);
@ -319,11 +320,11 @@ const beforeMessagePost = async prms => {
throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`); throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`);
} }
//Получим ящик получателя //Получим ящик получателя
Organization = await GetOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs); organization = await getOrganizationBoxId(prms.service.sSrvRoot, buildHeaders(sAPIClientId, sToken), prms.options.inn_cs, prms.options.kpp_cs);
obj.ToBoxId = Organization.BoxId; obj.ToBoxId = organization.BoxId;
//Если не заполнен идентификатор подразделения и при получении ящика удалось его подобрать //Если не заполнен идентификатор подразделения и при получении ящика удалось его подобрать
if ((!obj.ToDepartmentId) && (Organization.DepartmentId)) { if ((!obj.ToDepartmentId) && (organization.DepartmentId)) {
obj.ToDepartmentId = Organization.DepartmentId; obj.ToDepartmentId = organization.DepartmentId;
}; };
//Если пришел ответ //Если пришел ответ
if (prms.queue.blResp && serverResp.statusCode == 200) { 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].Kpp = serverResp?.Organization?.Kpp;
boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName; boxIds.boxIds[i].FullName = serverResp?.Organization?.FullName;
boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName; boxIds.boxIds[i].ShortName = serverResp?.Organization?.ShortName;
boxIds.boxIds[i].FnsParticipantId = serverResp?.Organization?.FnsParticipantId;
} else { } else {
//Не удалось получить информацию о контрагенте по ящику организации //Не удалось получить информацию о контрагенте по ящику организации
throw new Error(`Не удалось получить информацию о контрагенте по ящику организации ${boxIds.boxIds[i].boxId}`); 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.FromKpp = box.Kpp;
resp.Events[i].Message.FromFullName = box.FullName; resp.Events[i].Message.FromFullName = box.FullName;
resp.Events[i].Message.FromShortName = box.ShortName; 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); 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.ToKpp = box.Kpp;
resp.Events[i].Message.ToFullName = box.FullName; resp.Events[i].Message.ToFullName = box.FullName;
resp.Events[i].Message.ToShortName = box.ShortName; 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 => { const afterDepartmentIdGet = async prms => {
let resu = null; let resu = null;
let Organization = {}; let organization = {};
//Действие выполнено успешно //Действие выполнено успешно
if (prms.optionsResp.statusCode == 200) { if (prms.optionsResp.statusCode == 200) {
try { try {
try { try {
//Получим организацию не в роуминге (или единственную организацию в роуминге) //Получим организацию не в роуминге (или единственную организацию в роуминге)
Organization = GetOrganizations(JSON.parse(prms.queue.blResp.toString())); organization = getOrganizations(JSON.parse(prms.queue.blResp.toString()));
if (!Organization) { if (!organization) {
throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`); throw Error(`Не удалось получить ящик для контрагента с ИНН: ${prms.options.nINN} и КПП: ${prms.options.nKPP}`);
} }
} catch (e) { } catch (e) {
@ -833,10 +837,10 @@ const afterDepartmentIdGet = async prms => {
//Считаем токен доступа из контекста сервиса //Считаем токен доступа из контекста сервиса
let sToken = prms.service.sCtx; 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" //Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
resu = toXML({ root: Organization }); resu = toXML({ root: organization });
} catch (e) { } catch (e) {
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`); throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
} }