ЦИТК-588 - ЭДО 2.0

This commit is contained in:
Mikhail Chechnev 2024-07-26 14:28:09 +03:00
parent 28f99a8bf3
commit da79ad3fc8

View File

@ -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}`);
}