Merge branch 'dev' of https://gitea.verdnatura.es/verdnatura/salix into 5035-intermittent_backTest
gitea/salix/pipeline/head There was a failure building this commit
Details
gitea/salix/pipeline/head There was a failure building this commit
Details
This commit is contained in:
commit
ac3e68d846
10
CHANGELOG.md
10
CHANGELOG.md
|
@ -8,9 +8,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||
## [2302.01] - 2023-01-12
|
||||
|
||||
### Added
|
||||
|
||||
-
|
||||
- [General](Inicio) Permite recuperar la contraseña
|
||||
- [Artículo](Datos Básicos) Añadido campo Unidades/Caja
|
||||
|
||||
### Changed
|
||||
|
||||
-
|
||||
### Fixed
|
||||
- [General] Al utilizar el traductor de Google se descuadraban los iconos
|
||||
|
||||
### Removed
|
||||
- [Tickets](Control clientes) Eliminada sección
|
||||
|
|
|
@ -29,8 +29,12 @@ module.exports = Self => {
|
|||
filter = mergeFilters(filter, {where});
|
||||
|
||||
const stmt = new ParameterizedSQL(
|
||||
`SELECT * FROM campaign`);
|
||||
`SELECT * FROM (`);
|
||||
stmt.merge('SELECT * FROM campaign');
|
||||
stmt.merge(conn.makeWhere(filter.where));
|
||||
stmt.merge('ORDER BY dated ASC');
|
||||
stmt.merge('LIMIT 10000000000000000000');
|
||||
stmt.merge(') sub');
|
||||
stmt.merge('GROUP BY code');
|
||||
stmt.merge(conn.makePagination(filter));
|
||||
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
DELETE FROM `salix`.`ACL` WHERE model="SaleChecked";
|
||||
DROP TABLE IF EXISTS `vn`.`saleChecked`;
|
|
@ -2652,7 +2652,7 @@ INSERT INTO `vn`.`mdbVersion` (`app`, `branchFk`, `version`)
|
|||
|
||||
INSERT INTO `vn`.`accountingConfig` (`id`, `minDate`, `maxDate`)
|
||||
VALUES
|
||||
(1, '2022-01-01', '2023-01-01');
|
||||
(1, CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL -1 YEAR)), '-01-01'), CONCAT(YEAR(DATE_ADD(util.VN_CURDATE(), INTERVAL +1 YEAR)), '-01-01'));
|
||||
|
||||
|
||||
INSERT INTO `vn`.`saleGroup` (`userFk`, `parkingFk`, `sectorFk`)
|
||||
|
|
|
@ -30,7 +30,7 @@ export default {
|
|||
firstModuleRemovePinIcon: 'vn-home a:nth-child(1) vn-icon[icon="remove_circle"]'
|
||||
},
|
||||
recoverPassword: {
|
||||
recoverPasswordButton: 'vn-login a[ui-sref="recoverPassword"]',
|
||||
recoverPasswordButton: 'vn-login a[ui-sref="recover-password"]',
|
||||
email: 'vn-recover-password vn-textfield[ng-model="$ctrl.email"]',
|
||||
sendEmailButton: 'vn-recover-password vn-submit',
|
||||
},
|
||||
|
@ -463,6 +463,7 @@ export default {
|
|||
generic: 'vn-autocomplete[ng-model="$ctrl.item.genericFk"]',
|
||||
isFragile: 'vn-check[ng-model="$ctrl.item.isFragile"]',
|
||||
longName: 'vn-textfield[ng-model="$ctrl.item.longName"]',
|
||||
packingOut: 'vn-input-number[ng-model="$ctrl.item.packingOut"]',
|
||||
isActiveCheckbox: 'vn-check[label="Active"]',
|
||||
priceInKgCheckbox: 'vn-check[label="Price in kg"]',
|
||||
newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button',
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import selectors from '../../helpers/selectors';
|
||||
import getBrowser from '../../helpers/puppeteer';
|
||||
|
||||
// https://redmine.verdnatura.es/issues/4995 fix login
|
||||
xdescribe('RecoverPassword path', async() => {
|
||||
describe('RecoverPassword path', async() => {
|
||||
let browser;
|
||||
let page;
|
||||
|
||||
|
@ -11,7 +10,7 @@ xdescribe('RecoverPassword path', async() => {
|
|||
page = browser.page;
|
||||
|
||||
await page.waitToClick(selectors.recoverPassword.recoverPasswordButton);
|
||||
await page.waitForState('recoverPassword');
|
||||
await page.waitForState('recover-password');
|
||||
});
|
||||
|
||||
afterAll(async() => {
|
||||
|
|
|
@ -58,6 +58,7 @@ describe('Worker time control path', () => {
|
|||
});
|
||||
|
||||
it(`should return error when insert 'out' of first entry`, async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
await page.waitToClick(selectors.workerTimeControl.mondayAddTimeButton);
|
||||
await page.pickTime(selectors.workerTimeControl.dialogTimeInput, eightAm);
|
||||
await page.autocompleteSearch(selectors.workerTimeControl.dialogTimeDirection, 'out');
|
||||
|
@ -68,6 +69,7 @@ describe('Worker time control path', () => {
|
|||
});
|
||||
|
||||
it(`should insert 'in' monday`, async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
await page.waitToClick(selectors.workerTimeControl.mondayAddTimeButton);
|
||||
await page.pickTime(selectors.workerTimeControl.dialogTimeInput, eightAm);
|
||||
await page.autocompleteSearch(selectors.workerTimeControl.dialogTimeDirection, 'in');
|
||||
|
@ -78,6 +80,7 @@ describe('Worker time control path', () => {
|
|||
});
|
||||
|
||||
it(`should insert 'out' monday`, async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
await page.waitToClick(selectors.workerTimeControl.mondayAddTimeButton);
|
||||
await page.pickTime(selectors.workerTimeControl.dialogTimeInput, fourPm);
|
||||
await page.autocompleteSearch(selectors.workerTimeControl.dialogTimeDirection, 'out');
|
||||
|
@ -88,11 +91,13 @@ describe('Worker time control path', () => {
|
|||
});
|
||||
|
||||
it(`should check Hank Pym worked 8:20 hours`, async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
await page.waitForTextInElement(selectors.workerTimeControl.mondayWorkedHours, '08:20 h.');
|
||||
await page.waitForTextInElement(selectors.workerTimeControl.weekWorkedHours, '08:20 h.');
|
||||
});
|
||||
|
||||
it('should remove first entry of monday', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
await page.waitForTextInElement(selectors.workerTimeControl.firstEntryOfMonday, eightAm);
|
||||
await page.waitForTextInElement(selectors.workerTimeControl.secondEntryOfMonday, fourPm);
|
||||
await page.waitToClick(selectors.workerTimeControl.firstEntryOfMondayDelete);
|
||||
|
@ -103,6 +108,7 @@ describe('Worker time control path', () => {
|
|||
});
|
||||
|
||||
it(`should be the 'out' the first entry of monday`, async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
const result = await page.waitToGetProperty(selectors.workerTimeControl.firstEntryOfMonday, 'innerText');
|
||||
|
||||
expect(result).toEqual(fourPm);
|
||||
|
|
|
@ -35,6 +35,7 @@ describe('Item Edit basic data path', () => {
|
|||
await page.waitToClick(selectors.itemBasicData.isActiveCheckbox);
|
||||
await page.waitToClick(selectors.itemBasicData.priceInKgCheckbox);
|
||||
await page.waitToClick(selectors.itemBasicData.isFragile);
|
||||
await page.write(selectors.itemBasicData.packingOut, '5');
|
||||
await page.waitToClick(selectors.itemBasicData.submitBasicDataButton);
|
||||
const message = await page.waitForSnackbar();
|
||||
|
||||
|
@ -128,4 +129,11 @@ describe('Item Edit basic data path', () => {
|
|||
|
||||
expect(result).toBe('checked');
|
||||
});
|
||||
|
||||
it(`should confirm the item packingOut was edited`, async() => {
|
||||
const result = await page
|
||||
.waitToGetProperty(selectors.itemBasicData.packingOut, 'value');
|
||||
|
||||
expect(result).toEqual('5');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -26,7 +26,7 @@ class Icon {
|
|||
Icon.$inject = ['$attrs'];
|
||||
|
||||
ngModule.vnComponent('vnIcon', {
|
||||
template: '<i class="{{::$ctrl.iconClass}} unselectable">{{::$ctrl.iconContent}}</i>',
|
||||
template: '<i class="{{::$ctrl.iconClass}} unselectable notranslate">{{::$ctrl.iconContent}}</i>',
|
||||
controller: Icon,
|
||||
bindings: {
|
||||
icon: '@'
|
||||
|
|
|
@ -24,7 +24,7 @@ export default class Auth {
|
|||
initialize() {
|
||||
let criteria = {
|
||||
to: state => {
|
||||
const outLayout = ['login', 'recoverPassword', 'resetPassword'];
|
||||
const outLayout = ['login', 'recover-password', 'reset-password'];
|
||||
return !outLayout.some(ol => ol == state.name);
|
||||
}
|
||||
};
|
||||
|
|
|
@ -1,15 +1,8 @@
|
|||
{
|
||||
"name": "salix-front",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 1,
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
<<<<<<< HEAD
|
||||
"dependencies": {
|
||||
"@uirouter/angularjs": {
|
||||
"version": "1.0.29",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.29.tgz",
|
||||
"integrity": "sha512-RImWnBarNixkMto0o8stEaGwZmvhv5cnuOLXyMU2pY8MP2rgEF74ZNJTLeJCW14LR7XDUxVH8Mk8bPI6lxedmQ==",
|
||||
=======
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "salix-front",
|
||||
|
@ -32,8 +25,7 @@
|
|||
},
|
||||
"node_modules/@uirouter/angularjs": {
|
||||
"version": "1.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
|
||||
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@uirouter/core": "6.0.8"
|
||||
},
|
||||
|
@ -46,17 +38,14 @@
|
|||
},
|
||||
"node_modules/@uirouter/core": {
|
||||
"version": "6.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
|
||||
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/angular": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
|
||||
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw==",
|
||||
"deprecated": "For the actively supported Angular, see https://www.npmjs.com/package/@angular/core. AngularJS support has officially ended. For extended AngularJS support options, see https://goo.gle/angularjs-path-forward."
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/angular-animate": {
|
||||
"version": "1.8.2",
|
||||
|
@ -74,8 +63,7 @@
|
|||
},
|
||||
"node_modules/angular-translate": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
|
||||
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"angular": "^1.8.0"
|
||||
},
|
||||
|
@ -85,8 +73,7 @@
|
|||
},
|
||||
"node_modules/angular-translate-loader-partial": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.19.0.tgz",
|
||||
"integrity": "sha512-NnMw13LMV4bPQmJK7/pZOZAnPxe0M5OtUHchADs5Gye7V7feonuEnrZ8e1CKhBlv9a7IQyWoqcBa4Lnhg8gk5w==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"angular-translate": "~2.19.0"
|
||||
}
|
||||
|
@ -133,8 +120,7 @@
|
|||
},
|
||||
"node_modules/moment": {
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
|
@ -179,97 +165,51 @@
|
|||
"dependencies": {
|
||||
"@uirouter/angularjs": {
|
||||
"version": "1.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz",
|
||||
"integrity": "sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg==",
|
||||
>>>>>>> dev
|
||||
"requires": {
|
||||
"@uirouter/core": "6.0.8"
|
||||
}
|
||||
},
|
||||
"@uirouter/core": {
|
||||
<<<<<<< HEAD
|
||||
"version": "6.0.7",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.7.tgz",
|
||||
"integrity": "sha512-KUTJxL+6q0PiBnFx4/Z+Hsyg0pSGiaW5yZQeJmUxknecjpTbnXkLU8H2EqRn9N2B+qDRa7Jg8RcgeNDPY72O1w=="
|
||||
"version": "6.0.8"
|
||||
},
|
||||
"angular": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.2.tgz",
|
||||
"integrity": "sha512-IauMOej2xEe7/7Ennahkbb5qd/HFADiNuLSESz9Q27inmi32zB0lnAsFeLEWcox3Gd1F6YhNd1CP7/9IukJ0Gw=="
|
||||
=======
|
||||
"version": "6.0.8",
|
||||
"resolved": "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz",
|
||||
"integrity": "sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw=="
|
||||
},
|
||||
"angular": {
|
||||
"version": "1.8.3",
|
||||
"resolved": "https://registry.npmjs.org/angular/-/angular-1.8.3.tgz",
|
||||
"integrity": "sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw=="
|
||||
>>>>>>> dev
|
||||
"version": "1.8.3"
|
||||
},
|
||||
"angular-animate": {
|
||||
"version": "1.8.2",
|
||||
"resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.2.tgz",
|
||||
"integrity": "sha512-Jbr9+grNMs9Kj57xuBU3Ju3NOPAjS1+g2UAwwDv7su1lt0/PLDy+9zEwDiu8C8xJceoTbmBNKiWGPJGBdCQLlA=="
|
||||
"version": "1.8.2"
|
||||
},
|
||||
"angular-moment": {
|
||||
"version": "1.3.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-moment/-/angular-moment-1.3.0.tgz",
|
||||
"integrity": "sha512-KG8rvO9MoaBLwtGnxTeUveSyNtrL+RNgGl1zqWN36+HDCCVGk2DGWOzqKWB6o+eTTbO3Opn4hupWKIElc8XETA==",
|
||||
"requires": {
|
||||
"moment": ">=2.8.0 <3.0.0"
|
||||
}
|
||||
},
|
||||
"angular-translate": {
|
||||
<<<<<<< HEAD
|
||||
"version": "2.18.4",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.18.4.tgz",
|
||||
"integrity": "sha512-KohNrkH6J9PK+VW0L/nsRTcg5Fw70Ajwwe3Jbfm54Pf9u9Fd+wuingoKv+h45mKf38eT+Ouu51FPua8VmZNoCw==",
|
||||
=======
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate/-/angular-translate-2.19.0.tgz",
|
||||
"integrity": "sha512-Z/Fip5uUT2N85dPQ0sMEe1JdF5AehcDe4tg/9mWXNDVU531emHCg53ZND9Oe0dyNiGX5rWcJKmsL1Fujus1vGQ==",
|
||||
>>>>>>> dev
|
||||
"requires": {
|
||||
"angular": "^1.8.0"
|
||||
}
|
||||
},
|
||||
"angular-translate-loader-partial": {
|
||||
<<<<<<< HEAD
|
||||
"version": "2.18.4",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.18.4.tgz",
|
||||
"integrity": "sha512-bsjR+FbB0sdA2528E/ugwKdlPPQhA1looxLxI3otayBTFXBpED33besfSZhYAISLgNMSL038vSssfRUen9qD8w==",
|
||||
=======
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/angular-translate-loader-partial/-/angular-translate-loader-partial-2.19.0.tgz",
|
||||
"integrity": "sha512-NnMw13LMV4bPQmJK7/pZOZAnPxe0M5OtUHchADs5Gye7V7feonuEnrZ8e1CKhBlv9a7IQyWoqcBa4Lnhg8gk5w==",
|
||||
>>>>>>> dev
|
||||
"requires": {
|
||||
"angular-translate": "~2.19.0"
|
||||
}
|
||||
},
|
||||
"argparse": {
|
||||
"version": "1.0.10",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||
"requires": {
|
||||
"sprintf-js": "~1.0.2"
|
||||
}
|
||||
},
|
||||
"croppie": {
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/croppie/-/croppie-2.6.5.tgz",
|
||||
"integrity": "sha512-IlChnVUGG5T3w2gRZIaQgBtlvyuYnlUWs2YZIXXR3H9KrlO1PtBT3j+ykxvy9eZIWhk+V5SpBmhCQz5UXKrEKQ=="
|
||||
"version": "2.6.5"
|
||||
},
|
||||
"esprima": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
|
||||
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
|
||||
"version": "4.0.1"
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "3.14.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
|
||||
"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
"esprima": "^4.0.0"
|
||||
|
@ -277,45 +217,27 @@
|
|||
},
|
||||
"mg-crud": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/mg-crud/-/mg-crud-1.1.2.tgz",
|
||||
"integrity": "sha512-mAR6t0aQHKnT0QHKHpLOi0kNPZfO36iMpIoiLjFHxuio6mIJyuveBJ4VNlNXJRxLh32/FLADEb41/sYo7QUKFw==",
|
||||
"requires": {
|
||||
"angular": "^1.6.1"
|
||||
}
|
||||
},
|
||||
"moment": {
|
||||
<<<<<<< HEAD
|
||||
"version": "2.29.1",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
|
||||
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
|
||||
=======
|
||||
"version": "2.29.4",
|
||||
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz",
|
||||
"integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w=="
|
||||
>>>>>>> dev
|
||||
"version": "2.29.4"
|
||||
},
|
||||
"oclazyload": {
|
||||
"version": "0.6.3",
|
||||
"resolved": "https://registry.npmjs.org/oclazyload/-/oclazyload-0.6.3.tgz",
|
||||
"integrity": "sha512-HpOSYUgjtt6sTB/C6+FWsExR+9HCnXKsUA96RWkDXfv11C8Cc9X2DlR0WIZwFIiG6FQU0pwB5dhoYyut8bFAOQ=="
|
||||
"version": "0.6.3"
|
||||
},
|
||||
"require-yaml": {
|
||||
"version": "0.0.1",
|
||||
"resolved": "https://registry.npmjs.org/require-yaml/-/require-yaml-0.0.1.tgz",
|
||||
"integrity": "sha512-M6eVEgLPRbeOhgSCnOTtdrOOEQzbXRchg24Xa13c39dMuraFKdI9emUo97Rih0YEFzSICmSKg8w4RQp+rd9pOQ==",
|
||||
"requires": {
|
||||
"js-yaml": "^4.1.0"
|
||||
"js-yaml": ""
|
||||
},
|
||||
"dependencies": {
|
||||
"argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||
"version": "2.0.1"
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
|
||||
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
|
||||
"requires": {
|
||||
"argparse": "^2.0.1"
|
||||
}
|
||||
|
@ -323,14 +245,10 @@
|
|||
}
|
||||
},
|
||||
"sprintf-js": {
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
|
||||
"version": "1.0.3"
|
||||
},
|
||||
"validator": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/validator/-/validator-6.3.0.tgz",
|
||||
"integrity": "sha512-BylxTwhqwjQI5MDJF7amCy/L0ejJO+74DvCsLV52Lq3+3bhVcVMKqNqOiNcQJm2G48u9EAcw4xFERAmFbwXM9Q=="
|
||||
"version": "6.3.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,3 @@
|
|||
<vn-layout
|
||||
ng-if="$ctrl.showLayout">
|
||||
</vn-layout>
|
||||
<ui-view
|
||||
name="login"
|
||||
ng-if="!$ctrl.showLayout">
|
||||
</ui-view>
|
||||
<ui-view></ui-view>
|
||||
<vn-snackbar vn-id="snackbar"></vn-snackbar>
|
||||
<vn-debug-info></vn-debug-info>
|
||||
|
|
|
@ -19,12 +19,6 @@ export default class App extends Component {
|
|||
this.vnApp.logger = this;
|
||||
}
|
||||
|
||||
get showLayout() {
|
||||
const state = this.$state.current.name || this.$location.$$path.substring(1).replace('/', '.');
|
||||
const outLayout = ['login', 'recoverPassword', 'resetPassword', 'reset-password'];
|
||||
return state && !outLayout.some(ol => ol == state);
|
||||
}
|
||||
|
||||
$onDestroy() {
|
||||
this.deregisterCallback();
|
||||
this.vnApp.logger = null;
|
||||
|
|
|
@ -5,10 +5,10 @@ import './descriptor-popover';
|
|||
import './home/home';
|
||||
import './layout';
|
||||
import './left-menu/left-menu';
|
||||
import './login/index';
|
||||
import './login/login';
|
||||
import './login/recover-password';
|
||||
import './login/reset-password';
|
||||
import './login';
|
||||
import './outLayout';
|
||||
import './recover-password';
|
||||
import './reset-password';
|
||||
import './module-card';
|
||||
import './module-main';
|
||||
import './side-menu/side-menu';
|
||||
|
|
|
@ -1,6 +1,27 @@
|
|||
<div class="box">
|
||||
<img src="./logo.svg"/>
|
||||
<form name="form">
|
||||
<ui-view></ui-view>
|
||||
</form>
|
||||
<vn-textfield
|
||||
label="User"
|
||||
ng-model="$ctrl.user"
|
||||
vn-id="userField"
|
||||
vn-focus>
|
||||
</vn-textfield>
|
||||
<vn-textfield
|
||||
label="Password"
|
||||
ng-model="$ctrl.password"
|
||||
type="password">
|
||||
</vn-textfield>
|
||||
<vn-check
|
||||
label="Do not close session"
|
||||
ng-model="$ctrl.remember"
|
||||
name="remember">
|
||||
</vn-check>
|
||||
<div class="footer">
|
||||
<vn-submit label="Enter" ng-click="$ctrl.submit()"></vn-submit>
|
||||
<div class="spinner-wrapper">
|
||||
<vn-spinner enable="$ctrl.loading"></vn-spinner>
|
||||
</div>
|
||||
<div class="vn-pt-lg">
|
||||
<a ui-sref="recover-password" translate>
|
||||
I do not remember my password
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,16 +1,43 @@
|
|||
import ngModule from '../../module';
|
||||
import Component from 'core/lib/component';
|
||||
import './style.scss';
|
||||
|
||||
export default class OutLayout extends Component {
|
||||
constructor($element, $scope) {
|
||||
super($element, $scope);
|
||||
/**
|
||||
* A simple login form.
|
||||
*/
|
||||
export default class Controller {
|
||||
constructor($, $element, vnAuth) {
|
||||
Object.assign(this, {
|
||||
$,
|
||||
$element,
|
||||
vnAuth,
|
||||
user: localStorage.getItem('lastUser'),
|
||||
remember: true
|
||||
});
|
||||
}
|
||||
|
||||
submit() {
|
||||
this.loading = true;
|
||||
this.vnAuth.login(this.user, this.password, this.remember)
|
||||
.then(() => {
|
||||
localStorage.setItem('lastUser', this.user);
|
||||
this.loading = false;
|
||||
})
|
||||
.catch(err => {
|
||||
this.loading = false;
|
||||
this.password = '';
|
||||
this.focusUser();
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
focusUser() {
|
||||
this.$.userField.select();
|
||||
this.$.userField.focus();
|
||||
}
|
||||
}
|
||||
Controller.$inject = ['$scope', '$element', 'vnAuth'];
|
||||
|
||||
OutLayout.$inject = ['$element', '$scope'];
|
||||
|
||||
ngModule.vnComponent('vnOutLayout', {
|
||||
ngModule.vnComponent('vnLogin', {
|
||||
template: require('./index.html'),
|
||||
controller: OutLayout
|
||||
controller: Controller
|
||||
});
|
||||
|
|
|
@ -1,16 +1,5 @@
|
|||
User: Usuario
|
||||
Password: Contraseña
|
||||
Email: Correo electrónico
|
||||
Do not close session: No cerrar sesión
|
||||
Enter: Entrar
|
||||
I do not remember my password: No recuerdo mi contraseña
|
||||
Recover password: Recuperar contraseña
|
||||
We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña
|
||||
Notification sent!: ¡Notificación enviada!
|
||||
Reset password: Restrablecer contraseña
|
||||
New password: Nueva contraseña
|
||||
Repeat password: Repetir contraseña
|
||||
Password requirements: >
|
||||
La contraseña debe tener al menos {{ length }} caracteres de longitud,
|
||||
{{nAlpha}} caracteres alfabéticos, {{nUpper}} letras mayúsculas, {{nDigits}}
|
||||
dígitos y {{nPunct}} símbolos (Ej: $%&.)
|
||||
|
|
|
@ -1,32 +0,0 @@
|
|||
<div class="box">
|
||||
<img src="./logo.svg"/>
|
||||
<form name="form" ng-submit="$ctrl.submit()">
|
||||
<vn-textfield
|
||||
label="User"
|
||||
ng-model="$ctrl.user"
|
||||
vn-id="userField"
|
||||
vn-focus>
|
||||
</vn-textfield>
|
||||
<vn-textfield
|
||||
label="Password"
|
||||
ng-model="$ctrl.password"
|
||||
type="password">
|
||||
</vn-textfield>
|
||||
<vn-check
|
||||
label="Do not close session"
|
||||
ng-model="$ctrl.remember"
|
||||
name="remember">
|
||||
</vn-check>
|
||||
<div class="footer">
|
||||
<vn-submit label="Enter" ng-click="$ctrl.submit()"></vn-submit>
|
||||
<div class="spinner-wrapper">
|
||||
<vn-spinner enable="$ctrl.loading"></vn-spinner>
|
||||
</div>
|
||||
<!--<div class="vn-pt-lg">
|
||||
<a ui-sref="recoverPassword" translate>
|
||||
I do not remember my password
|
||||
</a>
|
||||
</div>-->
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
|
@ -1,43 +0,0 @@
|
|||
import ngModule from '../../module';
|
||||
import './style.scss';
|
||||
|
||||
/**
|
||||
* A simple login form.
|
||||
*/
|
||||
export default class Controller {
|
||||
constructor($, $element, vnAuth) {
|
||||
Object.assign(this, {
|
||||
$,
|
||||
$element,
|
||||
vnAuth,
|
||||
user: localStorage.getItem('lastUser'),
|
||||
remember: true
|
||||
});
|
||||
}
|
||||
|
||||
submit() {
|
||||
this.loading = true;
|
||||
this.vnAuth.login(this.user, this.password, this.remember)
|
||||
.then(() => {
|
||||
localStorage.setItem('lastUser', this.user);
|
||||
this.loading = false;
|
||||
})
|
||||
.catch(err => {
|
||||
this.loading = false;
|
||||
this.password = '';
|
||||
this.focusUser();
|
||||
throw err;
|
||||
});
|
||||
}
|
||||
|
||||
focusUser() {
|
||||
this.$.userField.select();
|
||||
this.$.userField.focus();
|
||||
}
|
||||
}
|
||||
Controller.$inject = ['$scope', '$element', 'vnAuth'];
|
||||
|
||||
ngModule.vnComponent('vnLogin', {
|
||||
template: require('./login.html'),
|
||||
controller: Controller
|
||||
});
|
|
@ -1,8 +1,6 @@
|
|||
@import "variables";
|
||||
|
||||
vn-login,
|
||||
vn-reset-password,
|
||||
vn-recover-password{
|
||||
vn-login{
|
||||
.footer {
|
||||
margin-top: 32px;
|
||||
text-align: center;
|
||||
|
@ -24,69 +22,3 @@ vn-recover-password{
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
vn-login{
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: $color-font;
|
||||
font-size: 1.1rem;
|
||||
font-weight: normal;
|
||||
background-color: $color-bg-dark;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: auto;
|
||||
|
||||
& > .box {
|
||||
box-sizing: border-box;
|
||||
position: absolute;
|
||||
max-width: 304px;
|
||||
min-width: 240px;
|
||||
padding: 48px;
|
||||
background-color: $color-bg-panel;
|
||||
box-shadow: 0 0 16px 0 rgba(0, 0, 0, .6);
|
||||
border-radius: 8px;
|
||||
|
||||
& > img {
|
||||
width: 100%;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
& > form {
|
||||
& > .vn-textfield {
|
||||
width: 100%;
|
||||
}
|
||||
& > .vn-check {
|
||||
display: block;
|
||||
.md-label {
|
||||
white-space: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h5{
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
.text-secondary{
|
||||
text-align: center;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
background-color: $color-bg-panel;
|
||||
|
||||
& > .box {
|
||||
padding: 16px;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
a{
|
||||
color: $color-primary;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
<div class="box">
|
||||
<img src="./logo.svg"/>
|
||||
<form name="form">
|
||||
<ui-view></ui-view>
|
||||
</form>
|
||||
</div>
|
|
@ -0,0 +1,16 @@
|
|||
import ngModule from '../../module';
|
||||
import Component from 'core/lib/component';
|
||||
import './style.scss';
|
||||
|
||||
export default class OutLayout extends Component {
|
||||
constructor($element, $scope) {
|
||||
super($element, $scope);
|
||||
}
|
||||
}
|
||||
|
||||
OutLayout.$inject = ['$element', '$scope'];
|
||||
|
||||
ngModule.vnComponent('vnOutLayout', {
|
||||
template: require('./index.html'),
|
||||
controller: OutLayout
|
||||
});
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
@ -0,0 +1,67 @@
|
|||
@import "variables";
|
||||
|
||||
vn-out-layout{
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: $color-font;
|
||||
font-size: 1.1rem;
|
||||
font-weight: normal;
|
||||
background-color: $color-bg-dark;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: auto;
|
||||
|
||||
& > .box {
|
||||
box-sizing: border-box;
|
||||
position: absolute;
|
||||
max-width: 304px;
|
||||
min-width: 240px;
|
||||
padding: 48px;
|
||||
background-color: $color-bg-panel;
|
||||
box-shadow: 0 0 16px 0 rgba(0, 0, 0, .6);
|
||||
border-radius: 8px;
|
||||
|
||||
& > img {
|
||||
width: 100%;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
& > form {
|
||||
& > .vn-textfield {
|
||||
width: 100%;
|
||||
}
|
||||
& > .vn-check {
|
||||
display: block;
|
||||
.md-label {
|
||||
white-space: inherit;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
h5{
|
||||
color: $color-primary;
|
||||
}
|
||||
|
||||
.text-secondary{
|
||||
text-align: center;
|
||||
padding-bottom: 16px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@media screen and (max-width: 600px) {
|
||||
background-color: $color-bg-panel;
|
||||
|
||||
& > .box {
|
||||
padding: 16px;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
a{
|
||||
color: $color-primary;
|
||||
}
|
||||
}
|
|
@ -32,6 +32,6 @@ export default class Controller {
|
|||
Controller.$inject = ['$scope', '$element', '$http', 'vnApp', '$translate', '$state'];
|
||||
|
||||
ngModule.vnComponent('vnRecoverPassword', {
|
||||
template: require('./recover-password.html'),
|
||||
template: require('./index.html'),
|
||||
controller: Controller
|
||||
});
|
|
@ -0,0 +1,3 @@
|
|||
Recover password: Recuperar contraseña
|
||||
We will sent you an email to recover your password: Te enviaremos un correo para restablecer tu contraseña
|
||||
Notification sent!: ¡Notificación enviada!
|
|
@ -0,0 +1,24 @@
|
|||
@import "variables";
|
||||
|
||||
vn-recover-password{
|
||||
.footer {
|
||||
margin-top: 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
& > .vn-submit {
|
||||
display: block;
|
||||
|
||||
& > input {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
& > .spinner-wrapper {
|
||||
position: absolute;
|
||||
width: 0;
|
||||
top: 3px;
|
||||
right: -8px;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -43,6 +43,6 @@ export default class Controller {
|
|||
Controller.$inject = ['$scope', '$element', '$http', 'vnApp', '$translate', '$state', '$location'];
|
||||
|
||||
ngModule.vnComponent('vnResetPassword', {
|
||||
template: require('./reset-password.html'),
|
||||
template: require('./index.html'),
|
||||
controller: Controller
|
||||
});
|
|
@ -1,7 +1,3 @@
|
|||
User: User
|
||||
Password: Password
|
||||
Do not close session: Do not close session
|
||||
Enter: Enter
|
||||
Password requirements: >
|
||||
The password must have at least {{ length }} length characters,
|
||||
{{nAlpha}} alphabetic characters, {{nUpper}} capital letters, {{nDigits}}
|
|
@ -0,0 +1,8 @@
|
|||
Reset password: Restrablecer contraseña
|
||||
New password: Nueva contraseña
|
||||
Repeat password: Repetir contraseñaç
|
||||
Password changed!: ¡Contraseña cambiada!
|
||||
Password requirements: >
|
||||
La contraseña debe tener al menos {{ length }} caracteres de longitud,
|
||||
{{nAlpha}} caracteres alfabéticos, {{nUpper}} letras mayúsculas, {{nDigits}}
|
||||
dígitos y {{nPunct}} símbolos (Ej: $%&.)
|
|
@ -0,0 +1,24 @@
|
|||
@import "variables";
|
||||
|
||||
vn-reset-password{
|
||||
.footer {
|
||||
margin-top: 32px;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
& > .vn-submit {
|
||||
display: block;
|
||||
|
||||
& > input {
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
& > .spinner-wrapper {
|
||||
position: absolute;
|
||||
width: 0;
|
||||
top: 3px;
|
||||
right: -8px;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,27 +3,38 @@ import getMainRoute from 'core/lib/get-main-route';
|
|||
|
||||
config.$inject = ['$stateProvider', '$urlRouterProvider'];
|
||||
function config($stateProvider, $urlRouterProvider) {
|
||||
$urlRouterProvider.otherwise('/');
|
||||
$urlRouterProvider
|
||||
.otherwise('/');
|
||||
|
||||
$stateProvider
|
||||
.state('layout', {
|
||||
abstract: true,
|
||||
template: '<vn-layout></vn-layout>',
|
||||
})
|
||||
.state('outLayout', {
|
||||
abstract: true,
|
||||
template: '<vn-out-layout></vn-out-layout>',
|
||||
})
|
||||
.state('login', {
|
||||
parent: 'outLayout',
|
||||
url: '/login?continue',
|
||||
description: 'Login',
|
||||
views: {
|
||||
'login': {template: '<vn-login></vn-login>'},
|
||||
}
|
||||
template: '<vn-login></vn-login>'
|
||||
})
|
||||
.state('recoverPassword', {
|
||||
.state('recover-password', {
|
||||
parent: 'outLayout',
|
||||
url: '/recover-password',
|
||||
description: 'Recover-password',
|
||||
template: '<vn-recover-password>asd</vn-recover-password>'
|
||||
description: 'Recover password',
|
||||
template: '<vn-recover-password></vn-recover-password>'
|
||||
})
|
||||
.state('resetPassword', {
|
||||
.state('reset-password', {
|
||||
parent: 'outLayout',
|
||||
url: '/reset-password',
|
||||
description: 'Reset-password',
|
||||
description: 'Reset password',
|
||||
template: '<vn-reset-password></vn-reset-password>'
|
||||
})
|
||||
.state('home', {
|
||||
parent: 'layout',
|
||||
url: '/',
|
||||
description: 'Home',
|
||||
template: '<vn-home></vn-home>'
|
||||
|
@ -54,6 +65,10 @@ function config($stateProvider, $urlRouterProvider) {
|
|||
};
|
||||
if (route.abstract)
|
||||
configRoute.abstract = true;
|
||||
|
||||
if (!route.state.includes('.'))
|
||||
configRoute.parent = 'layout';
|
||||
|
||||
if (route.routeParams)
|
||||
configRoute.params = route.routeParams;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ import Dialog from 'core/components/dialog';
|
|||
class Controller extends Dialog {
|
||||
constructor($element, $, $transclude, vnReport) {
|
||||
super($element, $, $transclude);
|
||||
|
||||
this.viewReceipt = true;
|
||||
this.vnReport = vnReport;
|
||||
this.receipt = {};
|
||||
}
|
||||
|
|
|
@ -75,6 +75,7 @@ describe('Client', () => {
|
|||
jest.spyOn(controller.vnReport, 'show');
|
||||
|
||||
controller.$params = {id: 1101};
|
||||
controller.viewReceipt = false;
|
||||
|
||||
$httpBackend.expect('POST', `Clients/1101/createReceipt`).respond({id: 1});
|
||||
controller.responseHandler('accept');
|
||||
|
|
|
@ -73,6 +73,12 @@ export default class Controller extends Section {
|
|||
this.vnApp.showSuccess(this.$t('Data saved!'));
|
||||
});
|
||||
}
|
||||
|
||||
itemSearchFunc($search) {
|
||||
return /^\d+$/.test($search)
|
||||
? {id: $search}
|
||||
: {name: {like: '%' + $search + '%'}};
|
||||
}
|
||||
}
|
||||
|
||||
ngModule.vnComponent('vnEntryBuyIndex', {
|
||||
|
|
|
@ -17,12 +17,12 @@
|
|||
target="_blank"
|
||||
name="showInvoicePdf"
|
||||
translate>
|
||||
Show as PDF
|
||||
as PDF
|
||||
</a>
|
||||
<vn-item
|
||||
ng-click="$ctrl.showCsvInvoice()"
|
||||
translate>
|
||||
Show as CSV
|
||||
as CSV
|
||||
</vn-item>
|
||||
</vn-list>
|
||||
</vn-menu>
|
||||
|
|
|
@ -2,6 +2,8 @@ Show invoice...: Ver factura...
|
|||
Send invoice...: Enviar factura...
|
||||
Send PDF invoice: Enviar factura en PDF
|
||||
Send CSV invoice: Enviar factura en CSV
|
||||
as PDF: como PDF
|
||||
as CSV: como CSV
|
||||
Delete Invoice: Eliminar factura
|
||||
Clone Invoice: Clonar factura
|
||||
Book invoice: Asentar factura
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<mg-ajax
|
||||
path="Items/{{patch.params.id}}"
|
||||
options="vnPatch"
|
||||
<mg-ajax
|
||||
path="Items/{{patch.params.id}}"
|
||||
options="vnPatch"
|
||||
override="{filter: {include: [{relation: 'itemType'}, {relation: 'origin'}, {relation: 'ink'}, {relation: 'producer'}, {relation: 'expense'}]}}">
|
||||
</mg-ajax>
|
||||
<vn-watcher
|
||||
|
@ -26,8 +26,8 @@
|
|||
rule
|
||||
vn-focus>
|
||||
</vn-textfield>
|
||||
<vn-textfield
|
||||
vn-one label="Full name"
|
||||
<vn-textfield
|
||||
vn-one label="Full name"
|
||||
ng-model="$ctrl.item.longName"
|
||||
rule
|
||||
info="Full name calculates based on tags 1-3. Is not recommended to change it manually">
|
||||
|
@ -95,7 +95,7 @@
|
|||
<vn-input-number
|
||||
vn-one
|
||||
min="0"
|
||||
label="Relevancy"
|
||||
label="Relevancy"
|
||||
ng-model="$ctrl.item.relevancy"
|
||||
rule>
|
||||
</vn-input-number>
|
||||
|
@ -108,15 +108,15 @@
|
|||
</vn-input-number>
|
||||
<vn-input-number
|
||||
vn-one
|
||||
min="0"
|
||||
label="stems"
|
||||
min="0"
|
||||
label="stems"
|
||||
ng-model="$ctrl.item.stems"
|
||||
rule>
|
||||
</vn-input-number>
|
||||
<vn-input-number
|
||||
vn-one
|
||||
min="0"
|
||||
label="Multiplier"
|
||||
label="Multiplier"
|
||||
ng-model="$ctrl.item.stemMultiplier">
|
||||
</vn-input-number>
|
||||
</vn-horizontal>
|
||||
|
@ -124,10 +124,17 @@
|
|||
<vn-input-number
|
||||
vn-one
|
||||
min="0"
|
||||
label="Weight/Piece"
|
||||
label="Weight/Piece"
|
||||
ng-model="$ctrl.item.weightByPiece"
|
||||
rule>
|
||||
</vn-input-number>
|
||||
<vn-input-number
|
||||
vn-one
|
||||
min="0"
|
||||
label="Units/Box"
|
||||
ng-model="$ctrl.item.packingOut"
|
||||
rule>
|
||||
</vn-input-number>
|
||||
<vn-autocomplete
|
||||
vn-one
|
||||
label="Generic"
|
||||
|
@ -192,7 +199,7 @@
|
|||
</form>
|
||||
|
||||
<!-- Create custom agent dialog -->
|
||||
<vn-dialog class="edit"
|
||||
<vn-dialog class="edit"
|
||||
vn-id="intrastat"
|
||||
on-accept="$ctrl.onIntrastatAccept()"
|
||||
message="New intrastat">
|
||||
|
@ -225,12 +232,12 @@
|
|||
<tpl-body class="itemFilter">
|
||||
<vn-horizontal>
|
||||
<vn-textfield
|
||||
label="Name"
|
||||
label="Name"
|
||||
ng-model="$ctrl.itemFilterParams.name"
|
||||
vn-focus>
|
||||
</vn-textfield>
|
||||
<vn-textfield
|
||||
label="Size"
|
||||
label="Size"
|
||||
ng-model="$ctrl.itemFilterParams.size">
|
||||
</vn-textfield>
|
||||
<vn-autocomplete
|
||||
|
@ -262,7 +269,7 @@
|
|||
</vn-button>
|
||||
</vn-horizontal>
|
||||
<vn-crud-model
|
||||
vn-id="itemsModel"
|
||||
vn-id="itemsModel"
|
||||
url="Items/withName"
|
||||
filter="$ctrl.itemFilter"
|
||||
data="items"
|
||||
|
@ -305,4 +312,4 @@
|
|||
warehouse-fk="$ctrl.vnConfig.warehouseFk">
|
||||
</vn-item-descriptor-popover>
|
||||
</tpl-body>
|
||||
</vn-dialog>
|
||||
</vn-dialog>
|
||||
|
|
|
@ -44,6 +44,7 @@ Weight/Piece: Peso/tallo
|
|||
Search items by id, name or barcode: Buscar articulos por identificador, nombre o codigo de barras
|
||||
SalesPerson: Comercial
|
||||
Concept: Concepto
|
||||
Units/Box: Unidades/Caja
|
||||
|
||||
# Sections
|
||||
Items: Artículos
|
||||
|
@ -61,4 +62,4 @@ Item diary: Registro de compra-venta
|
|||
Last entries: Últimas entradas
|
||||
Tags: Etiquetas
|
||||
Waste breakdown: Desglose de mermas
|
||||
Waste breakdown by item: Desglose de mermas por artículo
|
||||
Waste breakdown by item: Desglose de mermas por artículo
|
||||
|
|
|
@ -32,9 +32,6 @@
|
|||
"Sale": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"SaleChecked": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
"SaleCloned": {
|
||||
"dataSource": "vn"
|
||||
},
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
{
|
||||
"name": "SaleChecked",
|
||||
"base": "VnModel",
|
||||
"options": {
|
||||
"mysql": {
|
||||
"table": "saleChecked"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"isChecked": {
|
||||
"type": "number"
|
||||
},
|
||||
"saleFk": {
|
||||
"id": true
|
||||
}
|
||||
},
|
||||
"relations": {
|
||||
"sale": {
|
||||
"type": "belongsTo",
|
||||
"model": "Sale",
|
||||
"foreignKey": "saleFk"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -56,11 +56,6 @@
|
|||
"foreignKey": "ticketFk",
|
||||
"required": true
|
||||
},
|
||||
"isChecked": {
|
||||
"type": "hasOne",
|
||||
"model": "SaleChecked",
|
||||
"foreignKey": "saleFk"
|
||||
},
|
||||
"components": {
|
||||
"type": "hasMany",
|
||||
"model": "SaleComponent",
|
||||
|
@ -80,6 +75,6 @@
|
|||
"type": "hasOne",
|
||||
"model": "ItemShelvingSale",
|
||||
"foreignKey": "saleFk"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,6 @@ import './package/index';
|
|||
import './sale';
|
||||
import './tracking/index';
|
||||
import './tracking/edit';
|
||||
import './sale-checked';
|
||||
import './services';
|
||||
import './component';
|
||||
import './sale-tracking';
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
{"state": "ticket.card.expedition", "icon": "icon-package"},
|
||||
{"state": "ticket.card.service", "icon": "icon-services"},
|
||||
{"state": "ticket.card.package", "icon": "icon-bucket"},
|
||||
{"state": "ticket.card.saleChecked", "icon": "assignment"},
|
||||
{"state": "ticket.card.components", "icon": "icon-components"},
|
||||
{"state": "ticket.card.saleTracking", "icon": "assignment"},
|
||||
{"state": "ticket.card.dms.index", "icon": "cloud_download"},
|
||||
|
@ -159,15 +158,6 @@
|
|||
},
|
||||
"acl": ["production", "administrative", "salesPerson"]
|
||||
},
|
||||
{
|
||||
"url" : "/sale-checked",
|
||||
"state": "ticket.card.saleChecked",
|
||||
"component": "vn-ticket-sale-checked",
|
||||
"description": "Sale checked",
|
||||
"params": {
|
||||
"ticket": "$ctrl.ticket"
|
||||
}
|
||||
},
|
||||
{
|
||||
"url" : "/components",
|
||||
"state": "ticket.card.components",
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
<vn-crud-model
|
||||
vn-id="model"
|
||||
url="sales"
|
||||
filter="::$ctrl.filter"
|
||||
link="{ticketFk: $ctrl.$params.id}"
|
||||
limit="20"
|
||||
data="sales"
|
||||
order="concept ASC"
|
||||
auto-load="true">
|
||||
</vn-crud-model>
|
||||
<vn-data-viewer model="model">
|
||||
<vn-card class="vn-w-lg">
|
||||
<vn-table model="model">
|
||||
<vn-thead>
|
||||
<vn-tr>
|
||||
<vn-th field="isChecked" center>Is checked</vn-th>
|
||||
<vn-th field="itemFk" number>Item</vn-th>
|
||||
<vn-th field="concept">Description</vn-th>
|
||||
<vn-th field="quantity" number>Quantity</vn-th>
|
||||
</vn-tr>
|
||||
</vn-thead>
|
||||
<vn-tbody>
|
||||
<vn-tr ng-repeat="sale in sales">
|
||||
<vn-td center shrink>
|
||||
<vn-check
|
||||
vn-one ng-model="sale.isChecked.isChecked"
|
||||
disabled="true">
|
||||
</vn-check>
|
||||
</vn-td>
|
||||
<vn-td number>
|
||||
<span
|
||||
ng-click="$ctrl.showItemDescriptor($event, sale)"
|
||||
class="link">
|
||||
{{::sale.itemFk | zeroFill:6}}
|
||||
</span>
|
||||
</vn-td>
|
||||
<vn-td vn-fetched-tags>
|
||||
<div>
|
||||
<vn-one title="{{::sale.item.name}}">{{::sale.item.name}}</vn-one>
|
||||
<vn-one ng-if="::sale.item.subName">
|
||||
<h3 title="{{::sale.item.subName}}">{{::sale.item.subName}}</h3>
|
||||
</vn-one>
|
||||
</div>
|
||||
<vn-fetched-tags
|
||||
max-length="6"
|
||||
item="::sale.item"
|
||||
tabindex="-1">
|
||||
</vn-fetched-tags>
|
||||
</vn-td>
|
||||
<vn-td number>{{::sale.quantity}}</vn-td>
|
||||
</vn-tr>
|
||||
</vn-tbody>
|
||||
</vn-table>
|
||||
</vn-card>
|
||||
</vn-data-viewer>
|
||||
<vn-item-descriptor-popover
|
||||
vn-id="item-descriptor"
|
||||
warehouse-fk="$ctrl.ticket.warehouseFk"
|
||||
ticket-fk="$ctrl.ticket.id">
|
||||
</vn-item-descriptor-popover>
|
|
@ -1,42 +0,0 @@
|
|||
import ngModule from '../module';
|
||||
import Section from 'salix/components/section';
|
||||
|
||||
class Controller extends Section {
|
||||
constructor($element, $) {
|
||||
super($element, $);
|
||||
this.filter = {
|
||||
include: [
|
||||
{
|
||||
relation: 'item'
|
||||
}, {
|
||||
relation: 'isChecked',
|
||||
scope: {
|
||||
fields: ['isChecked']
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
}
|
||||
showItemDescriptor(event, sale) {
|
||||
this.quicklinks = {
|
||||
btnThree: {
|
||||
icon: 'icon-transaction',
|
||||
state: `item.card.diary({
|
||||
id: ${sale.itemFk},
|
||||
warehouseFk: ${this.ticket.warehouseFk},
|
||||
lineFk: ${sale.id}
|
||||
})`,
|
||||
tooltip: 'Item diary'
|
||||
}
|
||||
};
|
||||
this.$.itemDescriptor.show(event.target, sale.itemFk);
|
||||
}
|
||||
}
|
||||
|
||||
ngModule.vnComponent('vnTicketSaleChecked', {
|
||||
template: require('./index.html'),
|
||||
controller: Controller,
|
||||
bindings: {
|
||||
ticket: '<'
|
||||
}
|
||||
});
|
|
@ -10,6 +10,7 @@ describe('workerTimeControl sendMail()', () => {
|
|||
const ctx = {req: activeCtx, args: {}};
|
||||
|
||||
it('should fill time control of a worker without records in Journey and with rest', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4903');
|
||||
const tx = await models.WorkerTimeControl.beginTransaction({});
|
||||
|
||||
try {
|
||||
|
@ -34,6 +35,7 @@ describe('workerTimeControl sendMail()', () => {
|
|||
});
|
||||
|
||||
it('should fill time control of a worker without records in Journey and without rest', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4903');
|
||||
const workdayOf20Hours = 3;
|
||||
const tx = await models.WorkerTimeControl.beginTransaction({});
|
||||
|
||||
|
@ -61,6 +63,7 @@ describe('workerTimeControl sendMail()', () => {
|
|||
});
|
||||
|
||||
it('should fill time control of a worker with records in Journey and with rest', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4903');
|
||||
const tx = await models.WorkerTimeControl.beginTransaction({});
|
||||
|
||||
try {
|
||||
|
@ -92,6 +95,7 @@ describe('workerTimeControl sendMail()', () => {
|
|||
});
|
||||
|
||||
it('should fill time control of a worker with records in Journey and without rest', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4903');
|
||||
const tx = await models.WorkerTimeControl.beginTransaction({});
|
||||
|
||||
try {
|
||||
|
|
|
@ -201,6 +201,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
|
||||
describe('WorkerTimeControl_clockIn calls', () => {
|
||||
it('should fail to add a time entry if the target user has an absence that day', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
const date = new Date();
|
||||
|
@ -247,6 +248,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
|
||||
describe('direction errors', () => {
|
||||
it('should throw an error when trying "in" direction twice', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -276,6 +278,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should throw an error when trying "in" direction after insert "in" and "middle"', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -309,8 +312,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('Should throw an error when trying "out" before closing a "middle" couple', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/5035');
|
||||
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -344,6 +346,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should throw an error when trying "middle" after "out"', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -377,6 +380,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should throw an error when trying "out" direction twice', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -448,6 +452,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should not fail as the 12h rest is fulfilled', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -484,6 +489,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
|
||||
describe('for 3500kg drivers with enforced 9h rest', () => {
|
||||
it('should throw an error when the 9h enforced rest is not fulfilled', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = jessicaJonesId;
|
||||
|
||||
|
@ -518,6 +524,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should not fail when the 9h enforced rest is fulfilled', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = jessicaJonesId;
|
||||
|
||||
|
@ -554,6 +561,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
|
||||
describe('for 36h weekly rest', () => {
|
||||
it('should throw an error when the 36h weekly rest is not fulfilled', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -588,6 +596,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
});
|
||||
|
||||
it('should throw an error when the 36h weekly rest is not fulfilled again', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
@ -621,6 +630,7 @@ describe('workerTimeControl add/delete timeEntry()', () => {
|
|||
|
||||
describe('for 72h weekly rest', () => {
|
||||
it('should throw when the 72h weekly rest is not fulfilled yet', async() => {
|
||||
pending('https://redmine.verdnatura.es/issues/4707');
|
||||
activeCtx.accessToken.userId = salesBossId;
|
||||
const workerId = hankPymId;
|
||||
|
||||
|
|
Loading…
Reference in New Issue