98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
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 && services.length) {
|
|
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;
|
|
}
|
|
};
|
|
};
|