Merge branch 'dev' into 2481-campaign_filter
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
This commit is contained in:
commit
86025b88e3
|
@ -0,0 +1 @@
|
|||
UPDATE salix.ACL t SET t.principalId = 'salesAssistant' WHERE t.id = 234
|
|
@ -0,0 +1,4 @@
|
|||
ALTER TABLE `vn`.department
|
||||
ADD notificationEmail VARCHAR(150) null;
|
||||
|
||||
UPDATE vn.department t SET t.notificationEmail = 'direccioncomercial@verdnatura.es' WHERE t.id = 43
|
|
@ -42,8 +42,8 @@ INSERT INTO `vn`.`worker`(`id`,`code`, `firstName`, `lastName`, `userFk`, `bossF
|
|||
FROM `vn`.`user`;
|
||||
|
||||
UPDATE `vn`.`worker` SET bossFk = NULL WHERE id = 20;
|
||||
UPDATE `vn`.`worker` SET bossFk = 20
|
||||
WHERE id = 1 OR id = 9;
|
||||
UPDATE `vn`.`worker` SET bossFk = 20 WHERE id = 1 OR id = 9;
|
||||
UPDATE `vn`.`worker` SET bossFk = 19 WHERE id = 18;
|
||||
|
||||
DELETE FROM `vn`.`worker` WHERE firstName ='customer';
|
||||
|
||||
|
@ -1694,6 +1694,10 @@ UPDATE `postgresql`.`business_labour` bl
|
|||
SET bl.`professional_category_id` = 31
|
||||
WHERE p.`Id_trabajador` = 110;
|
||||
|
||||
UPDATE `postgresql`.`business_labour` bl
|
||||
SET bl.`department_id` = 43
|
||||
WHERE business_id IN(18, 19);
|
||||
|
||||
INSERT INTO `postgresql`.`media`(`media_id`, `media_type_id`, `value`, `sort`)
|
||||
VALUES
|
||||
(1, 10, 600123321, 0),
|
||||
|
|
|
@ -68,5 +68,7 @@
|
|||
"Incoterms is required for a non UEE member": "Incoterms is required for a non UEE member",
|
||||
"Client checked as validated despite of duplication": "Client checked as validated despite of duplication from client id {{clientId}}",
|
||||
"Landing cannot be lesser than shipment": "Landing cannot be lesser than shipment",
|
||||
"NOT_ZONE_WITH_THIS_PARAMETERS": "NOT_ZONE_WITH_THIS_PARAMETERS"
|
||||
"NOT_ZONE_WITH_THIS_PARAMETERS": "NOT_ZONE_WITH_THIS_PARAMETERS",
|
||||
"Created absence": "The worker <strong>{{author}}</strong> has added an absence of type '{{absenceType}}' to <a href='{{{workerUrl}}}'><strong>{{employee}}</strong></a> for day {{dated}}.",
|
||||
"Deleted absence": "The worker <strong>{{author}}</strong> has deleted an absence of type '{{absenceType}}' to <a href='{{{workerUrl}}}'><strong>{{employee}}</strong></a> for day {{dated}}."
|
||||
}
|
|
@ -143,5 +143,8 @@
|
|||
"Role name must be written in camelCase": "Role name must be written in camelCase",
|
||||
"can't be set": "can't be set",
|
||||
"Email already exists": "Email already exists",
|
||||
"User already exists": "User already exists"
|
||||
"User already exists": "User already exists",
|
||||
"Absence change notification on the labour calendar": "Notificacion de cambio de ausencia en el calendario laboral",
|
||||
"Created absence": "El empleado <strong>{{author}}</strong> ha añadido una ausencia de tipo '{{absenceType}}' a <a href='{{{workerUrl}}}'><strong>{{employee}}</strong></a> para el día {{dated}}.",
|
||||
"Deleted absence": "El empleado <strong>{{author}}</strong> ha eliminado una ausencia de tipo '{{absenceType}}' a <a href='{{{workerUrl}}}'><strong>{{employee}}</strong></a> del día {{dated}}."
|
||||
}
|
|
@ -186,10 +186,16 @@ module.exports = Self => {
|
|||
let payMethodWithIban = 4;
|
||||
|
||||
// Validate socialName format
|
||||
const socialNameChanged = orgData && changes
|
||||
&& orgData.socialName != changes.socialName;
|
||||
const hasChanges = orgData && changes;
|
||||
const socialName = changes.socialName || orgData.socialName;
|
||||
const isTaxDataChecked = hasChanges && (changes.isTaxDataChecked || orgData.isTaxDataChecked);
|
||||
|
||||
if (socialNameChanged && !isAlpha(changes.socialName))
|
||||
const socialNameChanged = hasChanges
|
||||
&& orgData.socialName != socialName;
|
||||
const dataCheckedChanged = hasChanges
|
||||
&& orgData.isTaxDataChecked != isTaxDataChecked;
|
||||
|
||||
if ((socialNameChanged || dataCheckedChanged) && !isAlpha(socialName))
|
||||
throw new UserError('The socialName has an invalid format');
|
||||
|
||||
if (changes.salesPerson === null) {
|
||||
|
|
|
@ -20,34 +20,33 @@ module.exports = Self => {
|
|||
});
|
||||
Self.getComponentsSum = async id => {
|
||||
const models = Self.app.models;
|
||||
let salesComponents = [];
|
||||
let componentsSum = [];
|
||||
let sales = await models.Sale.find({where: {ticketFk: id}});
|
||||
let components = await models.Component.find();
|
||||
if (sales.length > 0) {
|
||||
for (let sale of sales) {
|
||||
let myComponents = await models.SaleComponent.find({where: {saleFk: sale.id}});
|
||||
salesComponents = salesComponents.concat(myComponents);
|
||||
}
|
||||
|
||||
salesComponents.reduce((acumulator, currentValue) => {
|
||||
if (!acumulator[currentValue.componentFk]) {
|
||||
let defaultValue = 0;
|
||||
let tarjetComponent = components.find(component => component.id === currentValue.componentFk);
|
||||
|
||||
acumulator[currentValue.componentFk] = {
|
||||
componentFk: currentValue.componentFk,
|
||||
value: defaultValue,
|
||||
name: tarjetComponent.name
|
||||
};
|
||||
componentsSum.push(acumulator[currentValue.componentFk]);
|
||||
let sales = await models.Sale.find({
|
||||
include: {
|
||||
relation: 'components',
|
||||
scope: {fields: ['value', 'componentFk'],
|
||||
include: {
|
||||
relation: 'component',
|
||||
}
|
||||
}
|
||||
|
||||
acumulator[currentValue.componentFk].value += currentValue.value;
|
||||
|
||||
return acumulator;
|
||||
});
|
||||
},
|
||||
where: {ticketFk: id}
|
||||
});
|
||||
for (let sale of sales) {
|
||||
for (let component of sale.components()) {
|
||||
let componentId = componentsSum[component.componentFk];
|
||||
if (!componentId) {
|
||||
componentsSum[component.componentFk] = {
|
||||
componentFk: component.componentFk,
|
||||
value: 0,
|
||||
name: component.component().name
|
||||
};
|
||||
}
|
||||
componentsSum[component.componentFk].value += component.value * sale.quantity;
|
||||
}
|
||||
}
|
||||
return componentsSum;
|
||||
return componentsSum.filter(component => {
|
||||
return component != null;
|
||||
});
|
||||
};
|
||||
};
|
||||
|
|
|
@ -31,6 +31,7 @@ module.exports = Self => {
|
|||
|
||||
Self.createAbsence = async(ctx, id, absenceTypeId, dated) => {
|
||||
const models = Self.app.models;
|
||||
const $t = ctx.req.__; // $translate
|
||||
const userId = ctx.req.accessToken.userId;
|
||||
const isSubordinate = await models.Worker.isSubordinate(ctx, id);
|
||||
const isTeamBoss = await models.Account.hasRole(userId, 'teamBoss');
|
||||
|
@ -39,6 +40,7 @@ module.exports = Self => {
|
|||
throw new UserError(`You don't have enough privileges`);
|
||||
|
||||
const labour = await models.WorkerLabour.findOne({
|
||||
include: {relation: 'department'},
|
||||
where: {
|
||||
and: [
|
||||
{workerFk: id},
|
||||
|
@ -49,10 +51,42 @@ module.exports = Self => {
|
|||
}
|
||||
});
|
||||
|
||||
return models.Calendar.create({
|
||||
const absence = await models.Calendar.create({
|
||||
businessFk: labour.businessFk,
|
||||
dayOffTypeFk: absenceTypeId,
|
||||
dated: dated
|
||||
});
|
||||
|
||||
const department = labour.department();
|
||||
if (department && department.notificationEmail) {
|
||||
const absenceType = await models.AbsenceType.findById(absenceTypeId);
|
||||
const account = await models.Account.findById(userId);
|
||||
const subordinated = await models.Account.findById(id);
|
||||
const origin = ctx.req.headers.origin;
|
||||
const body = $t('Created absence', {
|
||||
author: account.nickname,
|
||||
employee: subordinated.nickname,
|
||||
absenceType: absenceType.name,
|
||||
dated: formatDate(dated),
|
||||
workerUrl: `${origin}/#!/worker/${id}/calendar`
|
||||
});
|
||||
await models.Mail.create({
|
||||
subject: $t('Absence change notification on the labour calendar'),
|
||||
body: body,
|
||||
sender: department.notificationEmail
|
||||
});
|
||||
}
|
||||
|
||||
return absence;
|
||||
};
|
||||
|
||||
function formatDate(date) {
|
||||
let day = date.getDate();
|
||||
if (day < 10) day = `0${day}`;
|
||||
let month = date.getMonth();
|
||||
if (month < 10) month = `0${month}`;
|
||||
let year = date.getFullYear();
|
||||
|
||||
return `${day}-${month}-${year}`;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -23,6 +23,7 @@ module.exports = Self => {
|
|||
|
||||
Self.deleteAbsence = async(ctx, id, absenceId) => {
|
||||
const models = Self.app.models;
|
||||
const $t = ctx.req.__; // $translate
|
||||
const userId = ctx.req.accessToken.userId;
|
||||
const isSubordinate = await models.Worker.isSubordinate(ctx, id);
|
||||
const isTeamBoss = await models.Account.hasRole(userId, 'teamBoss');
|
||||
|
@ -30,8 +31,46 @@ module.exports = Self => {
|
|||
if (!isSubordinate || (isSubordinate && userId == id && !isTeamBoss))
|
||||
throw new UserError(`You don't have enough privileges`);
|
||||
|
||||
const absence = await models.Calendar.findById(absenceId);
|
||||
const absence = await models.Calendar.findById(absenceId, {
|
||||
include: {
|
||||
relation: 'labour',
|
||||
scope: {
|
||||
include: {relation: 'department'}
|
||||
}
|
||||
}
|
||||
});
|
||||
const result = await absence.destroy();
|
||||
const labour = absence.labour();
|
||||
const department = labour && labour.department();
|
||||
if (department && department.notificationEmail) {
|
||||
const absenceType = await models.AbsenceType.findById(absence.dayOffTypeFk);
|
||||
const account = await models.Account.findById(userId);
|
||||
const subordinated = await models.Account.findById(labour.workerFk);
|
||||
const origin = ctx.req.headers.origin;
|
||||
const body = $t('Deleted absence', {
|
||||
author: account.nickname,
|
||||
employee: subordinated.nickname,
|
||||
absenceType: absenceType.name,
|
||||
dated: formatDate(absence.dated),
|
||||
workerUrl: `${origin}/#!/worker/${id}/calendar`
|
||||
});
|
||||
await models.Mail.create({
|
||||
subject: $t('Absence change notification on the labour calendar'),
|
||||
body: body,
|
||||
sender: department.notificationEmail
|
||||
});
|
||||
}
|
||||
|
||||
return absence.destroy();
|
||||
return result;
|
||||
};
|
||||
|
||||
function formatDate(date) {
|
||||
let day = date.getDate();
|
||||
if (day < 10) day = `0${day}`;
|
||||
let month = date.getMonth();
|
||||
if (month < 10) month = `0${month}`;
|
||||
let year = date.getFullYear();
|
||||
|
||||
return `${day}-${month}-${year}`;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
const LoopBackContext = require('loopback-context');
|
||||
|
||||
describe('Worker createAbsence()', () => {
|
||||
const workerId = 106;
|
||||
const workerId = 18;
|
||||
let createdAbsence;
|
||||
|
||||
afterAll(async() => {
|
||||
|
@ -10,7 +11,7 @@ describe('Worker createAbsence()', () => {
|
|||
});
|
||||
|
||||
it('should return an error for a user without enough privileges', async() => {
|
||||
const ctx = {req: {accessToken: {userId: 106}}};
|
||||
const ctx = {req: {accessToken: {userId: 18}}};
|
||||
const absenceTypeId = 1;
|
||||
const dated = new Date();
|
||||
|
||||
|
@ -25,12 +26,23 @@ describe('Worker createAbsence()', () => {
|
|||
});
|
||||
|
||||
it('should create a new absence', async() => {
|
||||
const ctx = {req: {accessToken: {userId: 37}}};
|
||||
const activeCtx = {
|
||||
accessToken: {userId: 19},
|
||||
headers: {origin: 'http://localhost'}
|
||||
};
|
||||
const ctx = {req: activeCtx};
|
||||
ctx.req.__ = value => {
|
||||
return value;
|
||||
};
|
||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||
active: activeCtx
|
||||
});
|
||||
|
||||
const absenceTypeId = 1;
|
||||
const dated = new Date();
|
||||
createdAbsence = await app.models.Worker.createAbsence(ctx, workerId, absenceTypeId, dated);
|
||||
|
||||
const expectedBusinessId = 106;
|
||||
const expectedBusinessId = 18;
|
||||
const expectedAbsenceTypeId = 1;
|
||||
|
||||
expect(createdAbsence.businessFk).toEqual(expectedBusinessId);
|
||||
|
|
|
@ -1,12 +1,25 @@
|
|||
const app = require('vn-loopback/server/server');
|
||||
const LoopBackContext = require('loopback-context');
|
||||
|
||||
describe('Worker deleteAbsence()', () => {
|
||||
const workerId = 106;
|
||||
const workerId = 18;
|
||||
let createdAbsence;
|
||||
const activeCtx = {
|
||||
accessToken: {userId: 19},
|
||||
headers: {origin: 'http://localhost'}
|
||||
};
|
||||
const ctx = {req: activeCtx};
|
||||
ctx.req.__ = value => {
|
||||
return value;
|
||||
};
|
||||
|
||||
it('should return an error for a user without enough privileges', async() => {
|
||||
const ctx = {req: {accessToken: {userId: 106}}};
|
||||
const businessId = 106;
|
||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||
active: activeCtx
|
||||
});
|
||||
|
||||
activeCtx.accessToken.userId = 106;
|
||||
const businessId = 18;
|
||||
createdAbsence = await app.models.Calendar.create({
|
||||
businessFk: businessId,
|
||||
dayOffTypeFk: 1,
|
||||
|
@ -14,7 +27,7 @@ describe('Worker deleteAbsence()', () => {
|
|||
});
|
||||
|
||||
let error;
|
||||
await app.models.Worker.deleteAbsence(ctx, workerId, createdAbsence.id).catch(e => {
|
||||
await app.models.Worker.deleteAbsence(ctx, 18, createdAbsence.id).catch(e => {
|
||||
error = e;
|
||||
}).finally(() => {
|
||||
expect(error.message).toEqual(`You don't have enough privileges`);
|
||||
|
@ -24,8 +37,12 @@ describe('Worker deleteAbsence()', () => {
|
|||
});
|
||||
|
||||
it('should create a new absence', async() => {
|
||||
const ctx = {req: {accessToken: {userId: 37}}};
|
||||
const businessId = 106;
|
||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||
active: activeCtx
|
||||
});
|
||||
|
||||
activeCtx.accessToken.userId = 19;
|
||||
const businessId = 18;
|
||||
|
||||
expect(createdAbsence.businessFk).toEqual(businessId);
|
||||
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
{
|
||||
"name": "Calendar",
|
||||
"base": "VnModel",
|
||||
"base": "Loggable",
|
||||
"log": {
|
||||
"model": "WorkerLog",
|
||||
"relation": "labour"
|
||||
},
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "calendar"
|
||||
|
@ -23,6 +27,11 @@
|
|||
"type": "belongsTo",
|
||||
"model": "AbsenceType",
|
||||
"foreignKey": "dayOffTypeFk"
|
||||
},
|
||||
"labour": {
|
||||
"type": "belongsTo",
|
||||
"model": "WorkerLabour",
|
||||
"foreignKey": "businessFk"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
},
|
||||
"chatName": {
|
||||
"type": "String"
|
||||
},
|
||||
"notificationEmail": {
|
||||
"type": "String"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -63,7 +63,7 @@
|
|||
"state": "worker.card.workerLog",
|
||||
"component": "vn-worker-log",
|
||||
"description": "Log",
|
||||
"acl": ["hr"]
|
||||
"acl": ["salesAssistant"]
|
||||
}, {
|
||||
"url": "/pbx",
|
||||
"state": "worker.card.pbx",
|
||||
|
|
Loading…
Reference in New Issue