ЦИТК-588 - ЭДО 2.0
This commit is contained in:
parent
28f99a8bf3
commit
da79ad3fc8
@ -37,6 +37,11 @@ const buildOrganizationURL = srvRoot => {
|
|||||||
return `${srvRoot.replace(/\/+$/, "")}/GetMyOrganizations`;
|
return `${srvRoot.replace(/\/+$/, "")}/GetMyOrganizations`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//формирования адреса запроса для получения данных о организации по идентификатору ящика
|
||||||
|
const buildOrganizationBoxIdURL = srvRoot => {
|
||||||
|
return `${srvRoot.replace(/\/+$/, "")}/GetBox`;
|
||||||
|
};
|
||||||
|
|
||||||
//формирования адреса запроса для получения данных о организации по ИНН/КПП
|
//формирования адреса запроса для получения данных о организации по ИНН/КПП
|
||||||
const buildOrganizationsByInnKppURL = srvRoot => {
|
const buildOrganizationsByInnKppURL = srvRoot => {
|
||||||
return `${srvRoot.replace(/\/+$/, "")}/GetOrganizationsByInnKpp`;
|
return `${srvRoot.replace(/\/+$/, "")}/GetOrganizationsByInnKpp`;
|
||||||
@ -202,7 +207,7 @@ const beforeMessagePost = async prms => {
|
|||||||
//Конвертируем XML из "Парус 8" в JSON
|
//Конвертируем XML из "Парус 8" в JSON
|
||||||
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: buildOrganizationURL(prms.service.sSrvRoot),
|
||||||
headers: buildHeaders(sAPIClientId, sToken),
|
headers: buildHeaders(sAPIClientId, sToken),
|
||||||
json: true
|
json: true
|
||||||
@ -210,7 +215,7 @@ const beforeMessagePost = async prms => {
|
|||||||
let serverResp;
|
let serverResp;
|
||||||
try {
|
try {
|
||||||
//Выполним запрос
|
//Выполним запрос
|
||||||
serverResp = await rqp(rqpoptions);
|
serverResp = await rqp(rqpOptions);
|
||||||
//Получим идентификатор организации по ИНН/КПП поставщика документа
|
//Получим идентификатор организации по ИНН/КПП поставщика документа
|
||||||
for (let i in serverResp.Organizations) {
|
for (let i in serverResp.Organizations) {
|
||||||
//Если найдена подходящая организация - запомним идентификатор и выходим из цикла
|
//Если найдена подходящая организация - запомним идентификатор и выходим из цикла
|
||||||
@ -228,10 +233,10 @@ const beforeMessagePost = async prms => {
|
|||||||
throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`);
|
throw Error(`Ошибка при получении ящика текущей организации: ${e.message}`);
|
||||||
}
|
}
|
||||||
//Очистим предыдущий запрос
|
//Очистим предыдущий запрос
|
||||||
rqpoptions = null;
|
rqpOptions = null;
|
||||||
serverResp = null;
|
serverResp = null;
|
||||||
//Формируем запрос для получения ToBoxId
|
//Формируем запрос для получения ToBoxId
|
||||||
rqpoptions = {
|
rqpOptions = {
|
||||||
uri: buildOrganizationsByInnKppURL(prms.service.sSrvRoot),
|
uri: buildOrganizationsByInnKppURL(prms.service.sSrvRoot),
|
||||||
qs: {
|
qs: {
|
||||||
inn: prms.options.inn_cs,
|
inn: prms.options.inn_cs,
|
||||||
@ -242,7 +247,7 @@ const beforeMessagePost = async prms => {
|
|||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
//Выполним запрос
|
//Выполним запрос
|
||||||
serverResp = await rqp(rqpoptions);
|
serverResp = await rqp(rqpOptions);
|
||||||
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
//Получим организацию не в роуминге (или единственную организацию в роуминге)
|
||||||
serverResp = GetOrganizations(serverResp);
|
serverResp = GetOrganizations(serverResp);
|
||||||
//Не удалось получить ящик получателя
|
//Не удалось получить ящик получателя
|
||||||
@ -376,14 +381,14 @@ 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: buildOrganizationURL(prms.service.sSrvRoot),
|
||||||
headers: buildHeaders(sAPIClientId, sToken),
|
headers: buildHeaders(sAPIClientId, sToken),
|
||||||
json: true
|
json: true
|
||||||
};
|
};
|
||||||
try {
|
try {
|
||||||
//Выполним запрос
|
//Выполним запрос
|
||||||
serverResp = await rqp(rqpoptions);
|
serverResp = await rqp(rqpOptions);
|
||||||
//Получим идентификатор организации по ИНН/КПП контрагента организации
|
//Получим идентификатор организации по ИНН/КПП контрагента организации
|
||||||
for (let i in serverResp.Organizations) {
|
for (let i in serverResp.Organizations) {
|
||||||
//Если найдена подходящая организация - запомним идентификатор и выходим из цикла
|
//Если найдена подходящая организация - запомним идентификатор и выходим из цикла
|
||||||
@ -457,12 +462,94 @@ const beforeEvent = async prms => {
|
|||||||
|
|
||||||
//Обработчик "После" запроса на получение новых событий к сервису "ДИАДОК"
|
//Обработчик "После" запроса на получение новых событий к сервису "ДИАДОК"
|
||||||
const afterEvent = 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) {
|
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 {
|
try {
|
||||||
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
|
//Преобразуем JSON ответ сервиса "ДИАДОК" в XML, понятный "Парус 8"
|
||||||
resu = toXML({ root: JSON.parse(prms.queue.blResp.toString()) });
|
resu = toXML({ root: resp });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
|
throw new Error(`Неожиданный ответ сервера ЭДО "ДИАДОК". Ошибка интерпретации: ${e.message}`);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user