2024-01-17 13:18:31 +00:00
|
|
|
const {Readable} = require('stream');
|
2024-01-26 11:40:42 +00:00
|
|
|
const UserError = require('vn-loopback/util/user-error');
|
2024-01-17 13:18:31 +00:00
|
|
|
|
2023-10-11 09:43:21 +00:00
|
|
|
module.exports = Self => {
|
|
|
|
Self.remoteMethodCtx('saveCmr', {
|
2023-10-11 10:20:30 +00:00
|
|
|
description: 'Save cmr',
|
2023-10-11 09:43:21 +00:00
|
|
|
accessType: 'WRITE',
|
2024-01-25 12:56:47 +00:00
|
|
|
accepts: [
|
2023-10-11 09:43:21 +00:00
|
|
|
{
|
|
|
|
arg: 'tickets',
|
|
|
|
type: ['number'],
|
|
|
|
required: true,
|
|
|
|
description: 'The tickets'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
http: {
|
|
|
|
path: `/saveCmr`,
|
|
|
|
verb: 'POST'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
Self.saveCmr = async(ctx, tickets, options) => {
|
|
|
|
const models = Self.app.models;
|
|
|
|
const myOptions = {userId: ctx.req.accessToken.userId};
|
2023-10-11 12:20:35 +00:00
|
|
|
let tx;
|
2023-10-11 09:43:21 +00:00
|
|
|
|
|
|
|
if (typeof options == 'object')
|
|
|
|
Object.assign(myOptions, options);
|
|
|
|
|
|
|
|
if (!myOptions.transaction) {
|
|
|
|
tx = await Self.beginTransaction({});
|
|
|
|
myOptions.transaction = tx;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2024-01-29 07:25:00 +00:00
|
|
|
const dmsTypeCmr = await models.DmsType.findOne({
|
|
|
|
where: {code: 'cmr'},
|
|
|
|
fields: ['id']
|
|
|
|
}, myOptions);
|
|
|
|
|
2023-10-11 09:43:21 +00:00
|
|
|
for (const ticketId of tickets) {
|
2023-10-11 12:20:35 +00:00
|
|
|
const ticket = await models.Ticket.findById(ticketId, myOptions);
|
2023-10-11 09:43:21 +00:00
|
|
|
|
2023-10-11 12:20:35 +00:00
|
|
|
if (ticket.cmrFk) {
|
2024-02-26 13:09:53 +00:00
|
|
|
const hasDmsCmr = await Self.rawSql(`
|
|
|
|
SELECT d.id
|
|
|
|
FROM ticketDms td
|
|
|
|
JOIN dms d ON d.id = td.dmsFk
|
|
|
|
WHERE td.ticketFk = ?
|
|
|
|
AND d.dmsTypeFk = ?
|
|
|
|
`, [ticketId, dmsTypeCmr.id]);
|
|
|
|
|
|
|
|
if (hasDmsCmr.length)
|
2024-01-26 11:40:42 +00:00
|
|
|
throw new UserError('This ticket already has a cmr saved');
|
|
|
|
|
|
|
|
ctx.args.id = ticket.cmrFk;
|
|
|
|
const response = await models.Route.cmr(ctx, myOptions);
|
|
|
|
const pdfStream = Readable.from(Buffer.from(response[0]));
|
|
|
|
const data = {
|
|
|
|
workerFk: ctx.req.accessToken.userId,
|
|
|
|
dmsTypeFk: dmsTypeCmr.id,
|
|
|
|
companyFk: ticket.companyFk,
|
|
|
|
warehouseFk: ticket.warehouseFk,
|
|
|
|
reference: ticket.id,
|
|
|
|
contentType: 'application/pdf',
|
2024-02-27 08:43:53 +00:00
|
|
|
hasFile: false
|
2024-01-26 11:40:42 +00:00
|
|
|
};
|
2024-01-17 12:07:26 +00:00
|
|
|
|
2024-01-26 11:40:42 +00:00
|
|
|
const dms = await models.Dms.createFromStream(data, 'pdf', pdfStream, myOptions);
|
|
|
|
await models.TicketDms.create({
|
|
|
|
ticketFk: ticketId,
|
|
|
|
dmsFk: dms.id
|
|
|
|
}, myOptions);
|
2023-10-11 09:43:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if (tx) await tx.commit();
|
|
|
|
return;
|
|
|
|
} catch (e) {
|
|
|
|
if (tx) await tx.rollback();
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|