let UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethod('updatePrice', { description: 'Changes the discount of a sale', accessType: 'WRITE', accepts: [{ arg: 'params', type: 'object', required: true, description: 'sale ID, newPrice, ticketFk', http: {source: 'body'} }], returns: { type: 'string', root: true }, http: { path: `/updatePrice`, verb: 'post' } }); Self.updatePrice = async params => { if (!params.price) params.price = 0; let model = Self.app.models; let manaDiscount; let buyerDiscount = await model.ComponentRate.findOne({where: {code: 'buyerDiscount'}}); let ticket = await 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 componentId = buyerDiscount.id; if (usesMana) { manaDiscount = await model.ComponentRate.findOne({where: {code: 'mana'}}); componentId = manaDiscount.id; } let value = (params.price - currentLine.price); let saleComponent = await Self.app.models.SaleComponent.findOne({ where: { componentFk: componentId, saleFk: params.id } }); if (saleComponent) { saleComponent.updateAttributes({value: saleComponent.value + value}).catch(() => { throw new UserError(`Enter a valid number`); }); } else { await Self.app.models.SaleComponent.create({ saleFk: params.id, componentFk: componentId, value: value }); } await currentLine.updateAttributes({price: params.price}); query = `call vn.manaSpellersRequery(?)`; await Self.rawSql(query, [ticket[0].client().salesPersonFk]); }; async function getTicket(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'] }); } };