diff --git a/db/changes/10200-normality/01-calendar_employee.sql b/db/changes/10200-normality/01-calendar_employee.sql
new file mode 100644
index 000000000..c5db9da2c
--- /dev/null
+++ b/db/changes/10200-normality/01-calendar_employee.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `postgresql`.`calendar_employee`
+ADD COLUMN `id` INT NULL AUTO_INCREMENT FIRST,
+ADD UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE,
+ADD INDEX `id_index` (`id` ASC) VISIBLE;
+;
diff --git a/db/changes/10200-normality/00-workerCalendar.sql b/db/changes/10200-normality/02-workerCalendar.sql
similarity index 92%
rename from db/changes/10200-normality/00-workerCalendar.sql
rename to db/changes/10200-normality/02-workerCalendar.sql
index 04b30394f..479470ac0 100644
--- a/db/changes/10200-normality/00-workerCalendar.sql
+++ b/db/changes/10200-normality/02-workerCalendar.sql
@@ -5,6 +5,7 @@ CREATE
SQL SECURITY DEFINER
VIEW `workerCalendar2` AS
SELECT
+ `ce`.`id` AS `id`,
`ce`.`business_id` AS `businessFk`,
`ce`.`calendar_state_id` AS `absenceTypeFk`,
`ce`.`date` AS `dated`
diff --git a/front/core/components/calendar/index.js b/front/core/components/calendar/index.js
index 96bc435db..02d2a4798 100644
--- a/front/core/components/calendar/index.js
+++ b/front/core/components/calendar/index.js
@@ -135,7 +135,7 @@ export default class Calendar extends FormInput {
$days: [day],
$type: 'day'
});
- this.repaint();
+ // this.repaint();
}
/*
diff --git a/modules/worker/back/methods/worker/createAbsence.js b/modules/worker/back/methods/worker/createAbsence.js
new file mode 100644
index 000000000..3f15b19c1
--- /dev/null
+++ b/modules/worker/back/methods/worker/createAbsence.js
@@ -0,0 +1,56 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('createAbsence', {
+ description: 'Returns an array of absences from an specified worker',
+ accepts: [{
+ arg: 'id',
+ type: 'Number',
+ description: 'The worker id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'absenceTypeId',
+ type: 'Number',
+ required: true
+ },
+ {
+ arg: 'dated',
+ type: 'Date',
+ required: false
+ }],
+ returns: {
+ type: 'Object',
+ root: true
+ },
+ http: {
+ path: `/:id/createAbsence`,
+ verb: 'POST'
+ }
+ });
+
+ Self.createAbsence = async(ctx, id, absenceTypeId, dated) => {
+ const models = Self.app.models;
+ const isSubordinate = await models.Worker.isSubordinate(ctx, id);
+
+ if (!isSubordinate)
+ throw new UserError(`You don't have enough privileges`);
+
+ const labour = await models.WorkerLabour.findOne({
+ where: {
+ and: [
+ {workerFk: id},
+ {or: [{
+ ended: {gte: [dated]}
+ }, {ended: null}]}
+ ]
+ }
+ });
+
+ return models.WorkerCalendar.create({
+ businessFk: labour.businessFk,
+ absenceTypeFk: absenceTypeId,
+ dated: dated
+ });
+ };
+};
diff --git a/modules/worker/back/methods/worker/createAbsences.js b/modules/worker/back/methods/worker/createAbsences.js
deleted file mode 100644
index e744d4796..000000000
--- a/modules/worker/back/methods/worker/createAbsences.js
+++ /dev/null
@@ -1,101 +0,0 @@
-const UserError = require('vn-loopback/util/user-error');
-
-module.exports = Self => {
- Self.remoteMethodCtx('createAbsences', {
- description: 'Returns an array of absences from an specified worker',
- accepts: [{
- arg: 'id',
- type: 'Number',
- description: 'The worker id',
- http: {source: 'path'}
- },
- {
- arg: 'absenceTypeId',
- type: 'Number',
- required: true
- },
- {
- arg: 'dated',
- type: 'Date',
- required: false
- },
- {
- arg: 'started',
- type: 'Date',
- required: false
- },
- {
- arg: 'ended',
- type: 'Date',
- required: false
- },
- {
- arg: 'type',
- type: 'String',
- required: true
- }],
- returns: 'Object',
- http: {
- path: `/:id/createAbsences`,
- verb: 'POST'
- }
- });
-
- Self.createAbsences = async(ctx, id, absenceTypeId, dated, started, ended, type) => {
- const models = Self.app.models;
- const isSubordinate = await models.Worker.isSubordinate(ctx, id);
-
- if (!isSubordinate)
- throw new UserError(`You don't have enough privileges`);
-
- const absences = [];
-
- if (type == 'day') {
- const contracts = await models.WorkerLabour.find({
- where: {
- and: [
- {workerFk: id},
- {or: [{
- ended: {gte: [yearStarted]}
- }, {ended: null}]}
- ]
- }
- });
-
- absences.push({
- businessFk: 106,
- absenceTypeFk: absenceTypeId,
- dated: dated
- });
- } else if (type == 'range')
- console.log(true);
-
- return models.WorkerCalendar.create(absences);
- };
-};
-
-/* include: [{
- relation: 'holidays',
- scope: {
- where: {year}
- }
-},
-{
- relation: 'workCenter',
- scope: {
- include: {
- relation: 'holidays',
- scope: {
- include: [{
- relation: 'detail'
- },
- {
- relation: 'type'
- }],
- where: {
- dated: {between: [yearStarted, yearEnded]}
- }
- }
- }
- }
-}], */
diff --git a/modules/worker/back/methods/worker/deleteAbsence.js b/modules/worker/back/methods/worker/deleteAbsence.js
new file mode 100644
index 000000000..a5bdd2014
--- /dev/null
+++ b/modules/worker/back/methods/worker/deleteAbsence.js
@@ -0,0 +1,35 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('deleteAbsence', {
+ description: 'Returns an array of absences from an specified worker',
+ accepts: [{
+ arg: 'id',
+ type: 'Number',
+ description: 'The worker id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'absenceId',
+ type: 'Number',
+ required: true
+ }],
+ returns: 'Object',
+ http: {
+ path: `/:id/deleteAbsence`,
+ verb: 'DELETE'
+ }
+ });
+
+ Self.deleteAbsence = async(ctx, id, absenceId) => {
+ const models = Self.app.models;
+ const isSubordinate = await models.Worker.isSubordinate(ctx, id);
+
+ if (!isSubordinate)
+ throw new UserError(`You don't have enough privileges`);
+
+ const absence = await models.WorkerCalendar.findById(absenceId);
+
+ return absence.destroy();
+ };
+};
diff --git a/modules/worker/back/methods/worker/updateAbsence.js b/modules/worker/back/methods/worker/updateAbsence.js
new file mode 100644
index 000000000..e129d228f
--- /dev/null
+++ b/modules/worker/back/methods/worker/updateAbsence.js
@@ -0,0 +1,40 @@
+const UserError = require('vn-loopback/util/user-error');
+
+module.exports = Self => {
+ Self.remoteMethodCtx('updateAbsence', {
+ description: 'Returns an array of absences from an specified worker',
+ accepts: [{
+ arg: 'id',
+ type: 'Number',
+ description: 'The worker id',
+ http: {source: 'path'}
+ },
+ {
+ arg: 'absenceId',
+ type: 'Number',
+ required: true
+ },
+ {
+ arg: 'absenceTypeId',
+ type: 'Number',
+ required: true
+ }],
+ returns: 'Object',
+ http: {
+ path: `/:id/updateAbsence`,
+ verb: 'PATCH'
+ }
+ });
+
+ Self.updateAbsence = async(ctx, id, absenceId, absenceTypeId) => {
+ const models = Self.app.models;
+ const isSubordinate = await models.Worker.isSubordinate(ctx, id);
+
+ if (!isSubordinate)
+ throw new UserError(`You don't have enough privileges`);
+
+ const absence = await models.WorkerCalendar.findById(absenceId);
+
+ return absence.updateAttribute('absenceTypeFk', absenceTypeId);
+ };
+};
diff --git a/modules/worker/back/models/worker-calendar.json b/modules/worker/back/models/worker-calendar.json
index 109b93c77..ca802caa7 100644
--- a/modules/worker/back/models/worker-calendar.json
+++ b/modules/worker/back/models/worker-calendar.json
@@ -7,12 +7,14 @@
}
},
"properties": {
+ "id": {
+ "id": true,
+ "type": "Number"
+ },
"businessFk": {
- "id": 1,
"type": "Number"
},
"dated": {
- "id": 3,
"type": "Date"
}
},
diff --git a/modules/worker/back/models/worker.js b/modules/worker/back/models/worker.js
index 5f97c3e10..0d94c788e 100644
--- a/modules/worker/back/models/worker.js
+++ b/modules/worker/back/models/worker.js
@@ -4,5 +4,7 @@ module.exports = Self => {
require('../methods/worker/isSubordinate')(Self);
require('../methods/worker/getWorkedHours')(Self);
require('../methods/worker/uploadFile')(Self);
- require('../methods/worker/createAbsences')(Self);
+ require('../methods/worker/createAbsence')(Self);
+ require('../methods/worker/deleteAbsence')(Self);
+ require('../methods/worker/updateAbsence')(Self);
};
diff --git a/modules/worker/front/calendar/index.html b/modules/worker/front/calendar/index.html
index 859da81b5..b77366328 100644
--- a/modules/worker/front/calendar/index.html
+++ b/modules/worker/front/calendar/index.html
@@ -13,7 +13,7 @@
display-controls="false"
hide-contiguous="true"
hide-year="true"
- on-selection="$ctrl.onSelection($days, $type, $weekday)">
+ on-selection="$ctrl.onSelection($days)">
@@ -38,61 +38,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
{
- this.selected = null;
- this.isNew = null;
+ const path = `Workers/${this.$params.id}/createAbsence`;
+ this.$http.post(path, params).then(res => {
+ this.responseHandler(() => {
+ const newEvent = res.data;
+ this.events[dated.getTime()] = {
+ name: absenceType.name,
+ color: absenceType.rgb,
+ type: absenceType.code,
+ absenceId: newEvent.id
+ };
this.refresh();
});
+ });
+ }
+
+ edit(event) {
+ const absenceType = this.absenceType;
+ const params = {
+ absenceId: event.absenceId,
+ absenceTypeId: absenceType.id
+ };
+ const path = `Workers/${this.$params.id}/updateAbsence`;
+ this.$http.patch(path, params).then(
+ this.responseHandler(() => {
+ event.color = absenceType.rgb;
+ event.name = absenceType.name;
+ event.code = absenceType.code;
+ this.refresh();
+ })
+ );
+ }
+
+ delete(day, event) {
+ const params = {absenceId: event.absenceId};
+ const path = `Workers/${this.$params.id}/deleteAbsence`;
+ this.$http.delete(path, {params}).then(
+ this.responseHandler(() => {
+ delete this.events[day.getTime()];
+ this.refresh();
+ })
+ );
+ }
+
+ responseHandler(cb) {
+ if (this.repaintCanceller) {
+ clearTimeout(this.repaintCanceller);
+ this.repaintCanceller = null;
}
- case 'delete':
- return this.onDelete(this.selected.id)
- .then(response => response == 'accept');
- }
+
+ this.repaintCanceller = setTimeout(
+ () => cb(), 650);
}
refresh() {