const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethodCtx('payBack', { description: 'Create ticket with the selected lines changing the sign to the quantites', accessType: 'WRITE', accepts: [{ arg: 'sales', description: 'The sales', type: ['object'], required: true }, { arg: 'ticketId', type: 'number', required: true, description: 'The ticket id' }], returns: { type: 'number', root: true }, http: { path: `/payBack`, verb: 'post' } }); Self.payBack = async(ctx, sales, ticketId, 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 salesIds = []; const params = []; 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 pay back`); sales.forEach(sale => { salesIds.push(sale.id); params.push('?'); }); const paramsString = params.join(); const query = ` DROP TEMPORARY TABLE IF EXISTS tmp.sale; CREATE TEMPORARY TABLE tmp.sale SELECT s.id, s.itemFk, - s.quantity, s.concept, s.price, s.discount FROM sale s WHERE s.id IN (${paramsString}); CALL vn.ticket_doRefund(${ticketId}, @newTicket); DROP TEMPORARY TABLE tmp.sale;`; await Self.rawSql(query, salesIds, myOptions); const [newTicket] = await Self.rawSql('SELECT @newTicket id', null, myOptions); ticketId = newTicket.id; if (tx) await tx.commit(); return ticketId; } catch (e) { if (tx) await tx.rollback(); throw e; } }; };