let UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('moveToNewTicket', { description: 'Change the state of a ticket', accessType: '', accepts: [{ arg: 'ticketParams', type: 'object', required: true, description: '[sales IDs], newTicketFk, actualTicketFk', http: {source: 'body'} }, { arg: 'sales', type: 'object', required: true, description: '[sales IDs]', http: {source: 'body'} }], returns: { type: 'string', root: true }, http: { path: `/moveToNewTicket`, verb: 'post' } }); Self.moveToNewTicket = async(ctx, params) => { let userId = ctx.req.accessToken.userId; let model = Self.app.models; let thisTicketIsEditable = await model.Ticket.isEditable(params.ticket.oldTicketFk); if (!thisTicketIsEditable) throw new UserError(`The sales of this ticket can't be modified`); let travelDates = await model.Agency.getFirstShipped(params.ticket); let shipped = new Date(travelDates.vShipped); shipped.setMinutes(shipped.getMinutes() + shipped.getTimezoneOffset()); let landed = new Date(travelDates.vLanded); landed.setMinutes(landed.getMinutes() + landed.getTimezoneOffset()); let newTicketParams = { clientFk: params.ticket.clientFk, addressFk: params.ticket.addressFk, agencyModeFk: params.ticket.agencyModeFk, warehouseFk: params.ticket.warehouseFk, shipped: shipped, landed: landed, userId: userId }; let tx = await Self.beginTransaction({}); try { let options = {transaction: tx}; let newTicket = await model.Ticket.new(ctx, newTicketParams, options); let selectedSalesId = []; params.sales.forEach(sale => { selectedSalesId.push(sale.id); }); await model.Sale.updateAll( {id: {inq: selectedSalesId}}, {ticketFk: newTicket.id}, options ); await tx.commit(); return newTicket; } catch (e) { await tx.rollback(); throw e; } }; };