Compare commits

..

No commits in common. "45d149dd2308007673e8284e0123448968a2f38f" and "113ccca2b8c4204e00593fad1916cd2955951340" have entirely different histories.

5 changed files with 151 additions and 91 deletions

View File

@ -12,7 +12,7 @@ let common = {
//Версия сервера приложений //Версия сервера приложений
sVersion: "8.5.6.1", sVersion: "8.5.6.1",
//Релиз сервера приложений //Релиз сервера приложений
sRelease: "2025.04.29", sRelease: "2025.02.04",
//Таймаут останова сервера (мс) //Таймаут останова сервера (мс)
nTerminateTimeout: 60000, nTerminateTimeout: 60000,
//Контролировать версию Системы //Контролировать версию Системы

View File

@ -360,8 +360,8 @@ const appProcess = async prms => {
default: default:
//Установим флаг возврата полного ответа (и тела и заголовков) //Установим флаг возврата полного ответа (и тела и заголовков)
options.resolveWithFullResponse = true; options.resolveWithFullResponse = true;
//Установим таймаут подключения (если задан в настройках функции и ещё не задан в параметрах сообщения) //Установим таймаут подключения
if (prms.function.nTimeoutConn && !options.timeout) options.timeout = prms.function.nTimeoutConn; options.timeout = prms.function.nTimeoutConn ? prms.function.nTimeoutConn : null;
//Отправляем запрос //Отправляем запрос
serverResp = prms.function.nTimeoutAsynch serverResp = prms.function.nTimeoutAsynch
? await wrapPromiseTimeout(prms.function.nTimeoutAsynch, rqp(options)) ? await wrapPromiseTimeout(prms.function.nTimeoutAsynch, rqp(options))

View File

@ -19,7 +19,6 @@ const { SDDAUTH_API_CLIENT_ID, SDEPARTMENT_NAME, SDEPARTMENT_ID } = require("./d
// Список тегов которые должны содержать массив // Список тегов которые должны содержать массив
const tag = [ const tag = [
"DocumentAttachments", "DocumentAttachments",
"Metadata",
"Signatures", "Signatures",
"CorrectionRequests", "CorrectionRequests",
"Receipts", "Receipts",
@ -56,13 +55,13 @@ const buildOrganizationsByInnKppURL = srvRoot => {
//Обернуть содержимое тега в массив //Обернуть содержимое тега в массив
const toArray = (obj, tags) => { const toArray = (obj, tags) => {
for (const prop in obj) { for (const prop in obj) {
let value = obj[prop]; const 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;
}; };
@ -134,31 +133,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;
@ -178,11 +177,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),
@ -198,13 +197,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])) {
@ -213,7 +212,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;
}; };
}; };
@ -223,12 +222,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}`);
}; };
@ -299,7 +298,7 @@ const beforeMessagePost = async prms => {
}; };
//Переменные для запросов //Переменные для запросов
let serverResp; let serverResp;
let organization; let Organization;
try { try {
//Выполним запрос //Выполним запрос
serverResp = await rqp(rqpOptions); serverResp = await rqp(rqpOptions);
@ -320,11 +319,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) {
@ -584,7 +583,6 @@ 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}`);
@ -603,7 +601,6 @@ 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);
@ -612,7 +609,6 @@ 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;
} }
} }
} }
@ -821,14 +817,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) {
@ -837,10 +833,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}`);
} }

View File

@ -9,6 +9,7 @@
const { ServerError } = require("./../core/server_errors"); //Типовая ошибка const { ServerError } = require("./../core/server_errors"); //Типовая ошибка
const { SERR_APP_SERVER_BEFORE, SERR_DB_SERVER } = require("./../core/constants"); //Общесистемные константы const { SERR_APP_SERVER_BEFORE, SERR_DB_SERVER } = require("./../core/constants"); //Общесистемные константы
const oracledb = require("oracledb"); //Работа с СУБД Oracle
//------------ //------------
// Тело модуля // Тело модуля
@ -20,37 +21,52 @@ const before = async prms => {
if (prms.options.qs && prms.options.qs.STOKEN && prms.options.qs.NPREVIEW && prms.options.qs.NACTUAL_CHECK) { if (prms.options.qs && prms.options.qs.STOKEN && prms.options.qs.NPREVIEW && prms.options.qs.NACTUAL_CHECK) {
//И есть подключение к БД //И есть подключение к БД
if (prms.dbConn.bConnected) { if (prms.dbConn.bConnected) {
let olappExtractData = await prms.dbConn.executeStored({ let pooledConnection;
sName: "PKG_EXS_EXT_OLAPP_RUN.EXTRACT", try {
inPrms: { //Считаем курсор с данными публикации
pooledConnection = await prms.dbConn.connection.getConnection();
let res = await pooledConnection.execute(
"BEGIN PKG_EXS_EXT_OLAPP_RUN.EXTRACT(STOKEN => :STOKEN, NPREVIEW => :NPREVIEW, NACTUAL_CHECK => :NACTUAL_CHECK, RCDATA => :RCDATA); END;",
{
STOKEN: prms.options.qs.STOKEN, STOKEN: prms.options.qs.STOKEN,
NPREVIEW: prms.options.qs.NPREVIEW, NPREVIEW: prms.options.qs.NPREVIEW,
NACTUAL_CHECK: prms.options.qs.NACTUAL_CHECK NACTUAL_CHECK: prms.options.qs.NACTUAL_CHECK,
RCDATA: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
}, },
outPrms: { { outFormat: oracledb.OBJECT }
RCDATA: prms.dbConn.connector.DT_CURSOR );
}
});
//Установим заголовок ответа и начнём выдачу данных //Установим заголовок ответа и начнём выдачу данных
prms.res.set({ prms.res.set({
"content-type": "application/json;charset=utf-8" "content-type": "application/json;charset=utf-8"
}); });
prms.res.write("["); prms.res.write("[");
if (olappExtractData) //Обходим курсор и выдаём порционно ответ
if (olappExtractData.RCDATA) { const rs = res.outBinds.RCDATA;
let cnt = 1; let cnt = 1;
olappExtractData.RCDATA.map(row => { let row;
while ((row = await rs.getRow())) {
prms.res.write(Buffer.from(`${cnt > 1 ? "," : ""}${JSON.stringify(row)}`)); prms.res.write(Buffer.from(`${cnt > 1 ? "," : ""}${JSON.stringify(row)}`));
cnt++; cnt++;
});
} }
//Завершаем передачу //Завершаем передачу
prms.res.write("]"); prms.res.write("]");
prms.res.end(); prms.res.end();
await rs.close();
//Дальше обрабатывать не надо //Дальше обрабатывать не надо
return { return {
bStopPropagation: true bStopPropagation: true
}; };
} catch (e) {
throw new ServerError(SERR_DB_SERVER, e.message);
} finally {
if (pooledConnection) {
try {
await pooledConnection.close();
} catch (e) {
throw new ServerError(SERR_DB_SERVER, e.message);
}
}
}
} else { } else {
throw new ServerError(SERR_DB_SERVER, "Нет подключения к БД"); throw new ServerError(SERR_DB_SERVER, "Нет подключения к БД");
} }

View File

@ -10,6 +10,7 @@
const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML const xml2js = require("xml2js"); //Конвертация XML в JSON и JSON в XML
const cfg = require("./../config"); //Настройки сервера приложений const cfg = require("./../config"); //Настройки сервера приложений
const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции const { makeErrorText, sendMail } = require("./../core/utils"); //Вспомогательные функции
const oracledb = require("oracledb"); //Работа с СУБД Oracle
//--------------------- //---------------------
// Глобальные константы // Глобальные константы
@ -23,37 +24,84 @@ const NSTATUS_DONE = 3;
// Тело модуля // Тело модуля
//------------ //------------
//Чтение данных из курсора
const readCursorData = cursor => {
return new Promise((resolve, reject) => {
let queryStream = cursor.toQueryStream();
let rows = [];
queryStream.on("data", row => {
rows.push(row);
});
queryStream.on("error", err => {
reject(new Error(err.message));
});
queryStream.on("close", () => {
resolve(rows);
});
});
};
//Установка статуса отправки //Установка статуса отправки
const setSendMsg = async prms => { const setSendMsg = async prms => {
await prms.dbConn.executeStored({ let pooledConnection;
connection: prms.dbConn.connection, try {
sName: "PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS", pooledConnection = await prms.connection.getConnection();
inPrms: { await pooledConnection.execute(
NRN: prms.nRn, "begin PKG_EXS_EXT_MAIL.EXSEXTMAIL_SET_STATUS(NRN => :NRN, SERR_TEXT => :SERR_TEXT, NSTATUS => :NSTATUS); end;",
SERR_TEXT: prms.sErrMsg, { NRN: prms.nRn, SERR_TEXT: prms.sErrMsg, NSTATUS: prms.nStatus },
NSTATUS: prms.nStatus { autoCommit: true }
);
} catch (e) {
throw new Error(e.message);
} finally {
if (pooledConnection) {
try {
await pooledConnection.close();
} catch (e) {
throw new Error(e.message);
}
}
} }
});
}; };
//Считывание записей прикладываемых документов //Считывание записей прикладываемых документов
const getMailAttach = async prms => { const getMailAttach = async prms => {
let attachData = await prms.dbConn.executeStored({ let pooledConnection;
connection: prms.dbConn.connection, try {
sName: "PKG_EXS_EXT_MAIL.GET_ATTACH", pooledConnection = await prms.connection.getConnection();
inPrms: { NIDENT: prms.nIdent }, let res = await pooledConnection.execute(
outPrms: { RCDOCUMENTS: prms.dbConn.connector.DT_CURSOR } "begin PKG_EXS_EXT_MAIL.GET_ATTACH(NIDENT => :NIDENT, RCDOCUMENTS => :RCDOCUMENTS); end;",
}); {
NIDENT: prms.nIdent,
RCDOCUMENTS: { type: oracledb.CURSOR, dir: oracledb.BIND_OUT }
},
{ outFormat: oracledb.OBJECT, autoCommit: true }
);
let rows = await readCursorData(res.outBinds.RCDOCUMENTS);
let rowsRes = []; let rowsRes = [];
if (attachData) //Если результат запроса не пустой
if (attachData.RCDOCUMENTS) if (rows.length !== 0) {
attachData.RCDOCUMENTS.map(data => { //Переводим BLOB в BUFFER и формируем формат аттача
for (let i = 0; i < rows.length; i++) {
let rowContent = await rows[i].BDATA.getData();
rowsRes.push({ rowsRes.push({
filename: data.filename, filename: rows[i].FILENAME,
content: data.bdata content: rowContent
});
}); });
}
}
return rowsRes; return rowsRes;
} catch (e) {
throw new Error(e.message);
} finally {
if (pooledConnection) {
try {
await pooledConnection.close();
} catch (e) {
throw new Error(e.message);
}
}
}
}; };
//Разбор XML //Разбор XML
@ -77,7 +125,7 @@ const before = async prms => {
parseRes = await parseXML(prms.queue.blMsg.toString()); parseRes = await parseXML(prms.queue.blMsg.toString());
//Если есть присоединенные файлы - добавляем их //Если есть присоединенные файлы - добавляем их
if (parseRes.mail.ident) { if (parseRes.mail.ident) {
parseRes.mail.attachments = await getMailAttach({ dbConn: prms.dbConn, nIdent: parseRes.mail.ident }); parseRes.mail.attachments = await getMailAttach({ connection: prms.dbConn.connection, nIdent: parseRes.mail.ident });
} }
//Если указан текст в обычном формате //Если указан текст в обычном формате
if (parseRes.mail.text) { if (parseRes.mail.text) {
@ -110,7 +158,7 @@ const before = async prms => {
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
if (parseRes.mail.nExsextmailId) { if (parseRes.mail.nExsextmailId) {
await setSendMsg({ await setSendMsg({
dbConn: prms.dbConn, connection: prms.dbConn.connection,
nRn: parseRes.mail.nExsextmailId, nRn: parseRes.mail.nExsextmailId,
sErrMsg: "", sErrMsg: "",
nStatus: NSTATUS_DONE nStatus: NSTATUS_DONE
@ -122,7 +170,7 @@ const before = async prms => {
//Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении //Если имеется рег. номер записи очереди отправки E-mail - обновляем информацию о текущем сообщении
if (parseRes.mail.nExsextmailId) { if (parseRes.mail.nExsextmailId) {
await setSendMsg({ await setSendMsg({
dbConn: prms.dbConn, connection: prms.dbConn.connection,
nRn: parseRes.mail.nExsextmailId, nRn: parseRes.mail.nExsextmailId,
sErrMsg: res, sErrMsg: res,
nStatus: NSTATUS_ERR nStatus: NSTATUS_ERR