const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('refund', { description: 'Create ticket refund with lines and services changing the sign to the quantites', accessType: 'WRITE', accepts: [{ arg: 'sales', description: 'The sales', type: ['object'], required: false }, { arg: 'services', type: ['object'], required: false, description: 'The services' }], returns: { type: 'number', root: true }, http: { path: `/refund`, verb: 'post' } }); Self.refund = async(ctx, sales, services, options) => { const myOptions = {}; let tx; if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } try { const userId = ctx.req.accessToken.userId; const isClaimManager = await Self.app.models.Account.hasRole(userId, 'claimManager'); const isSalesAssistant = await Self.app.models.Account.hasRole(userId, 'salesAssistant'); const hasValidRole = isClaimManager || isSalesAssistant; if (!hasValidRole) throw new UserError(`You don't have privileges to create refund`); const salesIds = []; if (sales) { for (let sale of sales) salesIds.push(sale.id); } else salesIds.push(null); const servicesIds = []; if (services) { for (let service of services) servicesIds.push(service.id); } else servicesIds.push(null); const query = ` DROP TEMPORARY TABLE IF EXISTS tmp.sale; DROP TEMPORARY TABLE IF EXISTS tmp.ticketService; CREATE TEMPORARY TABLE tmp.sale SELECT s.id, s.itemFk, s.quantity, s.concept, s.price, s.discount, s.ticketFk FROM sale s WHERE s.id IN (?); CREATE TEMPORARY TABLE tmp.ticketService SELECT ts.description, ts.quantity, ts.price, ts.taxClassFk, ts.ticketServiceTypeFk, ts.ticketFk FROM ticketService ts WHERE ts.id IN (?); CALL vn.ticket_doRefund(@newTicket); DROP TEMPORARY TABLE tmp.sale; DROP TEMPORARY TABLE tmp.ticketService;`; await Self.rawSql(query, [salesIds, servicesIds], myOptions); const [newTicket] = await Self.rawSql('SELECT @newTicket id', null, myOptions); const newTicketId = newTicket.id; if (tx) await tx.commit(); return newTicketId; } catch (e) { if (tx) await tx.rollback(); throw e; } }; };