diff --git a/Jenkinsfile b/Jenkinsfile
index 03ac84de3..4a1f9ba54 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -62,13 +62,13 @@ pipeline {
}
}
}
- // stage('Backend') {
- // steps {
- // nodejs('node-v14') {
- // sh 'gulp launchBackTest --ci'
- // }
- // }
- // }
+ stage('Backend') {
+ steps {
+ nodejs('node-v14') {
+ sh 'npm run test:back:ci'
+ }
+ }
+ }
}
}
stage('Build') {
diff --git a/README.md b/README.md
index 1e3ad5e9e..f73a8551b 100644
--- a/README.md
+++ b/README.md
@@ -54,17 +54,17 @@ $ gulp docker
For client-side unit tests run from project's root.
```
-$ jest
+$ npm run test:front
```
For server-side unit tests run from project's root.
```
-$ gulp backTest
+$ npm run test:back
```
For end-to-end tests run from project's root.
```
-$ gulp e2e
+$ npm run test:e2e
```
## Visual Studio Code extensions
diff --git a/back/methods/account/specs/change-password.spec.js b/back/methods/account/specs/change-password.spec.js
index 9f1130df5..17fadb3c6 100644
--- a/back/methods/account/specs/change-password.spec.js
+++ b/back/methods/account/specs/change-password.spec.js
@@ -1,9 +1,12 @@
-const app = require('vn-loopback/server/server');
+const {models} = require('vn-loopback/server/server');
describe('account changePassword()', () => {
it('should throw an error when old password is wrong', async() => {
- let req = app.models.Account.changePassword(null, 1, 'wrongOldPass', 'newPass');
+ let err;
+ await models.Account.changePassword(1, 'wrongPassword', 'nightmare.9999')
+ .catch(error => err = error.sqlMessage);
- await expectAsync(req).toBeRejected();
+ expect(err).toBeDefined();
+ expect(err).toEqual('Invalid password');
});
});
diff --git a/back/methods/collection/spec/newCollection.spec.js b/back/methods/collection/spec/newCollection.spec.js
index 88d105b4b..6abe73f8e 100644
--- a/back/methods/collection/spec/newCollection.spec.js
+++ b/back/methods/collection/spec/newCollection.spec.js
@@ -1,8 +1,8 @@
const app = require('vn-loopback/server/server');
-// #3400 analizar que hacer con rutas de back colletion
-xdescribe('newCollection()', () => {
- it('return a new collection', async() => {
+describe('newCollection()', () => {
+ it('should return a new collection', async() => {
+ pending('#3400 analizar que hacer con rutas de back collection');
let ctx = {req: {accessToken: {userId: 1106}}};
let response = await app.models.Collection.newCollection(ctx, 1, 1, 1);
diff --git a/back/methods/dms/deleteTrashFiles.js b/back/methods/dms/deleteTrashFiles.js
new file mode 100644
index 000000000..9d16e9d81
--- /dev/null
+++ b/back/methods/dms/deleteTrashFiles.js
@@ -0,0 +1,57 @@
+const fs = require('fs-extra');
+const path = require('path');
+
+module.exports = Self => {
+ Self.remoteMethod('deleteTrashFiles', {
+ description: 'Deletes files that have trash type',
+ accessType: 'WRITE',
+ returns: {
+ type: 'object',
+ root: true
+ },
+ http: {
+ path: `/deleteTrashFiles`,
+ verb: 'POST'
+ }
+ });
+
+ Self.deleteTrashFiles = async(options) => {
+ const tx = await Self.beginTransaction({});
+ const myOptions = {};
+
+ if (typeof options == 'object')
+ Object.assign(myOptions, options);
+
+ if (!myOptions.transaction)
+ myOptions.transaction = tx;
+
+ try {
+ const models = Self.app.models;
+ const DmsContainer = models.DmsContainer;
+
+ const trashDmsType = await models.DmsType.findOne({
+ where: {code: 'trash'}
+ }, myOptions);
+
+ const dmsToDelete = await models.Dms.find({
+ where: {
+ dmsTypeFk: trashDmsType.id
+ }
+ }, myOptions);
+
+ for (let dms of dmsToDelete) {
+ const pathHash = DmsContainer.getHash(dms.id);
+ const dmsContainer = await DmsContainer.container(pathHash);
+ const dstFile = path.join(dmsContainer.client.root, pathHash, dms.file);
+ await fs.unlink(dstFile);
+ await dms.destroy(myOptions);
+ }
+ if (tx) await tx.commit();
+
+ } catch (e) {
+ if (tx) await tx.rollback();
+
+ throw e;
+ }
+ };
+};
diff --git a/back/models/account.json b/back/models/account.json
index 9150bc1a7..5f0b05f9b 100644
--- a/back/models/account.json
+++ b/back/models/account.json
@@ -47,7 +47,7 @@
"type": "date"
},
"image": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/back/models/autonomy.json b/back/models/autonomy.json
index ce9ac0bc6..8c9d82936 100644
--- a/back/models/autonomy.json
+++ b/back/models/autonomy.json
@@ -9,7 +9,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/back/models/bank-entity.json b/back/models/bank-entity.json
index c45cd4336..35d1116bd 100644
--- a/back/models/bank-entity.json
+++ b/back/models/bank-entity.json
@@ -8,15 +8,15 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"bic": {
- "type": "String"
+ "type": "string"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/back/models/bank.json b/back/models/bank.json
index 33a2637d6..da73b1141 100644
--- a/back/models/bank.json
+++ b/back/models/bank.json
@@ -8,35 +8,35 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"bank": {
- "type": "String",
+ "type": "string",
"required": true
},
"account": {
- "type": "String",
+ "type": "string",
"required": true
},
"accountingTypeFk": {
- "type": "Number",
+ "type": "number",
"required": true,
"mysql": {
"columnName": "cash"
}
},
"entityFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"isActive": {
- "type": "Boolean",
+ "type": "boolean",
"required": true
},
"currencyFk": {
- "type": "Number",
+ "type": "number",
"required": true
}
},
diff --git a/back/models/chat-config.json b/back/models/chat-config.json
index d4f708b7a..bdfbeb60d 100644
--- a/back/models/chat-config.json
+++ b/back/models/chat-config.json
@@ -10,20 +10,20 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"host": {
- "type": "String"
+ "type": "string"
},
"api": {
- "type": "String"
+ "type": "string"
},
"user": {
- "type": "String"
+ "type": "string"
},
"password": {
- "type": "String"
+ "type": "string"
}
},
"acls": [{
diff --git a/back/models/company.json b/back/models/company.json
index eb349477b..a36b43b69 100644
--- a/back/models/company.json
+++ b/back/models/company.json
@@ -10,11 +10,11 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"code": {
- "type": "String"
+ "type": "string"
},
"expired": {
"type": "date"
diff --git a/back/models/country.json b/back/models/country.json
index 8364636fc..8fa25b88e 100644
--- a/back/models/country.json
+++ b/back/models/country.json
@@ -9,7 +9,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -21,7 +21,7 @@
"type": "string"
},
"isUeeMember": {
- "type": "Boolean"
+ "type": "boolean"
}
},
"relations": {
diff --git a/back/models/delivery.json b/back/models/delivery.json
index 7c3c5c621..65a0eef1b 100644
--- a/back/models/delivery.json
+++ b/back/models/delivery.json
@@ -9,17 +9,17 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"date": {
- "type": "Date"
+ "type": "date"
},
"m3":{
- "type": "Number"
+ "type": "number"
},
"warehouseFk":{
- "type": "Number"
+ "type": "number"
}
}
}
diff --git a/back/models/dms-type.json b/back/models/dms-type.json
index b51c810ac..c7a1815fe 100644
--- a/back/models/dms-type.json
+++ b/back/models/dms-type.json
@@ -9,7 +9,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/back/models/dms.js b/back/models/dms.js
index 91291a0c2..24c072f56 100644
--- a/back/models/dms.js
+++ b/back/models/dms.js
@@ -5,6 +5,7 @@ module.exports = Self => {
require('../methods/dms/uploadFile')(Self);
require('../methods/dms/removeFile')(Self);
require('../methods/dms/updateFile')(Self);
+ require('../methods/dms/deleteTrashFiles')(Self);
Self.checkRole = async function(ctx, id) {
const models = Self.app.models;
diff --git a/back/models/dms.json b/back/models/dms.json
index f517a23ff..0259e5487 100644
--- a/back/models/dms.json
+++ b/back/models/dms.json
@@ -13,7 +13,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -36,7 +36,7 @@
"type": "boolean"
},
"created": {
- "type": "Date"
+ "type": "date"
}
},
"relations": {
diff --git a/back/models/email-user.json b/back/models/email-user.json
index e983635ce..81c01ab0c 100644
--- a/back/models/email-user.json
+++ b/back/models/email-user.json
@@ -9,7 +9,7 @@
"properties": {
"userFk": {
"id": true,
- "type": "Number",
+ "type": "number",
"required": true
},
"email": {
diff --git a/back/models/image-collection-size.json b/back/models/image-collection-size.json
index adb92d16b..9452456ee 100644
--- a/back/models/image-collection-size.json
+++ b/back/models/image-collection-size.json
@@ -8,20 +8,20 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"width": {
- "type": "Number",
+ "type": "number",
"required": true
},
"height": {
- "type": "Number",
+ "type": "number",
"required": true
},
"crop": {
- "type": "Boolean",
+ "type": "boolean",
"required": true
}
},
diff --git a/back/models/image-collection.json b/back/models/image-collection.json
index fd019ecc3..186ab0208 100644
--- a/back/models/image-collection.json
+++ b/back/models/image-collection.json
@@ -8,32 +8,32 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String",
+ "type": "string",
"required": true
},
"desc": {
- "type": "String",
+ "type": "string",
"required": true
},
"maxWidth": {
- "type": "Number",
+ "type": "number",
"required": true
},
"maxHeight": {
- "type": "Number",
+ "type": "number",
"required": true
},
"model": {
- "type": "String",
+ "type": "string",
"required": true
},
"property": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/back/models/postcode.json b/back/models/postcode.json
index e28a77dc4..eadc2c86c 100644
--- a/back/models/postcode.json
+++ b/back/models/postcode.json
@@ -9,7 +9,7 @@
"properties": {
"code": {
"id": true,
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/back/models/sage-withholding.json b/back/models/sage-withholding.json
index dddbcfd74..87f00a01c 100644
--- a/back/models/sage-withholding.json
+++ b/back/models/sage-withholding.json
@@ -11,7 +11,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier",
"mysql": {
diff --git a/back/models/town.json b/back/models/town.json
index 41633fe0a..4ad729791 100644
--- a/back/models/town.json
+++ b/back/models/town.json
@@ -9,10 +9,10 @@
"properties": {
"id": {
"id": true,
- "type": "Number"
+ "type": "number"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/back/models/user-config-view.json b/back/models/user-config-view.json
index 8ffbc6f48..f9235725c 100644
--- a/back/models/user-config-view.json
+++ b/back/models/user-config-view.json
@@ -9,18 +9,18 @@
"properties": {
"id": {
"id": true,
- "type": "Number"
+ "type": "number"
},
"userFk": {
- "type": "String",
+ "type": "string",
"required": true
},
"tableCode": {
- "type": "String",
+ "type": "string",
"required": true
},
"configuration": {
- "type": "Object"
+ "type": "object"
}
},
"relations": {
diff --git a/back/models/user-log.json b/back/models/user-log.json
index e3e3a6752..43ccbfa43 100644
--- a/back/models/user-log.json
+++ b/back/models/user-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "Number"
+ "type": "number"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/back/models/user.json b/back/models/user.json
index 1d8f8f3a5..921362e0e 100644
--- a/back/models/user.json
+++ b/back/models/user.json
@@ -9,7 +9,7 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"username":{
diff --git a/back/models/warehouse.json b/back/models/warehouse.json
index 1d8ca44e3..eb86e2114 100644
--- a/back/models/warehouse.json
+++ b/back/models/warehouse.json
@@ -10,17 +10,17 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"name": {
- "type": "String"
+ "type": "string"
},
"code": {
- "type": "String"
+ "type": "string"
},
"isInventory": {
- "type": "Number"
+ "type": "number"
},
"isManaged":{
"type": "boolean"
diff --git a/back/nodemonConfig.json b/back/nodemonConfig.json
new file mode 100644
index 000000000..a1c9ca84f
--- /dev/null
+++ b/back/nodemonConfig.json
@@ -0,0 +1,24 @@
+{
+ "verbose": true,
+ "watch": [
+ "back/**/*.js",
+ "modules/**/*.js"
+ ],
+ "ignore": [
+ "modules/account/front/**/*",
+ "modules/claim/front/**/*",
+ "modules/client/front/**/*",
+ "modules/entry/front/**/*",
+ "modules/invoiceIn/front/**/*",
+ "modules/invoiceOut/front/**/*",
+ "modules/item/front/**/*",
+ "modules/monitor/front/**/*",
+ "modules/order/front/**/*",
+ "modules/route/front/**/*",
+ "modules/supplier/front/**/*",
+ "modules/ticket/front/**/*",
+ "modules/travel/front/**/*",
+ "modules/worker/front/**/*",
+ "modules/zone/front/**/*"
+ ]
+}
\ No newline at end of file
diff --git a/back/tests.js b/back/tests.js
index c715c96bf..809906177 100644
--- a/back/tests.js
+++ b/back/tests.js
@@ -1,4 +1,5 @@
-require('require-yaml');
+const Docker = require('../db/docker.js');
+let dataSources = require('../loopback/server/datasources.json');
process.on('warning', warning => {
console.log(warning.name);
@@ -6,34 +7,64 @@ process.on('warning', warning => {
console.log(warning.stack);
});
-let verbose = false;
+async function test() {
+ let isCI = false;
-if (process.argv[2] === '--v')
- verbose = true;
+ if (process.argv[2] === 'ci')
+ isCI = true;
-let Jasmine = require('jasmine');
-let jasmine = new Jasmine();
-let SpecReporter = require('jasmine-spec-reporter').SpecReporter;
+ const container = new Docker();
-let serviceSpecs = [
- `${__dirname}/**/*[sS]pec.js`,
- `${__dirname}/../loopback/**/*[sS]pec.js`,
- `${__dirname}/../modules/*/back/**/*.[sS]pec.js`
-];
+ await container.run(isCI);
+ dataSources = JSON.parse(JSON.stringify(dataSources));
-jasmine.loadConfig({
- spec_dir: '.',
- spec_files: serviceSpecs,
- helpers: []
-});
+ Object.assign(dataSources.vn, {
+ host: container.dbConf.host,
+ port: container.dbConf.port
+ });
-jasmine.addReporter(new SpecReporter({
- spec: {
- // displayStacktrace: 'summary',
- displaySuccessful: verbose,
- displayFailedSpec: true,
- displaySpecDuration: true
+ const bootOptions = {dataSources};
+ const app = require('vn-loopback/server/server');
+ app.boot(bootOptions);
+
+ const Jasmine = require('jasmine');
+ const jasmine = new Jasmine();
+
+ const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
+ jasmine.addReporter(new SpecReporter({
+ spec: {
+ displaySuccessful: isCI,
+ displayPending: isCI
+ },
+ summary: {
+ displayPending: false,
+ }
+ }));
+
+ if (isCI) {
+ const JunitReporter = require('jasmine-reporters');
+ jasmine.addReporter(new JunitReporter.JUnitXmlReporter());
+
+ jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
}
-}));
-jasmine.execute();
+ const backSpecs = [
+ './back/**/*[sS]pec.js',
+ './loopback/**/*[sS]pec.js',
+ './modules/*/back/**/*.[sS]pec.js'
+ ];
+
+ jasmine.loadConfig({
+ spec_dir: '.',
+ spec_files: backSpecs,
+ helpers: [],
+ });
+
+ jasmine.exitOnCompletion = false;
+ await jasmine.execute();
+ if (app) await app.disconnect();
+ if (container) await container.rm();
+ console.log('app disconnected & container removed');
+}
+
+test();
diff --git a/db/changes/10451-april/00-aclExpeditionState.sql b/db/changes/10451-april/00-aclExpeditionState.sql
new file mode 100644
index 000000000..d26117bbf
--- /dev/null
+++ b/db/changes/10451-april/00-aclExpeditionState.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL`(`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+VALUES('ExpeditionState', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
\ No newline at end of file
diff --git a/db/changes/10451-april/00-aclExpense.sql b/db/changes/10451-april/00-aclExpense.sql
new file mode 100644
index 000000000..55ca8c389
--- /dev/null
+++ b/db/changes/10451-april/00-aclExpense.sql
@@ -0,0 +1,5 @@
+INSERT INTO `salix`.`ACL`(`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES('Expense', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+INSERT INTO `salix`.`ACL`(`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+ VALUES('Expense', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative');
diff --git a/db/changes/10451-april/00-aclSupplierActivity.sql b/db/changes/10451-april/00-aclSupplierActivity.sql
new file mode 100644
index 000000000..bf73a1506
--- /dev/null
+++ b/db/changes/10451-april/00-aclSupplierActivity.sql
@@ -0,0 +1,5 @@
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+VALUES('SupplierActivity', '*', 'READ', 'ALLOW', 'ROLE', 'employee');
+
+INSERT INTO `salix`.`ACL` (`model`, `property`, `accessType`, `permission`, `principalType`, `principalId`)
+VALUES('SupplierActivity', '*', 'WRITE', 'ALLOW', 'ROLE', 'administrative');
diff --git a/db/changes/10460-mother/00-clientConfig.sql b/db/changes/10460-mother/00-clientConfig.sql
new file mode 100644
index 000000000..cd67a5797
--- /dev/null
+++ b/db/changes/10460-mother/00-clientConfig.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `vn`.`clientConfig` ADD `maxCreditRows` int(11) NULL COMMENT 'Máximo número de registros a mantener en la tabla clientCredit';
+
+UPDATE `vn`.`clientConfig`
+ SET `maxCreditRows` = 10
+ WHERE `id` = 1;
\ No newline at end of file
diff --git a/db/changes/10460-mother/00-dmsForeignKey.sql b/db/changes/10460-mother/00-dmsForeignKey.sql
new file mode 100644
index 000000000..6a4736fdd
--- /dev/null
+++ b/db/changes/10460-mother/00-dmsForeignKey.sql
@@ -0,0 +1,8 @@
+ALTER TABLE `vn`.`propertyDms` DROP FOREIGN KEY propertyDms_FK;
+ALTER TABLE `vn`.`propertyDms` ADD CONSTRAINT propertyDms_FK FOREIGN KEY (dmsFk) REFERENCES `vn`.`dms`(id) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `vn`.`clientDms` DROP FOREIGN KEY clientDms_ibfk_2;
+ALTER TABLE `vn`.`clientDms` ADD CONSTRAINT clientDms_ibfk_2 FOREIGN KEY (dmsFk) REFERENCES `vn`.`dms`(id) ON DELETE CASCADE ON UPDATE CASCADE;
+
+ALTER TABLE `vn`.`workerDocument` DROP FOREIGN KEY workerDocument_ibfk_2;
+ALTER TABLE `vn`.`workerDocument` ADD CONSTRAINT workerDocument_ibfk_2 FOREIGN KEY (document) REFERENCES `vn`.`dms`(id) ON DELETE CASCADE ON UPDATE CASCADE;
diff --git a/db/changes/10460-mother/01-dmsType.sql b/db/changes/10460-mother/01-dmsType.sql
new file mode 100644
index 000000000..649ffbc71
--- /dev/null
+++ b/db/changes/10460-mother/01-dmsType.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `vn`.`dmsType` ADD monthToDelete INT UNSIGNED DEFAULT NULL NULL;
+ALTER TABLE `vn`.`dmsType` MODIFY COLUMN monthToDelete int(10) unsigned DEFAULT NULL NULL COMMENT 'Meses en el pasado para ir borrando registros, dejar a null para no borrarlos nunca';
+UPDATE `vn`.`dmsType`
+ SET monthToDelete=6
+ WHERE id=20;
diff --git a/db/changes/10460-mother/02-dmsTrigger.sql b/db/changes/10460-mother/02-dmsTrigger.sql
new file mode 100644
index 000000000..d4525440b
--- /dev/null
+++ b/db/changes/10460-mother/02-dmsTrigger.sql
@@ -0,0 +1,18 @@
+
+DELIMITER $$
+$$
+CREATE TRIGGER `vn`.`dms_beforeDelete`
+BEFORE DELETE
+ON dms FOR EACH ROW
+BEGIN
+ DECLARE vCanNotBeDeleted INT;
+ SELECT COUNT(*) INTO vCanNotBeDeleted
+ FROM dmsType dt
+ WHERE NOT (code <=> 'trash')
+ AND dt.id = OLD.dmsTypeFk;
+
+ IF vCanNotBeDeleted THEN
+ CALL util.throw('A dms can not be deleted');
+ END IF;
+END$$
+DELIMITER ;
diff --git a/db/changes/10460-mother/03-clean.sql b/db/changes/10460-mother/03-clean.sql
new file mode 100644
index 000000000..13951394f
--- /dev/null
+++ b/db/changes/10460-mother/03-clean.sql
@@ -0,0 +1,175 @@
+DROP PROCEDURE IF EXISTS vn.clean;
+
+DELIMITER $$
+$$
+CREATE DEFINER=`root`@`localhost` PROCEDURE `vn`.`clean`()
+BEGIN
+ DECLARE vDateShort DATETIME;
+ DECLARE vOneYearAgo DATE;
+ DECLARE vFourYearsAgo DATE;
+ DECLARE v18Month DATE;
+ DECLARE v26Month DATE;
+ DECLARE v3Month DATE;
+ DECLARE vTrashId varchar(15);
+
+ SET vDateShort = TIMESTAMPADD(MONTH, -2, CURDATE());
+ SET vOneYearAgo = TIMESTAMPADD(YEAR,-1,CURDATE());
+ SET vFourYearsAgo = TIMESTAMPADD(YEAR,-4,CURDATE());
+ SET v18Month = TIMESTAMPADD(MONTH, -18,CURDATE());
+ SET v26Month = TIMESTAMPADD(MONTH, -26,CURDATE());
+ SET v3Month = TIMESTAMPADD(MONTH, -3, CURDATE());
+
+ DELETE FROM ticketParking WHERE created < vDateShort;
+ DELETE FROM routesMonitor WHERE dated < vDateShort;
+ DELETE FROM workerTimeControlLog WHERE created < vDateShort;
+ DELETE FROM `message` WHERE sendDate < vDateShort;
+ DELETE FROM messageInbox WHERE sendDate < vDateShort;
+ DELETE FROM messageInbox WHERE sendDate < vDateShort;
+ DELETE FROM workerTimeControl WHERE timed < vFourYearsAgo;
+ DELETE FROM itemShelving WHERE created < CURDATE() AND visible = 0;
+ DELETE FROM ticketDown WHERE created < TIMESTAMPADD(DAY,-1,CURDATE());
+ DELETE FROM entryLog WHERE creationDate < vDateShort;
+ DELETE IGNORE FROM expedition WHERE created < v26Month;
+ DELETE FROM sms WHERE created < v18Month;
+ DELETE FROM saleTracking WHERE created < vOneYearAgo;
+ DELETE tobs FROM ticketObservation tobs
+ JOIN ticket t ON tobs.ticketFk = t.id WHERE t.shipped < TIMESTAMPADD(YEAR,-2,CURDATE());
+ DELETE sc.* FROM saleCloned sc JOIN sale s ON s.id = sc.saleClonedFk JOIN ticket t ON t.id = s.ticketFk WHERE t.shipped < vOneYearAgo;
+ DELETE FROM sharingCart where ended < vDateShort;
+ DELETE FROM sharingClient where ended < vDateShort;
+ DELETE tw.* FROM ticketWeekly tw
+ LEFT JOIN sale s ON s.ticketFk = tw.ticketFk WHERE s.itemFk IS NULL;
+ DELETE FROM claim WHERE ticketCreated < vFourYearsAgo;
+ DELETE FROM message WHERE sendDate < vDateShort;
+ -- Robert ubicacion anterior de trevelLog comentario para debug
+ DELETE sc FROM saleChecked sc
+ JOIN sale s ON sc.saleFk = s.id WHERE s.created < vDateShort;
+ DELETE FROM zoneEvent WHERE `type` = 'day' AND dated < v3Month;
+ DELETE bm
+ FROM buyMark bm
+ JOIN buy b ON b.id = bm.id
+ JOIN entry e ON e.id = b.entryFk
+ JOIN travel t ON t.id = e.travelFk
+ WHERE t.landed <= vDateShort;
+ DELETE FROM stowaway WHERE created < v3Month;
+ DELETE FROM vn.buy WHERE created < vDateShort AND entryFk = 9200;
+ DELETE FROM vn.itemShelvingLog WHERE created < vDateShort;
+ DELETE FROM vn.stockBuyed WHERE creationDate < vDateShort;
+
+
+ -- Equipos duplicados
+ DELETE w.*
+ FROM workerTeam w
+ JOIN (SELECT id, team, workerFk, COUNT(*) - 1 as duplicated
+ FROM workerTeam
+ GROUP BY team,workerFk
+ HAVING duplicated
+ ) d ON d.team = w.team AND d.workerFk = w.workerFk AND d.id != w.id;
+
+ DELETE sc
+ FROM saleComponent sc
+ JOIN sale s ON s.id= sc.saleFk
+ JOIN ticket t ON t.id= s.ticketFk
+ WHERE t.shipped < v18Month;
+
+ DELETE c
+ FROM vn.claim c
+ JOIN vn.claimState cs ON cs.id = c.claimStateFk
+ WHERE cs.description = "Anulado" AND
+ c.created < vDateShort;
+ DELETE
+ FROM vn.expeditionTruck
+ WHERE ETD < v3Month;
+
+ -- borrar travels sin entradas
+ DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete;
+ CREATE TEMPORARY TABLE tmp.thermographToDelete
+ SELECT th.id,th.dmsFk
+ FROM vn.travel t
+ LEFT JOIN vn.entry e ON e.travelFk = t.id
+ JOIN vn.travelThermograph th ON th.travelFk = t.id
+ WHERE t.shipped < TIMESTAMPADD(MONTH, -3, CURDATE()) AND e.travelFk IS NULL;
+
+ SELECT dt.id into vTrashId
+ FROM vn.dmsType dt
+ WHERE dt.code = 'trash';
+
+ UPDATE tmp.thermographToDelete th
+ JOIN vn.dms d ON d.id = th.dmsFk
+ SET d.dmsTypeFk = vTrashId;
+
+ DELETE th
+ FROM tmp.thermographToDelete tmp
+ JOIN vn.travelThermograph th ON th.id = tmp.id;
+
+ DELETE t
+ FROM vn.travel t
+ LEFT JOIN vn.entry e ON e.travelFk = t.id
+ WHERE t.shipped < TIMESTAMPADD(MONTH, -3, CURDATE()) AND e.travelFk IS NULL;
+
+ UPDATE dms d
+ JOIN dmsType dt ON dt.id = d.dmsTypeFk
+ SET d.dmsTypeFk = vTrashId
+ WHERE created < TIMESTAMPADD(MONTH, -dt.monthToDelete, CURDATE());
+
+ -- borrar entradas sin compras
+ DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete;
+ CREATE TEMPORARY TABLE tmp.entryToDelete
+ SELECT e.*
+ FROM vn.entry e
+ LEFT JOIN vn.buy b ON b.entryFk = e.id
+ JOIN vn.entryConfig ec ON e.id != ec.defaultEntry
+ WHERE e.dated < TIMESTAMPADD(MONTH, -3, CURDATE()) AND b.entryFK IS NULL;
+
+ DELETE e
+ FROM vn.entry e
+ JOIN tmp.entryToDelete tmp ON tmp.id = e.id;
+
+ -- borrar de route registros menores a 4 años
+ DROP TEMPORARY TABLE IF EXISTS tmp.routeToDelete;
+ CREATE TEMPORARY TABLE tmp.routeToDelete
+ SELECT *
+ FROM vn.route r
+ WHERE created < TIMESTAMPADD(YEAR,-4,CURDATE());
+
+ UPDATE tmp.routeToDelete tmp
+ JOIN vn.dms d ON d.id = tmp.gestdocFk
+ SET d.dmsTypeFk = vTrashId;
+
+ DELETE r
+ FROM tmp.routeToDelete tmp
+ JOIN vn.route r ON r.id = tmp.id;
+
+ -- borrar registros de dua y awb menores a 2 años
+ DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete;
+ CREATE TEMPORARY TABLE tmp.duaToDelete
+ SELECT *
+ FROM vn.dua
+ WHERE operated < TIMESTAMPADD(YEAR,-2,CURDATE());
+
+ UPDATE tmp.duaToDelete tm
+ JOIN vn.dms d ON d.id = tm.gestdocFk
+ SET d.dmsTypeFk = vTrashId;
+
+ DELETE d
+ FROM tmp.duaToDelete tmp
+ JOIN vn.dua d ON d.id = tmp.id;
+
+ DELETE FROM vn.awb WHERE created < TIMESTAMPADD(YEAR,-2,CURDATE());
+
+ -- Borra los ficheros gestDoc
+ INSERT INTO vn.printServerQueue(priorityFk, labelReportFk)VALUES(1,11);
+
+ -- Borra los registros de collection y ticketcollection
+ DELETE FROM vn.collection WHERE created < vDateShort;
+
+ DROP TEMPORARY TABLE IF EXISTS tmp.thermographToDelete;
+ DROP TEMPORARY TABLE IF EXISTS tmp.entryToDelete;
+ DROP TEMPORARY TABLE IF EXISTS tmp.duaToDelete;
+
+ DELETE FROM travelLog WHERE creationDate < v3Month;
+
+ CALL shelving_clean;
+
+END$$
+DELIMITER ;
diff --git a/db/changes/10460-mother/04-acl.sql b/db/changes/10460-mother/04-acl.sql
new file mode 100644
index 000000000..c1dc4f6ed
--- /dev/null
+++ b/db/changes/10460-mother/04-acl.sql
@@ -0,0 +1,2 @@
+INSERT INTO `salix`.`ACL` (model,property,accessType,permission,principalType,principalId)
+ VALUES ('Dms','deleteTrashFiles','WRITE','ALLOW','ROLE','employee')
\ No newline at end of file
diff --git a/db/changes/10460-mothersDay/delete.keep b/db/changes/10460-mothersDay/delete.keep
deleted file mode 100644
index 0e7498f40..000000000
--- a/db/changes/10460-mothersDay/delete.keep
+++ /dev/null
@@ -1 +0,0 @@
-Delete file
\ No newline at end of file
diff --git a/db/changes/10470-family/delete.keep b/db/changes/10470-family/delete.keep
new file mode 100644
index 000000000..e69de29bb
diff --git a/db/docker.js b/db/docker.js
index ea9fe8ed1..34026f85f 100644
--- a/db/docker.js
+++ b/db/docker.js
@@ -24,7 +24,10 @@ module.exports = class Docker {
let d = new Date();
let pad = v => v < 10 ? '0' + v : v;
let stamp = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
+
+ log('Building container image...');
await this.execP(`docker build --build-arg STAMP=${stamp} -t salix-db ./db`);
+ log('Image built.');
let dockerArgs;
@@ -39,6 +42,7 @@ module.exports = class Docker {
let runChown = process.platform != 'linux';
+ log('Starting container...');
const container = await this.execP(`docker run --env RUN_CHOWN=${runChown} -d ${dockerArgs} salix-db`);
this.id = container.stdout.trim();
@@ -158,6 +162,7 @@ module.exports = class Docker {
return reject(new Error('Docker exited, please see the docker logs for more info'));
let conn = mysql.createConnection(myConf);
+
conn.on('error', () => {});
conn.connect(err => {
conn.destroy();
diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql
index 2a8921926..c329e4c6e 100644
--- a/db/dump/fixtures.sql
+++ b/db/dump/fixtures.sql
@@ -313,9 +313,9 @@ INSERT INTO `vn`.`clientManaCache`(`clientFk`, `mana`, `dated`)
(1103, 0, DATE_ADD(CURDATE(), INTERVAL -1 MONTH)),
(1104, -30, DATE_ADD(CURDATE(), INTERVAL -1 MONTH));
-INSERT INTO `vn`.`clientConfig`(`riskTolerance`)
+INSERT INTO `vn`.`clientConfig`(`riskTolerance`, `maxCreditRows`)
VALUES
- (200);
+ (200, 10);
INSERT INTO `vn`.`address`(`id`, `nickname`, `street`, `city`, `postalCode`, `provinceFk`, `phone`, `mobile`, `isActive`, `clientFk`, `agencyModeFk`, `longitude`, `latitude`, `isEqualizated`, `isDefaultAddress`)
VALUES
@@ -393,17 +393,17 @@ DROP TEMPORARY TABLE tmp.address;
INSERT INTO `vn`.`clientCredit`(`id`, `clientFk`, `workerFk`, `amount`, `created`)
VALUES
- (1 , 1101, 5, 300, DATE_ADD(CURDATE(), INTERVAL -1 MONTH)),
- (2 , 1101, 5, 900, DATE_ADD(CURDATE(), INTERVAL -2 MONTH)),
- (3 , 1101, 5, 800, DATE_ADD(CURDATE(), INTERVAL -3 MONTH)),
- (4 , 1101, 5, 700, DATE_ADD(CURDATE(), INTERVAL -4 MONTH)),
- (5 , 1101, 5, 600, DATE_ADD(CURDATE(), INTERVAL -5 MONTH)),
+ (1 , 1101, 5, 300, DATE_ADD(CURDATE(), INTERVAL -11 MONTH)),
+ (2 , 1101, 5, 900, DATE_ADD(CURDATE(), INTERVAL -10 MONTH)),
+ (3 , 1101, 5, 800, DATE_ADD(CURDATE(), INTERVAL -9 MONTH)),
+ (4 , 1101, 5, 700, DATE_ADD(CURDATE(), INTERVAL -8 MONTH)),
+ (5 , 1101, 5, 600, DATE_ADD(CURDATE(), INTERVAL -7 MONTH)),
(6 , 1101, 5, 500, DATE_ADD(CURDATE(), INTERVAL -6 MONTH)),
- (7 , 1101, 5, 400, DATE_ADD(CURDATE(), INTERVAL -7 MONTH)),
- (8 , 1101, 9, 300, DATE_ADD(CURDATE(), INTERVAL -8 MONTH)),
- (9 , 1101, 9, 200, DATE_ADD(CURDATE(), INTERVAL -9 MONTH)),
- (10, 1101, 9, 100, DATE_ADD(CURDATE(), INTERVAL -10 MONTH)),
- (11, 1101, 9, 50 , DATE_ADD(CURDATE(), INTERVAL -11 MONTH)),
+ (7 , 1101, 5, 400, DATE_ADD(CURDATE(), INTERVAL -5 MONTH)),
+ (8 , 1101, 9, 300, DATE_ADD(CURDATE(), INTERVAL -4 MONTH)),
+ (9 , 1101, 9, 200, DATE_ADD(CURDATE(), INTERVAL -3 MONTH)),
+ (10, 1101, 9, 100, DATE_ADD(CURDATE(), INTERVAL -2 MONTH)),
+ (11, 1101, 9, 50 , DATE_ADD(CURDATE(), INTERVAL -1 MONTH)),
(12, 1102, 9, 800, CURDATE()),
(14, 1104, 9, 90 , CURDATE()),
(15, 1105, 9, 90 , CURDATE());
@@ -854,18 +854,35 @@ INSERT INTO `vn`.`packaging`(`id`, `volume`, `width`, `height`, `depth`, `isPack
('cc', 1640038.00, 56.00, 220.00, 128.00, 1, CURDATE(), 15, 90.00),
('pallet 100', 2745600.00, 100.00, 220.00, 120.00, 1, CURDATE(), 16, 0.00);
-INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `isBox`, `created`, `itemFk`, `counter`, `checked`, `workerFk`, `externalId`, `packagingFk`)
+INSERT INTO `vn`.`expeditionStateType`(`id`, `description`, `code`)
VALUES
- (1, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 15, 1, 1, 18, 'UR9000006041', 94),
- (2, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 16, 2, 1, 18, 'UR9000006041', 94),
- (3, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 3, 1, 18, 'UR9000006041', 94),
- (4, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 4, 1, 18, 'UR9000006041', 94),
- (5, 1, 2, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 1, 1, 18, NULL, 94),
- (6, 7, 3, 71, DATE_ADD(CURDATE(), INTERVAL -2 MONTH), NULL, 1, 1, 18, NULL, 94),
- (7, 2, 4, 71, DATE_ADD(CURDATE(), INTERVAL -3 MONTH), NULL, 1, 1, 18, NULL, 94),
- (8, 3, 5, 71, DATE_ADD(CURDATE(), INTERVAL -4 MONTH), NULL, 1, 1, 18, NULL, 94),
- (9, 3, 6, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 1, 1, 18, NULL, 94),
- (10, 7, 7, 71, NOW(), NULL, 1, 1, 18, NULL, 94);
+ (1, 'En reparto', 'ON DELIVERY'),
+ (2, 'Entregada', 'DELIVERED'),
+ (3, 'Perdida', 'LOST');
+
+
+INSERT INTO `vn`.`expedition`(`id`, `agencyModeFk`, `ticketFk`, `isBox`, `created`, `itemFk`, `counter`, `checked`, `workerFk`, `externalId`, `packagingFk`, `stateTypeFk`)
+ VALUES
+ (1, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 15, 1, 1, 18, 'UR9000006041', 94, 1),
+ (2, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), 16, 2, 1, 18, 'UR9000006041', 94, 1),
+ (3, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 3, 1, 18, 'UR9000006041', 94, 2),
+ (4, 1, 1, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 4, 1, 18, 'UR9000006041', 94, 2),
+ (5, 1, 2, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 1, 1, 18, NULL, 94, 3),
+ (6, 7, 3, 71, DATE_ADD(CURDATE(), INTERVAL -2 MONTH), NULL, 1, 1, 18, NULL, 94, 3),
+ (7, 2, 4, 71, DATE_ADD(CURDATE(), INTERVAL -3 MONTH), NULL, 1, 1, 18, NULL, 94, NULL),
+ (8, 3, 5, 71, DATE_ADD(CURDATE(), INTERVAL -4 MONTH), NULL, 1, 1, 18, NULL, 94, 1),
+ (9, 3, 6, 71, DATE_ADD(CURDATE(), INTERVAL -1 MONTH), NULL, 1, 1, 18, NULL, 94, 2),
+ (10, 7, 7, 71, NOW(), NULL, 1, 1, 18, NULL, 94, 3);
+
+
+INSERT INTO `vn`.`expeditionState`(`id`, `created`, `expeditionFk`, `typeFk`, `userFk`)
+ VALUES
+ (1, CURDATE(), 1, 1, 1),
+ (2, CURDATE(), 2, 1, 1),
+ (3, CURDATE(), 3, 1, 1),
+ (4, CURDATE(), 3, 2, 1106),
+ (5, CURDATE(), 5, 1, 1106),
+ (6, CURDATE(), 5, 3, 1106);
INSERT INTO `vn`.`ticketPackaging`(`id`, `ticketFk`, `packagingFk`, `quantity`, `created`, `pvp`)
VALUES
@@ -1296,11 +1313,11 @@ INSERT INTO `vn`.`supplierAddress`(`id`, `supplierFk`, `nickname`, `street`, `pr
(5, 442, 'GCR building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222'),
(6, 442, 'The Gotham Tonight building', 'Bristol district', 1, '46000', 'Gotham', '111111111', '222222222');
-INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif`, `commission`, `created`, `isActive`, `street`, `city`, `provinceFk`, `postCode`, `payMethodFk`, `payDemFk`, `payDay`, `taxTypeSageFk`, `withholdingSageFk`, `transactionTypeSageFk`, `workerFk`, `supplierActivityFk`, `isPayMethodChecked`)
+INSERT INTO `vn`.`supplier`(`id`, `name`, `nickname`,`account`,`countryFk`,`nif`, `commission`, `created`, `isActive`, `street`, `city`, `provinceFk`, `postCode`, `payMethodFk`, `payDemFk`, `payDay`, `taxTypeSageFk`, `withholdingSageFk`, `transactionTypeSageFk`, `workerFk`, `supplierActivityFk`, `isPayMethodChecked`, `healthRegister`)
VALUES
- (1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1),
- (2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, CURDATE(), 1, 'supplier address 2', 'SILLA', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1),
- (442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, CURDATE(), 1, 'supplier address 3', 'SILLA', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'flowerPlants', 1);
+ (1, 'Plants SL', 'Plants nick', 4100000001, 1, '06089160W', 0, CURDATE(), 1, 'supplier address 1', 'PONTEVEDRA', 1, 15214, 1, 1, 15, 4, 1, 1, 18, 'flowerPlants', 1, '400664487V'),
+ (2, 'Farmer King', 'The farmer', 4000020002, 1, '87945234L', 0, CURDATE(), 1, 'supplier address 2', 'SILLA', 2, 43022, 1, 2, 10, 93, 2, 8, 18, 'animals', 1, '400664487V'),
+ (442, 'Verdnatura Levante SL', 'Verdnatura', 5115000442, 1, '06815934E', 0, CURDATE(), 1, 'supplier address 3', 'SILLA', 1, 43022, 1, 2, 15, 6, 9, 3, 18, 'complements', 1, '400664487V');
INSERT INTO `vn`.`supplierContact`(`id`, `supplierFk`, `phone`, `mobile`, `email`, `observation`, `name`)
VALUES
diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js
index 2ecb73960..29176489c 100644
--- a/e2e/helpers/selectors.js
+++ b/e2e/helpers/selectors.js
@@ -982,8 +982,8 @@ export default {
save: 'vn-invoice-in-basic-data button[type=submit]'
},
invoiceInTax: {
- addTaxButton: 'vn-invoice-in-tax vn-icon-button[icon="add_circle"]',
- thirdExpence: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.expenseFk"]',
+ addTaxButton: 'vn-invoice-in-tax vn-icon-button[vn-tooltip="Add tax"]',
+ thirdExpense: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.expenseFk"]',
thirdTaxableBase: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-input-number[ng-model="invoiceInTax.taxableBase"]',
thirdTaxType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.taxTypeSageFk"]',
thirdTransactionType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.transactionTypeSageFk"]',
diff --git a/e2e/helpers/tests.js b/e2e/helpers/tests.js
new file mode 100644
index 000000000..aac9963dd
--- /dev/null
+++ b/e2e/helpers/tests.js
@@ -0,0 +1,87 @@
+require('@babel/register')({presets: ['@babel/env']});
+require('core-js/stable');
+require('regenerator-runtime/runtime');
+
+const axios = require('axios');
+const Docker = require('../../db/docker.js');
+const e2eConfig = require('./config.js');
+const log = require('fancy-log');
+
+process.on('warning', warning => {
+ console.log(warning.name);
+ console.log(warning.message);
+ console.log(warning.stack);
+});
+
+async function test() {
+ if (process.argv[2] === 'show')
+ process.env.E2E_SHOW = true;
+
+ const container = new Docker('salix-db');
+
+ await container.run();
+
+ const Jasmine = require('jasmine');
+ const jasmine = new Jasmine();
+
+ const specFiles = [
+ `./e2e/paths/01*/*[sS]pec.js`,
+ `./e2e/paths/02*/*[sS]pec.js`,
+ `./e2e/paths/03*/*[sS]pec.js`,
+ `./e2e/paths/04*/*[sS]pec.js`,
+ `./e2e/paths/05*/*[sS]pec.js`,
+ `./e2e/paths/06*/*[sS]pec.js`,
+ `./e2e/paths/07*/*[sS]pec.js`,
+ `./e2e/paths/08*/*[sS]pec.js`,
+ `./e2e/paths/09*/*[sS]pec.js`,
+ `./e2e/paths/10*/*[sS]pec.js`,
+ `./e2e/paths/11*/*[sS]pec.js`,
+ `./e2e/paths/12*/*[sS]pec.js`,
+ `./e2e/paths/13*/*[sS]pec.js`,
+ `./e2e/paths/**/*[sS]pec.js`
+ ];
+
+ jasmine.loadConfig({
+ spec_dir: '.',
+ spec_files: specFiles,
+ helpers: [],
+ random: false,
+ });
+
+ await backendStatus();
+
+ jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
+ await jasmine.execute();
+}
+
+async function backendStatus() {
+ log('Awaiting backend connection...');
+
+ const milliseconds = 1000;
+ const maxAttempts = 10;
+
+ return new Promise(resolve => {
+ let timer;
+ let attempts = 1;
+ timer = setInterval(async() => {
+ try {
+ attempts++;
+ const url = `${e2eConfig.url}/api/Applications/status`;
+ const {data} = await axios.get(url);
+
+ if (data == true) {
+ clearInterval(timer);
+ log('Backend connection stablished!');
+ resolve(attempts);
+ }
+ } catch (error) {
+ if (error && attempts >= maxAttempts) {
+ log('Could not connect to backend');
+ process.exit();
+ }
+ }
+ }, milliseconds);
+ });
+}
+
+test();
diff --git a/e2e/paths/09-invoice-in/04_tax.spec.js b/e2e/paths/09-invoice-in/04_tax.spec.js
index 364a25d7e..b1dbe2008 100644
--- a/e2e/paths/09-invoice-in/04_tax.spec.js
+++ b/e2e/paths/09-invoice-in/04_tax.spec.js
@@ -19,7 +19,7 @@ describe('InvoiceIn tax path', () => {
it('should add a new tax', async() => {
await page.waitToClick(selectors.invoiceInTax.addTaxButton);
- await page.autocompleteSearch(selectors.invoiceInTax.thirdExpence, '6210000567');
+ await page.autocompleteSearch(selectors.invoiceInTax.thirdExpense, '6210000567');
await page.write(selectors.invoiceInTax.thirdTaxableBase, '100');
await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, '6');
await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas');
@@ -37,9 +37,9 @@ describe('InvoiceIn tax path', () => {
expect(result).toEqual('Taxable base €1,323.16');
});
- it('should navigate back to the tax section and check the reciently added line contains the expected expense', async() => {
+ it('should navigate back to tax section, check the reciently added line contains the expected expense', async() => {
await page.accessToSection('invoiceIn.card.tax');
- const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpence, 'value');
+ const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value');
expect(result).toEqual('6210000567: Alquiler VNH');
});
diff --git a/front/core/components/multi-check/multi-check.html b/front/core/components/multi-check/multi-check.html
index eaa4577f0..fe485e19b 100644
--- a/front/core/components/multi-check/multi-check.html
+++ b/front/core/components/multi-check/multi-check.html
@@ -5,12 +5,14 @@
-
+
All
diff --git a/front/core/components/multi-check/multi-check.js b/front/core/components/multi-check/multi-check.js
index e60d16519..077c93360 100644
--- a/front/core/components/multi-check/multi-check.js
+++ b/front/core/components/multi-check/multi-check.js
@@ -172,6 +172,10 @@ export default class MultiCheck extends FormInput {
this.checkedDummyCount = this.allRowsCount;
}
+ isCheckedDummy() {
+ return this.checked && this.checkDummyEnabled;
+ }
+
/**
* Toggles checked property on
* all instances
diff --git a/front/core/components/multi-check/multi-check.spec.js b/front/core/components/multi-check/multi-check.spec.js
index 1c0adb9d8..5cb8cbbef 100644
--- a/front/core/components/multi-check/multi-check.spec.js
+++ b/front/core/components/multi-check/multi-check.spec.js
@@ -190,4 +190,30 @@ describe('Component vnMultiCheck', () => {
expect(controller.checkedDummyCount).toBeNull();
});
});
+
+ describe('isCheckedDummy()', () => {
+ it(`should return true only if is checked and checked dummy is enabled`, () => {
+ controller.checked = true;
+ controller.checkDummyEnabled = true;
+ const isCheckedDummy = controller.isCheckedDummy();
+
+ expect(isCheckedDummy).toEqual(true);
+ });
+
+ it(`should return false if not checked`, () => {
+ controller.checked = false;
+ controller.checkDummyEnabled = true;
+ const isCheckedDummy = controller.isCheckedDummy();
+
+ expect(isCheckedDummy).toEqual(false);
+ });
+
+ it(`should return false if checked dummy is disabled`, () => {
+ controller.checked = true;
+ controller.checkDummyEnabled = false;
+ const isCheckedDummy = controller.isCheckedDummy();
+
+ expect(isCheckedDummy).toEqual(false);
+ });
+ });
});
diff --git a/front/core/components/multi-check/style.scss b/front/core/components/multi-check/style.scss
index 7a4d10675..15f462e8f 100644
--- a/front/core/components/multi-check/style.scss
+++ b/front/core/components/multi-check/style.scss
@@ -3,15 +3,8 @@ vn-multi-check {
.vn-check {
margin-bottom: 12px
}
-
- vn-list{
- padding: 50px;
- }
- vn-menu{
- padding: 50px;
- }
-
}
+
.bold{
font-weight: bold;
}
\ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 102a8a0bf..d7e7d8e86 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -3,8 +3,6 @@ const gulp = require('gulp');
const PluginError = require('plugin-error');
const argv = require('minimist')(process.argv.slice(2));
const log = require('fancy-log');
-const got = require('got');
-const e2eConfig = require('./e2e/helpers/config.js');
const Docker = require('./db/docker.js');
// Configuration
@@ -67,187 +65,6 @@ back.description = `Starts backend and database service`;
const defaultTask = gulp.parallel(front, back);
defaultTask.description = `Starts all application services`;
-
-// Backend tests - Private method
-
-async function launchBackTest(done) {
- let err;
- let dataSources = require('./loopback/server/datasources.json');
-
- const container = new Docker();
- await container.run(argv.ci);
-
- dataSources = JSON.parse(JSON.stringify(dataSources));
-
- Object.assign(dataSources.vn, {
- host: container.dbConf.host,
- port: container.dbConf.port
- });
-
- let bootOptions = {dataSources};
-
- let app = require(`./loopback/server/server`);
-
- try {
- app.boot(bootOptions);
-
- await new Promise((resolve, reject) => {
- const jasmine = require('gulp-jasmine');
-
- const options = {
- verbose: false,
- includeStackTrace: false,
- errorOnFail: false,
- timeout: 5000,
- config: {}
- };
-
- if (argv.ci) {
- const reporters = require('jasmine-reporters');
- options.reporter = new reporters.JUnitXmlReporter();
- }
-
- let backSpecFiles = [
- 'back/**/*.spec.js',
- 'loopback/**/*.spec.js',
- 'modules/*/back/**/*.spec.js'
- ];
-
- gulp.src(backSpecFiles)
- .pipe(jasmine(options))
- .on('end', resolve)
- .on('error', reject)
- .resume();
- });
- } catch (e) {
- err = e;
- }
- await app.disconnect();
- await container.rm();
- done();
- if (err)
- throw err;
-}
-launchBackTest.description = `
- Runs the backend tests once using a random container, can receive --ci arg to save reports on a xml file`;
-
-// Backend tests
-
-function backTest(done) {
- const nodemon = require('gulp-nodemon');
-
- nodemon({
- exec: ['node --tls-min-v1.0 ./node_modules/gulp/bin/gulp.js'],
- args: ['launchBackTest'],
- watch: backSources,
- done: done
- });
-}
-backTest.description = `Watches for changes in modules to execute backTest task`;
-
-// End to end tests
-function e2eSingleRun() {
- require('@babel/register')({presets: ['@babel/env']});
- require('core-js/stable');
- require('regenerator-runtime/runtime');
-
- const jasmine = require('gulp-jasmine');
- const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
-
- if (argv.show || argv.s)
- process.env.E2E_SHOW = true;
-
- const specFiles = [
- `${__dirname}/e2e/paths/01*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/02*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/03*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/04*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/05*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/06*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/07*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/08*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/09*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/10*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/11*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/12*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/13*/*[sS]pec.js`,
- `${__dirname}/e2e/paths/**/*[sS]pec.js`
- ];
-
- return gulp.src(specFiles).pipe(jasmine({
- errorOnFail: false,
- timeout: 30000,
- config: {
- random: false,
- // TODO: Waiting for this option to be implemented
- // https://github.com/jasmine/jasmine/issues/1533
- stopSpecOnExpectationFailure: false
- },
- reporter: [
- new SpecReporter({
- spec: {
- displayStacktrace: 'none',
- displaySuccessful: true,
- displayFailedSpec: true,
- displaySpecDuration: true,
- },
- summary: {
- displayStacktrace: 'raw',
- displayPending: false
- },
- colors: {
- enabled: true,
- successful: 'brightGreen',
- failed: 'brightRed'
- },
- // stacktrace: {
- // filter: stacktrace => {
- // const lines = stacktrace.split('\n');
- // const filtered = [];
- // for (let i = 1; i < lines.length; i++) {
- // if (/e2e\/paths/.test(lines[i]))
- // filtered.push(lines[i]);
- // }
- // return filtered.join('\n');
- // }
- // }
- })
- ]
- }));
-}
-
-e2e = gulp.series(docker, async function isBackendReady() {
- const attempts = await backendStatus();
- log(`Backend ready after ${attempts} attempt(s)`);
-
- return attempts;
-}, e2eSingleRun);
-e2e.description = `Restarts database and runs the e2e tests`;
-
-async function backendStatus() {
- const milliseconds = 250;
- return new Promise(resolve => {
- let timer;
- let attempts = 1;
- timer = setInterval(async() => {
- try {
- const url = `${e2eConfig.url}/api/Applications/status`;
- const {body} = await got.get(url);
-
- if (body == 'true') {
- clearInterval(timer);
- resolve(attempts);
- } else
- attempts++;
- } catch (error) {
- if (error || attempts > 100) // 250ms * 100 => 25s timeout
- throw new Error('Could not connect to backend');
- }
- }, milliseconds);
- });
-}
-backendStatus.description = `Performs a simple requests to check the backend status`;
-
function install() {
const install = require('gulp-install');
const print = require('gulp-print');
@@ -431,9 +248,6 @@ module.exports = {
back,
backOnly,
backWatch,
- backTest,
- launchBackTest,
- e2e,
i,
install,
build,
@@ -444,6 +258,5 @@ module.exports = {
locales,
localesRoutes,
watch,
- docker,
- backendStatus,
+ docker
};
diff --git a/jest.front.config.js b/jest.front.config.js
index dbea13950..a03c61d11 100644
--- a/jest.front.config.js
+++ b/jest.front.config.js
@@ -47,5 +47,6 @@ module.exports = {
'^.+\\.js?$': 'babel-jest',
'^.+\\.html$': 'html-loader-jest'
},
+ reporters: ['default', 'jest-junit']
};
diff --git a/loopback/common/models/field-acl.json b/loopback/common/models/field-acl.json
index 25ed949b9..a3f74aca2 100644
--- a/loopback/common/models/field-acl.json
+++ b/loopback/common/models/field-acl.json
@@ -9,19 +9,19 @@
"properties": {
"id": {
"id": true,
- "type": "Number"
+ "type": "number"
},
"model": {
- "type": "String"
+ "type": "string"
},
"property":{
- "type": "String"
+ "type": "string"
},
"actionType":{
- "type": "String"
+ "type": "string"
},
"role":{
- "type": "String"
+ "type": "string"
}
}
}
diff --git a/modules/account/back/models/samba-config.json b/modules/account/back/models/samba-config.json
index 1bde4cdb6..732c9b071 100644
--- a/modules/account/back/models/samba-config.json
+++ b/modules/account/back/models/samba-config.json
@@ -29,7 +29,7 @@
"type": "string"
},
"verifyCert": {
- "type": "Boolean"
+ "type": "boolean"
}
}
}
diff --git a/modules/account/back/models/sip-config.json b/modules/account/back/models/sip-config.json
index 088f18224..6c5ba3db3 100644
--- a/modules/account/back/models/sip-config.json
+++ b/modules/account/back/models/sip-config.json
@@ -11,7 +11,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true
}
}
diff --git a/modules/account/back/models/sip.json b/modules/account/back/models/sip.json
index 7a7cb8605..21671f4bf 100644
--- a/modules/account/back/models/sip.json
+++ b/modules/account/back/models/sip.json
@@ -8,7 +8,7 @@
},
"properties": {
"userFk": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "The user id",
"mysql": {
@@ -16,7 +16,7 @@
}
},
"extension": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/claim/back/models/claim-beginning.json b/modules/claim/back/models/claim-beginning.json
index abdae440a..afa21f817 100644
--- a/modules/claim/back/models/claim-beginning.json
+++ b/modules/claim/back/models/claim-beginning.json
@@ -13,12 +13,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"quantity": {
- "type": "Number",
+ "type": "number",
"required": true
}
},
diff --git a/modules/claim/back/models/claim-destination.json b/modules/claim/back/models/claim-destination.json
index 8782fb815..60f948899 100644
--- a/modules/claim/back/models/claim-destination.json
+++ b/modules/claim/back/models/claim-destination.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/claim/back/models/claim-development.json b/modules/claim/back/models/claim-development.json
index 2e8eb2f01..02061fab7 100644
--- a/modules/claim/back/models/claim-development.json
+++ b/modules/claim/back/models/claim-development.json
@@ -12,7 +12,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/modules/claim/back/models/claim-dms.json b/modules/claim/back/models/claim-dms.json
index 9ef964886..a215b6bb7 100644
--- a/modules/claim/back/models/claim-dms.json
+++ b/modules/claim/back/models/claim-dms.json
@@ -17,7 +17,7 @@
],
"properties": {
"dmsFk": {
- "type": "Number",
+ "type": "number",
"id": true,
"required": true
}
diff --git a/modules/claim/back/models/claim-end.json b/modules/claim/back/models/claim-end.json
index d908c252b..12d79f71b 100644
--- a/modules/claim/back/models/claim-end.json
+++ b/modules/claim/back/models/claim-end.json
@@ -12,7 +12,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
}
diff --git a/modules/claim/back/models/claim-log.json b/modules/claim/back/models/claim-log.json
index 28b3f88ec..519cfe1ea 100644
--- a/modules/claim/back/models/claim-log.json
+++ b/modules/claim/back/models/claim-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "Number"
+ "type": "number"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/claim/back/models/claim-ratio.json b/modules/claim/back/models/claim-ratio.json
index 196db72f6..605da98c6 100644
--- a/modules/claim/back/models/claim-ratio.json
+++ b/modules/claim/back/models/claim-ratio.json
@@ -9,23 +9,23 @@
"validateUpsert": true,
"properties": {
"clientFk": {
- "type": "Number",
+ "type": "number",
"id": true
},
"yearSale": {
- "type": "Number"
+ "type": "number"
},
"claimAmount": {
- "type": "Number"
+ "type": "number"
},
"claimingRate": {
- "type": "Number"
+ "type": "number"
},
"priceIncreasing": {
- "type": "Number"
+ "type": "number"
},
"packingRate": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/claim/back/models/claim-reason.json b/modules/claim/back/models/claim-reason.json
index 562acc14e..8d51b8079 100644
--- a/modules/claim/back/models/claim-reason.json
+++ b/modules/claim/back/models/claim-reason.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/claim/back/models/claim-redelivery.json b/modules/claim/back/models/claim-redelivery.json
index 8611a3a44..d153c7a8e 100644
--- a/modules/claim/back/models/claim-redelivery.json
+++ b/modules/claim/back/models/claim-redelivery.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/claim/back/models/claim-responsible.json b/modules/claim/back/models/claim-responsible.json
index 6bd06605b..bdc5df0ec 100644
--- a/modules/claim/back/models/claim-responsible.json
+++ b/modules/claim/back/models/claim-responsible.json
@@ -8,16 +8,16 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
},
"responsability": {
- "type": "Number",
+ "type": "number",
"required": true
}
},
diff --git a/modules/claim/back/models/claim-result.json b/modules/claim/back/models/claim-result.json
index 468f271de..2c9630696 100644
--- a/modules/claim/back/models/claim-result.json
+++ b/modules/claim/back/models/claim-result.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/claim/back/models/claim.json b/modules/claim/back/models/claim.json
index 431290812..a3490ccf4 100644
--- a/modules/claim/back/models/claim.json
+++ b/modules/claim/back/models/claim.json
@@ -12,7 +12,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/modules/client/back/methods/client/specs/updatePortfolio.spec.js b/modules/client/back/methods/client/specs/updatePortfolio.spec.js
index 4830156fc..f56555c08 100644
--- a/modules/client/back/methods/client/specs/updatePortfolio.spec.js
+++ b/modules/client/back/methods/client/specs/updatePortfolio.spec.js
@@ -12,11 +12,13 @@ describe('Client updatePortfolio', () => {
const expectedResult = 841.63;
- await models.Client.rawSql(`UPDATE vn.client SET salesPersonFk = ${salesPersonId} WHERE id = ${clientId}; `);
+ const clientQuery = `UPDATE vn.client SET salesPersonFk = ${salesPersonId} WHERE id = ${clientId}; `;
+ await models.Client.rawSql(clientQuery);
await models.Client.updatePortfolio();
- let [salesPerson] = await models.Client.rawSql(`SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `, null, options);
+ const portfolioQuery = `SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `;
+ const [salesPerson] = await models.Client.rawSql(portfolioQuery, null, options);
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
@@ -26,8 +28,9 @@ describe('Client updatePortfolio', () => {
throw e;
}
});
- // task 3817
- xit('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
+
+ it('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
+ pending('task 3817');
const salesPersonId = 19;
const tx = await models.Client.beginTransaction({});
@@ -40,7 +43,8 @@ describe('Client updatePortfolio', () => {
await models.Client.updatePortfolio();
- let [salesPerson] = await models.Client.rawSql(`SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `, null, options);
+ const portfolioQuery = `SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `;
+ const [salesPerson] = await models.Client.rawSql(portfolioQuery, null, options);
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
diff --git a/modules/client/back/model-config.json b/modules/client/back/model-config.json
index b6bf715b1..4feb3b168 100644
--- a/modules/client/back/model-config.json
+++ b/modules/client/back/model-config.json
@@ -14,6 +14,9 @@
"Client": {
"dataSource": "vn"
},
+ "ClientConfig": {
+ "dataSource": "vn"
+ },
"ClientContact": {
"dataSource": "vn"
},
diff --git a/modules/client/back/models/address-observation.json b/modules/client/back/models/address-observation.json
index 3096c8e5d..2fdb8bc0f 100644
--- a/modules/client/back/models/address-observation.json
+++ b/modules/client/back/models/address-observation.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/modules/client/back/models/address.json b/modules/client/back/models/address.json
index dd533cb32..0dcbbf7fe 100644
--- a/modules/client/back/models/address.json
+++ b/modules/client/back/models/address.json
@@ -14,7 +14,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -43,10 +43,10 @@
"type": "boolean"
},
"longitude": {
- "type": "Number"
+ "type": "number"
},
"latitude": {
- "type": "Number"
+ "type": "number"
},
"isEqualizated": {
"type": "boolean"
diff --git a/modules/client/back/models/client-config.json b/modules/client/back/models/client-config.json
new file mode 100644
index 000000000..90d47333d
--- /dev/null
+++ b/modules/client/back/models/client-config.json
@@ -0,0 +1,22 @@
+{
+ "name": "ClientConfig",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "clientConfig"
+ }
+ },
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "riskTolerance": {
+ "type": "number"
+ },
+ "maxCreditRows": {
+ "type": "number"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/client/back/models/client-contact.json b/modules/client/back/models/client-contact.json
index ea916c072..514ebbf5e 100644
--- a/modules/client/back/models/client-contact.json
+++ b/modules/client/back/models/client-contact.json
@@ -3,34 +3,34 @@
"description": "Client phone contacts",
"base": "Loggable",
"log": {
- "model": "ClientLog",
- "relation": "client",
- "showField": "name"
+ "model": "ClientLog",
+ "relation": "client",
+ "showField": "name"
},
"options": {
- "mysql": {
- "table": "clientContact"
- }
+ "mysql": {
+ "table": "clientContact"
+ }
},
"validateUpsert": true,
"properties": {
- "id": {
- "type": "Number",
- "id": true,
- "description": "Identifier"
- },
- "name": {
- "type": "string"
- },
- "phone": {
- "type": "string"
- }
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "name": {
+ "type": "string"
+ },
+ "phone": {
+ "type": "string"
+ }
},
"relations": {
- "client": {
- "type": "belongsTo",
- "model": "Client",
- "foreignKey": "clientFk"
- }
+ "client": {
+ "type": "belongsTo",
+ "model": "Client",
+ "foreignKey": "clientFk"
+ }
}
- }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/modules/client/back/models/client-credit-limit.json b/modules/client/back/models/client-credit-limit.json
index 5263fb94b..740f0cf53 100644
--- a/modules/client/back/models/client-credit-limit.json
+++ b/modules/client/back/models/client-credit-limit.json
@@ -1,26 +1,26 @@
{
- "name": "ClientCreditLimit",
- "base": "VnModel",
- "options": {
- "mysql": {
- "table": "clientCreditLimit"
- }
- },
- "properties": {
- "id": {
- "type": "Number",
- "id": true,
- "description": "Identifier"
+ "name": "ClientCreditLimit",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "clientCreditLimit"
+ }
},
- "maxAmount": {
- "type": "Number"
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "maxAmount": {
+ "type": "number"
+ }
+ },
+ "relations": {
+ "role": {
+ "type": "belongsTo",
+ "model": "Role",
+ "foreignKey": "roleFk"
+ }
}
- },
- "relations": {
- "role": {
- "type": "belongsTo",
- "model": "Role",
- "foreignKey": "roleFk"
- }
- }
}
\ No newline at end of file
diff --git a/modules/client/back/models/client-credit.js b/modules/client/back/models/client-credit.js
new file mode 100644
index 000000000..01fe8214a
--- /dev/null
+++ b/modules/client/back/models/client-credit.js
@@ -0,0 +1,23 @@
+module.exports = Self => {
+ Self.observe('after save', async ctx => {
+ const instance = ctx.instance;
+ const models = Self.app.models;
+
+ const clientConfig = await models.ClientConfig.findOne();
+ const maxCreditRows = clientConfig.maxCreditRows;
+
+ const clientCredit = await models.ClientCredit.find({
+ where: {clientFk: instance.clientFk},
+ order: 'created DESC',
+ limit: maxCreditRows
+ }, ctx.options);
+
+ const lastCredit = clientCredit[maxCreditRows - 1];
+ if (lastCredit) {
+ await models.ClientCredit.destroyAll({
+ clientFk: instance.clientFk,
+ created: {lt: lastCredit.created}
+ }, ctx.options);
+ }
+ });
+};
diff --git a/modules/client/back/models/client-credit.json b/modules/client/back/models/client-credit.json
index 2b71fbe2d..b92639b80 100644
--- a/modules/client/back/models/client-credit.json
+++ b/modules/client/back/models/client-credit.json
@@ -1,36 +1,36 @@
{
- "name": "ClientCredit",
- "description": "Log of credit changes",
- "base": "VnModel",
- "options": {
- "mysql": {
- "table": "clientCredit"
- }
- },
- "validateUpsert": true,
- "properties": {
- "id": {
- "type": "Number",
- "id": true,
- "description": "Identifier"
+ "name": "ClientCredit",
+ "description": "Log of credit changes",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "clientCredit"
+ }
},
- "amount": {
- "type": "Number"
+ "validateUpsert": true,
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "amount": {
+ "type": "number"
+ },
+ "created": {
+ "type": "date"
+ }
},
- "created": {
- "type": "date"
+ "relations": {
+ "client": {
+ "type": "belongsTo",
+ "model": "Client",
+ "foreignKey": "clientFk"
+ },
+ "worker": {
+ "type": "belongsTo",
+ "model": "Worker",
+ "foreignKey": "workerFk"
+ }
}
- },
- "relations": {
- "client": {
- "type": "belongsTo",
- "model": "Client",
- "foreignKey": "clientFk"
- },
- "worker": {
- "type": "belongsTo",
- "model": "Worker",
- "foreignKey": "workerFk"
- }
- }
}
\ No newline at end of file
diff --git a/modules/client/back/models/client-dms.json b/modules/client/back/models/client-dms.json
index 28ad21917..88b4349df 100644
--- a/modules/client/back/models/client-dms.json
+++ b/modules/client/back/models/client-dms.json
@@ -13,12 +13,12 @@
},
"properties": {
"dmsFk": {
- "type": "Number",
+ "type": "number",
"id": true,
"required": true
},
"clientFk": {
- "type": "Number",
+ "type": "number",
"required": true
}
},
diff --git a/modules/client/back/models/client-log.json b/modules/client/back/models/client-log.json
index 50c892e85..9c0933c0c 100644
--- a/modules/client/back/models/client-log.json
+++ b/modules/client/back/models/client-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "Number"
+ "type": "number"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/client/back/models/client-observation.json b/modules/client/back/models/client-observation.json
index a9c7b483a..d3059377d 100644
--- a/modules/client/back/models/client-observation.json
+++ b/modules/client/back/models/client-observation.json
@@ -13,12 +13,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"clientFk": {
- "type": "Number"
+ "type": "number"
},
"text": {
"type": "string",
diff --git a/modules/client/back/models/client-risk.json b/modules/client/back/models/client-risk.json
index f76483fca..eac36affb 100644
--- a/modules/client/back/models/client-risk.json
+++ b/modules/client/back/models/client-risk.json
@@ -2,22 +2,22 @@
"name": "ClientRisk",
"base": "VnModel",
"options": {
- "mysql": {
- "table": "clientRisk"
- }
+ "mysql": {
+ "table": "clientRisk"
+ }
},
"properties": {
- "clientFk": {
- "type": "Number",
- "id": true
- },
- "companyFk": {
- "type": "Number",
- "id": true
- },
- "amount": {
- "type": "Number"
- }
+ "clientFk": {
+ "type": "number",
+ "id": true
+ },
+ "companyFk": {
+ "type": "number",
+ "id": true
+ },
+ "amount": {
+ "type": "number"
+ }
},
"relations": {
"client": {
@@ -31,4 +31,4 @@
"foreignKey": "companyFk"
}
}
- }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/modules/client/back/models/client-sample.json b/modules/client/back/models/client-sample.json
index 812da8be8..920758217 100644
--- a/modules/client/back/models/client-sample.json
+++ b/modules/client/back/models/client-sample.json
@@ -14,7 +14,7 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"created": {
diff --git a/modules/client/back/models/client-type.json b/modules/client/back/models/client-type.json
index a91cc38b6..eeae845eb 100644
--- a/modules/client/back/models/client-type.json
+++ b/modules/client/back/models/client-type.json
@@ -8,17 +8,17 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true
},
"code": {
- "type": "String"
+ "type": "string"
},
"type": {
- "type": "String"
+ "type": "string"
},
"isCreatedAsServed": {
- "type": "Number"
+ "type": "number"
}
}
}
\ No newline at end of file
diff --git a/modules/client/back/models/client-unpaid.json b/modules/client/back/models/client-unpaid.json
index a3d1a684c..0fc3a9195 100644
--- a/modules/client/back/models/client-unpaid.json
+++ b/modules/client/back/models/client-unpaid.json
@@ -2,21 +2,21 @@
"name": "ClientUnpaid",
"base": "VnModel",
"options": {
- "mysql": {
- "table": "clientUnpaid"
- }
+ "mysql": {
+ "table": "clientUnpaid"
+ }
},
"properties": {
- "clientFk": {
- "type": "number",
- "id": true
- },
- "dated": {
- "type": "date"
- },
- "amount": {
- "type": "Number"
- }
+ "clientFk": {
+ "type": "number",
+ "id": true
+ },
+ "dated": {
+ "type": "date"
+ },
+ "amount": {
+ "type": "number"
+ }
},
"relations": {
"client": {
diff --git a/modules/client/back/models/client.json b/modules/client/back/models/client.json
index 6404cfba0..b9951e8bb 100644
--- a/modules/client/back/models/client.json
+++ b/modules/client/back/models/client.json
@@ -12,7 +12,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -55,16 +55,16 @@
"type": "boolean"
},
"credit": {
- "type": "Number"
+ "type": "number"
},
"creditInsurance": {
- "type": "Number"
+ "type": "number"
},
"iban": {
"type": "string"
},
"dueDay": {
- "type": "Number"
+ "type": "number"
},
"isEqualizated": {
"type": "boolean",
@@ -105,7 +105,7 @@
"type": "boolean"
},
"quality": {
- "type": "Number"
+ "type": "number"
},
"isVies": {
"type": "boolean"
@@ -117,7 +117,7 @@
"type": "string"
},
"created": {
- "type": "Date"
+ "type": "date"
},
"sageTaxTypeFk": {
"type": "number",
diff --git a/modules/client/back/models/contact-channel.json b/modules/client/back/models/contact-channel.json
index 3a5de2140..75151b9f9 100644
--- a/modules/client/back/models/contact-channel.json
+++ b/modules/client/back/models/contact-channel.json
@@ -1,20 +1,20 @@
{
- "name": "ContactChannel",
- "base": "VnModel",
- "options": {
- "mysql": {
- "table": "contactChannel"
- }
- },
- "properties": {
- "id": {
- "type": "Number",
- "id": true,
- "description": "Identifier"
+ "name": "ContactChannel",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "contactChannel"
+ }
},
- "name": {
- "type": "string",
- "required": true
+ "properties": {
+ "id": {
+ "type": "number",
+ "id": true,
+ "description": "Identifier"
+ },
+ "name": {
+ "type": "string",
+ "required": true
+ }
}
- }
}
\ No newline at end of file
diff --git a/modules/client/back/models/credit-classification.json b/modules/client/back/models/credit-classification.json
index 2e636af63..543f8359e 100644
--- a/modules/client/back/models/credit-classification.json
+++ b/modules/client/back/models/credit-classification.json
@@ -1,42 +1,42 @@
{
- "name": "CreditClassification",
- "description": "Clasified clients",
- "base": "VnModel",
- "options": {
- "mysql": {
- "table": "creditClassification"
- }
- },
- "properties": {
- "id": {
- "id": true,
- "type": "Number",
- "description": "Identifier"
+ "name": "CreditClassification",
+ "description": "Clasified clients",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "creditClassification"
+ }
},
- "started": {
- "type": "date",
- "required": true,
- "mysql": {
- "columnName": "dateStart"
- }
+ "properties": {
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "started": {
+ "type": "date",
+ "required": true,
+ "mysql": {
+ "columnName": "dateStart"
+ }
+ },
+ "finished": {
+ "type": "date",
+ "mysql": {
+ "columnName": "dateEnd"
+ }
+ }
},
- "finished": {
- "type": "date",
- "mysql": {
- "columnName": "dateEnd"
- }
+ "relations": {
+ "customer": {
+ "type": "belongsTo",
+ "model": "Client",
+ "foreignKey": "client"
+ },
+ "insurances": {
+ "type": "hasMany",
+ "model": "CreditInsurance",
+ "foreignKey": "creditClassification"
+ }
}
- },
- "relations": {
- "customer": {
- "type": "belongsTo",
- "model": "Client",
- "foreignKey": "client"
- },
- "insurances": {
- "type": "hasMany",
- "model": "CreditInsurance",
- "foreignKey": "creditClassification"
- }
- }
-}
+}
\ No newline at end of file
diff --git a/modules/client/back/models/credit-insurance.json b/modules/client/back/models/credit-insurance.json
index 6a9d04677..db4154978 100644
--- a/modules/client/back/models/credit-insurance.json
+++ b/modules/client/back/models/credit-insurance.json
@@ -10,11 +10,11 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"credit": {
- "type": "Number"
+ "type": "number"
},
"created": {
"type": "date",
@@ -23,7 +23,7 @@
}
},
"grade": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/client/back/models/customs-agent.json b/modules/client/back/models/customs-agent.json
index f72d7bf28..3a2e0258f 100644
--- a/modules/client/back/models/customs-agent.json
+++ b/modules/client/back/models/customs-agent.json
@@ -8,26 +8,26 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"description": "Identifier",
"id": true
},
"fiscalName": {
- "type": "String",
+ "type": "string",
"required": true
},
"street": {
- "type": "String"
+ "type": "string"
},
"nif": {
- "type": "String",
+ "type": "string",
"required": true
},
"phone": {
- "type": "String"
+ "type": "string"
},
"email": {
- "type": "String"
+ "type": "string"
}
}
}
\ No newline at end of file
diff --git a/modules/client/back/models/greuge-config.json b/modules/client/back/models/greuge-config.json
index b72348023..1ba66668d 100644
--- a/modules/client/back/models/greuge-config.json
+++ b/modules/client/back/models/greuge-config.json
@@ -8,7 +8,7 @@
},
"properties": {
"freightPickUpPrice": {
- "type": "Number"
+ "type": "number"
}
},
"acls": [{
diff --git a/modules/client/back/models/greuge-type.json b/modules/client/back/models/greuge-type.json
index 5c5b1870d..36b14e147 100644
--- a/modules/client/back/models/greuge-type.json
+++ b/modules/client/back/models/greuge-type.json
@@ -9,14 +9,14 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
},
"code": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/client/back/models/greuge.json b/modules/client/back/models/greuge.json
index 2abc33f7c..918ff0ca5 100644
--- a/modules/client/back/models/greuge.json
+++ b/modules/client/back/models/greuge.json
@@ -14,15 +14,15 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
},
"amount": {
- "type": "Number",
+ "type": "number",
"required": true
},
"shipped": {
@@ -32,7 +32,7 @@
"type": "date"
},
"greugeTypeFk": {
- "type": "Number",
+ "type": "number",
"required": true
}
diff --git a/modules/client/back/models/incoterms.json b/modules/client/back/models/incoterms.json
index 915a5b59a..fdf743c14 100644
--- a/modules/client/back/models/incoterms.json
+++ b/modules/client/back/models/incoterms.json
@@ -8,12 +8,12 @@
},
"properties": {
"code": {
- "type": "String",
+ "type": "string",
"description": "Identifier",
"id": true
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/client/back/models/mandate-type.json b/modules/client/back/models/mandate-type.json
index 8bd46ce19..ec189f089 100644
--- a/modules/client/back/models/mandate-type.json
+++ b/modules/client/back/models/mandate-type.json
@@ -9,11 +9,11 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
}
}
}
\ No newline at end of file
diff --git a/modules/client/back/models/mandate.json b/modules/client/back/models/mandate.json
index a671c45f1..914b23ce2 100644
--- a/modules/client/back/models/mandate.json
+++ b/modules/client/back/models/mandate.json
@@ -9,11 +9,11 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"code": {
- "type": "String"
+ "type": "string"
},
"created": {
"type": "date"
diff --git a/modules/client/back/models/observation-type.json b/modules/client/back/models/observation-type.json
index 5a7bdcfdd..474c5faac 100644
--- a/modules/client/back/models/observation-type.json
+++ b/modules/client/back/models/observation-type.json
@@ -9,15 +9,15 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
},
"code": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/client/back/models/pay-method.json b/modules/client/back/models/pay-method.json
index 4080a0953..c83c21e2f 100644
--- a/modules/client/back/models/pay-method.json
+++ b/modules/client/back/models/pay-method.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -23,7 +23,7 @@
"type": "string"
},
"outstandingDebt": {
- "type": "Number"
+ "type": "number"
},
"isIbanRequiredForClients": {
"type": "boolean"
diff --git a/modules/client/back/models/recovery.json b/modules/client/back/models/recovery.json
index 5a26cd842..de4183924 100644
--- a/modules/client/back/models/recovery.json
+++ b/modules/client/back/models/recovery.json
@@ -2,40 +2,40 @@
"name": "Recovery",
"base": "Loggable",
"log": {
- "model": "ClientLog",
- "relation": "client"
+ "model": "ClientLog",
+ "relation": "client"
},
"options": {
- "mysql": {
- "table": "recovery"
- }
+ "mysql": {
+ "table": "recovery"
+ }
},
"properties": {
- "id": {
- "id": true,
- "type": "Number",
- "description": "Identifier"
- },
- "started": {
- "type": "date",
- "required": true
- },
- "finished": {
- "type": "date"
- },
- "amount": {
- "type": "Number",
- "required": true
- },
- "period": {
- "type": "Number"
- }
+ "id": {
+ "id": true,
+ "type": "number",
+ "description": "Identifier"
+ },
+ "started": {
+ "type": "date",
+ "required": true
+ },
+ "finished": {
+ "type": "date"
+ },
+ "amount": {
+ "type": "number",
+ "required": true
+ },
+ "period": {
+ "type": "number"
+ }
},
"relations": {
- "client": {
- "type": "belongsTo",
- "model": "Client",
- "foreignKey": "clientFk"
- }
+ "client": {
+ "type": "belongsTo",
+ "model": "Client",
+ "foreignKey": "clientFk"
+ }
}
- }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/modules/client/back/models/sage-tax-type.json b/modules/client/back/models/sage-tax-type.json
index b60ef20cd..97af7353c 100644
--- a/modules/client/back/models/sage-tax-type.json
+++ b/modules/client/back/models/sage-tax-type.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier",
"mysql": {
diff --git a/modules/client/back/models/sage-transaction-type.json b/modules/client/back/models/sage-transaction-type.json
index dbe8f3b39..1903c650c 100644
--- a/modules/client/back/models/sage-transaction-type.json
+++ b/modules/client/back/models/sage-transaction-type.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier",
"mysql": {
diff --git a/modules/client/back/models/sms-config.json b/modules/client/back/models/sms-config.json
index f48c6198d..ba78e4a8d 100644
--- a/modules/client/back/models/sms-config.json
+++ b/modules/client/back/models/sms-config.json
@@ -9,18 +9,18 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"uri": {
- "type": "String"
+ "type": "string"
},
"apiKey": {
- "type": "String"
+ "type": "string"
},
"title": {
- "type": "String"
+ "type": "string"
}
}
}
diff --git a/modules/client/back/models/sms.json b/modules/client/back/models/sms.json
index e6e6ff64c..29438fc67 100644
--- a/modules/client/back/models/sms.json
+++ b/modules/client/back/models/sms.json
@@ -9,30 +9,30 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"sender": {
- "type": "String",
+ "type": "string",
"required": true
},
"destination": {
- "type": "String",
+ "type": "string",
"required": true
},
"message": {
- "type": "String",
+ "type": "string",
"required": true
},
"statusCode": {
- "type": "Number"
+ "type": "number"
},
"status": {
- "type": "String"
+ "type": "string"
},
"created": {
- "type": "Date"
+ "type": "date"
}
},
"relations": {
diff --git a/modules/client/back/models/specs/address.spec.js b/modules/client/back/models/specs/address.spec.js
index 81af6ee28..f0b421d35 100644
--- a/modules/client/back/models/specs/address.spec.js
+++ b/modules/client/back/models/specs/address.spec.js
@@ -14,7 +14,7 @@ describe('loopback model address', () => {
}
};
- beforeEach(() => {
+ beforeAll(() => {
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
active: activeCtx
});
diff --git a/modules/client/back/models/specs/clientCredit.spec.js b/modules/client/back/models/specs/clientCredit.spec.js
new file mode 100644
index 000000000..fcd86c979
--- /dev/null
+++ b/modules/client/back/models/specs/clientCredit.spec.js
@@ -0,0 +1,53 @@
+const models = require('vn-loopback/server/server').models;
+
+describe('Client Credit', () => {
+ const instance = {id: 1101, name: 'Bruce Banner'};
+
+ describe('after save', () => {
+ it('should delete old rows of clientCredit', async() => {
+ const tx = await models.ClientCredit.beginTransaction({});
+ const clientConfig = await models.ClientConfig.findOne({
+ where: {id: 1}
+ });
+
+ let rowsBefore;
+ let rowsAfter;
+
+ try {
+ const options = {transaction: tx};
+ const salesAssistant = await models.Account.findOne({
+ where: {name: 'salesAssistant'}
+ }, options);
+
+ rowsBefore = await models.ClientCredit.find({
+ where: {clientFk: instance.id},
+ order: 'created DESC',
+ }, options);
+
+ await models.ClientCredit.create({
+ amount: 355,
+ clientFk: instance.id,
+ workerFk: salesAssistant.id
+ }, options);
+
+ rowsAfter = await models.ClientCredit.find({
+ where: {clientFk: instance.id},
+ order: 'created DESC',
+ }, options);
+
+ await tx.rollback();
+ } catch (e) {
+ await tx.rollback();
+ throw e;
+ }
+
+ const FirstRowsBefore = rowsBefore[0];
+ const FirstRowsAfter = rowsAfter[0];
+
+ expect(FirstRowsAfter.id).toBeGreaterThan(FirstRowsBefore.id);
+
+ expect(rowsBefore.length).toBeGreaterThanOrEqual(clientConfig.maxCreditRows);
+ expect(rowsAfter.length).toEqual(clientConfig.maxCreditRows);
+ });
+ });
+});
diff --git a/modules/client/back/models/tpv-error.json b/modules/client/back/models/tpv-error.json
index 61e2a7156..d62203f40 100644
--- a/modules/client/back/models/tpv-error.json
+++ b/modules/client/back/models/tpv-error.json
@@ -8,7 +8,7 @@
},
"properties": {
"code": {
- "type": "String",
+ "type": "string",
"id": true,
"description": "Identifier"
},
diff --git a/modules/client/back/models/tpv-merchant.json b/modules/client/back/models/tpv-merchant.json
index db5c937d8..d4dba6cb1 100644
--- a/modules/client/back/models/tpv-merchant.json
+++ b/modules/client/back/models/tpv-merchant.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/modules/client/back/models/tpv-response.json b/modules/client/back/models/tpv-response.json
index d3a382b5f..674ba434c 100644
--- a/modules/client/back/models/tpv-response.json
+++ b/modules/client/back/models/tpv-response.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
diff --git a/modules/client/back/models/tpv-transaction.json b/modules/client/back/models/tpv-transaction.json
index 011616d98..2d926cc40 100644
--- a/modules/client/back/models/tpv-transaction.json
+++ b/modules/client/back/models/tpv-transaction.json
@@ -8,33 +8,33 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"merchantFk": {
- "type": "Number"
+ "type": "number"
},
"clientFk": {
- "type": "Number"
+ "type": "number"
},
"receiptFk": {
- "type": "Number"
+ "type": "number"
},
"amount": {
- "type": "Number"
+ "type": "number"
},
"response": {
- "type": "Number"
+ "type": "number"
},
"errorCode": {
- "type": "String"
+ "type": "string"
},
"status": {
- "type": "String"
+ "type": "string"
},
"created": {
- "type": "Date"
+ "type": "date"
}
},
"relations": {
diff --git a/modules/entry/back/methods/entry/specs/importBuysPreview.spec.js b/modules/entry/back/methods/entry/specs/importBuysPreview.spec.js
index edfdac988..41971a64c 100644
--- a/modules/entry/back/methods/entry/specs/importBuysPreview.spec.js
+++ b/modules/entry/back/methods/entry/specs/importBuysPreview.spec.js
@@ -1,5 +1,6 @@
const models = require('vn-loopback/server/server').models;
const LoopBackContext = require('loopback-context');
+const activeCtx = {accessToken: {userId: 9}};
describe('entry importBuysPreview()', () => {
const entryId = 1;
diff --git a/modules/entry/back/models/entry-log.json b/modules/entry/back/models/entry-log.json
index c63a55d9e..6f8edaf25 100644
--- a/modules/entry/back/models/entry-log.json
+++ b/modules/entry/back/models/entry-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "String"
+ "type": "string"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/entry/back/models/entry-observation.json b/modules/entry/back/models/entry-observation.json
index 535735d83..0c63dd663 100644
--- a/modules/entry/back/models/entry-observation.json
+++ b/modules/entry/back/models/entry-observation.json
@@ -13,11 +13,11 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/invoiceIn/front/dueDay/index.html b/modules/invoiceIn/front/dueDay/index.html
index 579ef3609..1a1935e72 100644
--- a/modules/invoiceIn/front/dueDay/index.html
+++ b/modules/invoiceIn/front/dueDay/index.html
@@ -25,6 +25,9 @@
ng-model="invoiceInDueDay.bankFk"
url="Banks"
show-field="bank"
+ select-fields="['id','bank']"
+ order="id"
+ search-function="$ctrl.bankSearchFunc($search)"
rule>
{{id}}: {{bank}}
diff --git a/modules/invoiceIn/front/dueDay/index.js b/modules/invoiceIn/front/dueDay/index.js
index 22b697f7e..3cc1c81e8 100644
--- a/modules/invoiceIn/front/dueDay/index.js
+++ b/modules/invoiceIn/front/dueDay/index.js
@@ -17,6 +17,12 @@ class Controller extends Section {
this.card.reload();
});
}
+
+ bankSearchFunc($search) {
+ return /^\d+$/.test($search)
+ ? {id: $search}
+ : {bank: {like: '%' + $search + '%'}};
+ }
}
ngModule.vnComponent('vnInvoiceInDueDay', {
diff --git a/modules/invoiceIn/front/tax/index.html b/modules/invoiceIn/front/tax/index.html
index c495d44d2..acc9cf492 100644
--- a/modules/invoiceIn/front/tax/index.html
+++ b/modules/invoiceIn/front/tax/index.html
@@ -33,6 +33,13 @@
show-field="id"
rule>
{{id}}: {{name}}
+
+
+
+
-
\ No newline at end of file
+
+
+
+
+
+
+ {{$ctrl.$t('New expense')}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/modules/invoiceIn/front/tax/index.js b/modules/invoiceIn/front/tax/index.js
index 53cfc5598..d05a77f29 100644
--- a/modules/invoiceIn/front/tax/index.js
+++ b/modules/invoiceIn/front/tax/index.js
@@ -1,7 +1,12 @@
import ngModule from '../module';
import Section from 'salix/components/section';
+import UserError from 'core/lib/user-error';
class Controller extends Section {
+ constructor($element, $, vnWeekDays) {
+ super($element, $);
+ this.expense = {};
+ }
taxRate(invoiceInTax, taxRateSelection) {
const taxTypeSage = taxRateSelection && taxRateSelection.rate;
const taxableBase = invoiceInTax && invoiceInTax.taxableBase;
@@ -26,6 +31,27 @@ class Controller extends Section {
this.card.reload();
});
}
+
+ onResponse() {
+ try {
+ if (!this.expense.code)
+ throw new Error(`The code can't be empty`);
+ if (!this.expense.description)
+ throw new UserError(`The description can't be empty`);
+
+ const data = [{
+ id: this.expense.code,
+ isWithheld: this.expense.isWithheld,
+ name: this.expense.description
+ }];
+
+ this.$http.post(`Expenses`, data) .then(() => {
+ this.vnApp.showSuccess(this.$t('Expense saved!'));
+ });
+ } catch (e) {
+ this.vnApp.showError(this.$t(e.message));
+ }
+ }
}
ngModule.vnComponent('vnInvoiceInTax', {
diff --git a/modules/invoiceIn/front/tax/index.spec.js b/modules/invoiceIn/front/tax/index.spec.js
index 20d5d40d8..c62ada9ca 100644
--- a/modules/invoiceIn/front/tax/index.spec.js
+++ b/modules/invoiceIn/front/tax/index.spec.js
@@ -1,16 +1,19 @@
import './index.js';
import watcher from 'core/mocks/watcher';
import crudModel from 'core/mocks/crud-model';
+const UserError = require('vn-loopback/util/user-error');
describe('InvoiceIn', () => {
describe('Component tax', () => {
let controller;
let $scope;
let vnApp;
+ let $httpBackend;
beforeEach(ngModule('invoiceIn'));
- beforeEach(inject(($componentController, $rootScope, _vnApp_) => {
+ beforeEach(inject(($componentController, $rootScope, _vnApp_, _$httpBackend_) => {
+ $httpBackend = _$httpBackend_;
vnApp = _vnApp_;
jest.spyOn(vnApp, 'showError');
$scope = $rootScope.$new();
@@ -19,6 +22,7 @@ describe('InvoiceIn', () => {
const $element = angular.element('');
controller = $componentController('vnInvoiceInTax', {$element, $scope});
+ controller.$.model = crudModel;
controller.invoiceIn = {id: 1};
}));
@@ -55,5 +59,56 @@ describe('InvoiceIn', () => {
expect(controller.card.reload).toHaveBeenCalledWith();
});
});
+
+ describe('onResponse()', () => {
+ it('should return success message', () => {
+ controller.expense = {
+ code: 7050000005,
+ isWithheld: 0,
+ description: 'Test'
+ };
+
+ const data = [{
+ id: controller.expense.code,
+ isWithheld: controller.expense.isWithheld,
+ name: controller.expense.description
+ }];
+
+ jest.spyOn(controller.vnApp, 'showSuccess');
+ $httpBackend.expect('POST', `Expenses`, data).respond();
+
+ controller.onResponse();
+ $httpBackend.flush();
+
+ expect(controller.vnApp.showSuccess).toHaveBeenCalledWith('Expense saved!');
+ });
+
+ it('should return an error if code is empty', () => {
+ controller.expense = {
+ code: null,
+ isWithheld: 0,
+ description: 'Test'
+ };
+
+ jest.spyOn(controller.vnApp, 'showError');
+ controller.onResponse();
+
+ expect(controller.vnApp.showError).toHaveBeenCalledWith(`The code can't be empty`);
+ });
+
+ it('should return an error if description is empty', () => {
+ controller.expense = {
+ code: 7050000005,
+ isWithheld: 0,
+ description: null
+ };
+
+ jest.spyOn(controller.vnApp, 'showError');
+ controller.onResponse();
+
+ expect(controller.vnApp.showError).toHaveBeenCalledWith(`The description can't be empty`);
+ });
+ });
});
});
+
diff --git a/modules/invoiceIn/front/tax/locale/es.yml b/modules/invoiceIn/front/tax/locale/es.yml
new file mode 100644
index 000000000..3ff68ea40
--- /dev/null
+++ b/modules/invoiceIn/front/tax/locale/es.yml
@@ -0,0 +1,7 @@
+Create expense: Crear gasto
+New expense: Nuevo gasto
+It's a withholding: Es una retención
+The fields can't be empty: Los campos no pueden estar vacíos
+The code can't be empty: El código no puede estar vacío
+The description can't be empty: La descripción no puede estar vacía
+Expense saved!: Gasto guardado!
\ No newline at end of file
diff --git a/modules/invoiceOut/back/models/invoice-out.json b/modules/invoiceOut/back/models/invoice-out.json
index 45c4c2774..2bf5182e8 100644
--- a/modules/invoiceOut/back/models/invoice-out.json
+++ b/modules/invoiceOut/back/models/invoice-out.json
@@ -9,21 +9,21 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"description": "Identifier"
},
"ref": {
- "type": "String",
+ "type": "string",
"required": true
},
"serial": {
- "type": "String"
+ "type": "string"
},
"issued": {
"type": "date"
},
"amount": {
- "type": "Number"
+ "type": "number"
},
"created": {
"type": "date"
@@ -35,7 +35,7 @@
"type": "date"
},
"hasPdf": {
- "type": "Boolean"
+ "type": "boolean"
}
},
"relations": {
diff --git a/modules/invoiceOut/back/models/tax-class.json b/modules/invoiceOut/back/models/tax-class.json
index fa5676466..a259b874a 100644
--- a/modules/invoiceOut/back/models/tax-class.json
+++ b/modules/invoiceOut/back/models/tax-class.json
@@ -8,16 +8,16 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"description": "Identifier",
"id": true
},
"description": {
- "type": "String",
+ "type": "string",
"required": true
},
"code": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/invoiceOut/back/models/tax-code.json b/modules/invoiceOut/back/models/tax-code.json
index dfd69139e..b515ca334 100644
--- a/modules/invoiceOut/back/models/tax-code.json
+++ b/modules/invoiceOut/back/models/tax-code.json
@@ -8,7 +8,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -16,7 +16,7 @@
"type": "date"
},
"code": {
- "type": "String"
+ "type": "string"
},
"rate": {
"type": "number"
@@ -25,10 +25,10 @@
"type": "number"
},
"type": {
- "type": "String"
+ "type": "string"
},
"isActive": {
- "type": "Boolean"
+ "type": "boolean"
}
},
"relations": {
diff --git a/modules/invoiceOut/back/models/tax-type.json b/modules/invoiceOut/back/models/tax-type.json
index 4e30446b0..46a73835d 100644
--- a/modules/invoiceOut/back/models/tax-type.json
+++ b/modules/invoiceOut/back/models/tax-type.json
@@ -8,21 +8,21 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"nickname": {
- "type": "String"
+ "type": "string"
},
"serial": {
- "type": "String"
+ "type": "string"
},
"TIPOOPE": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/item/back/models/expense.json b/modules/item/back/models/expense.json
index 65af02013..368876fbe 100644
--- a/modules/item/back/models/expense.json
+++ b/modules/item/back/models/expense.json
@@ -13,13 +13,10 @@
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
},
"isWithheld": {
"type": "number"
- },
- "taxTypeFk": {
- "type": "number"
}
},
"relations": {
@@ -28,13 +25,5 @@
"model": "TaxType",
"foreignKey": "taxTypeFk"
}
- },
- "acls": [
- {
- "accessType": "READ",
- "principalType": "ROLE",
- "principalId": "$everyone",
- "permission": "ALLOW"
- }
- ]
+ }
}
\ No newline at end of file
diff --git a/modules/item/back/models/genus.json b/modules/item/back/models/genus.json
index f18d8e4ae..007454130 100644
--- a/modules/item/back/models/genus.json
+++ b/modules/item/back/models/genus.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/item/back/models/ink.json b/modules/item/back/models/ink.json
index a3cd857bf..6a39daafe 100644
--- a/modules/item/back/models/ink.json
+++ b/modules/item/back/models/ink.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "String",
+ "type": "string",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
},
"showOrder": {
"type": "number"
diff --git a/modules/item/back/models/item-barcode.json b/modules/item/back/models/item-barcode.json
index b9de53dd1..e2ce347cb 100644
--- a/modules/item/back/models/item-barcode.json
+++ b/modules/item/back/models/item-barcode.json
@@ -13,12 +13,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"code": {
- "type": "String",
+ "type": "string",
"required": true
}
},
diff --git a/modules/item/back/models/item-botanical.json b/modules/item/back/models/item-botanical.json
index 6c465f0ee..8d8fd389f 100644
--- a/modules/item/back/models/item-botanical.json
+++ b/modules/item/back/models/item-botanical.json
@@ -12,7 +12,7 @@
},
"properties": {
"itemFk": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
}
diff --git a/modules/item/back/models/item-log.json b/modules/item/back/models/item-log.json
index c52931193..633a8f86b 100644
--- a/modules/item/back/models/item-log.json
+++ b/modules/item/back/models/item-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "Number"
+ "type": "number"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/item/back/models/item-placement.json b/modules/item/back/models/item-placement.json
index 7bbb2dc91..0c036ef14 100644
--- a/modules/item/back/models/item-placement.json
+++ b/modules/item/back/models/item-placement.json
@@ -8,17 +8,17 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true
},
"code": {
- "type": "String"
+ "type": "string"
},
"itemFk": {
- "type": "Number"
+ "type": "number"
},
"warehouseFk": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/item/back/models/item-shelving-sale.json b/modules/item/back/models/item-shelving-sale.json
index 04f505ddd..8b89a7597 100644
--- a/modules/item/back/models/item-shelving-sale.json
+++ b/modules/item/back/models/item-shelving-sale.json
@@ -8,15 +8,15 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"quantity": {
- "type": "Number"
+ "type": "number"
},
"created": {
- "type": "Date"
+ "type": "date"
}
},
"relations": {
diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json
index f0391c565..951a4553a 100644
--- a/modules/item/back/models/item-shelving.json
+++ b/modules/item/back/models/item-shelving.json
@@ -8,27 +8,27 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"shelve": {
- "type": "String"
+ "type": "string"
},
"shelvingFk": {
- "type": "String"
+ "type": "string"
},
"itemFk": {
- "type": "Number"
+ "type": "number"
},
"deep": {
- "type": "Number"
+ "type": "number"
},
"quantity": {
- "type": "Number"
+ "type": "number"
},
"created": {
- "type": "Date"
+ "type": "date"
}
},
"relations": {
diff --git a/modules/item/back/models/item-tag.json b/modules/item/back/models/item-tag.json
index 6beeb29d3..5660b3628 100644
--- a/modules/item/back/models/item-tag.json
+++ b/modules/item/back/models/item-tag.json
@@ -13,23 +13,23 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"value": {
- "type": "String"
+ "type": "string"
},
"itemFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"tagFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"priority": {
- "type": "Number",
+ "type": "number",
"required": true
}
},
diff --git a/modules/item/back/models/item-tax-country.json b/modules/item/back/models/item-tax-country.json
index 24c621518..f10a9eb72 100644
--- a/modules/item/back/models/item-tax-country.json
+++ b/modules/item/back/models/item-tax-country.json
@@ -13,21 +13,21 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"effectived": {
- "type": "Boolean"
+ "type": "boolean"
},
"itemFk": {
- "type": "Number"
+ "type": "number"
},
"countryFk": {
- "type": "Number"
+ "type": "number"
},
"taxClassFk": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/item/back/models/item-type-tag.json b/modules/item/back/models/item-type-tag.json
index ca374e00e..8c4d50a07 100644
--- a/modules/item/back/models/item-type-tag.json
+++ b/modules/item/back/models/item-type-tag.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"priority": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/item/back/models/producer.json b/modules/item/back/models/producer.json
index 81a36f8d1..593a172b5 100644
--- a/modules/item/back/models/producer.json
+++ b/modules/item/back/models/producer.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/item/back/models/specie.json b/modules/item/back/models/specie.json
index c5a1f455e..f24474416 100644
--- a/modules/item/back/models/specie.json
+++ b/modules/item/back/models/specie.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"acls": [
diff --git a/modules/item/back/models/tag.json b/modules/item/back/models/tag.json
index 4cd1ad74e..6c5f5c0ba 100644
--- a/modules/item/back/models/tag.json
+++ b/modules/item/back/models/tag.json
@@ -8,25 +8,25 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String",
+ "type": "string",
"required": true
},
"isFree": {
- "type": "Boolean"
+ "type": "boolean"
},
"sourceTable": {
- "type": "String"
+ "type": "string"
},
"unit": {
- "type": "String"
+ "type": "string"
},
"isQuantitative": {
- "type": "Boolean",
+ "type": "boolean",
"mysql": {
"columnName": "isQuantitatif"
}
diff --git a/modules/order/back/models/order-row.json b/modules/order/back/models/order-row.json
index 44d5a103a..4b78bfdad 100644
--- a/modules/order/back/models/order-row.json
+++ b/modules/order/back/models/order-row.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"warehouseFk": {
- "type": "Number"
+ "type": "number"
},
"shipped": {
"type": "date",
@@ -22,22 +22,22 @@
}
},
"quantity": {
- "type": "Number",
+ "type": "number",
"mysql": {
"columnName": "amount"
}
},
"price": {
- "type": "Number"
+ "type": "number"
},
"rate": {
- "type": "Number"
+ "type": "number"
},
"created": {
"type": "date"
},
"saleFk": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/order/back/models/order-ticket.json b/modules/order/back/models/order-ticket.json
index 2875ebdfc..9fe144b47 100644
--- a/modules/order/back/models/order-ticket.json
+++ b/modules/order/back/models/order-ticket.json
@@ -9,11 +9,11 @@
"properties": {
"orderFk": {
"id": true,
- "type": "Number"
+ "type": "number"
},
"ticketFk": {
"id": true,
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/order/back/models/order.json b/modules/order/back/models/order.json
index 38755c2a5..169c0c550 100644
--- a/modules/order/back/models/order.json
+++ b/modules/order/back/models/order.json
@@ -8,80 +8,80 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"landed": {
- "type": "Date",
+ "type": "date",
"required": true,
"mysql": {
"columnName": "date_send"
}
},
"clientFk": {
- "type": "Number",
+ "type": "number",
"required": true,
"mysql": {
"columnName": "customer_id"
}
},
"addressFk": {
- "type": "Number",
+ "type": "number",
"required": true,
"mysql": {
"columnName": "address_id"
}
},
"agencyModeFk": {
- "type": "Number",
+ "type": "number",
"required": true,
"mysql": {
"columnName": "agency_id"
}
},
"companyFk": {
- "type": "Number",
+ "type": "number",
"required": true,
"mysql": {
"columnName": "company_id"
}
},
"note": {
- "type": "String"
+ "type": "string"
},
"sourceApp": {
- "type": "String",
+ "type": "string",
"mysql": {
"columnName": "source_app"
}
},
"isConfirmed": {
- "type": "Number",
+ "type": "number",
"mysql": {
"columnName": "confirmed"
}
},
"created": {
- "type": "Date",
+ "type": "date",
"mysql": {
"columnName": "date_make"
}
},
"firstRowStamp": {
- "type": "Date",
+ "type": "date",
"mysql": {
"columnName": "first_row_stamp"
}
},
"confirmed": {
- "type": "Date",
+ "type": "date",
"mysql": {
"columnName": "confirm_date"
}
},
"total": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js b/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js
index 81686144d..ad4613caf 100644
--- a/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js
+++ b/modules/route/back/methods/agency-term/specs/createInvoiceIn.spec.js
@@ -1,7 +1,6 @@
const models = require('vn-loopback/server/server').models;
-// Include after #3638 export database
-xdescribe('AgencyTerm createInvoiceIn()', () => {
+describe('AgencyTerm createInvoiceIn()', () => {
const rows = [
{
routeFk: 2,
@@ -17,6 +16,7 @@ xdescribe('AgencyTerm createInvoiceIn()', () => {
];
it('should make an invoiceIn', async() => {
+ pending('Include after #3638 export database');
const tx = await models.AgencyTerm.beginTransaction({});
const options = {transaction: tx};
@@ -32,8 +32,12 @@ xdescribe('AgencyTerm createInvoiceIn()', () => {
await models.AgencyTerm.createInvoiceIn(rows, dms, options);
const [newInvoiceIn] = await models.InvoiceIn.rawSql('SELECT MAX(id) id FROM invoiceIn', null, options);
- const [newInvoiceInDueDay] = await models.InvoiceInDueDay.rawSql('SELECT MAX(id) id FROM invoiceInDueDay', null, options);
- const [newInvoiceInTax] = await models.InvoiceInTax.rawSql('SELECT MAX(id) id FROM invoiceInTax', null, options);
+
+ const dueDayQuery = 'SELECT MAX(id) id FROM invoiceInDueDay';
+ const [newInvoiceInDueDay] = await models.InvoiceInDueDay.rawSql(dueDayQuery, null, options);
+
+ const taxQuery = 'SELECT MAX(id) id FROM invoiceInTax';
+ const [newInvoiceInTax] = await models.InvoiceInTax.rawSql(taxQuery, null, options);
expect(newInvoiceIn.id).toBeGreaterThan(oldInvoiceIn.id);
expect(newInvoiceInDueDay.id).toBeGreaterThan(oldInvoiceInDueDay.id);
diff --git a/modules/route/back/methods/route/specs/guessPriority.spec.js b/modules/route/back/methods/route/specs/guessPriority.spec.js
index 892324acf..902647ba1 100644
--- a/modules/route/back/methods/route/specs/guessPriority.spec.js
+++ b/modules/route/back/methods/route/specs/guessPriority.spec.js
@@ -1,9 +1,21 @@
const app = require('vn-loopback/server/server');
+const LoopBackContext = require('loopback-context');
describe('route guessPriority()', () => {
const targetRouteId = 7;
let routeTicketsToRestore;
+ const activeCtx = {
+ accessToken: {userId: 9},
+ __: () => {}
+ };
+
+ beforeAll(() => {
+ spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
+ active: activeCtx
+ });
+ });
+
afterAll(async() => {
let restoreFixtures = [];
routeTicketsToRestore.forEach(ticket => {
@@ -12,12 +24,9 @@ describe('route guessPriority()', () => {
await Promise.all(restoreFixtures);
});
- it('should call guessPriority() and then check the tickets in the target route now have their priorities defined', async() => {
+ it('should call guessPriority() then check all tickets in that route have their priorities defined', async() => {
const ctx = {
- req: {
- accessToken: {userId: 9},
- __: () => {}
- },
+ req: activeCtx
};
routeTicketsToRestore = await app.models.Ticket.find({where: {routeFk: targetRouteId}});
diff --git a/modules/route/back/models/deliveryPoint.json b/modules/route/back/models/deliveryPoint.json
index c6c0a2116..639f21e35 100644
--- a/modules/route/back/models/deliveryPoint.json
+++ b/modules/route/back/models/deliveryPoint.json
@@ -8,15 +8,15 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"name": {
- "type": "String"
+ "type": "string"
},
"ubication": {
- "type": "String"
+ "type": "string"
}
}
}
diff --git a/modules/route/back/models/route-log.json b/modules/route/back/models/route-log.json
index abaeeb722..37f898267 100644
--- a/modules/route/back/models/route-log.json
+++ b/modules/route/back/models/route-log.json
@@ -9,40 +9,40 @@
"properties": {
"id": {
"id": true,
- "type": "Number",
+ "type": "number",
"forceId": false
},
"originFk": {
- "type": "Number",
+ "type": "number",
"required": true
},
"userFk": {
- "type": "Number"
+ "type": "number"
},
"action": {
- "type": "String",
+ "type": "string",
"required": true
},
"changedModel": {
- "type": "String"
+ "type": "string"
},
"oldInstance": {
- "type": "Object"
+ "type": "object"
},
"newInstance": {
- "type": "Object"
+ "type": "object"
},
"creationDate": {
- "type": "Date"
+ "type": "date"
},
"changedModelId": {
- "type": "Number"
+ "type": "number"
},
"changedModelValue": {
- "type": "String"
+ "type": "string"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/route/back/models/route.json b/modules/route/back/models/route.json
index bdb641096..46fb6b76f 100644
--- a/modules/route/back/models/route.json
+++ b/modules/route/back/models/route.json
@@ -11,7 +11,7 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
@@ -22,10 +22,10 @@
"type": "date"
},
"kmStart": {
- "type": "Number"
+ "type": "number"
},
"kmEnd": {
- "type": "Number"
+ "type": "number"
},
"started": {
"type": "date"
@@ -40,13 +40,13 @@
}
},
"cost": {
- "type": "Number"
+ "type": "number"
},
"m3": {
- "type": "Number"
+ "type": "number"
},
"description": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/route/back/models/vehicle.json b/modules/route/back/models/vehicle.json
index 399480c98..a35926bef 100644
--- a/modules/route/back/models/vehicle.json
+++ b/modules/route/back/models/vehicle.json
@@ -8,27 +8,27 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"numberPlate": {
- "type": "String"
+ "type": "string"
},
"tradeMark": {
- "type": "String"
+ "type": "string"
},
"model": {
- "type": "String"
+ "type": "string"
},
"m3": {
- "type": "Number"
+ "type": "number"
},
"description": {
- "type": "String"
+ "type": "string"
},
"isActive": {
- "type": "Number"
+ "type": "number"
}
},
"relations": {
diff --git a/modules/supplier/back/methods/supplier/getSummary.js b/modules/supplier/back/methods/supplier/getSummary.js
index c29a2a058..bf3fa56f5 100644
--- a/modules/supplier/back/methods/supplier/getSummary.js
+++ b/modules/supplier/back/methods/supplier/getSummary.js
@@ -41,7 +41,9 @@ module.exports = Self => {
'sageTaxTypeFk',
'sageTransactionTypeFk',
'sageWithholdingFk',
- 'workerFk'
+ 'workerFk',
+ 'supplierActivityFk',
+ 'healthRegister'
],
include: [
{
@@ -98,6 +100,12 @@ module.exports = Self => {
}
}
},
+ {
+ relation: 'supplierActivity',
+ scope: {
+ fields: ['code', 'name']
+ }
+ }
]
};
diff --git a/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js b/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js
index 0eec54926..a47e547d1 100644
--- a/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js
+++ b/modules/supplier/back/methods/supplier/specs/updateFiscalData.spec.js
@@ -66,6 +66,8 @@ describe('Supplier updateFiscalData', () => {
city: 'VALENCIA',
provinceFk: 2,
countryFk: 1,
+ supplierActivityFk: 'animals',
+ healthRegister: '400664487H'
};
const result = await app.models.Supplier.updateFiscalData(ctx, supplierId);
@@ -80,6 +82,8 @@ describe('Supplier updateFiscalData', () => {
expect(result.city).toEqual('VALENCIA');
expect(result.provinceFk).toEqual(2);
expect(result.countryFk).toEqual(1);
+ expect(result.supplierActivityFk).toEqual('animals');
+ expect(result.healthRegister).toEqual('400664487H');
// Restores
ctx.args = defaultData;
diff --git a/modules/supplier/back/methods/supplier/updateFiscalData.js b/modules/supplier/back/methods/supplier/updateFiscalData.js
index daa602af0..4604b3f91 100644
--- a/modules/supplier/back/methods/supplier/updateFiscalData.js
+++ b/modules/supplier/back/methods/supplier/updateFiscalData.js
@@ -56,6 +56,14 @@ module.exports = Self => {
{
arg: 'countryFk',
type: 'any'
+ },
+ {
+ arg: 'supplierActivityFk',
+ type: 'string'
+ },
+ {
+ arg: 'healthRegister',
+ type: 'string'
}],
returns: {
arg: 'res',
diff --git a/modules/supplier/back/model-config.json b/modules/supplier/back/model-config.json
index 7c1bba1ec..dbc387ed2 100644
--- a/modules/supplier/back/model-config.json
+++ b/modules/supplier/back/model-config.json
@@ -11,6 +11,9 @@
"SupplierAccount": {
"dataSource": "vn"
},
+ "SupplierActivity": {
+ "dataSource": "vn"
+ },
"SupplierAgencyTerm": {
"dataSource": "vn"
},
diff --git a/modules/supplier/back/models/pay-dem.json b/modules/supplier/back/models/pay-dem.json
index f214f3e3a..1253c751c 100644
--- a/modules/supplier/back/models/pay-dem.json
+++ b/modules/supplier/back/models/pay-dem.json
@@ -8,12 +8,12 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"payDem": {
- "type": "Number"
+ "type": "number"
}
}
}
diff --git a/modules/supplier/back/models/supplier-account.json b/modules/supplier/back/models/supplier-account.json
index 8e2838fe5..2ee83338b 100644
--- a/modules/supplier/back/models/supplier-account.json
+++ b/modules/supplier/back/models/supplier-account.json
@@ -12,15 +12,15 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"iban": {
- "type": "String"
+ "type": "string"
},
"beneficiary": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/supplier/back/models/supplier-activity.json b/modules/supplier/back/models/supplier-activity.json
new file mode 100644
index 000000000..7a0b9a537
--- /dev/null
+++ b/modules/supplier/back/models/supplier-activity.json
@@ -0,0 +1,18 @@
+{
+ "name": "SupplierActivity",
+ "base": "VnModel",
+ "options": {
+ "mysql": {
+ "table": "supplierActivity"
+ }
+ },
+ "properties": {
+ "code": {
+ "type": "string",
+ "id": true
+ },
+ "name": {
+ "type": "string"
+ }
+ }
+}
\ No newline at end of file
diff --git a/modules/supplier/back/models/supplier-contact.json b/modules/supplier/back/models/supplier-contact.json
index 104a3a404..9e13c33a8 100644
--- a/modules/supplier/back/models/supplier-contact.json
+++ b/modules/supplier/back/models/supplier-contact.json
@@ -12,27 +12,27 @@
},
"properties": {
"id": {
- "type": "Number",
+ "type": "number",
"id": true,
"description": "Identifier"
},
"supplierFk": {
- "type": "String"
+ "type": "string"
},
"phone": {
- "type": "String"
+ "type": "string"
},
"mobile": {
- "type": "String"
+ "type": "string"
},
"email": {
- "type": "String"
+ "type": "string"
},
"observation": {
- "type": "String"
+ "type": "string"
},
"name": {
- "type": "String"
+ "type": "string"
}
},
"relations": {
diff --git a/modules/supplier/back/models/supplier.json b/modules/supplier/back/models/supplier.json
index 8b4b8f26f..b27073ca5 100644
--- a/modules/supplier/back/models/supplier.json
+++ b/modules/supplier/back/models/supplier.json
@@ -101,6 +101,12 @@
},
"isPayMethodChecked": {
"type": "boolean"
+ },
+ "supplierActivityFk": {
+ "type": "string"
+ },
+ "healthRegister": {
+ "type": "string"
}
},
"relations": {
@@ -159,6 +165,11 @@
"type": "hasMany",
"model": "SupplierAddress",
"foreignKey": "supplierFk"
+ },
+ "supplierActivity": {
+ "type": "belongsTo",
+ "model": "SupplierActivity",
+ "foreignKey": "supplierActivityFk"
}
}
}
\ No newline at end of file
diff --git a/modules/supplier/front/fiscal-data/index.html b/modules/supplier/front/fiscal-data/index.html
index 4f34528f2..77a5cce4e 100644
--- a/modules/supplier/front/fiscal-data/index.html
+++ b/modules/supplier/front/fiscal-data/index.html
@@ -30,6 +30,11 @@
data="sageWithholdings"
order="withholding">
+
+