2023-03-09 07:31:38 +00:00
|
|
|
const UserError = require('vn-loopback/util/user-error');
|
|
|
|
|
2023-02-24 13:41:02 +00:00
|
|
|
module.exports = Self => {
|
|
|
|
Self.remoteMethodCtx('saveSign', {
|
|
|
|
description: 'Save sign',
|
|
|
|
accessType: 'WRITE',
|
|
|
|
accepts:
|
|
|
|
[
|
|
|
|
{
|
|
|
|
arg: 'tickets',
|
|
|
|
type: ['number'],
|
|
|
|
required: true,
|
|
|
|
description: 'The tickets'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
arg: 'location',
|
|
|
|
type: 'object',
|
|
|
|
description: 'The employee location the moment the sign is saved'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
arg: 'signedTime',
|
|
|
|
type: 'date',
|
|
|
|
description: 'The signed time'
|
|
|
|
}
|
|
|
|
],
|
|
|
|
http: {
|
|
|
|
path: `/saveSign`,
|
|
|
|
verb: 'POST'
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
Self.saveSign = async(ctx, options) => {
|
|
|
|
const args = Object.assign({}, ctx.args);
|
|
|
|
const models = Self.app.models;
|
|
|
|
const myOptions = {};
|
|
|
|
let tx;
|
2023-04-20 06:24:43 +00:00
|
|
|
let dms;
|
|
|
|
let gestDocCreated = false;
|
2023-02-24 13:41:02 +00:00
|
|
|
|
|
|
|
if (typeof options == 'object')
|
|
|
|
Object.assign(myOptions, options);
|
|
|
|
|
|
|
|
if (!myOptions.transaction) {
|
|
|
|
tx = await Self.beginTransaction({});
|
|
|
|
myOptions.transaction = tx;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function setLocation(ticketId) {
|
2023-03-09 07:31:38 +00:00
|
|
|
await models.Delivery.create({
|
|
|
|
ticketFk: ticketId,
|
|
|
|
longitude: args.location.Longitude,
|
|
|
|
latitude: args.location.Latitude,
|
|
|
|
dated: args.signedTime || new Date()
|
|
|
|
}, myOptions);
|
2023-02-24 13:41:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async function gestDocExists(ticketId) {
|
|
|
|
const ticketDms = await models.TicketDms.findOne({
|
2023-03-09 07:31:38 +00:00
|
|
|
where: {ticketFk: ticketId},
|
2023-02-24 13:41:02 +00:00
|
|
|
fields: ['dmsFk']
|
|
|
|
}, myOptions);
|
|
|
|
|
|
|
|
if (!ticketDms) return false;
|
|
|
|
|
|
|
|
const ticket = await models.Ticket.findById(ticketId, {fields: ['isSigned']}, myOptions);
|
2023-03-08 11:29:09 +00:00
|
|
|
if (ticket.isSigned == true)
|
|
|
|
return true;
|
2023-02-24 13:41:02 +00:00
|
|
|
else
|
|
|
|
await models.Dms.destroyAll({where: {reference: ticketId}}, myOptions);
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
async function createGestDoc(id) {
|
|
|
|
const ticket = await models.Ticket.findById(id,
|
|
|
|
{include: [
|
|
|
|
{
|
|
|
|
relation: 'warehouse',
|
|
|
|
scope: {
|
|
|
|
fields: ['id']
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
relation: 'client',
|
|
|
|
scope: {
|
|
|
|
fields: ['name']
|
|
|
|
}
|
|
|
|
}, {
|
|
|
|
relation: 'route',
|
|
|
|
scope: {
|
|
|
|
fields: ['id']
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}, myOptions);
|
|
|
|
const dmsType = await models.DmsType.findOne({where: {code: 'Ticket'}, fields: ['id']}, myOptions);
|
|
|
|
const ctxUploadFile = Object.assign({}, ctx);
|
|
|
|
ctxUploadFile.args = {
|
|
|
|
warehouseId: ticket.warehouseFk,
|
|
|
|
companyId: ticket.companyFk,
|
|
|
|
dmsTypeId: dmsType.id,
|
2023-04-20 06:24:43 +00:00
|
|
|
reference: '',
|
|
|
|
description: `Firma del cliente - Ruta ${ticket.route().id}`,
|
2023-04-21 12:46:46 +00:00
|
|
|
hasFile: false
|
2023-02-24 13:41:02 +00:00
|
|
|
};
|
2023-04-20 06:24:43 +00:00
|
|
|
dms = await models.Dms.uploadFile(ctxUploadFile, myOptions);
|
|
|
|
gestDocCreated = true;
|
2023-02-24 13:41:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
for (let i = 0; i < args.tickets.length; i++) {
|
|
|
|
const ticketState = await models.TicketState.findOne(
|
|
|
|
{where: {ticketFk: args.tickets[i]},
|
|
|
|
fields: ['alertLevel']
|
|
|
|
}, myOptions);
|
|
|
|
|
2023-03-16 08:07:19 +00:00
|
|
|
const packedAlertLevel = await models.AlertLevel.findOne({where: {code: 'PACKED'},
|
2023-03-16 08:04:57 +00:00
|
|
|
fields: ['id']
|
|
|
|
}, myOptions);
|
|
|
|
|
2023-03-16 08:07:19 +00:00
|
|
|
if (ticketState.alertLevel < packedAlertLevel.id)
|
2023-03-16 08:04:57 +00:00
|
|
|
throw new UserError('This ticket cannot be signed because it has not been boxed');
|
|
|
|
else if (!await gestDocExists(args.tickets[i])) {
|
2023-02-24 13:41:02 +00:00
|
|
|
if (args.location) setLocation(args.tickets[i]);
|
2023-04-20 06:24:43 +00:00
|
|
|
if (!gestDocCreated) await createGestDoc(args.tickets[i]);
|
|
|
|
await models.TicketDms.create({ticketFk: args.tickets[i], dmsFk: dms[0].id}, myOptions);
|
|
|
|
const ticket = await models.Ticket.findById(args.tickets[i], null, myOptions);
|
|
|
|
await ticket.updateAttribute('isSigned', true, myOptions);
|
2023-02-24 13:41:02 +00:00
|
|
|
await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [args.tickets[i], 'DELIVERED'], myOptions);
|
2023-03-16 08:04:57 +00:00
|
|
|
}
|
2023-02-24 13:41:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (tx) await tx.commit();
|
2023-04-20 06:24:43 +00:00
|
|
|
return;
|
2023-02-24 13:41:02 +00:00
|
|
|
} catch (e) {
|
|
|
|
if (tx) await tx.rollback();
|
|
|
|
throw e;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|