This commit is contained in:
parent
85049c126b
commit
6a23a5429c
|
@ -27,12 +27,12 @@ module.exports = Self => {
|
||||||
let newTicketData = {};
|
let newTicketData = {};
|
||||||
let receiverTicket = params.receiverTicket;
|
let receiverTicket = params.receiverTicket;
|
||||||
|
|
||||||
let isCurrentTicketEditable = await models.Ticket.isEditable(params.currentTicket.currentTicketId);
|
let isCurrentTicketEditable = await models.Ticket.isEditable(ctx, params.currentTicket.currentTicketId);
|
||||||
if (!isCurrentTicketEditable)
|
if (!isCurrentTicketEditable)
|
||||||
throw new UserError(`The sales of the current ticket can't be modified`);
|
throw new UserError(`The sales of the current ticket can't be modified`);
|
||||||
|
|
||||||
if (params.receiverTicket.id) {
|
if (params.receiverTicket.id) {
|
||||||
let isReceiverTicketEditable = await models.Ticket.isEditable(params.receiverTicket.id);
|
let isReceiverTicketEditable = await models.Ticket.isEditable(ctx, params.receiverTicket.id);
|
||||||
if (!isReceiverTicketEditable)
|
if (!isReceiverTicketEditable)
|
||||||
throw new UserError(`The sales of the receiver ticket can't be modified`);
|
throw new UserError(`The sales of the receiver ticket can't be modified`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('priceDifference', {
|
Self.remoteMethodCtx('priceDifference', {
|
||||||
description: 'Returns sales with price difference if the ticket is editable',
|
description: 'Returns sales with price difference if the ticket is editable',
|
||||||
accessType: 'READ',
|
accessType: 'READ',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -27,8 +27,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.priceDifference = async(ticketFk, data) => {
|
Self.priceDifference = async(ctx, ticketFk, data) => {
|
||||||
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(ticketFk);
|
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(ctx, ticketFk);
|
||||||
if (!thisTicketIsEditable)
|
if (!thisTicketIsEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let UserError = require('vn-loopback/util/user-error');
|
let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('removes', {
|
Self.remoteMethodCtx('removes', {
|
||||||
description: 'Change the state of a ticket',
|
description: 'Change the state of a ticket',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -21,8 +21,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.removes = async params => {
|
Self.removes = async(ctx, params) => {
|
||||||
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.actualTicketFk);
|
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(ctx, params.actualTicketFk);
|
||||||
if (!thisTicketIsEditable)
|
if (!thisTicketIsEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
let UserError = require('vn-loopback/util/user-error');
|
let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('reserve', {
|
Self.remoteMethodCtx('reserve', {
|
||||||
description: 'Change the state of a ticket',
|
description: 'Change the state of a ticket',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -22,8 +22,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.reserve = async params => {
|
Self.reserve = async(ctx, params) => {
|
||||||
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(params.ticketFk);
|
let thisTicketIsEditable = await Self.app.models.Ticket.isEditable(ctx, params.ticketFk);
|
||||||
if (!thisTicketIsEditable)
|
if (!thisTicketIsEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
describe('sale priceDifference()', () => {
|
describe('sale priceDifference()', () => {
|
||||||
it('should return ticket price differences', async() => {
|
it('should return ticket price differences', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let tomorrow = new Date();
|
let tomorrow = new Date();
|
||||||
tomorrow.setDate(tomorrow.getDate() + 1);
|
tomorrow.setDate(tomorrow.getDate() + 1);
|
||||||
let data = {
|
let data = {
|
||||||
|
@ -11,7 +12,7 @@ describe('sale priceDifference()', () => {
|
||||||
agencyModeFk: 7,
|
agencyModeFk: 7,
|
||||||
warehouseFk: 1
|
warehouseFk: 1
|
||||||
};
|
};
|
||||||
let result = await app.models.Sale.priceDifference(16, data);
|
let result = await app.models.Sale.priceDifference(ctx, 16, data);
|
||||||
|
|
||||||
expect(result.totalUnitPrice).toEqual(215.77);
|
expect(result.totalUnitPrice).toEqual(215.77);
|
||||||
expect(result.totalNewPrice).toEqual(215.77);
|
expect(result.totalNewPrice).toEqual(215.77);
|
||||||
|
@ -19,6 +20,7 @@ describe('sale priceDifference()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return an error if the ticket is not editable', async() => {
|
it('should return an error if the ticket is not editable', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
let data = {
|
let data = {
|
||||||
landed: new Date(),
|
landed: new Date(),
|
||||||
|
@ -26,7 +28,7 @@ describe('sale priceDifference()', () => {
|
||||||
agencyModeFk: 1,
|
agencyModeFk: 1,
|
||||||
warehouseFk: 1
|
warehouseFk: 1
|
||||||
};
|
};
|
||||||
await app.models.Sale.priceDifference(1, data)
|
await app.models.Sale.priceDifference(ctx, 1, data)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
});
|
});
|
||||||
|
|
|
@ -13,6 +13,7 @@ describe('sale removes()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the ticket of the given sales is not editable', async() => {
|
it('should throw an error if the ticket of the given sales is not editable', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
|
|
||||||
let params = {
|
let params = {
|
||||||
|
@ -21,7 +22,7 @@ describe('sale removes()', () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await app.models.Sale.removes(params);
|
await app.models.Sale.removes(ctx, params);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
error = e;
|
error = e;
|
||||||
}
|
}
|
||||||
|
@ -30,12 +31,13 @@ describe('sale removes()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should delete the sales', async() => {
|
it('should delete the sales', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let params = {
|
let params = {
|
||||||
sales: [{id: newsale.id, instance: 0}],
|
sales: [{id: newsale.id, instance: 0}],
|
||||||
actualTicketFk: 16
|
actualTicketFk: 16
|
||||||
};
|
};
|
||||||
|
|
||||||
let res = await app.models.Sale.removes(params);
|
let res = await app.models.Sale.removes(ctx, params);
|
||||||
|
|
||||||
expect(res).toEqual([{count: 1}]);
|
expect(res).toEqual([{count: 1}]);
|
||||||
});
|
});
|
||||||
|
|
|
@ -2,6 +2,7 @@ const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('sale reserve()', () => {
|
describe('sale reserve()', () => {
|
||||||
afterAll(async done => {
|
afterAll(async done => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let params = {
|
let params = {
|
||||||
sales: [
|
sales: [
|
||||||
{id: 7},
|
{id: 7},
|
||||||
|
@ -10,18 +11,19 @@ describe('sale reserve()', () => {
|
||||||
reserved: false
|
reserved: false
|
||||||
};
|
};
|
||||||
|
|
||||||
await app.models.Sale.reserve(params);
|
await app.models.Sale.reserve(ctx, params);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the ticket can not be modified', async() => {
|
it('should throw an error if the ticket can not be modified', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
let params = {ticketFk: 2,
|
let params = {ticketFk: 2,
|
||||||
sales: [{id: 5}],
|
sales: [{id: 5}],
|
||||||
reserved: false};
|
reserved: false};
|
||||||
|
|
||||||
await app.models.Sale.reserve(params)
|
await app.models.Sale.reserve(ctx, params)
|
||||||
.catch(response => {
|
.catch(response => {
|
||||||
expect(response).toEqual(new Error(`The sales of this ticket can't be modified`));
|
expect(response).toEqual(new Error(`The sales of this ticket can't be modified`));
|
||||||
error = response;
|
error = response;
|
||||||
|
@ -36,6 +38,7 @@ describe('sale reserve()', () => {
|
||||||
expect(originalTicketSales[0].reserved).toEqual(0);
|
expect(originalTicketSales[0].reserved).toEqual(0);
|
||||||
expect(originalTicketSales[1].reserved).toEqual(0);
|
expect(originalTicketSales[1].reserved).toEqual(0);
|
||||||
|
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let params = {
|
let params = {
|
||||||
sales: [
|
sales: [
|
||||||
{id: 7},
|
{id: 7},
|
||||||
|
@ -44,7 +47,7 @@ describe('sale reserve()', () => {
|
||||||
reserved: true
|
reserved: true
|
||||||
};
|
};
|
||||||
|
|
||||||
await app.models.Sale.reserve(params);
|
await app.models.Sale.reserve(ctx, params);
|
||||||
|
|
||||||
let reservedTicketSales = await app.models.Ticket.getSales(11);
|
let reservedTicketSales = await app.models.Ticket.getSales(11);
|
||||||
|
|
||||||
|
|
|
@ -26,10 +26,11 @@ describe('sale updatePrice()', () => {
|
||||||
|
|
||||||
|
|
||||||
it('should throw an error if the ticket is not editable', async() => {
|
it('should throw an error if the ticket is not editable', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let immutableSaleId = 1;
|
let immutableSaleId = 1;
|
||||||
let price = 5;
|
let price = 5;
|
||||||
|
|
||||||
await app.models.Sale.updatePrice(immutableSaleId, price)
|
await app.models.Sale.updatePrice(ctx, immutableSaleId, price)
|
||||||
.catch(response => {
|
.catch(response => {
|
||||||
expect(response).toEqual(new Error(`The sales of this ticket can't be modified`));
|
expect(response).toEqual(new Error(`The sales of this ticket can't be modified`));
|
||||||
error = response;
|
error = response;
|
||||||
|
@ -39,27 +40,30 @@ describe('sale updatePrice()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return 0 if the price is an empty string', async() => {
|
it('should return 0 if the price is an empty string', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let price = '';
|
let price = '';
|
||||||
|
|
||||||
await app.models.Sale.updatePrice(saleId, price);
|
await app.models.Sale.updatePrice(ctx, saleId, price);
|
||||||
let saleUpdated = await app.models.Sale.findById(saleId);
|
let saleUpdated = await app.models.Sale.findById(saleId);
|
||||||
|
|
||||||
expect(saleUpdated.price).toEqual(0);
|
expect(saleUpdated.price).toEqual(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should now set price as a decimal number in a string', async() => {
|
it('should now set price as a decimal number in a string', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let price = '8';
|
let price = '8';
|
||||||
|
|
||||||
await app.models.Sale.updatePrice(saleId, price);
|
await app.models.Sale.updatePrice(ctx, saleId, price);
|
||||||
let saleUpdated = await app.models.Sale.findById(saleId);
|
let saleUpdated = await app.models.Sale.findById(saleId);
|
||||||
|
|
||||||
expect(saleUpdated.price).toEqual(8);
|
expect(saleUpdated.price).toEqual(8);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set price as a decimal number and check the sale has the mana component', async() => {
|
it('should set price as a decimal number and check the sale has the mana component', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let price = 5.3;
|
let price = 5.3;
|
||||||
|
|
||||||
await app.models.Sale.updatePrice(saleId, price);
|
await app.models.Sale.updatePrice(ctx, saleId, price);
|
||||||
let saleUpdated = await app.models.Sale.findById(saleId);
|
let saleUpdated = await app.models.Sale.findById(saleId);
|
||||||
createdSaleComponent = await app.models.SaleComponent.findOne({where: {saleFk: saleId, componentFk: manaComponentId}});
|
createdSaleComponent = await app.models.SaleComponent.findOne({where: {saleFk: saleId, componentFk: manaComponentId}});
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let UserError = require('vn-loopback/util/user-error');
|
let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('updatePrice', {
|
Self.remoteMethodCtx('updatePrice', {
|
||||||
description: 'Changes the price of a sale',
|
description: 'Changes the price of a sale',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [
|
accepts: [
|
||||||
|
@ -28,7 +28,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.updatePrice = async(id, newPrice) => {
|
Self.updatePrice = async(ctx, id, newPrice) => {
|
||||||
let models = Self.app.models;
|
let models = Self.app.models;
|
||||||
let tx = await Self.beginTransaction({});
|
let tx = await Self.beginTransaction({});
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ module.exports = Self => {
|
||||||
};
|
};
|
||||||
let sale = await models.Sale.findById(id, filter, options);
|
let sale = await models.Sale.findById(id, filter, options);
|
||||||
|
|
||||||
let isEditable = await models.Ticket.isEditable(sale.ticketFk);
|
let isEditable = await models.Ticket.isEditable(ctx, sale.ticketFk);
|
||||||
if (!isEditable)
|
if (!isEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('addSale', {
|
Self.remoteMethodCtx('addSale', {
|
||||||
description: 'Inserts a new sale for the current ticket',
|
description: 'Inserts a new sale for the current ticket',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -32,10 +32,10 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.addSale = async(id, itemId, quantity) => {
|
Self.addSale = async(ctx, id, itemId, quantity) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
|
|
||||||
const isEditable = await models.Ticket.isEditable(id);
|
const isEditable = await models.Ticket.isEditable(ctx, id);
|
||||||
if (!isEditable)
|
if (!isEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('isEditable', {
|
Self.remoteMethodCtx('isEditable', {
|
||||||
description: 'Check if a ticket is editable',
|
description: 'Check if a ticket is editable',
|
||||||
accessType: 'READ',
|
accessType: 'READ',
|
||||||
accepts: [{
|
accepts: [{
|
||||||
|
@ -19,10 +19,13 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.isEditable = async ticketFk => {
|
Self.isEditable = async(ctx, ticketFk) => {
|
||||||
|
const accessToken = ctx.active && ctx.active.accessToken || ctx.req && ctx.req.accessToken;
|
||||||
|
const userId = accessToken.userId;
|
||||||
let state = await Self.app.models.TicketState.findOne({
|
let state = await Self.app.models.TicketState.findOne({
|
||||||
where: {ticketFk: ticketFk}
|
where: {ticketFk: ticketFk}
|
||||||
});
|
});
|
||||||
|
let isProductionBoss = await Self.app.models.Account.hasRole(userId, 'productionBoss');
|
||||||
let alertLevel = state ? state.alertLevel : null;
|
let alertLevel = state ? state.alertLevel : null;
|
||||||
let ticket = await Self.app.models.Ticket.findById(ticketFk, {
|
let ticket = await Self.app.models.Ticket.findById(ticketFk, {
|
||||||
fields: ['isDeleted', 'clientFk', 'refFk'],
|
fields: ['isDeleted', 'clientFk', 'refFk'],
|
||||||
|
@ -41,7 +44,7 @@ module.exports = Self => {
|
||||||
const isNotNormalClient = ticket && ticket.client().type().code == 'normal';
|
const isNotNormalClient = ticket && ticket.client().type().code == 'normal';
|
||||||
const isInvoiced = ticket && ticket.refFk;
|
const isInvoiced = ticket && ticket.refFk;
|
||||||
|
|
||||||
if (!ticket || ((isDeleted || isOnDelivery) && isNotNormalClient) || isInvoiced)
|
if (!ticket || (isOnDelivery && isNotNormalClient && !isProductionBoss) || isInvoiced || isDeleted)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -12,19 +12,21 @@ describe('ticket addSale()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should create a new sale for the ticket with id 13', async() => {
|
it('should create a new sale for the ticket with id 13', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
const itemId = 4;
|
const itemId = 4;
|
||||||
const quantity = 10;
|
const quantity = 10;
|
||||||
newSale = await app.models.Ticket.addSale(ticketId, itemId, quantity);
|
newSale = await app.models.Ticket.addSale(ctx, ticketId, itemId, quantity);
|
||||||
|
|
||||||
expect(newSale.itemFk).toEqual(4);
|
expect(newSale.itemFk).toEqual(4);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not be able to add a sale if the item quantity is not available', async() => {
|
it('should not be able to add a sale if the item quantity is not available', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
const itemId = 11;
|
const itemId = 11;
|
||||||
const quantity = 10;
|
const quantity = 10;
|
||||||
|
|
||||||
let error;
|
let error;
|
||||||
await app.models.Ticket.addSale(ticketId, itemId, quantity).catch(e => {
|
await app.models.Ticket.addSale(ctx, ticketId, itemId, quantity).catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
expect(error.message).toEqual(`This item is not available`);
|
expect(error.message).toEqual(`This item is not available`);
|
||||||
|
@ -34,11 +36,12 @@ describe('ticket addSale()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not be able to add a sale if the ticket is not editable', async() => {
|
it('should not be able to add a sale if the ticket is not editable', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
const notEditableTicketId = 1;
|
const notEditableTicketId = 1;
|
||||||
const itemId = 4;
|
const itemId = 4;
|
||||||
const quantity = 10;
|
const quantity = 10;
|
||||||
let error;
|
let error;
|
||||||
await app.models.Ticket.addSale(notEditableTicketId, itemId, quantity).catch(e => {
|
await app.models.Ticket.addSale(ctx, notEditableTicketId, itemId, quantity).catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
expect(error.message).toEqual(`The sales of this ticket can't be modified`);
|
expect(error.message).toEqual(`The sales of this ticket can't be modified`);
|
||||||
|
|
|
@ -2,26 +2,44 @@ const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('ticket isEditable()', () => {
|
describe('ticket isEditable()', () => {
|
||||||
it('should return false if the given ticket is not editable', async() => {
|
it('should return false if the given ticket is not editable', async() => {
|
||||||
let result = await app.models.Ticket.isEditable(2);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 2);
|
||||||
|
|
||||||
expect(result).toEqual(false);
|
expect(result).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false if the given ticket does not exist', async() => {
|
it('should return false if the given ticket does not exist', async() => {
|
||||||
let result = await app.models.Ticket.isEditable(99999);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 99999);
|
||||||
|
|
||||||
expect(result).toEqual(false);
|
expect(result).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return false if the given ticket isDeleted', async() => {
|
it('should return false if the given ticket isDeleted', async() => {
|
||||||
let result = await app.models.Ticket.isEditable(19);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 19);
|
||||||
|
|
||||||
expect(result).toEqual(false);
|
expect(result).toEqual(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should return true if the given ticket is editable', async() => {
|
it('should return true if the given ticket is editable', async() => {
|
||||||
let result = await app.models.Ticket.isEditable(16);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 16);
|
||||||
|
|
||||||
expect(result).toEqual(true);
|
expect(result).toEqual(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should be able to edit a not deleted or invoiced ticket if the role is productionBoss', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 50}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 8);
|
||||||
|
|
||||||
|
expect(result).toEqual(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should not be able to edit a not deleted or invoiced ticket if the role is salesPerson', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 18}}};
|
||||||
|
let result = await app.models.Ticket.isEditable(ctx, 8);
|
||||||
|
|
||||||
|
expect(result).toEqual(false);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -28,13 +28,14 @@ describe('sale updateDiscount()', () => {
|
||||||
|
|
||||||
|
|
||||||
it('should throw an error if no sales were selected', async() => {
|
it('should throw an error if no sales were selected', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
const ticketId = 11;
|
const ticketId = 11;
|
||||||
const sales = [];
|
const sales = [];
|
||||||
const newDiscount = 10;
|
const newDiscount = 10;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await app.models.Ticket.updateDiscount(ticketId, sales, newDiscount);
|
await app.models.Ticket.updateDiscount(ctx, ticketId, sales, newDiscount);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err;
|
error = err;
|
||||||
}
|
}
|
||||||
|
@ -43,13 +44,14 @@ describe('sale updateDiscount()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if no sales belong to different tickets', async() => {
|
it('should throw an error if no sales belong to different tickets', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
const ticketId = 11;
|
const ticketId = 11;
|
||||||
const sales = [1, 14];
|
const sales = [1, 14];
|
||||||
const newDiscount = 10;
|
const newDiscount = 10;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await app.models.Ticket.updateDiscount(ticketId, sales, newDiscount);
|
await app.models.Ticket.updateDiscount(ctx, ticketId, sales, newDiscount);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err;
|
error = err;
|
||||||
}
|
}
|
||||||
|
@ -58,13 +60,14 @@ describe('sale updateDiscount()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the ticket is invoiced already', async() => {
|
it('should throw an error if the ticket is invoiced already', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
let error;
|
let error;
|
||||||
const ticketId = 1;
|
const ticketId = 1;
|
||||||
const sales = [1];
|
const sales = [1];
|
||||||
const newDiscount = 100;
|
const newDiscount = 100;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await app.models.Ticket.updateDiscount(ticketId, sales, newDiscount);
|
await app.models.Ticket.updateDiscount(ctx, ticketId, sales, newDiscount);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
error = err;
|
error = err;
|
||||||
}
|
}
|
||||||
|
@ -73,11 +76,12 @@ describe('sale updateDiscount()', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should update the discount if the salesPerson has mana', async() => {
|
it('should update the discount if the salesPerson has mana', async() => {
|
||||||
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
const ticketId = 11;
|
const ticketId = 11;
|
||||||
const sales = [originalSaleId];
|
const sales = [originalSaleId];
|
||||||
const newDiscount = 100;
|
const newDiscount = 100;
|
||||||
|
|
||||||
await app.models.Ticket.updateDiscount(ticketId, sales, newDiscount);
|
await app.models.Ticket.updateDiscount(ctx, ticketId, sales, newDiscount);
|
||||||
|
|
||||||
let updatedSale = await app.models.Sale.findById(originalSaleId);
|
let updatedSale = await app.models.Sale.findById(originalSaleId);
|
||||||
let createdSaleComponent = await app.models.SaleComponent.findOne({
|
let createdSaleComponent = await app.models.SaleComponent.findOne({
|
||||||
|
|
|
@ -7,14 +7,17 @@ describe('ticket updateEditableTicket()', () => {
|
||||||
const originalData = {addressFk: 123};
|
const originalData = {addressFk: 123};
|
||||||
|
|
||||||
afterAll(async done => {
|
afterAll(async done => {
|
||||||
await app.models.Ticket.updateEditableTicket(validTicketId, originalData);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
await app.models.Ticket.updateEditableTicket(ctx, validTicketId, originalData);
|
||||||
|
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw an error if the ticket is not editable', async() => {
|
it('should throw an error if the ticket is not editable', async() => {
|
||||||
let error;
|
let error;
|
||||||
await app.models.Ticket.updateEditableTicket(invalidTicketId, data).catch(e => {
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
|
||||||
|
await app.models.Ticket.updateEditableTicket(ctx, invalidTicketId, data).catch(e => {
|
||||||
error = e;
|
error = e;
|
||||||
}).finally(() => {
|
}).finally(() => {
|
||||||
expect(error.message).toEqual('This ticket can not be modified');
|
expect(error.message).toEqual('This ticket can not be modified');
|
||||||
|
@ -25,7 +28,9 @@ describe('ticket updateEditableTicket()', () => {
|
||||||
|
|
||||||
|
|
||||||
it('should edit the ticket address', async() => {
|
it('should edit the ticket address', async() => {
|
||||||
await app.models.Ticket.updateEditableTicket(validTicketId, data);
|
let ctx = {req: {accessToken: {userId: 9}}};
|
||||||
|
|
||||||
|
await app.models.Ticket.updateEditableTicket(ctx, validTicketId, data);
|
||||||
|
|
||||||
let updatedTicket = await app.models.Ticket.findById(validTicketId);
|
let updatedTicket = await app.models.Ticket.findById(validTicketId);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
let UserError = require('vn-loopback/util/user-error');
|
let UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('updateDiscount', {
|
Self.remoteMethodCtx('updateDiscount', {
|
||||||
description: 'Changes the discount of a sale',
|
description: 'Changes the discount of a sale',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [
|
accepts: [
|
||||||
|
@ -34,7 +34,7 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.updateDiscount = async(id, salesIds, newDiscount) => {
|
Self.updateDiscount = async(ctx, id, salesIds, newDiscount) => {
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const tx = await Self.beginTransaction({});
|
const tx = await Self.beginTransaction({});
|
||||||
|
|
||||||
|
@ -69,7 +69,7 @@ module.exports = Self => {
|
||||||
if (!allFromSameTicket)
|
if (!allFromSameTicket)
|
||||||
throw new UserError('All sales must belong to the same ticket');
|
throw new UserError('All sales must belong to the same ticket');
|
||||||
|
|
||||||
const isEditable = await models.Ticket.isEditable(id);
|
const isEditable = await models.Ticket.isEditable(ctx, id);
|
||||||
if (!isEditable)
|
if (!isEditable)
|
||||||
throw new UserError(`The sales of this ticket can't be modified`);
|
throw new UserError(`The sales of this ticket can't be modified`);
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('updateEditableTicket', {
|
Self.remoteMethodCtx('updateEditableTicket', {
|
||||||
description: 'Change data of a ticket',
|
description: 'Change data of a ticket',
|
||||||
accessType: 'WRITE',
|
accessType: 'WRITE',
|
||||||
accepts: [
|
accepts: [
|
||||||
|
@ -30,8 +30,8 @@ module.exports = Self => {
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
Self.updateEditableTicket = async(id, data) => {
|
Self.updateEditableTicket = async(ctx, id, data) => {
|
||||||
let ticketIsEditable = await Self.app.models.Ticket.isEditable(id);
|
let ticketIsEditable = await Self.app.models.Ticket.isEditable(ctx, id);
|
||||||
if (!ticketIsEditable)
|
if (!ticketIsEditable)
|
||||||
throw new UserError('This ticket can not be modified');
|
throw new UserError('This ticket can not be modified');
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,23 @@
|
||||||
const UserError = require('vn-loopback/util/user-error');
|
const UserError = require('vn-loopback/util/user-error');
|
||||||
|
const LoopBackContext = require('loopback-context');
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.observe('before save', async ctx => {
|
Self.observe('before save', async ctx => {
|
||||||
|
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||||
let changes = ctx.currentInstance || ctx.instance;
|
let changes = ctx.currentInstance || ctx.instance;
|
||||||
if (changes) {
|
if (changes) {
|
||||||
let ticketId = changes.ticketFk;
|
let ticketId = changes.ticketFk;
|
||||||
let isEditable = await Self.app.models.Ticket.isEditable(ticketId);
|
let isEditable = await Self.app.models.Ticket.isEditable(loopBackContext, ticketId);
|
||||||
if (!isEditable)
|
if (!isEditable)
|
||||||
throw new UserError(`The current ticket can't be modified`);
|
throw new UserError(`The current ticket can't be modified`);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Self.observe('before delete', async ctx => {
|
Self.observe('before delete', async ctx => {
|
||||||
|
const loopBackContext = LoopBackContext.getCurrentContext();
|
||||||
const models = Self.app.models;
|
const models = Self.app.models;
|
||||||
const service = await models.TicketService.findById(ctx.where.id);
|
const service = await models.TicketService.findById(ctx.where.id);
|
||||||
const isEditable = await Self.app.models.Ticket.isEditable(service.ticketFk);
|
const isEditable = await Self.app.models.Ticket.isEditable(loopBackContext, service.ticketFk);
|
||||||
|
|
||||||
if (!isEditable)
|
if (!isEditable)
|
||||||
throw new UserError(`The current ticket can't be modified`);
|
throw new UserError(`The current ticket can't be modified`);
|
||||||
|
|
|
@ -21,6 +21,15 @@ class Controller {
|
||||||
this.imagesPath = '//verdnatura.es/vn-image-data/catalog';
|
this.imagesPath = '//verdnatura.es/vn-image-data/catalog';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get ticket() {
|
||||||
|
return this._ticket;
|
||||||
|
}
|
||||||
|
|
||||||
|
set ticket(value) {
|
||||||
|
this._ticket = value;
|
||||||
|
this.isEditable();
|
||||||
|
}
|
||||||
|
|
||||||
get sales() {
|
get sales() {
|
||||||
return this._sales;
|
return this._sales;
|
||||||
}
|
}
|
||||||
|
@ -85,14 +94,11 @@ class Controller {
|
||||||
callback.call(this);
|
callback.call(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
get isEditable() {
|
isEditable() {
|
||||||
try {
|
this.$http.get(`/api/Tickets/${this.$state.params.id}/isEditable`).then(res => {
|
||||||
return !this.ticket.state.state.alertLevel;
|
this.isEditable = res.data;
|
||||||
} catch (e) {}
|
});
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get isChecked() {
|
get isChecked() {
|
||||||
if (this.sales) {
|
if (this.sales) {
|
||||||
for (let instance of this.sales)
|
for (let instance of this.sales)
|
||||||
|
|
Loading…
Reference in New Issue