module.exports = Self => { Self.remoteMethodCtx('refund', { description: 'Create refund tickets with sales and services if provided', accessType: 'WRITE', accepts: [ { arg: 'salesIds', type: ['number'], required: true }, { arg: 'servicesIds', type: ['number'] }, { arg: 'withWarehouse', type: 'boolean', required: true } ], returns: { type: ['number'], root: true }, http: { path: `/refund`, verb: 'post' } }); Self.refund = async(ctx, salesIds, servicesIds, withWarehouse, options) => { const models = Self.app.models; const myOptions = {userId: ctx.req.accessToken.userId}; let tx; if (typeof options == 'object') Object.assign(myOptions, options); if (!myOptions.transaction) { tx = await Self.beginTransaction({}); myOptions.transaction = tx; } try { const refundAgencyMode = await models.AgencyMode.findOne({ include: { relation: 'zones', scope: { limit: 1, field: ['id', 'name'] } }, where: {code: 'refund'} }, myOptions); const refoundZoneId = refundAgencyMode.zones()[0].id; const salesFilter = { where: {id: {inq: salesIds}}, include: { relation: 'components', scope: { fields: ['saleFk', 'componentFk', 'value'] } } }; // const sales = await models.Sale.find(salesFilter, myOptions); const refundTicket = await models.Sale.clone( salesIds, servicesIds, withWarehouse, // refundAgencyMode, // refoundZoneId, true, true, myOptions ); if (tx && !options) await tx.commit(); return refundTicket; } catch (e) { if (tx) await tx.rollback(); throw e; } }; /* async function createTicketRefund(ticketId, now, refundAgencyMode, refoundZoneId, withWarehouse, myOptions) { const models = Self.app.models; const filter = {include: {relation: 'address'}}; const ticket = await models.Ticket.findById(ticketId, filter, myOptions); const refundTicket = await models.Ticket.create({ clientFk: ticket.clientFk, shipped: now, addressFk: ticket.address().id, agencyModeFk: refundAgencyMode.id, nickname: ticket.address().nickname, warehouseFk: withWarehouse ? ticket.warehouseFk : null, companyFk: ticket.companyFk, landed: now, zoneFk: refoundZoneId }, myOptions); await models.TicketRefund.create({ refundTicketFk: refundTicket.id, originalTicketFk: ticket.id, }, myOptions); return refundTicket; } */ };