diff --git a/.eslintrc.yml b/.eslintrc.yml
index fc8c9fb1c..022c3d6fa 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -19,4 +19,4 @@ rules:
no-eq-null: 0
no-console: 0
no-warning-comments: 0
- no-empty: 0
+ no-empty: [error, allowEmptyCatch: true]
diff --git a/client/client/src/address-edit/address-edit.html b/client/client/src/address-edit/address-edit.html
index f703c3803..e846eadfe 100644
--- a/client/client/src/address-edit/address-edit.html
+++ b/client/client/src/address-edit/address-edit.html
@@ -77,7 +77,7 @@
margin-medium-left
orange
icon="add_circle"
- ng-if = "observation.showAddIcon"
+ ng-if = "observation.showAddIcon && observationsTypes.model.length > $ctrl.observations.length"
ng-click="$ctrl.addObservation()"
>
diff --git a/client/client/src/address-edit/address-edit.js b/client/client/src/address-edit/address-edit.js
index 8d7a56994..90009cbe8 100644
--- a/client/client/src/address-edit/address-edit.js
+++ b/client/client/src/address-edit/address-edit.js
@@ -13,7 +13,7 @@ export default class Controller {
id: parseInt($state.params.addressId)
};
this.observations = [];
- this.observationsDictionary = {};
+ this.observationsOld = {};
this.observationsRemoved = [];
}
@@ -60,11 +60,16 @@ export default class Controller {
return this.$http.post(`/client/api/AddressObservations/crudAddressObservations`, objectObservations);
}
+ _observationsEquals(ob1, ob2) {
+ return ob1.observationTypeFk === ob2.observationTypeFk && ob1.description === ob2.description;
+ }
+
submit() {
this._unsetDirtyForm();
let submitWatcher = this.$scope.watcher.dataChanged();
let submitObservations;
let repeatedTypes = false;
+ let types = [];
let observationsObj = {
delete: this.observationsRemoved,
create: [],
@@ -73,31 +78,27 @@ export default class Controller {
for (let i = 0; i < this.observations.length; i++) {
let observation = this.observations[i];
- // only one observation is allowed for each of its types
- if (this.observationsDictionary[observation.observationTypeFk] !== undefined && // IF the dictionary contains the type
- (
- // AND (is a new Observation OR is old but with distinct Id) --> repeated
- !observation.id || (observation.id && this.observationsDictionary[observation.observationTypeFk].id !== observation.id)
- )
- ) {
+ let isNewObservation = observation.id === undefined;
+
+ if (types.indexOf(observation.observationTypeFk) !== -1) {
repeatedTypes = true;
break;
}
- if (!observation.id && observation.observationTypeFk && observation.description) {
+ types.push(observation.observationTypeFk);
+
+ if (isNewObservation && observation.observationTypeFk && observation.description) {
observationsObj.create.push(observation);
- } else if (observation.id && this.observationsDictionary[observation.observationTypeFk].description !== observation.description) {
+ } else if (!isNewObservation && !this._observationsEquals(this.observationsOld[observation.id], observation)) {
observationsObj.update.push(observation);
}
-
- this.observationsDictionary[observation.observationTypeFk] = observation;
}
submitObservations = observationsObj.update.length > 0 || observationsObj.create.length > 0 || observationsObj.delete.length > 0;
if (repeatedTypes) {
this.vnApp.showMessage(
- this.$translate.instant('you can not repeat the types of observations')
+ this.$translate.instant('The observation type must be unique')
);
} else if (submitWatcher && !submitObservations) {
this.$scope.watcher.submit().then(() => {
@@ -126,7 +127,7 @@ export default class Controller {
this.$http.get(`/client/api/AddressObservations?filter=${JSON.stringify(filter)}`).then(res => {
this.observations = res.data;
res.data.forEach(item => {
- this.observationsDictionary[item.observationTypeFk] = Object.assign({}, item);
+ this.observationsOld[item.id] = Object.assign({}, item);
});
});
}
diff --git a/client/client/src/address-edit/locale/es.yml b/client/client/src/address-edit/locale/es.yml
index aad6a3c87..78f236039 100644
--- a/client/client/src/address-edit/locale/es.yml
+++ b/client/client/src/address-edit/locale/es.yml
@@ -1,2 +1,5 @@
Enabled: Activo
-Is equalizated: Recargo de equivalencia
\ No newline at end of file
+Is equalizated: Recargo de equivalencia
+Observation type: Tipo de observación
+Description: Descripción
+The observation type must be unique: El tipo de observación ha de ser único
\ No newline at end of file
diff --git a/client/item/src/history/item-history.html b/client/item/src/history/item-history.html
index 1a5a65483..fe1c1faf7 100644
--- a/client/item/src/history/item-history.html
+++ b/client/item/src/history/item-history.html
@@ -1,5 +1,4 @@
-
-
+
Item history
@@ -22,12 +21,10 @@
{{::itemLog.description}}
- No results
-
diff --git a/gulpfile.js b/gulpfile.js
index 327a51579..28f1e37f6 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,16 +1,12 @@
require('require-yaml');
const gulp = require('gulp');
const gutil = require('gulp-util');
-const wrap = require('gulp-wrap');
-const concat = require('gulp-concat');
-const merge = require('merge-stream');
const print = require('gulp-print');
const runSequence = require('run-sequence');
const fs = require('fs-extra');
const webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const exec = require('child_process').exec;
-const path = require('path');
// Configuration
@@ -81,9 +77,17 @@ gulp.task('e2e-run', () => {
gulp.task('clean', () => {
const del = require('del');
- return del([`${buildDir}/*`, `!${buildDir}/templates`, `!${buildDir}/images`], {force: true});
+ const files = [
+ `${buildDir}/*`,
+ `!${buildDir}/templates`,
+ `!${buildDir}/images`,
+ `docker-compose.yml`
+ ];
+ return del(files, {force: true});
});
+gulp.task('i', ['install']);
+
gulp.task('install', () => {
const install = require('gulp-install');
let jsonFile = [];
@@ -101,9 +105,6 @@ gulp.task('install', () => {
}));
});
-// Gulp install alias
-gulp.task('i', ['install']);
-
// Deployment
gulp.task('build', ['clean'], () => {
@@ -111,9 +112,8 @@ gulp.task('build', ['clean'], () => {
});
gulp.task('docker-compose', async () => {
- let compose = await fs.readFile('./docker-compose.tpl.yml', 'utf8');
-
const yaml = require('js-yaml');
+ let compose = await fs.readFile('./docker-compose.tpl.yml', 'utf8');
let composeYml = yaml.safeLoad(compose);
let services = await getServices();
@@ -181,7 +181,7 @@ gulp.task('nginx-stop', ['nginx-conf'], async () => {
return new Promise((resolve, reject) => {
exec(command, err => {
- if (err) return reject(err);
+ if (err && err.code != 1) return reject(err);
resolve();
});
});
@@ -191,6 +191,9 @@ gulp.task('nginx-stop', ['nginx-conf'], async () => {
gulp.task('nginx-conf', async () => {
const mustache = require('mustache');
+ if (!await fs.exists(nginxTemp))
+ await fs.mkdir(nginxTemp);
+
let params = {
services: await getServices(),
defaultService: defaultService,
@@ -208,19 +211,16 @@ gulp.task('nginx-conf', async () => {
let template = await fs.readFile(confFile, 'utf8');
let nginxConf = mustache.render(template, params);
- await fs.writeFile(`${nginxDir}/temp/nginx.conf`, nginxConf);
+ await fs.writeFile(`${nginxTemp}/nginx.conf`, nginxConf);
});
gulp.task('nginx-clean', () => {
const del = require('del');
- return del([`${nginxDir}/temp/*`], {force: true});
+ return del([`${nginxTemp}/*`], {force: true});
});
-let services;
-
async function getServices() {
- if (services) return services;
-
+ let services;
let startPort = defaultPort + 1;
services = [];
@@ -286,11 +286,13 @@ gulp.task('webpack-dev-server', function() {
// Locale
-let localeFiles = `${srcDir}/**/locale/*.json`;
+let localeFiles = `${srcDir}/**/locale/*.yml`;
gulp.task('locales', function() {
const extend = require('gulp-extend');
const yaml = require('gulp-yaml');
+ const merge = require('merge-stream');
+
let streams = [];
for (let mod in modules)
@@ -310,6 +312,9 @@ gulp.task('locales', function() {
let routeFiles = `${srcDir}/**/routes.json`;
gulp.task('routes', function() {
+ const concat = require('gulp-concat');
+ const wrap = require('gulp-wrap');
+
return gulp.src(routeFiles)
.pipe(concat('routes.js', {newLine: ','}))
.pipe(wrap('var routes = [<%=contents%>\n];'))
diff --git a/package-lock.json b/package-lock.json
index e10725348..dec836866 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -113,7 +113,7 @@
"angular": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/angular/-/angular-1.6.8.tgz",
- "integrity": "sha1-W+N4pYvpGlSJ54tZxFGM2f0nP/s="
+ "integrity": "sha512-9WErZIOw1Cu1V5Yxdvxz/6YpND8ntdP71fdPpufPFJvZodZXqCjQBYrHqEoMZreO5i84O3D/Jw/vepoFt68Azw=="
},
"angular-cookies": {
"version": "1.6.4",
@@ -1119,7 +1119,7 @@
"bluebird": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=",
+ "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
"dev": true
},
"bn.js": {
@@ -9909,7 +9909,7 @@
"jasmine-spec-reporter": {
"version": "4.2.1",
"resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz",
- "integrity": "sha1-HWMq7ANBZwrTJPkrqEtLMrNeniI=",
+ "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==",
"dev": true,
"requires": {
"colors": "1.1.2"
@@ -10051,7 +10051,7 @@
"karma": {
"version": "1.7.1",
"resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz",
- "integrity": "sha1-hcwI6eCiLXzpzKN8ShvoJPaisa4=",
+ "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==",
"dev": true,
"requires": {
"bluebird": "3.5.1",
@@ -10103,7 +10103,7 @@
"karma-chrome-launcher": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz",
- "integrity": "sha1-zxudBxNswY/iOTJ9JGVMPbw2is8=",
+ "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==",
"dev": true,
"requires": {
"fs-access": "1.0.1",
@@ -10113,7 +10113,7 @@
"karma-firefox-launcher": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz",
- "integrity": "sha1-LEcDBFLwRTHrfRPU/HZpYwu5Mzk=",
+ "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==",
"dev": true
},
"karma-jasmine": {
@@ -10134,7 +10134,7 @@
"karma-webpack": {
"version": "2.0.9",
"resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.9.tgz",
- "integrity": "sha1-YciAkffdkQY1E0wDKyZqRlr/tX8=",
+ "integrity": "sha512-F1j3IG/XhiMzcunAXbWXH95uizjzr3WdTzmVWlta8xqxcCtAu9FByCb4sccIMxaVFAefpgnUW9KlCo0oLvIX6A==",
"dev": true,
"requires": {
"async": "0.9.2",
@@ -14654,7 +14654,7 @@
"useragent": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz",
- "integrity": "sha1-IX+UOtVAyyEoZYqyP8lg9qiMmXI=",
+ "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==",
"dev": true,
"requires": {
"lru-cache": "4.1.1",
diff --git a/services/db/00-trucateAll.sql b/services/db/00-trucateAll.sql
new file mode 100644
index 000000000..f7d98056c
--- /dev/null
+++ b/services/db/00-trucateAll.sql
@@ -0,0 +1,38 @@
+DROP PROCEDURE IF EXISTS mysql.truncateAll;
+DELIMITER $$
+CREATE PROCEDURE mysql.truncateAll()
+BEGIN
+ DECLARE vSchema VARCHAR(255);
+ DECLARE vTable VARCHAR(255);
+ DECLARE vDone BOOL;
+
+ DECLARE cTables CURSOR FOR
+ SELECT `TABLE_SCHEMA`, `TABLE_NAME`
+ FROM `information_schema`.`TABLES`
+ WHERE `TABLE_TYPE` = 'BASE TABLE'
+ AND `TABLE_ROWS` > 0
+ AND `TABLE_SCHEMA` NOT IN ('information_schema', 'mysql', 'performance_schema');
+
+ DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+ SET FOREIGN_KEY_CHECKS = FALSE;
+ OPEN cTables;
+
+ l: LOOP
+ SET vDone = FALSE;
+ FETCH cTables INTO vSchema, vTable;
+
+ IF vDone THEN
+ LEAVE l;
+ END IF;
+
+ SET @stmt = CONCAT('TRUNCATE TABLE `', vSchema, '`.`', vTable, '`');
+ PREPARE stmt FROM @stmt;
+ EXECUTE stmt;
+ DEALLOCATE PREPARE stmt;
+ END LOOP;
+
+ CLOSE cTables;
+ SET FOREIGN_KEY_CHECKS = TRUE;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/services/db/02-fixtures.sql b/services/db/02-fixtures.sql
index 9cf4deeec..d6bd1acae 100644
--- a/services/db/02-fixtures.sql
+++ b/services/db/02-fixtures.sql
@@ -390,16 +390,16 @@ INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city
INSERT INTO `salix`.`Address`(`id`, `consignee`, `street`, `city`, `postcode`, `provinceFk`, `phone`, `mobile`, `isEnabled`, `isDefaultAddress`, `clientFk`, `defaultAgencyFk`, `longitude`, `latitude`, `isEqualizated`)
VALUES
- (1, 'Bruce Wayne', 'The Bat cave', 'Silla', 46460, 1, NULL, NULL, 1, 1, 1, 2, NULL, NULL, 0),
- (2, 'Petter Parker', 'NY roofs', 'Silla', 46460, 1, NULL, NULL, 1, 1, 2, 2, NULL, NULL, 0),
- (3, 'Clark Kenn', 'The phone box', 'Silla', 46460, 1, NULL, NULL, 1, 1, 3, 2, NULL, NULL, 0),
- (4, 'Tony Stark', 'Stark tower', 'Silla', 46460, 1, NULL, NULL, 1, 1, 4, 2, NULL, NULL, 0),
- (5, 'Max Eisenhardt', 'The plastic cell', 'Silla', 46460, 1, NULL, NULL, 1, 1, 5, 2, NULL, NULL, 0),
- (6, 'David Charles Haller', 'Many places', 'Silla', 46460, 1, NULL, NULL, 1, 1, 6, 2, NULL, NULL, 0),
- (7, 'Hank Pym', 'Your pocket', 'Silla', 46460, 1, NULL, NULL, 1, 1, 7, 2, NULL, NULL, 0),
- (8, 'Charles Xavier', 'Cerebro', 'Silla', 46460, 1, NULL, NULL, 1, 1, 8, 2, NULL, NULL, 0),
- (9, 'Bruce Banner', 'Somewhere in Thailand', 'Silla', 46460, 1, NULL, NULL, 1, 1, 9, 2, NULL, NULL, 0),
- (10,'Jessica Jones', 'Luke Cages Bar', 'Silla', 46460, 1, NULL, NULL, 1, 1, 10, 2, NULL, NULL, 0);
+ (101, 'Bruce Wayne', 'The Bat cave', 'Silla', 46460, 1, NULL, NULL, 1, 1, 1, 2, NULL, NULL, 0),
+ (102, 'Petter Parker', 'NY roofs', 'Silla', 46460, 1, NULL, NULL, 1, 1, 2, 2, NULL, NULL, 0),
+ (103, 'Clark Kenn', 'The phone box', 'Silla', 46460, 1, NULL, NULL, 1, 1, 3, 2, NULL, NULL, 0),
+ (104, 'Tony Stark', 'Stark tower', 'Silla', 46460, 1, NULL, NULL, 1, 1, 4, 2, NULL, NULL, 0),
+ (105, 'Max Eisenhardt', 'The plastic cell', 'Silla', 46460, 1, NULL, NULL, 1, 1, 5, 2, NULL, NULL, 0),
+ (106, 'David Charles Haller', 'Many places', 'Silla', 46460, 1, NULL, NULL, 1, 1, 6, 2, NULL, NULL, 0),
+ (107, 'Hank Pym', 'Your pocket', 'Silla', 46460, 1, NULL, NULL, 1, 1, 7, 2, NULL, NULL, 0),
+ (108, 'Charles Xavier', 'Cerebro', 'Silla', 46460, 1, NULL, NULL, 1, 1, 8, 2, NULL, NULL, 0),
+ (109, 'Bruce Banner', 'Somewhere in Thailand', 'Silla', 46460, 1, NULL, NULL, 1, 1, 9, 2, NULL, NULL, 0),
+ (1010,'Jessica Jones', 'Luke Cages Bar', 'Silla', 46460, 1, NULL, NULL, 1, 1, 10, 2, NULL, NULL, 0);
INSERT INTO `salix`.`ClientCredit`(`id`, `clientFk`, `employeeFk`, `amount`, `created`)
VALUES
diff --git a/services/db/changes/1.0.0/01-agencyMode.sql b/services/db/changes/1.0.0/01-agencyMode.sql
new file mode 100644
index 000000000..5190821c5
--- /dev/null
+++ b/services/db/changes/1.0.0/01-agencyMode.sql
@@ -0,0 +1,25 @@
+CREATE OR REPLACE
+ ALGORITHM = UNDEFINED
+ DEFINER = `root`@`%`
+ SQL SECURITY DEFINER
+VIEW `vn`.`agencyMode` AS
+ SELECT
+ `a`.`Id_Agencia` AS `id`,
+ `a`.`Agencia` AS `name`,
+ `a`.`description` AS `description`,
+ `a`.`Vista` AS `deliveryMethodFk`,
+ `a`.`Vista` AS `__deliveryMethod`,
+ `a`.`Vista` AS `__view`,
+ `a`.`m3` AS `m3`,
+ `a`.`cod71` AS `cod71`,
+ `a`.`web` AS `web`,
+ `a`.`agency_id` AS `agencyFk`,
+ `a`.`agency_id` AS `__agency`,
+ `a`.`agency_service_id` AS `agencyServiceFk`,
+ `a`.`agency_service_id` AS `__agencyService`,
+ `a`.`inflacion` AS `inflation`,
+ `a`.`inflacion` AS `__inflacion`,
+ `a`.`is_volumetric` AS `isVolumetric`,
+ `a`.`send_mail` AS `reportMail`
+ FROM
+ `vn2008`.`Agencias` `a`
\ No newline at end of file
diff --git a/services/db/changes/1.0.0/02-agencyHour.sql b/services/db/changes/1.0.0/02-agencyHour.sql
new file mode 100644
index 000000000..1c3a743f6
--- /dev/null
+++ b/services/db/changes/1.0.0/02-agencyHour.sql
@@ -0,0 +1,18 @@
+CREATE OR REPLACE
+ ALGORITHM = UNDEFINED
+ DEFINER = `root`@`%`
+ SQL SECURITY DEFINER
+VIEW `vn`.`agencyHour` AS
+ SELECT
+ `h`.`agency_hour_id` AS `id`,
+ `h`.`agency_id` AS `agencyFk`,
+ `h`.`agency_id` AS `__agency`,
+ `h`.`week_day` AS `weekDay`,
+ `h`.`warehouse_id` AS `warehouseFk`,
+ `h`.`warehouse_id` AS `__warehouse`,
+ `h`.`province_id` AS `provinceFk`,
+ `h`.`province_id` AS `__province`,
+ `h`.`subtract_day` AS `substractDay`,
+ `h`.`max_hour` AS `maxHour`
+ FROM
+ `vn2008`.`agency_hour` `h`
\ No newline at end of file
diff --git a/services/db/changes/1.0.0/03-address.sql b/services/db/changes/1.0.0/03-address.sql
new file mode 100644
index 000000000..bdd27136c
--- /dev/null
+++ b/services/db/changes/1.0.0/03-address.sql
@@ -0,0 +1,24 @@
+CREATE OR REPLACE
+ ALGORITHM = UNDEFINED
+ DEFINER = `root`@`%`
+ SQL SECURITY DEFINER
+VIEW `vn`.`address` AS
+ SELECT
+ `t`.`id_consigna` AS `id`,
+ `t`.`Id_cliente` AS `clientFk`,
+ `t`.`domicilio` AS `street`,
+ `t`.`poblacion` AS `city`,
+ `t`.`codPostal` AS `postalCode`,
+ `t`.`province_id` AS `provinceFk`,
+ `t`.`telefono` AS `phone`,
+ `t`.`movil` AS `mobile`,
+ `t`.`consignatario` AS `nickname`,
+ `t`.`predeterminada` AS `isDefaultAddress`,
+ `t`.`longitude` AS `longitude`,
+ `t`.`latitude` AS `latitude`,
+ `t`.`warehouse_id` AS `warehouseFk`,
+ `t`.`Id_Agencia` AS `agencyFk`,
+ `t`.`isEqualizated` AS `isEqualizated`,
+ `t`.`active` AS `isActive`
+ FROM
+ `vn2008`.`Consignatarios` `t`
\ No newline at end of file
diff --git a/services/db/changes/1.0.0/04-userRole.sql b/services/db/changes/1.0.0/04-userRole.sql
new file mode 100644
index 000000000..b896589bc
--- /dev/null
+++ b/services/db/changes/1.0.0/04-userRole.sql
@@ -0,0 +1,36 @@
+USE `account`;
+CREATE
+ OR REPLACE ALGORITHM = UNDEFINED
+ DEFINER = `root`@`%`
+ SQL SECURITY DEFINER
+VIEW `account`.`__userRole` AS
+ SELECT
+ `r`.`inheritsFrom` AS `id`
+ FROM
+ (`account`.`roleRole` `r`
+ JOIN `account`.`user` `u` ON ((`u`.`role` = `r`.`role`)))
+ WHERE
+ (`u`.`id` = USERGETID());
+
+DROP VIEW `account`.`userRole`;
+
+CREATE TABLE `account`.`userRole` (
+ `userFk` INT(10) UNSIGNED NOT NULL,
+ `roleFk` INT(10) UNSIGNED NOT NULL,
+ PRIMARY KEY (`userFk`, `roleFk`));
+
+ALTER TABLE `account`.`userRole`
+ ADD INDEX `user` (`userFk` ASC),
+ ADD INDEX `role` (`roleFk` ASC);
+
+ALTER TABLE `account`.`userRole`
+ ADD CONSTRAINT `user`
+ FOREIGN KEY (`userFk`)
+ REFERENCES `account`.`user` (`id`)
+ ON DELETE CASCADE
+ ON UPDATE CASCADE,
+ ADD CONSTRAINT `role`
+ FOREIGN KEY (`roleFk`)
+ REFERENCES `account`.`role` (`id`)
+ ON DELETE CASCADE
+ ON UPDATE CASCADE;
diff --git a/services/db/changes/1.0.0/05-userHasRoleId.sql b/services/db/changes/1.0.0/05-userHasRoleId.sql
new file mode 100644
index 000000000..9d96ff775
--- /dev/null
+++ b/services/db/changes/1.0.0/05-userHasRoleId.sql
@@ -0,0 +1,31 @@
+DROP function IF EXISTS `userHasRoleId`;
+DELIMITER $$
+CREATE DEFINER=`root`@`%` FUNCTION `account`.`userHasRoleId`(vRoleId INT) RETURNS tinyint(1)
+ DETERMINISTIC
+BEGIN
+/**
+ * Comprueba si el usuario actual tiene asociado un rol.
+ *
+ * @param vRoleId Identificador del rol a comprobar
+ * @return %TRUE si tiene el rol, %FALSE en caso contrario
+ */
+ DECLARE vHasRole BOOL DEFAULT FALSE;
+
+ SELECT COUNT(*) > 0 INTO vHasRole
+ FROM user u
+ JOIN roleRole r ON r.role = u.role
+ WHERE u.id = userGetId()
+ AND r.inheritsFrom = vRoleId;
+
+ IF NOT vHasRole
+ THEN
+ SELECT COUNT(*) > 0 INTO vHasRole
+ FROM userRole
+ WHERE userFk = userGetId()
+ AND roleFk = vRoleId;
+ END IF;
+
+ RETURN vHasRole;
+END$$
+DELIMITER ;
+
diff --git a/services/item/common/methods/item/getLog.js b/services/item/common/methods/item/getLog.js
index 50d563c08..3b214e5c8 100644
--- a/services/item/common/methods/item/getLog.js
+++ b/services/item/common/methods/item/getLog.js
@@ -1,27 +1,13 @@
module.exports = Self => {
- Self.remoteMethod('itemLog', {
- description: 'Returns the item changes log',
- accessType: 'READ',
- accepts: [{
- arg: 'id',
- type: 'number',
- required: true,
- description: 'The item id',
- http: {source: 'path'}
- }],
- returns: {
- arg: 'data',
- type: ['Object'],
- root: true
- },
- http: {
- path: `/:id/itemLog`,
- verb: 'get'
- }
- });
+ Self.installMethod('getLog', filterParams);
- Self.itemLog = itemFk => {
- let query = `SELECT * FROM vn.itemLog WHERE itemFk = ?`;
- return Self.rawSql(query, [itemFk]);
- };
+ function filterParams(params) {
+ return {
+ where: {
+ itemFk: params.itemFk
+ },
+ skip: (params.page - 1) * params.size,
+ limit: params.size
+ };
+ }
};
diff --git a/services/item/common/models/itemLog.js b/services/item/common/models/itemLog.js
new file mode 100644
index 000000000..248cc6abd
--- /dev/null
+++ b/services/item/common/models/itemLog.js
@@ -0,0 +1,3 @@
+module.exports = function(Self) {
+ require('../methods/item/getLog.js')(Self);
+};
diff --git a/services/item/common/models/itemLog.json b/services/item/common/models/itemLog.json
new file mode 100644
index 000000000..63777113f
--- /dev/null
+++ b/services/item/common/models/itemLog.json
@@ -0,0 +1,35 @@
+{
+ "name": "ItemLog",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "itemLog",
+ "database": "vn"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "Number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "creationDate": {
+ "type": "Date"
+ },
+ "description": {
+ "type": "String"
+ }
+ },
+ "relations": {
+ "originFk": {
+ "type": "belongsTo",
+ "model": "Origin",
+ "foreignKey": "originFk"
+ },
+ "userFk": {
+ "type": "belongsTo",
+ "model": "User",
+ "foreignKey": "userFk"
+ }
+ }
+ }
diff --git a/services/item/server/model-config.json b/services/item/server/model-config.json
index f001fcba1..09eed1735 100644
--- a/services/item/server/model-config.json
+++ b/services/item/server/model-config.json
@@ -34,5 +34,8 @@
},
"Tag": {
"dataSource": "vn"
+ },
+ "ItemLog": {
+ "dataSource": "vn"
}
}
diff --git a/services_tests.js b/services_tests.js
index 0ce869843..068f8c8f2 100644
--- a/services_tests.js
+++ b/services_tests.js
@@ -36,4 +36,3 @@ jasmine.addReporter(new SpecReporter({
}));
jasmine.execute();
-