Merge branch 'dev' into 3379-payMethod_ibanRequired
gitea/salix/pipeline/head This commit looks good Details

This commit is contained in:
Carlos Jimenez Ruiz 2021-11-22 13:32:18 +00:00
commit ff0a3acd6e
11 changed files with 170 additions and 24 deletions

View File

@ -1882,6 +1882,7 @@ INSERT INTO `postgresql`.`calendar_state` (`calendar_state_id`, `type`, `rgb`, `
INSERT INTO `postgresql`.`calendar_employee` (`business_id`, `calendar_state_id`, `date`)
VALUES
(1, 6, IF(MONTH(CURDATE()) = 12 AND DAY(CURDATE()) > 10, DATE_ADD(CURDATE(), INTERVAL -10 DAY), DATE_ADD(CURDATE(), INTERVAL 10 DAY))),
(1106, 1, IF(MONTH(CURDATE()) = 12 AND DAY(CURDATE()) > 10, DATE_ADD(CURDATE(), INTERVAL -10 DAY), DATE_ADD(CURDATE(), INTERVAL 10 DAY))),
(1106, 1, IF(MONTH(CURDATE()) = 12 AND DAY(CURDATE()) > 10, DATE_ADD(CURDATE(), INTERVAL -11 DAY), DATE_ADD(CURDATE(), INTERVAL 11 DAY))),
(1106, 1, IF(MONTH(CURDATE()) = 12 AND DAY(CURDATE()) > 10, DATE_ADD(CURDATE(), INTERVAL -12 DAY), DATE_ADD(CURDATE(), INTERVAL 12 DAY))),

View File

@ -47,19 +47,20 @@ TABLES=(
cplusSubjectOp
cplusTaxBreak
cplusTrascendency472
pgc
time
claimResponsible
claimReason
claimRedelivery
claimResult
ticketUpdateAction
state
sample
department
component
componentType
continent
department
itemPackingType
pgc
sample
state
ticketUpdateAction
time
volumeConfig
)
dump_tables ${TABLES[@]}

View File

@ -193,6 +193,7 @@
"Client assignment has changed": "He cambiado el comercial ~*\"<{{previousWorkerName}}>\"*~ por *\"<{{currentWorkerName}}>\"* del cliente [{{clientName}} ({{clientId}})]({{{url}}})",
"None": "Ninguno",
"The contract was not active during the selected date": "El contrato no estaba activo durante la fecha seleccionada",
"Cannot add more than one '1/2 day vacation'": "No puedes añadir más de un 'Vacaciones 1/2 dia'",
"This document already exists on this ticket": "Este documento ya existe en el ticket",
"Some of the selected tickets are not billable": "Algunos de los tickets seleccionados no son facturables",
"You can't invoice tickets from multiple clients": "No puedes facturar tickets de multiples clientes",
@ -212,5 +213,6 @@
"You don't have enough privileges to set this credit amount": "No tienes suficientes privilegios para establecer esta cantidad de crédito",
"You can't change the credit set to zero from a manager": "No puedes cambiar el cŕedito establecido a cero por un gerente",
"The PDF document does not exists": "El documento PDF no existe. Prueba a regenerarlo desde la opción 'Regenerar PDF factura'",
"The type of business must be filled in basic data": "El tipo de negocio debe estar rellenado en datos básicos"
"The type of business must be filled in basic data": "El tipo de negocio debe estar rellenado en datos básicos",
"You can't create a claim from a ticket delivered more than seven days ago": "No puedes crear una reclamación de un ticket entregado hace más de siete días"
}

View File

@ -57,8 +57,14 @@ module.exports = Self => {
}
}, myOptions);
const landedPlusWeek = new Date(ticket.landed);
landedPlusWeek.setDate(landedPlusWeek.getDate() + 7);
const isClaimable = landedPlusWeek >= new Date();
if (ticket.isDeleted)
throw new UserError(`You can't create a claim for a removed ticket`);
if (!isClaimable)
throw new UserError(`You can't create a claim from a ticket delivered more than seven days ago`);
const newClaim = await Self.create({
ticketFk: ticketId,

View File

@ -1,31 +1,40 @@
const app = require('vn-loopback/server/server');
const models = require('vn-loopback/server/server').models;
const LoopBackContext = require('loopback-context');
describe('Claim createFromSales()', () => {
const ticketId = 2;
const ticketId = 16;
const newSale = [{
id: 3,
instance: 0,
quantity: 10
}];
const ctx = {
req: {
accessToken: {userId: 1},
headers: {origin: 'localhost:5000'},
__: () => {}
}
const activeCtx = {
accessToken: {userId: 1},
headers: {origin: 'localhost:5000'},
__: () => {}
};
const ctx = {
req: activeCtx
};
beforeEach(() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
});
});
it('should create a new claim', async() => {
const tx = await app.models.Claim.beginTransaction({});
const tx = await models.Claim.beginTransaction({});
try {
const options = {transaction: tx};
const claim = await app.models.Claim.createFromSales(ctx, ticketId, newSale, options);
const claim = await models.Claim.createFromSales(ctx, ticketId, newSale, options);
expect(claim.ticketFk).toEqual(ticketId);
let claimBeginning = await app.models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options);
let claimBeginning = await models.ClaimBeginning.findOne({where: {claimFk: claim.id}}, options);
expect(claimBeginning.saleFk).toEqual(newSale[0].id);
expect(claimBeginning.quantity).toEqual(newSale[0].quantity);
@ -37,17 +46,42 @@ describe('Claim createFromSales()', () => {
}
});
it('should not be able to create a claim if exists that sale', async() => {
const tx = await app.models.Claim.beginTransaction({});
it('should not be able to create a claim for a ticket delivered more than seven days ago', async() => {
const tx = await models.Claim.beginTransaction({});
let error;
try {
const options = {transaction: tx};
await app.models.Claim.createFromSales(ctx, ticketId, newSale, options);
const todayMinusEightDays = new Date();
todayMinusEightDays.setDate(todayMinusEightDays.getDate() - 8);
await app.models.Claim.createFromSales(ctx, ticketId, newSale, options);
const ticket = await models.Ticket.findById(ticketId, options);
await ticket.updateAttribute('landed', todayMinusEightDays, options);
await models.Claim.createFromSales(ctx, ticketId, newSale, options);
await tx.rollback();
} catch (e) {
error = e;
await tx.rollback();
}
expect(error.toString()).toContain(`You can't create a claim from a ticket delivered more than seven days ago`);
});
it('should not be able to create a claim if exists that sale', async() => {
const tx = await models.Claim.beginTransaction({});
let error;
try {
const options = {transaction: tx};
await models.Claim.createFromSales(ctx, ticketId, newSale, options);
await models.Claim.createFromSales(ctx, ticketId, newSale, options);
await tx.rollback();
} catch (e) {

View File

@ -0,0 +1,26 @@
{
"name": "ItemPackingType",
"base": "VnModel",
"options": {
"mysql": {
"table": "itemPackingType"
}
},
"properties": {
"code": {
"type": "string",
"id": true
},
"description": {
"type": "string"
}
},
"acls": [
{
"accessType": "READ",
"principalType": "ROLE",
"principalId": "$everyone",
"permission": "ALLOW"
}
]
}

View File

@ -469,7 +469,8 @@
</vn-item>
<vn-item translate
name="claim"
ng-click="$ctrl.createClaim()">
ng-click="$ctrl.createClaim()"
ng-if="$ctrl.isClaimable">
Add claim
</vn-item>
<vn-item translate

View File

@ -35,6 +35,16 @@ class Controller extends Section {
return ticketState && ticketState.state.code;
}
get isClaimable() {
if (this.ticket) {
const landedPlusWeek = new Date(this.ticket.landed);
landedPlusWeek.setDate(landedPlusWeek.getDate() + 7);
return landedPlusWeek >= new Date();
}
return false;
}
getSaleTotal(sale) {
if (sale.quantity == null || sale.price == null)
return null;

View File

@ -15,7 +15,8 @@ describe('Ticket', () => {
const ticket = {
id: 1,
clientFk: 1101,
shipped: 1,
shipped: new Date(),
landed: new Date(),
created: new Date(),
client: {salesPersonFk: 1},
address: {mobile: 111111111}
@ -74,6 +75,25 @@ describe('Ticket', () => {
});
});
describe('isClaimable() getter', () => {
it('should return true for a ticket delivered less than seven days ago', () => {
const result = controller.isClaimable;
expect(result).toEqual(true);
});
it('should return false for a ticket delivered more than seven days ago', () => {
const ticket = controller.ticket;
const landedMinusEightDays = new Date(ticket.landed);
landedMinusEightDays.setDate(landedMinusEightDays.getDate() - 8);
ticket.landed = landedMinusEightDays;
const result = controller.isClaimable;
expect(result).toEqual(false);
});
});
describe('getSaleTotal()', () => {
it('should return the sale total amount', () => {
const sale = {

View File

@ -65,6 +65,23 @@ module.exports = Self => {
if (args.dated < labour.started || (labour.ended != null && args.dated > labour.ended))
throw new UserError(`The contract was not active during the selected date`);
const result = await Self.rawSql(
`SELECT COUNT(*) halfHolidayCounter
FROM vn.calendar c
JOIN postgresql.business b ON b.business_id = c.businessFk
JOIN postgresql.profile p ON p.profile_id = b.client_id
JOIN vn.person pe ON pe.id = p.person_id
WHERE c.dayOffTypeFk = 6
AND pe.workerFk = ?
AND c.dated BETWEEN util.firstDayOfYear(CURDATE())
AND LAST_DAY(DATE_ADD(NOW(), INTERVAL 12-MONTH(NOW()) MONTH))`, [args.id]);
const hasHalfHoliday = result[0].halfHolidayCounter > 0;
const isHalfHoliday = args.absenceTypeId == 6;
if (isHalfHoliday && hasHalfHoliday)
throw new UserError(`Cannot add more than one '1/2 day vacation'`);
const absence = await models.Calendar.create({
businessFk: labour.businessFk,
dayOffTypeFk: args.absenceTypeId,

View File

@ -74,4 +74,32 @@ describe('Worker createAbsence()', () => {
throw e;
}
});
it(`should throw an error when adding a "Half holiday" absence if there's already one`, async() => {
const ctx = {
req: {accessToken: {userId: 19}},
args: {
id: 1,
businessFk: 1,
absenceTypeId: 6,
dated: new Date()
}
};
const tx = await app.models.Calendar.beginTransaction({});
let error;
try {
const options = {transaction: tx};
await app.models.Worker.createAbsence(ctx, workerId, options);
await tx.rollback();
} catch (e) {
await tx.rollback();
error = e;
}
expect(error.message).toEqual(`Cannot add more than one '1/2 day vacation'`);
});
});