let UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('updatePrice', { description: 'Changes the discount of a sale', accessType: 'WRITE', accepts: [{ arg: 'params', type: 'object', required: true, description: 'sale ID, newPrice', http: {source: 'body'} }], returns: { type: 'string', root: true }, http: { path: `/updatePrice`, verb: 'post' } }); Self.getTicket = async params => { let model = Self.app.models; let thisTicketIsEditable = await model.Ticket.isEditable(params.ticketFk); if (!thisTicketIsEditable) throw new UserError(`The sales of this ticket can't be modified`); return await model.Ticket.find({ where: { id: params.ticketFk }, include: [{ relation: 'client', scope: { fields: ['salesPersonFk'] } }], fields: ['id', 'clientFk'] }); }; Self.updatePrice = async params => { if (isNaN(params.price)) throw new UserError(`The value should be a number`); if (!params.price) params.price = 0; let model = Self.app.models; let ticket = await Self.getTicket(params); let usesMana = await model.WorkerMana.findOne({where: {workerFk: ticket[0].client().salesPersonFk}, fields: 'amount'}); let currentLine = await Self.app.models.Sale.findOne({where: {id: params.id}}); let componentToUse; if (usesMana) componentToUse = 37; else componentToUse = 34; let value = (params.price - currentLine.price); let saleComponent = await Self.app.models.SaleComponent.findOne({ where: { componentFk: componentToUse, saleFk: params.id } }); if (saleComponent) saleComponent.updateAttributes({value: saleComponent.value + value}); else { await Self.app.models.SaleComponent.create({ saleFk: params.id, componentFk: componentToUse, value: value }); } await currentLine.updateAttributes({price: params.price}); query = `call vn.manaSpellersRequery(?)`; await Self.rawSql(query, [ticket[0].client().salesPersonFk]); }; };