let UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('confirm', { description: '', accessType: 'WRITE', accepts: [{ arg: 'id', type: 'Integer', required: true, description: 'The request ID', }, { arg: 'itemFk', type: 'Integer', required: true, description: 'The request observation', }, { arg: 'quantity', type: 'Integer', required: true, description: 'The request observation', }], returns: { type: 'Object', root: true }, http: { path: `/:id/confirm`, verb: 'post' } }); Self.confirm = async ctx => { let transaction = await Self.beginTransaction({}); let options = {transaction: transaction}; try { let item = await Self.app.models.Item.findById(ctx.args.itemFk); if (!item) throw new UserError(`That item doesn't exists`); let request = await Self.app.models.TicketRequest.findById(ctx.args.id, { include: {relation: 'ticket'} }); let query = `CALL vn.getItemVisibleAvailable(?,?,?,?)`; let params = [ ctx.args.itemFk, request.ticket().warehouseFk, request.ticket().shipped, false ]; let [res] = await Self.rawSql(query, params); let available = res[0].available; if (!available) throw new UserError(`That item is not available on that day`); if (request.saleFk) { let sale = await Self.app.models.Sale.findById(request.saleFk); sale.updateAttributes({itemFk: ctx.args.itemFk, quantity: ctx.args.quantity, description: item.description}, options); } else { params = { ticketFk: request.ticketFk, itemFk: ctx.args.itemFk, quantity: ctx.args.quantity }; sale = await Self.app.models.Sale.create(params, options); request.updateAttributes({saleFk: sale.id, itemFk: sale.itemFk}, options); } query = `CALL vn.ticketCalculateSale(?)`; params = [sale.id]; await Self.rawSql(query, params, options); await transaction.commit(); } catch (error) { await transaction.rollback(); throw error; } }; };