#6760 modify transferClient #2035
|
@ -4,7 +4,6 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `vn`.`ticket_beforeUpdate`
|
|||
FOR EACH ROW
|
||||
BEGIN
|
||||
DECLARE vNewTime TIME;
|
||||
DECLARE vHasTicketRefund BOOL;
|
||||
|
||||
SET NEW.editorFk = account.myUser_getId();
|
||||
|
||||
|
@ -64,14 +63,5 @@ BEGIN
|
|||
|
||||
CALL vn.routeUpdateM3(NEW.routeFk);
|
||||
END IF;
|
||||
|
||||
SELECT COUNT(*) INTO vHasTicketRefund
|
||||
FROM ticketRefund
|
||||
WHERE originalTicketFk = NEW.id
|
||||
OR refundTicketFk = NEW.id;
|
||||
|
||||
IF vHasTicketRefund AND NEW.clientFk <> OLD.clientFk THEN
|
||||
CALL util.throw('The ticket has a refund associated');
|
||||
END IF;
|
||||
END$$
|
||||
DELIMITER ;
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
REVOKE UPDATE ON vn.ticket FROM employee;
|
||||
|
||||
GRANT UPDATE (id,
|
||||
warehouseFk,
|
||||
shipped,
|
||||
nickname,
|
||||
refFk,
|
||||
addressFk,
|
||||
workerFk,
|
||||
observations,
|
||||
isSigned,
|
||||
isLabeled,
|
||||
isPrinted,
|
||||
packages,
|
||||
location,
|
||||
hour,
|
||||
created,
|
||||
isBlocked,
|
||||
solution,
|
||||
routeFk,
|
||||
priority,
|
||||
hasPriority,
|
||||
companyFk,
|
||||
agencyModeFk,
|
||||
landed,
|
||||
isBoxed,
|
||||
isDeleted,
|
||||
zoneFk,
|
||||
zonePrice,
|
||||
zoneBonus,
|
||||
totalWithVat,
|
||||
totalWithoutVat,
|
||||
weight,
|
||||
clonedFrom,
|
||||
cmrFk,
|
||||
editorFk)
|
||||
ON vn.ticket TO employee;
|
|
@ -1,49 +1,60 @@
|
|||
const models = require('vn-loopback/server/server').models;
|
||||
|
||||
describe('Ticket transferClient()', () => {
|
||||
const userId = 9;
|
||||
const activeCtx = {
|
||||
accessToken: {userId: userId},
|
||||
};
|
||||
const ctx = {req: activeCtx};
|
||||
const originalTicketId = 8;
|
||||
const refundTicketId = 24;
|
||||
const clientId = 1;
|
||||
let ctx;
|
||||
let options;
|
||||
let tx;
|
||||
beforeEach(async() => {
|
||||
ctx = {
|
||||
req: {
|
||||
accessToken: {userId: 9},
|
||||
headers: {origin: 'http://localhost'}
|
||||
},
|
||||
args: {}
|
||||
};
|
||||
|
||||
options = {transaction: tx};
|
||||
tx = await models.Ticket.beginTransaction({});
|
||||
options.transaction = tx;
|
||||
});
|
||||
|
||||
afterEach(async() => {
|
||||
await tx.rollback();
|
||||
});
|
||||
|
||||
it('should throw an error as the ticket is not editable', async() => {
|
||||
const tx = await models.Ticket.beginTransaction({});
|
||||
let error;
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
const ticketId = 4;
|
||||
const clientId = 1;
|
||||
await models.Ticket.transferClient(ctx, ticketId, clientId, options);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
error = e;
|
||||
expect(e.message).toEqual(`This ticket is locked`);
|
||||
}
|
||||
|
||||
expect(error.message).toEqual(`This ticket is locked`);
|
||||
});
|
||||
|
||||
it('should be assigned a different clientFk', async() => {
|
||||
const tx = await models.Ticket.beginTransaction({});
|
||||
let updatedTicket;
|
||||
const ticketId = 10;
|
||||
const clientId = 1;
|
||||
it('should be assigned a different clientFk in the original ticket', async() => {
|
||||
await models.Ticket.transferClient(ctx, 2, clientId, options);
|
||||
const afterTransfer = await models.Ticket.findById(2, null, options);
|
||||
|
||||
try {
|
||||
const options = {transaction: tx};
|
||||
expect(afterTransfer.clientFk).toEqual(clientId);
|
||||
});
|
||||
|
||||
await models.Ticket.transferClient(ctx, ticketId, clientId, options);
|
||||
updatedTicket = await models.Ticket.findById(ticketId, {fields: ['clientFk']}, options);
|
||||
it('should be assigned a different clientFk in the original and refund ticket and claim', async() => {
|
||||
await models.Ticket.transferClient(ctx, originalTicketId, clientId, options);
|
||||
|
||||
await tx.rollback();
|
||||
} catch (e) {
|
||||
await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
const [originalTicket, refundTicket] = await models.Ticket.find({
|
||||
where: {id: {inq: [originalTicketId, refundTicketId]}}
|
||||
}, options);
|
||||
|
||||
expect(updatedTicket.clientFk).toEqual(clientId);
|
||||
const claim = await models.Claim.findOne({
|
||||
where: {ticketFk: originalTicketId}
|
||||
}, options);
|
||||
|
||||
expect(originalTicket.clientFk).toEqual(clientId);
|
||||
expect(refundTicket.clientFk).toEqual(clientId);
|
||||
expect(claim.clientFk).toEqual(clientId);
|
||||
});
|
||||
});
|
||||
|
|
|
@ -2,20 +2,17 @@ module.exports = Self => {
|
|||
Self.remoteMethodCtx('transferClient', {
|
||||
description: 'Transfering ticket to another client',
|
||||
accessType: 'WRITE',
|
||||
accepts: [
|
||||
{
|
||||
arg: 'id',
|
||||
type: 'number',
|
||||
required: true,
|
||||
description: 'the ticket id',
|
||||
http: {source: 'path'}
|
||||
},
|
||||
{
|
||||
arg: 'clientFk',
|
||||
type: 'number',
|
||||
required: true,
|
||||
},
|
||||
],
|
||||
accepts: [{
|
||||
arg: 'id',
|
||||
type: 'number',
|
||||
required: true,
|
||||
description: 'the ticket id',
|
||||
http: {source: 'path'}
|
||||
}, {
|
||||
arg: 'clientFk',
|
||||
type: 'number',
|
||||
required: true,
|
||||
}],
|
||||
http: {
|
||||
path: `/:id/transferClient`,
|
||||
verb: 'PATCH'
|
||||
|
@ -25,21 +22,47 @@ module.exports = Self => {
|
|||
Self.transferClient = async(ctx, id, clientFk, options) => {
|
||||
const models = Self.app.models;
|
||||
const myOptions = {};
|
||||
const tickets = [];
|
||||
let tx;
|
||||
|
||||
if (typeof options == 'object')
|
||||
Object.assign(myOptions, options);
|
||||
|
||||
await Self.isEditableOrThrow(ctx, id, myOptions);
|
||||
if (!myOptions.transaction) {
|
||||
tx = await Self.beginTransaction({});
|
||||
myOptions.transaction = tx;
|
||||
}
|
||||
|
||||
const ticket = await models.Ticket.findById(
|
||||
id,
|
||||
{fields: ['id', 'shipped', 'clientFk', 'addressFk']},
|
||||
myOptions
|
||||
);
|
||||
const client = await models.Client.findById(clientFk, {fields: ['id', 'defaultAddressFk']}, myOptions);
|
||||
try {
|
||||
await Self.isEditableOrThrow(ctx, id, myOptions);
|
||||
|
||||
await ticket.updateAttributes({
|
||||
clientFk,
|
||||
addressFk: client.defaultAddressFk,
|
||||
});
|
||||
const ticketRelation = await models.TicketRefund.findOne({
|
||||
where: {or: [{originalTicketFk: id}, {refundTicketFk: id}]},
|
||||
include: [{relation: 'refundTicket'}, {relation: 'originalTicket'}]
|
||||
}, myOptions);
|
||||
|
||||
const {defaultAddressFk: addressFk} = await models.Client.findById(clientFk,
|
||||
{fields: ['id', 'defaultAddressFk']}, myOptions);
|
||||
|
||||
const attributes = {clientFk, addressFk};
|
||||
|
||||
if (ticketRelation) {
|
||||
const {refundTicket, originalTicket} = ticketRelation;
|
||||
tickets.push(refundTicket(), originalTicket());
|
||||
|
||||
for (const ticket of tickets)
|
||||
await ticket.updateAttributes(attributes, myOptions);
|
||||
} else
|
||||
await Self.updateAll({id}, attributes, myOptions);
|
||||
|
||||
const ticketIds = tickets.length ? tickets.map(ticket => ticket.id) : [id];
|
||||
|
||||
await models.Claim.updateAll({ticketFk: {inq: ticketIds}}, {clientFk}, myOptions);
|
||||
|
||||
if (tx) await tx.commit();
|
||||
} catch (e) {
|
||||
if (tx) await tx.rollback();
|
||||
throw e;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue