From 33f1ed360b7dc91ec7e5c453e6b693edf3d69aef Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 23 May 2024 12:16:12 +0200 Subject: [PATCH 001/266] refactor: refs #7457 Added from param if not exists --- modules/order/back/methods/order/filter.js | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 592ed11e6..d22fa0804 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -96,9 +96,18 @@ module.exports = Self => { teamMembersId.push(userId); } - if (args && args.myTeam) + if (args?.myTeam) args.teamIds = teamIds; + if (args?.to) + args.to.setHours(23, 59, 0, 0); + + if (!args.from) { + const yesterday = new Date(); + yesterday.setDate(yesterday.getDate() - 1); + args.from = yesterday.toISOString().split('T')[0]; + } + const where = buildFilter(args, (param, value) => { switch (param) { case 'search': @@ -194,7 +203,7 @@ module.exports = Self => { `); stmt.merge(conn.makeWhere(filter.where)); - stmt.merge(`GROUP BY id`); + stmt.merge(`GROUP BY o.id`); stmt.merge(conn.makePagination(filter)); stmts.push(stmt); stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`); From 1a01b3e58795f1b17993d4d6b8a8a9e5ac82b33c Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 10 Jun 2024 10:42:52 +0200 Subject: [PATCH 002/266] refs #7529 back models acls --- .../11094-maroonCyca/00-firstScript.sql | 8 +++ modules/worker/back/model-config.json | 9 +++ .../worker/back/models/disability-grade.json | 18 ++++++ modules/worker/back/models/worker-irpf.json | 60 +++++++++++++++++++ .../worker/back/models/worker-relatives.json | 53 ++++++++++++++++ 5 files changed, 148 insertions(+) create mode 100644 db/versions/11094-maroonCyca/00-firstScript.sql create mode 100644 modules/worker/back/models/disability-grade.json create mode 100644 modules/worker/back/models/worker-irpf.json create mode 100644 modules/worker/back/models/worker-relatives.json diff --git a/db/versions/11094-maroonCyca/00-firstScript.sql b/db/versions/11094-maroonCyca/00-firstScript.sql new file mode 100644 index 000000000..dfaf5b79e --- /dev/null +++ b/db/versions/11094-maroonCyca/00-firstScript.sql @@ -0,0 +1,8 @@ +-- Place your SQL code here +-- Auto-generated SQL script #202406101036 +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES ('Worker','workerRelatives','*','ALLOW','ROLE','hr'); +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES ('Worker','workerIrpf','*','ALLOW','ROLE','hr'); +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES ('Worker','disabilityGrade','*','ALLOW','ROLE','hr'); diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index b7c355511..e58685123 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -124,6 +124,15 @@ }, "Locker": { "dataSource": "vn" + }, + "WorkerIrpf": { + "dataSource": "vn" + }, + "DisabilityGrade": { + "dataSource": "vn" + }, + "WorkerRelatives": { + "dataSource": "vn" } } diff --git a/modules/worker/back/models/disability-grade.json b/modules/worker/back/models/disability-grade.json new file mode 100644 index 000000000..506138225 --- /dev/null +++ b/modules/worker/back/models/disability-grade.json @@ -0,0 +1,18 @@ +{ + "name": "DisabilityGrade", + "base": "VnModel", + "options": { + "mysql": { + "table": "disabilityGrade" + } + }, + "properties": { + "id": { + "id": true, + "type": "number" + }, + "description": { + "type": "string" + } + } +} diff --git a/modules/worker/back/models/worker-irpf.json b/modules/worker/back/models/worker-irpf.json new file mode 100644 index 000000000..034bed368 --- /dev/null +++ b/modules/worker/back/models/worker-irpf.json @@ -0,0 +1,60 @@ +{ + "name": "WorkerIrpf", + "description": "Model 145 IRPF", + "base": "VnModel", + "options": { + "mysql": { + "table": "workerIrpf" + } + }, + "properties": { + "workerFk": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "spouseNif": { + "type": "string" + }, + "geographicMobilityDate": { + "type": "date" + }, + "disabilityGradeFk": { + "type" : "number" + }, + "isDependent": { + "type" : "number" + }, + "familySituation": { + "type" : "number" + }, + "spousePension": { + "type" : "number" + }, + "childPension": { + "type" : "number" + }, + "hasHousingPaymentBefore": { + "type" : "number" + }, + "hasHousingPaymentAfter": { + "type" : "number" + }, + "updated": { + "type" : "date" + } + + }, + "relations": { + "disabilityGrade": { + "type": "belongsTo", + "model": "disabilityGrade", + "foreignKey": "disabilityGradeFk" + }, + "worker": { + "type": "belongsTo", + "model": "VnUser", + "foreignKey": "workerFK" + } + } +} diff --git a/modules/worker/back/models/worker-relatives.json b/modules/worker/back/models/worker-relatives.json new file mode 100644 index 000000000..2429a2f1c --- /dev/null +++ b/modules/worker/back/models/worker-relatives.json @@ -0,0 +1,53 @@ +{ + "name": "WorkerRelatives", + "description": "Model 145 IRPF", + "base": "VnModel", + "options": { + "mysql": { + "table": "workerRelatives" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "workerFk": { + "type": "number" + }, + "isDescendant": { + "type": "number" + }, + "disabilityGradeFk": { + "type" : "number" + }, + "birthed": { + "type" : "number" + }, + "adoptionYear": { + "type" : "number" + }, + "isDependend": { + "type" : "boolean" + }, + "islointCustody": { + "type" : "boolean" + }, + "updated": { + "type" : "date" + } + }, + "relations": { + "disabilityGrade": { + "type": "belongsTo", + "model": "disabilityGrade", + "foreignKey": "disabilityGradeFk" + }, + "worker": { + "type": "belongsTo", + "model": "WorkerIrpf", + "foreignKey": "workerFK" + } + } +} From 155597bf857c1c61c49d35449d803fed519f7d8f Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 2 Sep 2024 13:36:03 +0200 Subject: [PATCH 003/266] fix: refs #7283 remove --- e2e/paths/04-item/01_summary.spec.js | 133 -------- e2e/paths/04-item/02_basic_data.spec.js | 64 ---- e2e/paths/04-item/03_tax.spec.js | 48 --- e2e/paths/04-item/04_tags.spec.js | 79 ----- e2e/paths/04-item/05_botanical.spec.js | 66 ---- e2e/paths/04-item/06_barcode.spec.js | 37 -- e2e/paths/04-item/07_create.spec.js | 65 ---- e2e/paths/04-item/08_regularize.spec.js | 141 -------- e2e/paths/04-item/09_index.spec.js | 84 ----- e2e/paths/04-item/10_item_log.spec.js | 45 --- e2e/paths/04-item/11_descriptor.spec.js | 41 --- e2e/paths/04-item/12_request.spec.js | 45 --- e2e/paths/04-item/13_fixedPrice.spec.js | 97 ------ modules/item/front/barcode/index.html | 57 ---- modules/item/front/barcode/index.js | 17 - modules/item/front/basic-data/index.html | 318 ------------------ modules/item/front/basic-data/index.js | 87 ----- modules/item/front/basic-data/index.spec.js | 32 -- modules/item/front/basic-data/locale/es.yml | 19 -- modules/item/front/botanical/index.html | 102 ------ modules/item/front/botanical/index.js | 99 ------ modules/item/front/botanical/index.spec.js | 179 ---------- modules/item/front/botanical/locale/es.yml | 5 - modules/item/front/card/index.html | 8 - modules/item/front/card/index.js | 33 -- modules/item/front/card/index.spec.js | 32 -- modules/item/front/create/index.html | 95 ------ modules/item/front/create/index.js | 40 --- modules/item/front/create/index.spec.js | 37 -- modules/item/front/create/locale/es.yml | 1 - modules/item/front/diary/index.html | 2 - modules/item/front/diary/index.js | 21 -- modules/item/front/fetched-tags/index.html | 40 --- modules/item/front/fetched-tags/index.js | 12 - modules/item/front/fetched-tags/style.scss | 61 ---- .../front/fixed-price-search-panel/index.html | 214 ------------ .../front/fixed-price-search-panel/index.js | 60 ---- .../fixed-price-search-panel/index.spec.js | 56 --- .../fixed-price-search-panel/locale/es.yml | 4 - .../front/fixed-price-search-panel/style.scss | 71 ---- modules/item/front/fixed-price/index.html | 284 ---------------- modules/item/front/fixed-price/index.js | 254 -------------- modules/item/front/fixed-price/index.spec.js | 173 ---------- modules/item/front/fixed-price/locale/es.yml | 7 - modules/item/front/fixed-price/style.scss | 46 --- modules/item/front/index.js | 21 -- modules/item/front/index/index.html | 197 ----------- modules/item/front/index/index.js | 112 ------ modules/item/front/index/index.spec.js | 30 -- modules/item/front/index/locale/es.yml | 2 - modules/item/front/index/preview.svg | 11 - modules/item/front/index/style.scss | 34 -- modules/item/front/item-shelving/index.html | 118 ------- modules/item/front/item-shelving/index.js | 89 ----- .../item/front/item-shelving/index.spec.js | 81 ----- .../item/front/item-shelving/locale/es.yml | 5 - .../front/item-type/basic-data/index.html | 62 ---- .../item/front/item-type/basic-data/index.js | 12 - modules/item/front/item-type/card/index.html | 5 - modules/item/front/item-type/card/index.js | 23 -- .../item/front/item-type/card/index.spec.js | 27 -- .../item/front/item-type/create/index.html | 62 ---- modules/item/front/item-type/create/index.js | 15 - .../item/front/item-type/create/index.spec.js | 34 -- .../front/item-type/descriptor/index.html | 25 -- .../item/front/item-type/descriptor/index.js | 20 -- modules/item/front/item-type/index.js | 8 - modules/item/front/item-type/index/index.html | 43 --- modules/item/front/item-type/index/index.js | 14 - .../item/front/item-type/index/index.spec.js | 34 -- .../item/front/item-type/index/locale/es.yml | 2 - modules/item/front/item-type/main/index.html | 18 - modules/item/front/item-type/main/index.js | 24 -- .../item/front/item-type/main/index.spec.js | 31 -- .../item/front/item-type/main/locale/es.yml | 1 - .../front/item-type/search-panel/index.html | 22 -- .../front/item-type/search-panel/index.js | 7 - .../item/front/item-type/summary/index.html | 50 --- modules/item/front/item-type/summary/index.js | 33 -- .../front/item-type/summary/locale/es.yml | 4 - modules/item/front/last-entries/index.html | 138 -------- modules/item/front/last-entries/index.js | 105 ------ modules/item/front/last-entries/locale/es.yml | 15 - modules/item/front/main/index.html | 23 -- modules/item/front/main/index.js | 9 +- .../front/request-search-panel/index.html | 104 ------ .../item/front/request-search-panel/index.js | 48 --- .../front/request-search-panel/index.spec.js | 48 --- .../front/request-search-panel/locale/es.yml | 4 - modules/item/front/request/index.html | 172 ---------- modules/item/front/request/index.js | 143 -------- modules/item/front/request/index.spec.js | 120 ------- modules/item/front/request/locale/es.yml | 9 - modules/item/front/request/style.scss | 15 - modules/item/front/routes.json | 196 +---------- modules/item/front/search-panel/index.html | 181 ---------- modules/item/front/search-panel/index.js | 67 ---- modules/item/front/search-panel/index.spec.js | 60 ---- modules/item/front/search-panel/locale/es.yml | 8 - modules/item/front/summary/index.html | 227 ------------- modules/item/front/summary/index.js | 61 ---- modules/item/front/summary/index.spec.js | 42 --- modules/item/front/summary/locale/en.yml | 1 - modules/item/front/summary/locale/es.yml | 5 - modules/item/front/summary/style.scss | 39 --- modules/item/front/tags/index.html | 82 ----- modules/item/front/tags/index.js | 54 --- modules/item/front/tags/index.spec.js | 34 -- modules/item/front/tax/index.html | 43 --- modules/item/front/tax/index.js | 41 --- modules/item/front/tax/index.spec.js | 64 ---- modules/item/front/waste/index/index.html | 2 - modules/item/front/waste/index/index.js | 19 -- modules/item/front/waste/index/style.scss | 27 -- modules/item/front/waste/locale/es.yml | 4 - 115 files changed, 5 insertions(+), 6892 deletions(-) delete mode 100644 e2e/paths/04-item/01_summary.spec.js delete mode 100644 e2e/paths/04-item/02_basic_data.spec.js delete mode 100644 e2e/paths/04-item/03_tax.spec.js delete mode 100644 e2e/paths/04-item/04_tags.spec.js delete mode 100644 e2e/paths/04-item/05_botanical.spec.js delete mode 100644 e2e/paths/04-item/06_barcode.spec.js delete mode 100644 e2e/paths/04-item/07_create.spec.js delete mode 100644 e2e/paths/04-item/08_regularize.spec.js delete mode 100644 e2e/paths/04-item/09_index.spec.js delete mode 100644 e2e/paths/04-item/10_item_log.spec.js delete mode 100644 e2e/paths/04-item/11_descriptor.spec.js delete mode 100644 e2e/paths/04-item/12_request.spec.js delete mode 100644 e2e/paths/04-item/13_fixedPrice.spec.js delete mode 100644 modules/item/front/barcode/index.html delete mode 100644 modules/item/front/barcode/index.js delete mode 100644 modules/item/front/basic-data/index.html delete mode 100644 modules/item/front/basic-data/index.js delete mode 100644 modules/item/front/basic-data/index.spec.js delete mode 100644 modules/item/front/basic-data/locale/es.yml delete mode 100644 modules/item/front/botanical/index.html delete mode 100644 modules/item/front/botanical/index.js delete mode 100644 modules/item/front/botanical/index.spec.js delete mode 100644 modules/item/front/botanical/locale/es.yml delete mode 100644 modules/item/front/card/index.html delete mode 100644 modules/item/front/card/index.js delete mode 100644 modules/item/front/card/index.spec.js delete mode 100644 modules/item/front/create/index.html delete mode 100644 modules/item/front/create/index.js delete mode 100644 modules/item/front/create/index.spec.js delete mode 100644 modules/item/front/create/locale/es.yml delete mode 100644 modules/item/front/diary/index.html delete mode 100644 modules/item/front/diary/index.js delete mode 100644 modules/item/front/fetched-tags/index.html delete mode 100644 modules/item/front/fetched-tags/index.js delete mode 100644 modules/item/front/fetched-tags/style.scss delete mode 100644 modules/item/front/fixed-price-search-panel/index.html delete mode 100644 modules/item/front/fixed-price-search-panel/index.js delete mode 100644 modules/item/front/fixed-price-search-panel/index.spec.js delete mode 100644 modules/item/front/fixed-price-search-panel/locale/es.yml delete mode 100644 modules/item/front/fixed-price-search-panel/style.scss delete mode 100644 modules/item/front/fixed-price/index.html delete mode 100644 modules/item/front/fixed-price/index.js delete mode 100644 modules/item/front/fixed-price/index.spec.js delete mode 100644 modules/item/front/fixed-price/locale/es.yml delete mode 100644 modules/item/front/fixed-price/style.scss delete mode 100644 modules/item/front/index/index.html delete mode 100644 modules/item/front/index/index.js delete mode 100644 modules/item/front/index/index.spec.js delete mode 100644 modules/item/front/index/locale/es.yml delete mode 100644 modules/item/front/index/preview.svg delete mode 100644 modules/item/front/index/style.scss delete mode 100644 modules/item/front/item-shelving/index.html delete mode 100644 modules/item/front/item-shelving/index.js delete mode 100644 modules/item/front/item-shelving/index.spec.js delete mode 100644 modules/item/front/item-shelving/locale/es.yml delete mode 100644 modules/item/front/item-type/basic-data/index.html delete mode 100644 modules/item/front/item-type/basic-data/index.js delete mode 100644 modules/item/front/item-type/card/index.html delete mode 100644 modules/item/front/item-type/card/index.js delete mode 100644 modules/item/front/item-type/card/index.spec.js delete mode 100644 modules/item/front/item-type/create/index.html delete mode 100644 modules/item/front/item-type/create/index.js delete mode 100644 modules/item/front/item-type/create/index.spec.js delete mode 100644 modules/item/front/item-type/descriptor/index.html delete mode 100644 modules/item/front/item-type/descriptor/index.js delete mode 100644 modules/item/front/item-type/index.js delete mode 100644 modules/item/front/item-type/index/index.html delete mode 100644 modules/item/front/item-type/index/index.js delete mode 100644 modules/item/front/item-type/index/index.spec.js delete mode 100644 modules/item/front/item-type/index/locale/es.yml delete mode 100644 modules/item/front/item-type/main/index.html delete mode 100644 modules/item/front/item-type/main/index.js delete mode 100644 modules/item/front/item-type/main/index.spec.js delete mode 100644 modules/item/front/item-type/main/locale/es.yml delete mode 100644 modules/item/front/item-type/search-panel/index.html delete mode 100644 modules/item/front/item-type/search-panel/index.js delete mode 100644 modules/item/front/item-type/summary/index.html delete mode 100644 modules/item/front/item-type/summary/index.js delete mode 100644 modules/item/front/item-type/summary/locale/es.yml delete mode 100644 modules/item/front/last-entries/index.html delete mode 100644 modules/item/front/last-entries/index.js delete mode 100644 modules/item/front/last-entries/locale/es.yml delete mode 100644 modules/item/front/request-search-panel/index.html delete mode 100644 modules/item/front/request-search-panel/index.js delete mode 100644 modules/item/front/request-search-panel/index.spec.js delete mode 100644 modules/item/front/request-search-panel/locale/es.yml delete mode 100644 modules/item/front/request/index.html delete mode 100644 modules/item/front/request/index.js delete mode 100644 modules/item/front/request/index.spec.js delete mode 100644 modules/item/front/request/locale/es.yml delete mode 100644 modules/item/front/request/style.scss delete mode 100644 modules/item/front/search-panel/index.html delete mode 100644 modules/item/front/search-panel/index.js delete mode 100644 modules/item/front/search-panel/index.spec.js delete mode 100644 modules/item/front/search-panel/locale/es.yml delete mode 100644 modules/item/front/summary/index.html delete mode 100644 modules/item/front/summary/index.js delete mode 100644 modules/item/front/summary/index.spec.js delete mode 100644 modules/item/front/summary/locale/en.yml delete mode 100644 modules/item/front/summary/locale/es.yml delete mode 100644 modules/item/front/summary/style.scss delete mode 100644 modules/item/front/tags/index.html delete mode 100644 modules/item/front/tags/index.js delete mode 100644 modules/item/front/tags/index.spec.js delete mode 100644 modules/item/front/tax/index.html delete mode 100644 modules/item/front/tax/index.js delete mode 100644 modules/item/front/tax/index.spec.js delete mode 100644 modules/item/front/waste/index/index.html delete mode 100644 modules/item/front/waste/index/index.js delete mode 100644 modules/item/front/waste/index/style.scss delete mode 100644 modules/item/front/waste/locale/es.yml diff --git a/e2e/paths/04-item/01_summary.spec.js b/e2e/paths/04-item/01_summary.spec.js deleted file mode 100644 index 51195be48..000000000 --- a/e2e/paths/04-item/01_summary.spec.js +++ /dev/null @@ -1,133 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item summary path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'item'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should search for an item', async() => { - await page.doSearch('Ranged weapon'); - const resultsCount = await page.countElement(selectors.itemsIndex.searchResult); - - await page.waitForTextInElement(selectors.itemsIndex.firstSearchResult, 'Ranged weapon'); - await page.waitToClick(selectors.itemsIndex.firstResultPreviewButton); - const isVisible = await page.isVisible(selectors.itemSummary.basicData); - - expect(resultsCount).toBe(4); - expect(isVisible).toBeTruthy(); - }); - - it(`should check the item summary preview shows fields from basic data`, async() => { - await page.waitForTextInElement(selectors.itemSummary.basicData, 'Ranged weapon longbow 200cm'); - const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText'); - - expect(result).toContain('Ranged weapon longbow 200cm'); - }); - - it(`should check the item summary preview shows fields from tags`, async() => { - await page.waitForTextInElement(selectors.itemSummary.tags, 'Brown'); - const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText'); - - expect(result).toContain('Brown'); - }); - - it(`should check the item summary preview shows fields from botanical`, async() => { - await page.waitForTextInElement(selectors.itemSummary.botanical, 'Abelia'); - const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText'); - - expect(result).toContain('Abelia'); - }); - - it(`should check the item summary preview shows fields from barcode`, async() => { - await page.waitForTextInElement(selectors.itemSummary.barcode, '1'); - const result = await page.waitToGetProperty(selectors.itemSummary.barcode, 'innerText'); - - expect(result).toContain('1'); - }); - - it(`should close the summary popup`, async() => { - await page.closePopup(); - await page.waitForSelector(selectors.itemSummary.basicData, {hidden: true}); - }); - - it('should search for other item', async() => { - await page.doSearch('Melee Reinforced'); - const resultsCount = await page.countElement(selectors.itemsIndex.searchResult); - - await page.waitToClick(selectors.itemsIndex.firstResultPreviewButton); - await page.waitForSelector(selectors.itemSummary.basicData, {visible: true}); - - expect(resultsCount).toBe(3); - }); - - it(`should now check the item summary preview shows fields from basic data`, async() => { - await page.waitForTextInElement(selectors.itemSummary.basicData, 'Melee Reinforced weapon combat fist 15cm'); - const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText'); - - expect(result).toContain('Melee Reinforced weapon combat fist 15cm'); - }); - - it(`should now check the item summary preview shows fields from tags`, async() => { - await page.waitForTextInElement(selectors.itemSummary.tags, 'Silver'); - const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText'); - - expect(result).toContain('Silver'); - }); - - it(`should now check the item summary preview shows fields from botanical`, async() => { - await page.waitForTextInElement(selectors.itemSummary.botanical, '-'); - const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText'); - - expect(result).toContain('-'); - }); - - it(`should now close the summary popup`, async() => { - await page.closePopup(); - await page.waitForSelector(selectors.itemSummary.basicData, {hidden: true}); - }); - - it(`should navigate to one of the items detailed section`, async() => { - await page.accessToSearchResult('Melee weapon combat fist 15cm'); - await page.waitForState('item.card.summary'); - }); - - it(`should check the descritor edit button is not visible for employee`, async() => { - const visibleButton = await page.isVisible(selectors.itemDescriptor.editButton); - - expect(visibleButton).toBeFalsy(); - }); - - it(`should check the item summary shows fields from basic data section`, async() => { - await page.waitForTextInElement(selectors.itemSummary.basicData, 'Melee weapon combat fist 15cm'); - const result = await page.waitToGetProperty(selectors.itemSummary.basicData, 'innerText'); - - expect(result).toContain('Melee weapon combat fist 15cm'); - }); - - it(`should check the item summary shows fields from tags section`, async() => { - const result = await page.waitToGetProperty(selectors.itemSummary.tags, 'innerText'); - - expect(result).toContain('Silver'); - }); - - it(`should check the item summary shows fields from botanical section`, async() => { - const result = await page.waitToGetProperty(selectors.itemSummary.botanical, 'innerText'); - - expect(result).toContain('procera'); - }); - - it(`should check the item summary shows fields from barcodes section`, async() => { - const result = await page.waitToGetProperty(selectors.itemSummary.barcode, 'innerText'); - - expect(result).toContain('4'); - }); -}); diff --git a/e2e/paths/04-item/02_basic_data.spec.js b/e2e/paths/04-item/02_basic_data.spec.js deleted file mode 100644 index 3bad18303..000000000 --- a/e2e/paths/04-item/02_basic_data.spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import getBrowser from '../../helpers/puppeteer'; - -const $ = { - form: 'vn-item-basic-data form', - intrastatForm: '.vn-dialog.shown form', - newIntrastatButton: 'vn-item-basic-data vn-icon-button[vn-tooltip="New intrastat"] > button' -}; - -describe('Item Edit basic data path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('Melee weapon combat fist 15cm'); - }); - - beforeEach(async() => { - await page.accessToSection('item.card.basicData'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should edit the item basic data and confirm the item data was edited`, async() => { - const values = { - type: 'Anthurium', - intrastat: 'Coral y materiales similares', - relevancy: 1, - generic: 'Pallet', - isActive: false, - priceInKg: true, - isFragile: true, - packingOut: 5 - }; - - const message = await page.sendForm($.form, values); - await page.reloadSection('item.card.basicData'); - const formValues = await page.fetchForm($.form, Object.keys(values)); - - expect(message.isSuccess).toBeTrue(); - expect(formValues).toEqual(values); - }); - - it(`should create a new intrastat and save it`, async() => { - await page.click($.newIntrastatButton); - await page.waitForSelector($.intrastatForm); - await page.fillForm($.intrastatForm, { - id: '588420239', - description: 'Tropical Flowers' - }); - await page.respondToDialog('accept'); - - const message = await page.sendForm($.form); - await page.reloadSection('item.card.basicData'); - const formValues = await page.fetchForm($.form, ['intrastat']); - - expect(message.isSuccess).toBeTrue(); - expect(formValues).toEqual({intrastat: 'Tropical Flowers'}); - }); -}); diff --git a/e2e/paths/04-item/03_tax.spec.js b/e2e/paths/04-item/03_tax.spec.js deleted file mode 100644 index 6013094e9..000000000 --- a/e2e/paths/04-item/03_tax.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item edit tax path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('Ranged weapon longbow 200cm'); - await page.accessToSection('item.card.tax'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should add the item tax to all countries`, async() => { - await page.autocompleteSearch(selectors.itemTax.firstClass, 'General VAT'); - await page.autocompleteSearch(selectors.itemTax.secondClass, 'General VAT'); - await page.waitToClick(selectors.itemTax.submitTaxButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the first item tax class was edited`, async() => { - await page.reloadSection('item.card.tax'); - const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value'); - - expect(firstVatType).toEqual('General VAT'); - }); - - it(`should confirm the second item tax class was edited`, async() => { - const secondVatType = await page - .waitToGetProperty(selectors.itemTax.secondClass, 'value'); - - expect(secondVatType).toEqual('General VAT'); - }); - - it(`should edit the first class without saving the form`, async() => { - await page.autocompleteSearch(selectors.itemTax.firstClass, 'Reduced VAT'); - const firstVatType = await page.waitToGetProperty(selectors.itemTax.firstClass, 'value'); - - expect(firstVatType).toEqual('Reduced VAT'); - }); -}); diff --git a/e2e/paths/04-item/04_tags.spec.js b/e2e/paths/04-item/04_tags.spec.js deleted file mode 100644 index f13cf9aa4..000000000 --- a/e2e/paths/04-item/04_tags.spec.js +++ /dev/null @@ -1,79 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item create tags path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('Ranged weapon longbow 200cm'); - await page.accessToSection('item.card.tags'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should create a new tag and delete a former one', async() => { - await page.waitToClick(selectors.itemTags.fourthRemoveTagButton); - await page.waitToClick(selectors.itemTags.addItemTagButton); - await page.autocompleteSearch(selectors.itemTags.seventhTag, 'Ancho de la base'); - await page.write(selectors.itemTags.seventhValue, '50'); - await page.clearInput(selectors.itemTags.seventhRelevancy); - await page.write(selectors.itemTags.seventhRelevancy, '4'); - await page.waitToClick(selectors.itemTags.submitItemTagsButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the fourth row data is the expected one', async() => { - await page.reloadSection('item.card.tags'); - await page.waitForSelector('vn-item-tags'); - let result = await page.waitToGetProperty(selectors.itemTags.fourthTag, 'value'); - - expect(result).toEqual('Ancho de la base'); - - result = await page - .waitToGetProperty(selectors.itemTags.fourthValue, 'value'); - - expect(result).toEqual('50'); - - result = await page - .waitToGetProperty(selectors.itemTags.fourthRelevancy, 'value'); - - expect(result).toEqual('4'); - }); - - it('should confirm the fifth row data is the expected one', async() => { - let tag = await page - .waitToGetProperty(selectors.itemTags.fifthTag, 'value'); - - let value = await page - .waitToGetProperty(selectors.itemTags.fifthValue, 'value'); - - let relevancy = await page - .waitToGetProperty(selectors.itemTags.fifthRelevancy, 'value'); - - expect(tag).toEqual('Color'); - expect(value).toEqual('Brown'); - expect(relevancy).toEqual('5'); - }); - - it('should confirm the sixth row data is the expected one', async() => { - let tag = await page - .waitToGetProperty(selectors.itemTags.sixthTag, 'value'); - - let value = await page - .waitToGetProperty(selectors.itemTags.sixthValue, 'value'); - - let relevancy = await page - .waitToGetProperty(selectors.itemTags.sixthRelevancy, 'value'); - - expect(tag).toEqual('Categoria'); - expect(value).toEqual('+1 precission'); - expect(relevancy).toEqual('6'); - }); -}); diff --git a/e2e/paths/04-item/05_botanical.spec.js b/e2e/paths/04-item/05_botanical.spec.js deleted file mode 100644 index 1671cc5d2..000000000 --- a/e2e/paths/04-item/05_botanical.spec.js +++ /dev/null @@ -1,66 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item Create botanical path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('Ranged weapon pistol 9mm'); - await page.accessToSection('item.card.botanical'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should create a new botanical for the item`, async() => { - await page.autocompleteSearch(selectors.itemBotanical.genus, 'Abelia'); - await page.autocompleteSearch(selectors.itemBotanical.species, 'dealbata'); - await page.waitToClick(selectors.itemBotanical.submitBotanicalButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the Genus for the item was created`, async() => { - await page.waitForTextInField(selectors.itemBotanical.genus, 'Abelia'); - const result = await page - .waitToGetProperty(selectors.itemBotanical.genus, 'value'); - - expect(result).toEqual('Abelia'); - }); - - it(`should confirm the Species for the item was created`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBotanical.species, 'value'); - - expect(result).toEqual('dealbata'); - }); - - it(`should edit botanical for the item`, async() => { - await page.autocompleteSearch(selectors.itemBotanical.genus, 'Abies'); - await page.autocompleteSearch(selectors.itemBotanical.species, 'decurrens'); - await page.waitToClick(selectors.itemBotanical.submitBotanicalButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the Genus for the item was edited`, async() => { - await page.waitForTextInField(selectors.itemBotanical.genus, 'Abies'); - const result = await page - .waitToGetProperty(selectors.itemBotanical.genus, 'value'); - - expect(result).toEqual('Abies'); - }); - - it(`should confirm the Species for the item was edited`, async() => { - const result = await page - .waitToGetProperty(selectors.itemBotanical.species, 'value'); - - expect(result).toEqual('decurrens'); - }); -}); diff --git a/e2e/paths/04-item/06_barcode.spec.js b/e2e/paths/04-item/06_barcode.spec.js deleted file mode 100644 index 36c9c39ae..000000000 --- a/e2e/paths/04-item/06_barcode.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item Create barcodes path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('Ranged weapon longbow 200cm'); - await page.accessToSection('item.card.itemBarcode'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should click create a new code and delete a former one`, async() => { - await page.waitToClick(selectors.itemBarcodes.firstCodeRemoveButton); - await page.waitToClick(selectors.itemBarcodes.addBarcodeButton); - await page.write(selectors.itemBarcodes.thirdCode, '5'); - await page.waitToClick(selectors.itemBarcodes.submitBarcodesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the barcode 5 is created and it is now the third barcode as the first was deleted`, async() => { - await page.reloadSection('item.card.itemBarcode'); - await page.waitForTextInField(selectors.itemBarcodes.thirdCode, '5'); - const result = await page - .waitToGetProperty(selectors.itemBarcodes.thirdCode, 'value'); - - expect(result).toEqual('5'); - }); -}); diff --git a/e2e/paths/04-item/07_create.spec.js b/e2e/paths/04-item/07_create.spec.js deleted file mode 100644 index c20be9ebc..000000000 --- a/e2e/paths/04-item/07_create.spec.js +++ /dev/null @@ -1,65 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -const $ = { - form: 'vn-item-create form' -}; - -describe('Item Create', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should access to the create item view by clicking the create floating button', async() => { - await page.waitToClick(selectors.itemsIndex.createItemButton); - await page.waitForState('item.create'); - }); - - it('should return to the item index by clickig the cancel button', async() => { - await page.waitToClick(selectors.itemCreateView.cancelButton); - await page.waitForState('item.index'); - }); - - it('should now access to the create item view by clicking the create floating button', async() => { - await page.waitToClick(selectors.itemsIndex.createItemButton); - await page.waitForState('item.create'); - }); - - it('should throw an error when insert an invalid priority', async() => { - const values = { - name: 'Infinity Gauntlet', - type: 'Crisantemo', - intrastat: 'Coral y materiales similares', - origin: 'Holand', - priority: null - }; - const message = await page.sendForm($.form, values); - - expect(message.text).toContain('Valid priorities'); - }); - - it('should create the Infinity Gauntlet item', async() => { - const values = { - name: 'Infinity Gauntlet', - type: 'Crisantemo', - intrastat: 'Coral y materiales similares', - origin: 'Holand', - priority: '2' - }; - - await page.fillForm($.form, values); - const formValues = await page.fetchForm($.form, Object.keys(values)); - const message = await page.sendForm($.form); - - expect(message.isSuccess).toBeTrue(); - expect(formValues).toEqual(values); - }); -}); diff --git a/e2e/paths/04-item/08_regularize.spec.js b/e2e/paths/04-item/08_regularize.spec.js deleted file mode 100644 index 9b3074776..000000000 --- a/e2e/paths/04-item/08_regularize.spec.js +++ /dev/null @@ -1,141 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item regularize path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'item'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should edit the user local warehouse', async() => { - await page.waitForSpinnerLoad(); - await page.waitToClick(selectors.globalItems.userMenuButton); - await page.autocompleteSearch(selectors.globalItems.userLocalWarehouse, 'Warehouse Four'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the local settings were saved', async() => { - const userLocalWarehouse = await page - .waitToGetProperty(selectors.globalItems.userLocalWarehouse, 'value'); - - await page.closePopup(); - - expect(userLocalWarehouse).toContain('Warehouse Four'); - }); - - it('should search for a specific item', async() => { - await page.accessToSearchResult('Ranged weapon pistol 9mm'); - await page.waitForState('item.card.summary'); - }); - - it('should open the regularize dialog and check the warehouse matches the local user settings', async() => { - await page.waitToClick(selectors.itemDescriptor.moreMenu); - await page.waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton); - const result = await page.waitToGetProperty(selectors.itemDescriptor.regularizeWarehouse, 'value'); - - expect(result).toEqual('Warehouse Four'); - }); - - it('should regularize the item', async() => { - await page.write(selectors.itemDescriptor.regularizeQuantity, '100'); - await page.autocompleteSearch(selectors.itemDescriptor.regularizeWarehouse, 'Warehouse One'); - await page.waitToClick(selectors.itemDescriptor.regularizeSaveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should click on the Tickets button of the top bar menu', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await Promise.all([ - page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), - page.waitToClick(selectors.globalItems.ticketsButton) - ]); - await page.waitForState('ticket.index'); - }); - - it('should clear the user local settings now', async() => { - await page.waitToClick(selectors.globalItems.userMenuButton); - await page.waitForContentLoaded(); - await page.clearInput(selectors.globalItems.userConfigFirstAutocomplete); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should search for the ticket with alias missing', async() => { - await page.keyboard.press('Escape'); - await page.accessToSearchResult('missing'); - await page.waitForState('ticket.card.summary'); - }); - - it(`should check the ticket sale quantity is showing a negative value`, async() => { - await page.waitForTextInElement(selectors.ticketSummary.firstSaleQuantity, '-100'); - const result = await page - .waitToGetProperty(selectors.ticketSummary.firstSaleQuantity, 'innerText'); - - expect(result).toContain('-100'); - }); - - it(`should check the ticket sale discount is 100%`, async() => { - const result = await page - .waitToGetProperty(selectors.ticketSummary.firstSaleDiscount, 'innerText'); - - expect(result).toContain('100 %'); - }); - - it('should now click on the Items button of the top bar menu', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.itemsButton); - await page.waitForState('item.index'); - }); - - it('should search for the item once again', async() => { - await page.accessToSearchResult('Ranged weapon pistol 9mm'); - await page.waitForState('item.card.summary'); - }); - - it('should regularize the item once more', async() => { - await page.waitToClick(selectors.itemDescriptor.moreMenu); - await page.waitToClick(selectors.itemDescriptor.moreMenuRegularizeButton); - await page.write(selectors.itemDescriptor.regularizeQuantity, '100'); - await page.autocompleteSearch(selectors.itemDescriptor.regularizeWarehouse, 'Warehouse One'); - await page.waitToClick(selectors.itemDescriptor.regularizeSaveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should again click on the Tickets button of the top bar menu', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await Promise.all([ - page.waitForNavigation({waitUntil: ['load', 'networkidle0', 'domcontentloaded']}), - page.waitToClick(selectors.globalItems.ticketsButton) - ]); - await page.waitForState('ticket.index'); - }); - - it('should search for the ticket missing once again', async() => { - await page.accessToSearchResult('Missing'); - await page.waitForState('ticket.card.summary'); - }); - - it(`should check the ticket contains now two sales`, async() => { - await page.waitForTextInElement(selectors.ticketSummary.firstSaleQuantity, '-100'); - const result = await page.countElement(selectors.ticketSummary.sale); - - expect(result).toEqual(2); - }); -}); diff --git a/e2e/paths/04-item/09_index.spec.js b/e2e/paths/04-item/09_index.spec.js deleted file mode 100644 index 6e0a4bd5c..000000000 --- a/e2e/paths/04-item/09_index.spec.js +++ /dev/null @@ -1,84 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item index path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('salesPerson', 'item'); - await page.waitToClick(selectors.globalItems.searchButton); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should click on the fields to show button to open the list of columns to show', async() => { - await page.waitToClick(selectors.itemsIndex.shownColumns); - const visible = await page.isVisible(selectors.itemsIndex.shownColumnsList); - - expect(visible).toBeTruthy(); - }); - - it('should unmark all checkboxes except the first and the last ones', async() => { - await page.waitToClick(selectors.itemsIndex.idCheckbox); - await page.waitToClick(selectors.itemsIndex.stemsCheckbox); - await page.waitToClick(selectors.itemsIndex.sizeCheckbox); - await page.waitToClick(selectors.itemsIndex.typeCheckbox); - await page.waitToClick(selectors.itemsIndex.categoryCheckbox); - await page.waitToClick(selectors.itemsIndex.intrastadCheckbox); - await page.waitToClick(selectors.itemsIndex.originCheckbox); - await page.waitToClick(selectors.itemsIndex.buyerCheckbox); - await page.waitToClick(selectors.itemsIndex.weightByPieceCheckbox); - await page.waitToClick(selectors.itemsIndex.saveFieldsButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should navigate forth and back to see the images column is still visible', async() => { - await page.closePopup(); - await page.waitToClick(selectors.itemsIndex.firstSearchResult); - await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); - await page.waitToClick(selectors.globalItems.searchButton); - await page.waitForSelector(selectors.itemsIndex.searchResult); - await page.waitImgLoad(selectors.itemsIndex.firstItemImage); - const imageVisible = await page.isVisible(selectors.itemsIndex.firstItemImageTd); - - expect(imageVisible).toBeTruthy(); - }); - - it('should check the ids column is not visible', async() => { - await page.waitForSelector(selectors.itemsIndex.firstItemId, {hidden: true}); - }); - - it('should mark all unchecked boxes to leave the index as it was', async() => { - await page.waitToClick(selectors.itemsIndex.shownColumns); - await page.waitToClick(selectors.itemsIndex.idCheckbox); - await page.waitToClick(selectors.itemsIndex.stemsCheckbox); - await page.waitToClick(selectors.itemsIndex.sizeCheckbox); - await page.waitToClick(selectors.itemsIndex.typeCheckbox); - await page.waitToClick(selectors.itemsIndex.categoryCheckbox); - await page.waitToClick(selectors.itemsIndex.intrastadCheckbox); - await page.waitToClick(selectors.itemsIndex.originCheckbox); - await page.waitToClick(selectors.itemsIndex.buyerCheckbox); - await page.waitToClick(selectors.itemsIndex.weightByPieceCheckbox); - await page.waitToClick(selectors.itemsIndex.saveFieldsButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should now navigate forth and back to see the ids column is now visible', async() => { - await page.closePopup(); - await page.waitToClick(selectors.itemsIndex.firstSearchResult); - await page.waitToClick(selectors.itemDescriptor.goBackToModuleIndexButton); - await page.waitToClick(selectors.globalItems.searchButton); - await page.waitForSelector(selectors.itemsIndex.searchResult); - const idVisible = await page.isVisible(selectors.itemsIndex.firstItemId); - - expect(idVisible).toBeTruthy(); - }); -}); diff --git a/e2e/paths/04-item/10_item_log.spec.js b/e2e/paths/04-item/10_item_log.spec.js deleted file mode 100644 index c88fbd337..000000000 --- a/e2e/paths/04-item/10_item_log.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item log path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('developer', 'item'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should search for the Knowledge artifact to confirm it isn't created yet`, async() => { - await page.doSearch('Knowledge artifact'); - const nResults = await page.countElement(selectors.itemsIndex.searchResult); - - expect(nResults).toEqual(1); - }); - - it('should access to the create item view by clicking the create floating button', async() => { - await page.waitToClick(selectors.itemsIndex.createItemButton); - await page.waitForState('item.create'); - }); - - it('should create the Knowledge artifact item', async() => { - await page.write(selectors.itemCreateView.temporalName, 'Knowledge artifact'); - await page.autocompleteSearch(selectors.itemCreateView.type, 'Crisantemo'); - await page.autocompleteSearch(selectors.itemCreateView.intrastat, 'Coral y materiales similares'); - await page.autocompleteSearch(selectors.itemCreateView.origin, 'Holand'); - await page.waitToClick(selectors.itemCreateView.createButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should return to the items index by clicking the return to items button', async() => { - await page.waitToClick(selectors.itemBasicData.goToItemIndexButton); - await page.waitForSelector(selectors.itemsIndex.createItemButton); - await page.waitForState('item.index'); - }); -}); diff --git a/e2e/paths/04-item/11_descriptor.spec.js b/e2e/paths/04-item/11_descriptor.spec.js deleted file mode 100644 index eb9ed2573..000000000 --- a/e2e/paths/04-item/11_descriptor.spec.js +++ /dev/null @@ -1,41 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item descriptor path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSearchResult('1'); - await page.accessToSection('item.card.basicData'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should set the item to inactive', async() => { - await page.waitToClick(selectors.itemBasicData.isActiveCheckbox); - await page.waitToClick(selectors.itemBasicData.submitBasicDataButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should reload the section and check the inactive icon is visible', async() => { - await page.reloadSection('item.card.basicData'); - const visibleIcon = await page.isVisible(selectors.itemDescriptor.inactiveIcon); - - expect(visibleIcon).toBeTruthy(); - }); - - it('should set the item back to active', async() => { - await page.waitToClick(selectors.itemBasicData.isActiveCheckbox); - await page.waitToClick(selectors.itemBasicData.submitBasicDataButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); -}); diff --git a/e2e/paths/04-item/12_request.spec.js b/e2e/paths/04-item/12_request.spec.js deleted file mode 100644 index e0f3a1b45..000000000 --- a/e2e/paths/04-item/12_request.spec.js +++ /dev/null @@ -1,45 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Item request path', () => { - let browser; - let page; - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSection('item.request'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should reach the item request section', async() => { - await page.waitForState('item.request'); - }); - - it('should fill the id and quantity then check the concept was updated', async() => { - await page.writeOnEditableTD(selectors.itemRequest.firstRequestItemID, '4'); - await page.writeOnEditableTD(selectors.itemRequest.firstRequestQuantity, '10'); - await page.waitForTextInElement(selectors.itemRequest.firstRequestConcept, 'Melee weapon heavy shield 100cm'); - let filledConcept = await page.waitToGetProperty(selectors.itemRequest.firstRequestConcept, 'innerText'); - - expect(filledConcept).toContain('Melee weapon heavy shield 100cm'); - }); - - it('should check the status of the request should now be accepted', async() => { - let status = await page.waitToGetProperty(selectors.itemRequest.firstRequestStatus, 'innerText'); - - expect(status).toContain('Accepted'); - }); - - it('should now click on the second declain request icon then type the reason', async() => { - await page.waitToClick(selectors.itemRequest.secondRequestDecline); - await page.write(selectors.itemRequest.declineReason, 'Not quite as expected'); - await page.respondToDialog('accept'); - let status = await page.waitToGetProperty(selectors.itemRequest.secondRequestStatus, 'innerText'); - - expect(status).toContain('Denied'); - }); -}); diff --git a/e2e/paths/04-item/13_fixedPrice.spec.js b/e2e/paths/04-item/13_fixedPrice.spec.js deleted file mode 100644 index f36138e18..000000000 --- a/e2e/paths/04-item/13_fixedPrice.spec.js +++ /dev/null @@ -1,97 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -const $ = selectors.itemFixedPrice; - -describe('Item fixed prices path', () => { - let browser; - let page; - let httpRequest; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyer', 'item'); - await page.accessToSection('item.fixedPrice'); - page.on('request', req => { - if (req.url().includes(`FixedPrices/filter`)) - httpRequest = req.url(); - }); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should filter using all the fields', async() => { - await page.write($.generalSearchFilter, 'item'); - await page.keyboard.press('Enter'); - - expect(httpRequest).toContain('search=item'); - - await page.click($.chip); - await page.click($.reignFilter); - - expect(httpRequest).toContain('categoryFk'); - - await page.autocompleteSearch($.typeFilter, 'Alstroemeria'); - - expect(httpRequest).toContain('typeFk'); - - await page.click($.chip); - await page.autocompleteSearch($.buyerFilter, 'buyerNick'); - - expect(httpRequest).toContain('buyerFk'); - - await page.click($.chip); - await page.autocompleteSearch($.warehouseFilter, 'Algemesi'); - - expect(httpRequest).toContain('warehouseFk'); - - await page.click($.chip); - await page.click($.mineFilter); - - expect(httpRequest).toContain('mine=true'); - - await page.click($.chip); - await page.click($.hasMinPriceFilter); - - expect(httpRequest).toContain('hasMinPrice=true'); - - await page.click($.chip); - await page.click($.addTag); - await page.autocompleteSearch($.tagFilter, 'Color'); - await page.autocompleteSearch($.tagValueFilter, 'Brown'); - - expect(httpRequest).toContain('tags'); - - await page.click($.chip); - }); - - it('should click on the add new fixed price button', async() => { - await page.waitToClick($.add); - await page.waitForSelector($.fourthFixedPrice); - }); - - it('should fill the fixed price data', async() => { - const now = Date.vnNew(); - await page.autocompleteSearch($.fourthWarehouse, 'Warehouse one'); - await page.writeOnEditableTD($.fourthGroupingPrice, '1'); - await page.writeOnEditableTD($.fourthPackingPrice, '1'); - await page.write($.fourthMinPrice, '1'); - await page.pickDate($.fourthStarted, now); - await page.pickDate($.fourthEnded, now); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should reload the section and check the created price has the expected ID', async() => { - await page.goto(`http://localhost:5000/#!/item/fixed-price`); - await page.autocompleteSearch($.warehouseFilter, 'Warehouse one'); - await page.click($.chip); - const result = await page.waitToGetProperty($.fourthItemID, 'value'); - - expect(result).toContain('13'); - }); -}); diff --git a/modules/item/front/barcode/index.html b/modules/item/front/barcode/index.html deleted file mode 100644 index 8d6cb3af8..000000000 --- a/modules/item/front/barcode/index.html +++ /dev/null @@ -1,57 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/item/front/barcode/index.js b/modules/item/front/barcode/index.js deleted file mode 100644 index 4ceb87b9d..000000000 --- a/modules/item/front/barcode/index.js +++ /dev/null @@ -1,17 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - onSubmit() { - this.$.watcher.check(); - this.$.model.save().then(() => { - this.$.watcher.notifySaved(); - this.$.watcher.updateOriginalData(); - }); - } -} - -ngModule.vnComponent('vnItemBarcode', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/basic-data/index.html b/modules/item/front/basic-data/index.html deleted file mode 100644 index af76d5966..000000000 --- a/modules/item/front/basic-data/index.html +++ /dev/null @@ -1,318 +0,0 @@ - - - - - - -
- - - - -
{{::name}}
-
- {{::category.name}} -
-
-
- - - - -
- - - - - - - -
{{::name}}
-
- #{{::id}} -
-
- - - - -
-
- - - -
{{::description}}
-
- #{{::id}} -
-
- - - - -
- - -
- - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ID - Item - Size - Producer - Color - - - - - - - {{::item.id}} - - - {{::item.name}} - {{::item.size}} - {{::item.producer.name}} - {{::item.ink.name}} - - - - - - - - diff --git a/modules/item/front/basic-data/index.js b/modules/item/front/basic-data/index.js deleted file mode 100644 index 5a303f15f..000000000 --- a/modules/item/front/basic-data/index.js +++ /dev/null @@ -1,87 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - showIntrastat(event) { - if (event.defaultPrevented) return; - event.preventDefault(); - - this.newIntrastat = { - taxClassFk: this.item.taxClassFk - }; - this.$.intrastat.show(); - } - - onIntrastatAccept() { - const query = `Items/${this.$params.id}/createIntrastat`; - return this.$http.patch(query, this.newIntrastat) - .then(res => this.item.intrastatFk = res.data.id); - } - - itemSearchFunc($search) { - return /^\d+$/.test($search) - ? {id: $search} - : {name: {like: '%' + $search + '%'}}; - } - - showFilterDialog(item) { - this.activeItem = item; - this.itemFilterParams = {}; - this.itemFilter = { - include: [ - { - relation: 'producer', - scope: { - fields: ['name'] - } - }, - { - relation: 'ink', - scope: { - fields: ['name'] - } - } - ] - }; - - this.$.filterDialog.show(); - } - - selectItem(id) { - this.activeItem['genericFk'] = id; - this.$.filterDialog.hide(); - } - - filter() { - const filter = this.itemFilter; - const params = this.itemFilterParams; - const where = {}; - for (let key in params) { - const value = params[key]; - if (!value) continue; - - switch (key) { - case 'name': - where[key] = {like: `%${value}%`}; - break; - case 'producerFk': - case 'typeFk': - case 'size': - case 'inkFk': - where[key] = value; - } - } - - filter.where = where; - - this.$.itemsModel.applyFilter(filter); - } -} - -ngModule.vnComponent('vnItemBasicData', { - template: require('./index.html'), - bindings: { - item: '<' - }, - controller: Controller -}); diff --git a/modules/item/front/basic-data/index.spec.js b/modules/item/front/basic-data/index.spec.js deleted file mode 100644 index 274453d30..000000000 --- a/modules/item/front/basic-data/index.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import './index.js'; - -describe('vnItemBasicData', () => { - describe('Component vnItemBasicData', () => { - let $httpBackend; - let $scope; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnItemBasicData', {$element, $scope}); - controller.$.watcher = {}; - controller.$params.id = 1; - controller.item = {id: 1, name: 'Rainbow Coral'}; - })); - - describe('onIntrastatAccept()', () => { - it('should pass the data to the watcher', () => { - const newIntrastatId = 20; - $httpBackend.expect('PATCH', 'Items/1/createIntrastat').respond({id: 20}); - controller.onIntrastatAccept(); - $httpBackend.flush(); - - expect(controller.item.intrastatFk).toEqual(newIntrastatId); - }); - }); - }); -}); diff --git a/modules/item/front/basic-data/locale/es.yml b/modules/item/front/basic-data/locale/es.yml deleted file mode 100644 index fc490e448..000000000 --- a/modules/item/front/basic-data/locale/es.yml +++ /dev/null @@ -1,19 +0,0 @@ -Reference: Referencia -Full name calculates based on tags 1-3. Is not recommended to change it manually: >- - El nombre completo se calcula - basado en los tags 1-3. - No se recomienda cambiarlo manualmente -Is active: Activo -Expense: Gasto -Price in kg: Precio en kg -New intrastat: Nuevo intrastat -Identifier: Identificador -Fragile: Frágil -Is shown at website, app that this item cannot travel (wreath, palms, ...): Se muestra en la web, app que este artículo no puede viajar (coronas, palmas, ...) -Multiplier: Multiplicador -Generic: Genérico -This item does need a photo: Este artículo necesita una foto -Do photo: Hacer foto -Recycled Plastic: Plástico reciclado -Non recycled plastic: Plástico no reciclado -Minimum sales quantity: Cantidad mínima de venta diff --git a/modules/item/front/botanical/index.html b/modules/item/front/botanical/index.html deleted file mode 100644 index 2388f4e8f..000000000 --- a/modules/item/front/botanical/index.html +++ /dev/null @@ -1,102 +0,0 @@ - - -
- - - - - - - - - - -
{{name}}
-
- {{genus.name}} -
-
- - - - -
-
-
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/modules/item/front/botanical/index.js b/modules/item/front/botanical/index.js deleted file mode 100644 index 8ade0fd9d..000000000 --- a/modules/item/front/botanical/index.js +++ /dev/null @@ -1,99 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; -class Controller extends Section { - get item() { - return this._item; - } - - set item(value) { - this._item = value; - if (value) - this.getBotanicalData(); - } - - showGenus(event) { - if (event.defaultPrevented) return; - event.preventDefault(); - - this.$.genus.show(); - } - - showSpecies(event) { - if (event.defaultPrevented) return; - event.preventDefault(); - - this.$.species.show(); - } - - onGenusAccept() { - try { - if (!this.data.name) - throw new Error(`The name of the genus can't be empty`); - - this.$http.post(`genera`, this.data).then(res => { - this.vnApp.showMessage(this.$t('The genus has been created')); - this.emit('response', {$response: res.data}); - this.onGenusResponse(res.data); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - return false; - } - return true; - } - - onSpeciesAccept() { - try { - if (!this.data.name) - throw new Error(`The name of the species can't be empty`); - - this.$http.post(`species`, this.data).then(res => { - this.vnApp.showMessage(this.$t('The species has been created')); - this.emit('response', {$response: res.data}); - this.onSpeciesResponse(res.data); - }); - } catch (e) { - this.vnApp.showError(this.$t(e.message)); - return false; - } - return true; - } - - getBotanicalData() { - const filter = { - where: {itemFk: this.item.id} - }; - const filterParams = encodeURIComponent(JSON.stringify(filter)); - this.$http.get(`ItemBotanicals?filter=${filterParams}`).then(res => { - if (res.data[0]) - this.botanical = res.data[0]; - - else - this.botanical = {itemFk: this.item.id}; - }); - } - - onSubmit() { - this.$.watcher.check(); - this.$http.patch(`ItemBotanicals`, this.botanical).then(() => { - this.$.watcher.notifySaved(); - this.$.watcher.updateOriginalData(); - }); - } - - onGenusResponse(response) { - this.botanical.genusFk = response.id; - } - - onSpeciesResponse(response) { - this.botanical.specieFk = response.id; - } -} - -ngModule.vnComponent('vnItemBotanical', { - template: require('./index.html'), - bindings: { - item: '<' - }, - controller: Controller -}); diff --git a/modules/item/front/botanical/index.spec.js b/modules/item/front/botanical/index.spec.js deleted file mode 100644 index afec83cfd..000000000 --- a/modules/item/front/botanical/index.spec.js +++ /dev/null @@ -1,179 +0,0 @@ -import './index.js'; - -describe('vnItemBotanical', () => { - describe('Component vnItemBotanical', () => { - let $httpBackend; - let $scope; - let controller; - let vnApp; - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_, _vnApp_) => { - $httpBackend = _$httpBackend_; - vnApp = _vnApp_; - jest.spyOn(vnApp, 'showError'); - $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnItemBotanical', {$element, $scope}); - controller.item = {id: 5}; - controller.$params = {itemFk: 5}; - controller.$ = { - watcher: { - check: () => {}, - notifySaved: () => {}, - updateOriginalData: () => {}}, - genus: { - show: () => {} - }, - species: { - show: () => {} - }}; - })); - - beforeEach(() => { - const response = {data: 'MyResult'}; - $httpBackend.whenRoute('GET', 'ItemBotanicals').respond(response); - }); - - describe('showGenus()', () => { - it('should do nothing in genus field if it default is prevented', () => { - const event = { - defaultPrevented: true, - preventDefault: () => {} - }; - jest.spyOn(event, 'preventDefault'); - jest.spyOn(controller.$.genus, 'show'); - - controller.showGenus(event); - - expect(event.preventDefault).not.toHaveBeenCalledWith(); - expect(controller.$.genus.show).not.toHaveBeenCalledWith(); - }); - - it('should call show function in genus field when the default is not prevented', () => { - const event = { - defaultPrevented: false, - preventDefault: () => {} - }; - - jest.spyOn(event, 'preventDefault'); - jest.spyOn(controller.$.genus, 'show'); - - controller.showGenus(event); - - expect(event.preventDefault).toHaveBeenCalledWith(); - expect(controller.$.genus.show).toHaveBeenCalledWith(); - }); - }); - - describe('showSpecies()', () => { - it('should do nothing in species field if it default is prevented', () => { - const event = { - defaultPrevented: true, - preventDefault: () => {} - }; - jest.spyOn(event, 'preventDefault'); - jest.spyOn(controller.$.species, 'show'); - - controller.showSpecies(event); - - expect(event.preventDefault).not.toHaveBeenCalledWith(); - expect(controller.$.species.show).not.toHaveBeenCalledWith(); - }); - - it('should call show function in species field when the default is not prevented', () => { - const event = { - defaultPrevented: false, - preventDefault: () => {} - }; - - jest.spyOn(event, 'preventDefault'); - jest.spyOn(controller.$.species, 'show'); - - controller.showSpecies(event); - - expect(event.preventDefault).toHaveBeenCalledWith(); - expect(controller.$.species.show).toHaveBeenCalledWith(); - }); - }); - - describe('onGenusAccept()', () => { - it('should throw an error if the item botanical has no genus name', () => { - jest.spyOn(controller.vnApp, 'showMessage'); - - controller.data = {}; - - controller.onGenusAccept(); - - expect(controller.vnApp.showError).toHaveBeenCalledWith(`The name of the genus can't be empty`); - }); - - it('should add the new genus', () => { - controller.data = { - id: 4, - name: 'Anilius' - }; - - $httpBackend.expectPOST('genera', controller.data).respond(200, controller.data); - - controller.onGenusAccept(); - $httpBackend.flush(); - - controller.onGenusResponse(controller.data); - - expect(controller.botanical.genusFk).toEqual(controller.data.id); - }); - }); - - describe('onSpeciesAccept()', () => { - it('should throw an error if the item botanical has no species name', () => { - jest.spyOn(controller.vnApp, 'showMessage'); - - controller.data = {}; - - controller.onSpeciesAccept(); - - expect(controller.vnApp.showError).toHaveBeenCalledWith(`The name of the species can't be empty`); - }); - - it('should add the new species', () => { - controller.data = { - id: 2, - name: 'Spasiva' - }; - - $httpBackend.expectPOST('species', controller.data).respond(200, controller.data); - - controller.onSpeciesAccept(); - $httpBackend.flush(); - controller.onSpeciesResponse(controller.data); - }); - }); - - describe('onSubmit()', () => { - it('should make HTTP POST request to save the genus and species data', () => { - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - jest.spyOn(controller.$.watcher, 'check'); - jest.spyOn(controller.$.watcher, 'notifySaved'); - - $httpBackend.expectPATCH('ItemBotanicals').respond(); - controller.onSubmit(); - $httpBackend.flush(); - - expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); - expect(controller.$.watcher.check).toHaveBeenCalledWith(); - expect(controller.$.watcher.notifySaved).toHaveBeenCalledWith(); - }); - }); - - describe('getBotanicalData()', () => { - it('should get the species and genus data references of the item', () => { - controller.getBotanicalData(); - $httpBackend.flush(); - - expect(controller.botanical).toEqual(controller.$params); - }); - }); - }); -}); - diff --git a/modules/item/front/botanical/locale/es.yml b/modules/item/front/botanical/locale/es.yml deleted file mode 100644 index e1234bd71..000000000 --- a/modules/item/front/botanical/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -The genus has been created: El genus ha sido creado -The species has been created: La especie ha sido creada -Latin species name: Nombre de la especie en latín -Latin genus name: Nombre del genus en latín -Species: Especie \ No newline at end of file diff --git a/modules/item/front/card/index.html b/modules/item/front/card/index.html deleted file mode 100644 index 330d274c0..000000000 --- a/modules/item/front/card/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/modules/item/front/card/index.js b/modules/item/front/card/index.js deleted file mode 100644 index 2fe42fd04..000000000 --- a/modules/item/front/card/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import ngModule from '../module'; -import ModuleCard from 'salix/components/module-card'; - -class Controller extends ModuleCard { - reload() { - this.$http.get(`Items/${this.$params.id}/getCard`) - .then(res => this.item = res.data); - - this.$http.get('ItemConfigs/findOne') - .then(res => { - if (this.$state.getCurrentPath()[4].state.name === 'item.card.diary') return; - this.warehouseFk = res.data.warehouseFk; - this.getWarehouseName(res.data.warehouseFk); - }); - } - - getWarehouseName(warehouseFk) { - const filter = { - where: {id: warehouseFk} - }; - this.$http.get('Warehouses/findOne', {filter}) - .then(res => { - this.warehouseText = this.$t('WarehouseFk', { - warehouseName: res.data.name - }); - }); - } -} - -ngModule.vnComponent('vnItemCard', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/card/index.spec.js b/modules/item/front/card/index.spec.js deleted file mode 100644 index 6ebce3d36..000000000 --- a/modules/item/front/card/index.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemCard', () => { - let controller; - let $httpBackend; - let $state; - let data = {id: 1, name: 'fooName'}; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_, $stateParams, _$state_) => { - $httpBackend = _$httpBackend_; - $state = _$state_; - $state.getCurrentPath = () => [null, null, null, null, {state: {name: 'item.card.diary'}}]; - - let $element = angular.element('
'); - controller = $componentController('vnItemCard', {$element}); - - $stateParams.id = data.id; - $httpBackend.whenRoute('GET', 'Items/:id/getCard').respond(data); - })); - - it('should request data and set it on the controller', () => { - $httpBackend.expect('GET', `ItemConfigs/findOne`).respond({}); - controller.reload(); - $httpBackend.flush(); - - expect(controller.item).toEqual(data); - }); - }); -}); diff --git a/modules/item/front/create/index.html b/modules/item/front/create/index.html deleted file mode 100644 index b284abf06..000000000 --- a/modules/item/front/create/index.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - -
- - - - - - - - - - - - -
-
{{::code}}
-
{{::name}}
-
-
- {{category.name}} -
-
-
- - -
{{::description}}
-
- #{{::id}} -
-
-
-
- - - - -
- - - - - - -
diff --git a/modules/item/front/create/index.js b/modules/item/front/create/index.js deleted file mode 100644 index 4ca5f8f9f..000000000 --- a/modules/item/front/create/index.js +++ /dev/null @@ -1,40 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - this.fetchDefaultPriorityTag(); - } - - fetchDefaultPriorityTag() { - this.validPriorities = []; - const filter = {fields: ['defaultPriority', 'defaultTag', 'validPriorities'], limit: 1}; - this.$http.get(`ItemConfigs`, {filter}) - .then(res => { - if (res.data) { - const dataRow = res.data[0]; - dataRow.validPriorities.forEach(priority => { - this.validPriorities.push({priority}); - }); - this.item = { - priority: dataRow.defaultPriority, - tag: dataRow.defaultTag - }; - } - }); - } - - onSubmit() { - this.$.watcher.submit().then( - json => this.$state.go('item.card.basicData', {id: json.data.id}) - ); - } -} - -Controller.$inject = ['$element', '$scope']; - -ngModule.vnComponent('vnItemCreate', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/create/index.spec.js b/modules/item/front/create/index.spec.js deleted file mode 100644 index 9e54988d7..000000000 --- a/modules/item/front/create/index.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemCreate', () => { - let $scope; - let $state; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope, _$state_) => { - $scope = $rootScope.$new(); - $state = _$state_; - $scope.watcher = { - submit: () => { - return { - then: callback => { - callback({data: {id: 1}}); - } - }; - } - }; - const $element = angular.element(''); - controller = $componentController('vnItemCreate', {$element, $scope}); - })); - - describe('onSubmit()', () => { - it(`should call submit() on the watcher then expect a callback`, () => { - jest.spyOn($state, 'go'); - controller.onSubmit(); - - expect(controller.$state.go).toHaveBeenCalledWith('item.card.basicData', {id: 1}); - }); - }); - }); -}); - diff --git a/modules/item/front/create/locale/es.yml b/modules/item/front/create/locale/es.yml deleted file mode 100644 index 041826e1c..000000000 --- a/modules/item/front/create/locale/es.yml +++ /dev/null @@ -1 +0,0 @@ -Temporal name: Nombre temporal \ No newline at end of file diff --git a/modules/item/front/diary/index.html b/modules/item/front/diary/index.html deleted file mode 100644 index 7fb3b870e..000000000 --- a/modules/item/front/diary/index.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/modules/item/front/diary/index.js b/modules/item/front/diary/index.js deleted file mode 100644 index 3d86b0b60..000000000 --- a/modules/item/front/diary/index.js +++ /dev/null @@ -1,21 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - } - - async $onInit() { - this.$state.go('item.card.summary', {id: this.$params.id}); - window.location.href = await this.vnApp.getUrl(`item/${this.$params.id}/diary`); - } -} - -ngModule.vnComponent('vnItemDiary', { - template: require('./index.html'), - controller: Controller, - bindings: { - item: '<' - } -}); diff --git a/modules/item/front/fetched-tags/index.html b/modules/item/front/fetched-tags/index.html deleted file mode 100644 index df5936871..000000000 --- a/modules/item/front/fetched-tags/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - -
- {{::$ctrl.item.value5}} -
-
- {{::$ctrl.item.value6}} -
-
- {{::$ctrl.item.value7}} -
-
- {{::$ctrl.item.value8}} -
-
- {{::$ctrl.item.value9}} -
-
- {{::$ctrl.item.value10}} -
-
-
diff --git a/modules/item/front/fetched-tags/index.js b/modules/item/front/fetched-tags/index.js deleted file mode 100644 index e3584be23..000000000 --- a/modules/item/front/fetched-tags/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import ngModule from '../module'; -import Component from 'core/lib/component'; -import './style.scss'; - -ngModule.vnComponent('vnFetchedTags', { - template: require('./index.html'), - controller: Component, - bindings: { - maxLength: '<', - item: '<', - } -}); diff --git a/modules/item/front/fetched-tags/style.scss b/modules/item/front/fetched-tags/style.scss deleted file mode 100644 index 250ca07ab..000000000 --- a/modules/item/front/fetched-tags/style.scss +++ /dev/null @@ -1,61 +0,0 @@ -@import "variables"; - -[vn-fetched-tags] { - min-width: 155px; - & [wide] { - width: 430px; - } - & div { - display: flex; - flex-wrap: wrap; - align-items: center; - & vn-one { - min-width: 200px; - overflow: hidden; - text-overflow: ellipsis; - font-size: 1rem; - } - & vn-one h3 { - color: $color-font-secondary; - text-transform: uppercase; - line-height: initial; - font-size: 0.75rem; - margin-bottom: 0px; - } - } -} - -vn-fetched-tags { - & > vn-horizontal { - align-items: center; - max-width: 210px; - & > vn-auto { - flex-wrap: wrap; - - & > .inline-tag { - margin: 1px; - } - } - - & > vn-auto { - display: flex; - - & > .inline-tag { - color: $color-font-secondary; - text-align: center; - font-size: .8rem; - height: 13px; - padding: 1px; - width: 64px; - min-width: 64px; - max-width: 64px; - flex: 1; - border: 1px solid $color-font-secondary; - - &.empty { - border: 1px solid darken($color-font-secondary, 30%); - } - } - } - } -} diff --git a/modules/item/front/fixed-price-search-panel/index.html b/modules/item/front/fixed-price-search-panel/index.html deleted file mode 100644 index 347e65571..000000000 --- a/modules/item/front/fixed-price-search-panel/index.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - - - - - - - - - - - - - - -
{{name}}
-
- {{category.name}} -
-
-
-
- - - - - - - - - - - - - - - - - - - - Tags - - - - - - - - - - - - - -
- - Id/{{$ctrl.$t('Name')}}: {{$ctrl.filter.search}} - - - {{$ctrl.$t('Category')}}: {{category.selection.name}} - - - {{$ctrl.$t('Type')}}: {{type.selection.name}} - - - {{$ctrl.$t('Buyer')}}: {{buyer.selection.nickname}} - - - {{$ctrl.$t('Warehouse')}}: {{warehouse.selection.name}} - - - {{$ctrl.$t('Started')}}: {{$ctrl.filter.started | date:'dd/MM/yyyy'}} - - - {{$ctrl.$t('Ended')}}: {{$ctrl.filter.ended | date:'dd/MM/yyyy'}} - - - {{$ctrl.$t('For me')}}: {{$ctrl.filter.mine ? '✓' : '✗'}} - - - {{$ctrl.$t('Minimum price')}}: {{$ctrl.filter.hasMinPrice ? '✓' : '✗'}} - - - {{$ctrl.showTagInfo(chipTag)}} - -
-
diff --git a/modules/item/front/fixed-price-search-panel/index.js b/modules/item/front/fixed-price-search-panel/index.js deleted file mode 100644 index 0882eb5ac..000000000 --- a/modules/item/front/fixed-price-search-panel/index.js +++ /dev/null @@ -1,60 +0,0 @@ -import ngModule from '../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; -import './style.scss'; - -class Controller extends SearchPanel { - constructor($element, $) { - super($element, $); - } - - $onInit() { - this.filter = { - tags: [] - }; - } - - changeCategory(id) { - if (this.filter.categoryFk != id) { - this.filter.categoryFk = id; - this.addFilters(); - } - } - - removeItemFilter(param) { - this.filter[param] = null; - if (param == 'categoryFk') this.filter['typeFk'] = null; - this.addFilters(); - } - - removeTag(tag) { - const index = this.filter.tags.indexOf(tag); - if (index > -1) this.filter.tags.splice(index, 1); - this.addFilters(); - } - - onKeyPress($event) { - if ($event.key === 'Enter') - this.addFilters(); - } - - addFilters() { - for (let i = 0; i < this.filter.tags.length; i++) { - if (!this.filter.tags[i].value) - this.filter.tags.splice(i, 1); - } - return this.model.addFilter({}, this.filter); - } - - showTagInfo(itemTag) { - if (!itemTag.tagFk) return itemTag.value; - return `${this.tags.find(tag => tag.id == itemTag.tagFk).name}: ${itemTag.value}`; - } -} - -ngModule.vnComponent('vnFixedPriceSearchPanel', { - template: require('./index.html'), - controller: Controller, - bindings: { - model: '<' - } -}); diff --git a/modules/item/front/fixed-price-search-panel/index.spec.js b/modules/item/front/fixed-price-search-panel/index.spec.js deleted file mode 100644 index 597bc108e..000000000 --- a/modules/item/front/fixed-price-search-panel/index.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnFixedPriceSearchPanel', () => { - let $element; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(angular.mock.inject($componentController => { - $element = angular.element(``); - controller = $componentController('vnFixedPriceSearchPanel', {$element}); - controller.model = {addFilter: () => {}}; - })); - - describe('removeItemFilter()', () => { - it(`should remove param from filter`, () => { - controller.filter = {tags: [], categoryFk: 1, typeFk: 1}; - const expectFilter = {tags: [], categoryFk: null, typeFk: null}; - - controller.removeItemFilter('categoryFk'); - - expect(controller.filter).toEqual(expectFilter); - }); - }); - - describe('removeTag()', () => { - it(`should remove tag from filter`, () => { - const tag = {tagFk: 1, value: 'Value'}; - controller.filter = {tags: [tag]}; - const expectFilter = {tags: []}; - - controller.removeTag(tag); - - expect(controller.filter).toEqual(expectFilter); - }); - }); - - describe('showTagInfo()', () => { - it(`should show tag value`, () => { - const tag = {value: 'Value'}; - const result = controller.showTagInfo(tag); - - expect(result).toEqual('Value'); - }); - - it(`should show tag name and value`, () => { - const tag = {tagFk: 1, value: 'Value'}; - controller.tags = [{id: 1, name: 'tagName'}]; - const result = controller.showTagInfo(tag); - - expect(result).toEqual('tagName: Value'); - }); - }); - }); -}); diff --git a/modules/item/front/fixed-price-search-panel/locale/es.yml b/modules/item/front/fixed-price-search-panel/locale/es.yml deleted file mode 100644 index 06e5e6b26..000000000 --- a/modules/item/front/fixed-price-search-panel/locale/es.yml +++ /dev/null @@ -1,4 +0,0 @@ -Started: Inicio -Ended: Fin -Minimum price: Precio mínimo -Item ID: ID Artículo \ No newline at end of file diff --git a/modules/item/front/fixed-price-search-panel/style.scss b/modules/item/front/fixed-price-search-panel/style.scss deleted file mode 100644 index e386033dd..000000000 --- a/modules/item/front/fixed-price-search-panel/style.scss +++ /dev/null @@ -1,71 +0,0 @@ -@import "variables"; - -vn-fixed-price-search-panel vn-side-menu { - .menu { - min-width: $menu-width; - } - & > div { - .input { - padding-left: $spacing-md; - padding-right: $spacing-md; - border-color: $color-spacer; - border-bottom: $border-thin; - } - .horizontal { - padding-left: $spacing-md; - padding-right: $spacing-md; - grid-auto-flow: column; - grid-column-gap: $spacing-sm; - align-items: center; - } - .tags { - padding: $spacing-md; - padding-bottom: 0%; - padding-top: 0%; - align-items: center; - } - .chips { - display: flex; - flex-wrap: wrap; - padding: $spacing-md; - overflow: hidden; - max-width: 100%; - border-color: $color-spacer; - border-top: $border-thin; - } - .item-category { - padding: $spacing-sm; - justify-content: flex-start; - align-items: flex-start; - flex-wrap: wrap; - - vn-autocomplete[vn-id="category"] { - display: none; - } - - & > vn-one { - padding: $spacing-sm; - min-width: 33.33%; - text-align: center; - box-sizing: border-box; - - & > vn-icon { - padding: $spacing-sm; - background-color: $color-font-secondary; - border-radius: 50%; - cursor: pointer; - - &.active { - background-color: $color-main; - color: #fff; - } - & > i:before { - font-size: 2.6rem; - width: 16px; - height: 16px; - } - } - } - } - } -} diff --git a/modules/item/front/fixed-price/index.html b/modules/item/front/fixed-price/index.html deleted file mode 100644 index f1f6e1419..000000000 --- a/modules/item/front/fixed-price/index.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Item ID - - Description - - Grouping price - - Packing price - - Min price - - Started - - Ended - - Warehouse -
- - - - - -
{{id}}
-
- {{name}} -
-
-
-
-
- - {{itemFk.selection.name}} - - -

{{price.subName}}

-
-
- - -
- - - {{price.rate2 | currency: 'EUR':2}} - - - - - - - - - - {{price.rate3 | currency: 'EUR':2}} - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - -
-
-
-
-
- -
- - - - -
- - - Edit - - {{::$ctrl.totalChecked}} - - buy(s) - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/item/front/fixed-price/index.js b/modules/item/front/fixed-price/index.js deleted file mode 100644 index fe6788e9c..000000000 --- a/modules/item/front/fixed-price/index.js +++ /dev/null @@ -1,254 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; -import './style.scss'; - -export default class Controller extends Section { - constructor($element, $) { - super($element, $); - this.editedColumn; - this.checkAll = false; - this.checkedFixedPrices = []; - - this.smartTableOptions = { - activeButtons: { - search: true - }, - columns: [ - { - field: 'warehouseFk', - autocomplete: { - url: 'Warehouses', - showField: 'name', - valueField: 'id', - } - }, - { - field: 'started', - searchable: false - }, - { - field: 'ended', - searchable: false - } - ] - }; - - this.filterParams = { - warehouseFk: this.vnConfig.warehouseFk - }; - } - - getFilterParams() { - return { - warehouseFk: this.vnConfig.warehouseFk - }; - } - - get columns() { - if (this._columns) return this._columns; - - this._columns = [ - {field: 'rate2', displayName: this.$t('Grouping price')}, - {field: 'rate3', displayName: this.$t('Packing price')}, - {field: 'hasMinPrice', displayName: this.$t('Has min price')}, - {field: 'minPrice', displayName: this.$t('Min price')}, - {field: 'started', displayName: this.$t('Started')}, - {field: 'ended', displayName: this.$t('Ended')}, - {field: 'warehouseFk', displayName: this.$t('Warehouse')} - ]; - - return this._columns; - } - - get checked() { - const fixedPrices = this.$.model.data || []; - const checkedBuys = []; - for (let fixedPrice of fixedPrices) { - if (fixedPrice.checked) - checkedBuys.push(fixedPrice); - } - - return checkedBuys; - } - - uncheck() { - this.checkAll = false; - this.checkedFixedPrices = []; - } - - get totalChecked() { - if (this.checkedDummyCount) - return this.checkedDummyCount; - - return this.checked.length; - } - - saveChecked(fixedPriceId) { - const index = this.checkedFixedPrices.indexOf(fixedPriceId); - if (index !== -1) - return this.checkedFixedPrices.splice(index, 1); - return this.checkedFixedPrices.push(fixedPriceId); - } - - reCheck() { - if (!this.$.model.data) return; - if (!this.checkedFixedPrices.length) return; - - this.$.model.data.forEach(fixedPrice => { - if (this.checkedFixedPrices.includes(fixedPrice.id)) - fixedPrice.checked = true; - }); - } - - onEditAccept() { - const rowsToEdit = []; - for (let row of this.checked) - rowsToEdit.push({id: row.id, itemFk: row.itemFk}); - - const data = { - field: this.editedColumn.field, - newValue: this.editedColumn.newValue, - lines: rowsToEdit - }; - - if (this.checkedDummyCount && this.checkedDummyCount > 0) { - const params = {}; - if (this.$.model.userParams) { - const userParams = this.$.model.userParams; - for (let param in userParams) { - let newParam = this.exprBuilder(param, userParams[param]); - if (!newParam) - newParam = {[param]: userParams[param]}; - Object.assign(params, newParam); - } - } - if (this.$.model.userFilter) - Object.assign(params, this.$.model.userFilter.where); - - data.filter = params; - } - - return this.$http.post('FixedPrices/editFixedPrice', data) - .then(() => { - this.uncheck(); - this.$.model.refresh(); - }); - } - - isBigger(date) { - let today = Date.vnNew(); - today.setHours(0, 0, 0, 0); - - date = new Date(date); - date.setHours(0, 0, 0, 0); - - const timeDifference = today - date; - if (timeDifference < 0) return 'warning'; - } - - isLower(date) { - let today = Date.vnNew(); - today.setHours(0, 0, 0, 0); - - date = new Date(date); - date.setHours(0, 0, 0, 0); - - const timeDifference = today - date; - if (timeDifference > 0) return 'warning'; - } - - add() { - if (!this.$.model.data || this.$.model.data.length == 0) { - this.$.model.data = []; - this.$.model.proxiedData = []; - - const today = Date.vnNew(); - - const millisecsInDay = 86400000; - const daysInWeek = 7; - const nextWeek = new Date(today.getTime() + daysInWeek * millisecsInDay); - - this.$.model.insert({ - started: today, - ended: nextWeek - }); - return; - } - - const lastIndex = this.$.model.data.length - 1; - const lastItem = this.$.model.data[lastIndex]; - this.$.model.insert({ - itemFk: lastItem.itemFk, - name: lastItem.name, - subName: lastItem.subName, - value5: lastItem.value5, - value6: lastItem.value6, - value7: lastItem.value7, - value8: lastItem.value8, - value9: lastItem.value9, - value10: lastItem.value10, - warehouseFk: lastItem.warehouseFk, - rate2: lastItem.rate2, - rate3: lastItem.rate3, - hasMinPrice: lastItem.hasMinPrice, - minPrice: lastItem.minPrice, - started: lastItem.started, - ended: lastItem.ended, - }); - } - - upsertPrice(price, resetMinPrice) { - if (resetMinPrice) - delete price['minPrice']; - - const requiredFields = ['itemFk', 'started', 'ended', 'rate2', 'rate3']; - for (const field of requiredFields) - if (price[field] == undefined) return; - - const query = 'FixedPrices/upsertFixedPrice'; - this.$http.patch(query, price) - .then(res => { - this.vnApp.showSuccess(this.$t('Data saved!')); - Object.assign(price, res.data); - }); - } - - removePrice($index) { - const price = this.$.model.data[$index]; - if (price.id) { - this.$http.delete(`FixedPrices/${price.id}`) - .then(() => { - this.$.model.remove($index); - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } else - this.$.model.remove($index); - } - - itemSearchFunc($search) { - return /^\d+$/.test($search) - ? {id: $search} - : {name: {like: '%' + $search + '%'}}; - } - - exprBuilder(param, value) { - switch (param) { - case 'name': - return {'i.name': {like: `%${value}%`}}; - case 'itemFk': - case 'warehouseFk': - case 'rate2': - case 'rate3': - param = `fp.${param}`; - return {[param]: value}; - case 'minPrice': - param = `i.${param}`; - return {[param]: value}; - } - } -} - -ngModule.vnComponent('vnFixedPrice', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/fixed-price/index.spec.js b/modules/item/front/fixed-price/index.spec.js deleted file mode 100644 index ae24da60b..000000000 --- a/modules/item/front/fixed-price/index.spec.js +++ /dev/null @@ -1,173 +0,0 @@ -import './index'; - -describe('fixed price', () => { - describe('Component vnFixedPrice', () => { - let controller; - let $httpBackend; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_, $rootScope) => { - $httpBackend = _$httpBackend_; - const $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnFixedPrice', {$element, $scope}); - controller.$ = { - model: {refresh: () => {}}, - edit: {hide: () => {}} - }; - })); - - describe('get columns', () => { - it(`should return a set of columns`, () => { - let result = controller.columns; - - let length = result.length; - let anyColumn = Object.keys(result[Math.floor(Math.random() * Math.floor(length))]); - - expect(anyColumn).toContain('field', 'displayName'); - }); - }); - - describe('get checked', () => { - it(`should return a set of checked lines`, () => { - controller.$.model.data = [ - {checked: true, id: 1}, - {checked: true, id: 2}, - {checked: true, id: 3}, - {checked: false, id: 4}, - ]; - - let result = controller.checked; - - expect(result.length).toEqual(3); - }); - }); - - describe('reCheck()', () => { - it(`should recheck buys`, () => { - controller.$.model.data = [ - {checked: false, id: 1}, - {checked: false, id: 2}, - {checked: false, id: 3}, - {checked: false, id: 4}, - ]; - controller.checkedFixedPrices = [1, 2]; - - controller.reCheck(); - - expect(controller.$.model.data[0].checked).toEqual(true); - expect(controller.$.model.data[1].checked).toEqual(true); - expect(controller.$.model.data[2].checked).toEqual(false); - expect(controller.$.model.data[3].checked).toEqual(false); - }); - }); - - describe('saveChecked()', () => { - it(`should check buy`, () => { - const buyCheck = 3; - controller.checkedFixedPrices = [1, 2]; - - controller.saveChecked(buyCheck); - - expect(controller.checkedFixedPrices[2]).toEqual(buyCheck); - }); - - it(`should uncheck buy`, () => { - const buyUncheck = 3; - controller.checkedFixedPrices = [1, 2, 3]; - - controller.saveChecked(buyUncheck); - - expect(controller.checkedFixedPrices[2]).toEqual(undefined); - }); - }); - - describe('onEditAccept()', () => { - it(`should perform a query to update columns`, () => { - controller.editedColumn = {field: 'my field', newValue: 'the new value'}; - const query = 'FixedPrices/editFixedPrice'; - - $httpBackend.expectPOST(query).respond(); - controller.onEditAccept(); - $httpBackend.flush(); - - const result = controller.checked; - - expect(result.length).toEqual(0); - }); - }); - - describe('upsertPrice()', () => { - it('should do nothing if one or more required arguments are missing', () => { - jest.spyOn(controller.vnApp, 'showSuccess'); - - controller.upsertPrice({}); - - expect(controller.vnApp.showSuccess).not.toHaveBeenCalled(); - }); - - it('should perform an http request to update the price', () => { - const now = Date.vnNew(); - jest.spyOn(controller.vnApp, 'showSuccess'); - - $httpBackend.expectPATCH('FixedPrices/upsertFixedPrice').respond(); - controller.upsertPrice({ - itemFk: 1, - started: now, - ended: now, - rate2: 1, - rate3: 2 - }); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('removePrice()', () => { - it(`should only remove the created instance by the model as it doesn't have an ID yet`, () => { - const $index = 0; - controller.$ = { - model: { - remove: () => {}, - data: [{ - foo: 'bar' - }] - } - }; - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller.$.model, 'remove'); - - $httpBackend.expectGET('Warehouses').respond(); - - controller.removePrice($index); - - expect(controller.vnApp.showSuccess).not.toHaveBeenCalled(); - expect(controller.$.model.remove).toHaveBeenCalled(); - }); - - it('should remove the instance performing an delete http request', () => { - const $index = 0; - controller.$ = { - model: { - remove: () => {}, - data: [{ - id: '1' - }] - } - }; - jest.spyOn(controller.vnApp, 'showSuccess'); - jest.spyOn(controller.$.model, 'remove'); - - const query = `FixedPrices/${controller.$.model.data[0].id}`; - $httpBackend.expectDELETE(query).respond(); - controller.removePrice($index); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - expect(controller.$.model.remove).toHaveBeenCalled(); - }); - }); - }); -}); diff --git a/modules/item/front/fixed-price/locale/es.yml b/modules/item/front/fixed-price/locale/es.yml deleted file mode 100644 index 6dacf96c9..000000000 --- a/modules/item/front/fixed-price/locale/es.yml +++ /dev/null @@ -1,7 +0,0 @@ -Fixed prices: Precios fijados -Search prices by item ID or code: Buscar por ID de artículo o código -Search fixed prices: Buscar precios fijados -Add fixed price: Añadir precio fijado -This row will be removed: Esta linea se eliminará -Edit fixed price(s): Editar precio(s) fijado(s) -Has min price: Tiene precio mínimo diff --git a/modules/item/front/fixed-price/style.scss b/modules/item/front/fixed-price/style.scss deleted file mode 100644 index f70ec2f50..000000000 --- a/modules/item/front/fixed-price/style.scss +++ /dev/null @@ -1,46 +0,0 @@ -@import "variables"; -vn-fixed-price{ - smart-table table{ - [shrink-field]{ - width: 90px; - max-width: 90px; - } - [shrink-field-expand]{ - width: 150px; - max-width: 150px; - } - } - - .minPrice { - align-items: center; - text-align: center; - vn-input-number { - width: 75px; - max-width: 75px; - } - } - - smart-table table tbody > * > td .chip { - padding: 0px; - } - - smart-table table tbody > * > td{ - padding: 0px; - padding-left: 5px; - padding-right: 5px; - } - - smart-table table tbody > * > td .chip.warning { - color: $color-font-bg - } - - .vn-field > .container > .infix > .control > input { - color: inherit; - } - - vn-input-number.inactive{ - input { - color: $color-font-light !important; - } - } -} diff --git a/modules/item/front/index.js b/modules/item/front/index.js index 354477d4d..fb1aacd39 100644 --- a/modules/item/front/index.js +++ b/modules/item/front/index.js @@ -1,27 +1,6 @@ export * from './module'; import './main'; -import './index/'; -import './search-panel'; -import './diary'; -import './create'; -import './card'; import './descriptor'; import './descriptor-popover'; -import './basic-data'; -import './fetched-tags'; -import './tags'; -import './tax'; -import './log'; -import './request'; -import './request-search-panel'; -import './last-entries'; -import './botanical'; -import './barcode'; -import './summary'; -import './waste/index/'; -import './fixed-price'; -import './fixed-price-search-panel'; -import './item-type'; -import './item-shelving'; diff --git a/modules/item/front/index/index.html b/modules/item/front/index/index.html deleted file mode 100644 index 6f5cce7c0..000000000 --- a/modules/item/front/index/index.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Identifier - - Grouping - - Packing - - Description - - Stems - - Size - - Type - - Category - - Intrastat - - Origin - - Buyer - - Weight/Piece - - Multiplier - - Active - - Producer - - Landed -
- - - - {{::item.id}} - - {{::item.grouping | dashIfEmpty}}{{::item.packing | dashIfEmpty}} -
- {{::item.name}} - -

{{::item.subName}}

-
-
- - -
{{::item.stems}}{{::item.size}} - {{::item.typeName}} - - {{::item.category}} - - {{::item.intrastat}} - {{::item.origin}} - - {{::item.userName}} - - {{::item.weightByPiece}}{{::item.stemMultiplier}} - - - {{::item.producer | dashIfEmpty}}{{::item.landed | date:'dd/MM/yyyy'}} - - - - - - -
-
-
-
- - - - - - - - - - - - - - - - - Filter by selection - - - Exclude selection - - - Remove filter - - - Remove all filters - - - \ No newline at end of file diff --git a/modules/item/front/index/index.js b/modules/item/front/index/index.js deleted file mode 100644 index 2bcc2302a..000000000 --- a/modules/item/front/index/index.js +++ /dev/null @@ -1,112 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; -import './style.scss'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - - this.smartTableOptions = { - activeButtons: { - search: true, - shownColumns: true, - }, - columns: [ - { - field: 'category', - autocomplete: { - url: 'ItemCategories', - valueField: 'name', - } - }, - { - field: 'origin', - autocomplete: { - url: 'Origins', - showField: 'code', - valueField: 'code' - } - }, - { - field: 'typeFk', - autocomplete: { - url: 'ItemTypes', - } - }, - { - field: 'intrastat', - autocomplete: { - url: 'Intrastats', - showField: 'description', - valueField: 'description' - } - }, - { - field: 'buyerFk', - autocomplete: { - url: 'TicketRequests/getItemTypeWorker', - searchFunction: '{firstName: $search}', - showField: 'nickname', - valueField: 'id', - } - }, - { - field: 'active', - searchable: false - }, - { - field: 'landed', - searchable: false - }, - ] - }; - } - - exprBuilder(param, value) { - switch (param) { - case 'category': - return {'ic.name': value}; - case 'buyerFk': - return {'it.workerFk': value}; - case 'grouping': - return {'b.grouping': value}; - case 'packing': - return {'b.packing': value}; - case 'origin': - return {'ori.code': value}; - case 'typeFk': - return {'i.typeFk': value}; - case 'intrastat': - return {'intr.description': value}; - case 'name': - return {'i.name': {like: `%${value}%`}}; - case 'producer': - return {'pr.name': {like: `%${value}%`}}; - case 'id': - case 'size': - case 'subname': - case 'isActive': - case 'weightByPiece': - case 'stemMultiplier': - case 'stems': - return {[`i.${param}`]: value}; - } - } - - onCloneAccept(itemFk) { - return this.$http.post(`Items/${itemFk}/clone`) - .then(res => { - this.$state.go('item.card.tags', {id: res.data.id}); - }); - } - - preview(item) { - this.itemSelected = item; - this.$.preview.show(); - } -} - -ngModule.vnComponent('vnItemIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/index/index.spec.js b/modules/item/front/index/index.spec.js deleted file mode 100644 index 18abde581..000000000 --- a/modules/item/front/index/index.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemIndex', () => { - let controller; - let $httpBackend; - let $scope; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_, $rootScope) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnItemIndex', {$element, $scope}); - })); - - describe('onCloneAccept()', () => { - it('should perform a post query and then call go() then update itemSelected in the controller', () => { - jest.spyOn(controller.$state, 'go'); - - $httpBackend.expectRoute('POST', `Items/:id/clone`).respond({id: 99}); - controller.onCloneAccept(1); - $httpBackend.flush(); - - expect(controller.$state.go).toHaveBeenCalledWith('item.card.tags', {id: 99}); - }); - }); - }); -}); diff --git a/modules/item/front/index/locale/es.yml b/modules/item/front/index/locale/es.yml deleted file mode 100644 index 0d72edd28..000000000 --- a/modules/item/front/index/locale/es.yml +++ /dev/null @@ -1,2 +0,0 @@ -picture: Foto -Buy requests: Peticiones de compra \ No newline at end of file diff --git a/modules/item/front/index/preview.svg b/modules/item/front/index/preview.svg deleted file mode 100644 index 5d56b5f34..000000000 --- a/modules/item/front/index/preview.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/modules/item/front/index/style.scss b/modules/item/front/index/style.scss deleted file mode 100644 index e9fd9f935..000000000 --- a/modules/item/front/index/style.scss +++ /dev/null @@ -1,34 +0,0 @@ -@import "variables"; - -vn-item-product { - display: block; - - .id { - background-color: $color-main; - color: $color-font-dark; - margin-bottom: 0; - } - .image { - height: 112px; - width: 112px; - - & > img { - max-height: 100%; - max-width: 100%; - border-radius: 3px; - } - } - vn-label-value:first-of-type section{ - margin-top: 9px; - } -} - -vn-item-index { - table { - img { - border-radius: 50%; - width: 50px; - height: 50px; - } - } -} \ No newline at end of file diff --git a/modules/item/front/item-shelving/index.html b/modules/item/front/item-shelving/index.html deleted file mode 100644 index fa7a70544..000000000 --- a/modules/item/front/item-shelving/index.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - -
-
-
Total
- - -
-
-
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Created - - Item - - Concept - - Parking - - Shelving - - Etiqueta - - Packing -
- - - {{::itemShelvingPlacementSupplyStock.created | date: 'dd/MM/yyyy'}} - {{::itemShelvingPlacementSupplyStock.itemFk}} - - - {{itemShelvingPlacementSupplyStock.longName}} - - - {{::itemShelvingPlacementSupplyStock.parking}} - - {{::itemShelvingPlacementSupplyStock.shelving}} - - {{(itemShelvingPlacementSupplyStock.stock / itemShelvingPlacementSupplyStock.packing).toFixed(2)}} - - {{::itemShelvingPlacementSupplyStock.packing}} -
-
-
-
- - - - - \ No newline at end of file diff --git a/modules/item/front/item-shelving/index.js b/modules/item/front/item-shelving/index.js deleted file mode 100644 index b8584039b..000000000 --- a/modules/item/front/item-shelving/index.js +++ /dev/null @@ -1,89 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - constructor($element, $) { - super($element, $); - - this.smartTableOptions = { - activeButtons: { - search: true - }, - columns: [ - { - field: 'parking', - autocomplete: { - url: 'Parkings', - showField: 'code', - valueField: 'code' - } - }, - { - field: 'shelving', - autocomplete: { - url: 'Shelvings', - showField: 'code', - valueField: 'code' - } - }, - { - field: 'created', - searchable: false - }, - { - field: 'itemFk', - searchable: false - }, - { - field: 'longName', - searchable: false - } - ] - }; - } - - get checked() { - const itemShelvings = this.$.model.data || []; - const checkedLines = []; - for (let itemShelving of itemShelvings) { - if (itemShelving.checked) - checkedLines.push(itemShelving.itemShelvingFk); - } - - return checkedLines; - } - - calculateTotals() { - this.labelTotal = 0; - const itemShelvings = this.$.model.data || []; - itemShelvings.forEach(itemShelving => { - const label = itemShelving.stock / itemShelving.packing; - this.labelTotal += label; - }); - } - - onRemove() { - const params = {itemShelvingIds: this.checked}; - const query = `ItemShelvings/deleteItemShelvings`; - this.$http.post(query, params) - .then(() => { - this.vnApp.showSuccess(this.$t('ItemShelvings removed')); - this.$.model.refresh(); - }); - } - - exprBuilder(param, value) { - switch (param) { - case 'parking': - case 'shelving': - case 'label': - case 'packing': - return {[param]: value}; - } - } -} - -ngModule.vnComponent('vnItemShelving', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/item-shelving/index.spec.js b/modules/item/front/item-shelving/index.spec.js deleted file mode 100644 index 55df1c27d..000000000 --- a/modules/item/front/item-shelving/index.spec.js +++ /dev/null @@ -1,81 +0,0 @@ -import './index'; -import crudModel from 'core/mocks/crud-model'; - -describe('item shelving', () => { - describe('Component vnItemShelving', () => { - let controller; - let $httpBackend; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - const $element = angular.element(''); - controller = $componentController('vnItemShelving', {$element}); - controller.$.model = crudModel; - controller.$.model.data = [ - {itemShelvingFk: 1, packing: 10, stock: 1}, - {itemShelvingFk: 2, packing: 12, stock: 5}, - {itemShelvingFk: 4, packing: 20, stock: 10} - ]; - const modelData = controller.$.model.data; - modelData[0].checked = true; - modelData[1].checked = true; - })); - - describe('checked() getter', () => { - it('should return a the selected rows', () => { - const result = controller.checked; - - expect(result).toEqual(expect.arrayContaining([1, 2])); - }); - }); - - describe('calculateTotals()', () => { - it('should calculate the total of labels', () => { - controller.calculateTotals(); - - expect(controller.labelTotal).toEqual(1.0166666666666666); - }); - }); - - describe('onRemove()', () => { - it('shoud remove the selected lines', () => { - jest.spyOn(controller.$.model, 'refresh'); - const expectedParams = {itemShelvingIds: [1, 2]}; - - $httpBackend.expectPOST('ItemShelvings/deleteItemShelvings', expectedParams).respond(200); - controller.onRemove(); - $httpBackend.flush(); - - expect(controller.$.model.refresh).toHaveBeenCalled(); - }); - }); - - describe('exprBuilder()', () => { - it('should search by parking', () => { - const expr = controller.exprBuilder('parking', '700-01'); - - expect(expr).toEqual({'parking': '700-01'}); - }); - - it('should search by shelving', () => { - const expr = controller.exprBuilder('shelving', 'AAA'); - - expect(expr).toEqual({'shelving': 'AAA'}); - }); - - it('should search by label', () => { - const expr = controller.exprBuilder('label', 0.17); - - expect(expr).toEqual({'label': 0.17}); - }); - - it('should search by packing', () => { - const expr = controller.exprBuilder('packing', 10); - - expect(expr).toEqual({'packing': 10}); - }); - }); - }); -}); diff --git a/modules/item/front/item-shelving/locale/es.yml b/modules/item/front/item-shelving/locale/es.yml deleted file mode 100644 index 006363cfa..000000000 --- a/modules/item/front/item-shelving/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Shelving: Matrícula -Remove selected lines: Eliminar líneas seleccionadas -Selected lines will be deleted: Las líneas seleccionadas serán eliminadas -ItemShelvings removed: Carros eliminados -Total labels: Total etiquetas \ No newline at end of file diff --git a/modules/item/front/item-type/basic-data/index.html b/modules/item/front/item-type/basic-data/index.html deleted file mode 100644 index 1417a05ab..000000000 --- a/modules/item/front/item-type/basic-data/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/modules/item/front/item-type/basic-data/index.js b/modules/item/front/item-type/basic-data/index.js deleted file mode 100644 index ec280fdf8..000000000 --- a/modules/item/front/item-type/basic-data/index.js +++ /dev/null @@ -1,12 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section {} - -ngModule.component('vnItemTypeBasicData', { - template: require('./index.html'), - controller: Controller, - bindings: { - itemType: '<' - } -}); diff --git a/modules/item/front/item-type/card/index.html b/modules/item/front/item-type/card/index.html deleted file mode 100644 index 80af6088e..000000000 --- a/modules/item/front/item-type/card/index.html +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/modules/item/front/item-type/card/index.js b/modules/item/front/item-type/card/index.js deleted file mode 100644 index fa6b37340..000000000 --- a/modules/item/front/item-type/card/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import ngModule from '../../module'; -import ModuleCard from 'salix/components/module-card'; - -class Controller extends ModuleCard { - reload() { - const filter = { - include: [ - {relation: 'worker'}, - {relation: 'category'}, - {relation: 'itemPackingType'}, - {relation: 'temperature'} - ] - }; - - this.$http.get(`ItemTypes/${this.$params.id}`, {filter}) - .then(res => this.itemType = res.data); - } -} - -ngModule.vnComponent('vnItemTypeCard', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/item-type/card/index.spec.js b/modules/item/front/item-type/card/index.spec.js deleted file mode 100644 index ab2314bb9..000000000 --- a/modules/item/front/item-type/card/index.spec.js +++ /dev/null @@ -1,27 +0,0 @@ -import './index'; - -describe('component vnItemTypeCard', () => { - let controller; - let $httpBackend; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - controller = $componentController('vnItemTypeCard', {$element: null}); - })); - - describe('reload()', () => { - it('should reload the controller data', () => { - controller.$params.id = 1; - - const itemType = {id: 1}; - - $httpBackend.expectGET('ItemTypes/1').respond(itemType); - controller.reload(); - $httpBackend.flush(); - - expect(controller.itemType).toEqual(itemType); - }); - }); -}); diff --git a/modules/item/front/item-type/create/index.html b/modules/item/front/item-type/create/index.html deleted file mode 100644 index 44cb5183d..000000000 --- a/modules/item/front/item-type/create/index.html +++ /dev/null @@ -1,62 +0,0 @@ - - -
- - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/item/front/item-type/create/index.js b/modules/item/front/item-type/create/index.js deleted file mode 100644 index ccf7744be..000000000 --- a/modules/item/front/item-type/create/index.js +++ /dev/null @@ -1,15 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - onSubmit() { - return this.$.watcher.submit().then(res => - this.$state.go('item.itemType.card.basicData', {id: res.data.id}) - ); - } -} - -ngModule.component('vnItemTypeCreate', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/item-type/create/index.spec.js b/modules/item/front/item-type/create/index.spec.js deleted file mode 100644 index 4b000df9a..000000000 --- a/modules/item/front/item-type/create/index.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -import './index'; - -describe('component vnItemTypeCreate', () => { - let $scope; - let $state; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope, _$state_) => { - $scope = $rootScope.$new(); - $state = _$state_; - $scope.watcher = { - submit: () => { - return { - then: callback => { - callback({data: {id: '1234'}}); - } - }; - } - }; - const $element = angular.element(''); - controller = $componentController('vnItemTypeCreate', {$element, $scope}); - })); - - describe('onSubmit()', () => { - it(`should call submit() on the watcher then expect a callback`, () => { - jest.spyOn($state, 'go'); - controller.onSubmit(); - - expect(controller.$state.go).toHaveBeenCalledWith('item.itemType.card.basicData', {id: '1234'}); - }); - }); -}); diff --git a/modules/item/front/item-type/descriptor/index.html b/modules/item/front/item-type/descriptor/index.html deleted file mode 100644 index 5a0e8ed49..000000000 --- a/modules/item/front/item-type/descriptor/index.html +++ /dev/null @@ -1,25 +0,0 @@ - - -
- - - - - - - - -
-
-
\ No newline at end of file diff --git a/modules/item/front/item-type/descriptor/index.js b/modules/item/front/item-type/descriptor/index.js deleted file mode 100644 index 9322c599a..000000000 --- a/modules/item/front/item-type/descriptor/index.js +++ /dev/null @@ -1,20 +0,0 @@ -import ngModule from '../../module'; -import Descriptor from 'salix/components/descriptor'; - -class Controller extends Descriptor { - get itemType() { - return this.entity; - } - - set itemType(value) { - this.entity = value; - } -} - -ngModule.component('vnItemTypeDescriptor', { - template: require('./index.html'), - controller: Controller, - bindings: { - itemType: '<' - } -}); diff --git a/modules/item/front/item-type/index.js b/modules/item/front/item-type/index.js deleted file mode 100644 index 5dcbe4097..000000000 --- a/modules/item/front/item-type/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import './main'; -import './index/'; -import './summary'; -import './card'; -import './descriptor'; -import './create'; -import './basic-data'; -import './search-panel'; diff --git a/modules/item/front/item-type/index/index.html b/modules/item/front/item-type/index/index.html deleted file mode 100644 index 50b9eb172..000000000 --- a/modules/item/front/item-type/index/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/modules/item/front/item-type/index/index.js b/modules/item/front/item-type/index/index.js deleted file mode 100644 index 54ecba997..000000000 --- a/modules/item/front/item-type/index/index.js +++ /dev/null @@ -1,14 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - preview(itemType) { - this.selectedItemType = itemType; - this.$.summary.show(); - } -} - -ngModule.component('vnItemTypeIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/item-type/index/index.spec.js b/modules/item/front/item-type/index/index.spec.js deleted file mode 100644 index 887c03f7f..000000000 --- a/modules/item/front/item-type/index/index.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -import './index'; - -describe('Item', () => { - describe('Component vnItemTypeIndex', () => { - let controller; - let $window; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$window_) => { - $window = _$window_; - const $element = angular.element(''); - controller = $componentController('vnItemTypeIndex', {$element}); - })); - - describe('preview()', () => { - it('should show the dialog summary', () => { - controller.$.summary = {show: () => {}}; - jest.spyOn(controller.$.summary, 'show'); - - const itemType = {id: 1}; - - const event = new MouseEvent('click', { - view: $window, - bubbles: true, - cancelable: true - }); - controller.preview(event, itemType); - - expect(controller.$.summary.show).toHaveBeenCalledWith(); - }); - }); - }); -}); diff --git a/modules/item/front/item-type/index/locale/es.yml b/modules/item/front/item-type/index/locale/es.yml deleted file mode 100644 index 1a71ff212..000000000 --- a/modules/item/front/item-type/index/locale/es.yml +++ /dev/null @@ -1,2 +0,0 @@ -Item Type: Familia -New itemType: Nueva familia \ No newline at end of file diff --git a/modules/item/front/item-type/main/index.html b/modules/item/front/item-type/main/index.html deleted file mode 100644 index faba696c0..000000000 --- a/modules/item/front/item-type/main/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/modules/item/front/item-type/main/index.js b/modules/item/front/item-type/main/index.js deleted file mode 100644 index 0dea00abb..000000000 --- a/modules/item/front/item-type/main/index.js +++ /dev/null @@ -1,24 +0,0 @@ -import ngModule from '../../module'; -import ModuleMain from 'salix/components/module-main'; - -export default class ItemType extends ModuleMain { - exprBuilder(param, value) { - switch (param) { - case 'search': - return /^\d+$/.test(value) - ? {id: value} - : {or: [ - {name: {like: `%${value}%`}}, - {code: {like: `%${value}%`}} - ]}; - case 'name': - case 'code': - return {[param]: {like: `%${value}%`}}; - } - } -} - -ngModule.vnComponent('vnItemType', { - controller: ItemType, - template: require('./index.html') -}); diff --git a/modules/item/front/item-type/main/index.spec.js b/modules/item/front/item-type/main/index.spec.js deleted file mode 100644 index dcb14ec0e..000000000 --- a/modules/item/front/item-type/main/index.spec.js +++ /dev/null @@ -1,31 +0,0 @@ -import './index'; - -describe('Item', () => { - describe('Component vnItemType', () => { - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject($componentController => { - const $element = angular.element(''); - controller = $componentController('vnItemType', {$element}); - })); - - describe('exprBuilder()', () => { - it('should return a filter based on a search by id', () => { - const filter = controller.exprBuilder('search', '123'); - - expect(filter).toEqual({id: '123'}); - }); - - it('should return a filter based on a search by name or code', () => { - const filter = controller.exprBuilder('search', 'Alstroemeria'); - - expect(filter).toEqual({or: [ - {name: {like: '%Alstroemeria%'}}, - {code: {like: '%Alstroemeria%'}}, - ]}); - }); - }); - }); -}); diff --git a/modules/item/front/item-type/main/locale/es.yml b/modules/item/front/item-type/main/locale/es.yml deleted file mode 100644 index 7aceac46f..000000000 --- a/modules/item/front/item-type/main/locale/es.yml +++ /dev/null @@ -1 +0,0 @@ -Search itemType by id, name or code: Buscar familia por id, nombre o código \ No newline at end of file diff --git a/modules/item/front/item-type/search-panel/index.html b/modules/item/front/item-type/search-panel/index.html deleted file mode 100644 index 4aa762900..000000000 --- a/modules/item/front/item-type/search-panel/index.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
- - - - - - - - - - - -
-
\ No newline at end of file diff --git a/modules/item/front/item-type/search-panel/index.js b/modules/item/front/item-type/search-panel/index.js deleted file mode 100644 index 17a439c39..000000000 --- a/modules/item/front/item-type/search-panel/index.js +++ /dev/null @@ -1,7 +0,0 @@ -import ngModule from '../../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -ngModule.component('vnItemTypeSearchPanel', { - template: require('./index.html'), - controller: SearchPanel -}); diff --git a/modules/item/front/item-type/summary/index.html b/modules/item/front/item-type/summary/index.html deleted file mode 100644 index d003c8f38..000000000 --- a/modules/item/front/item-type/summary/index.html +++ /dev/null @@ -1,50 +0,0 @@ - -
- {{summary.id}} - {{summary.name}} - {{summary.worker.firstName}} {{summary.worker.lastName}} -
- - -

Basic data

- - - - - - - - - - - - - - - - - - - - -
-
-
\ No newline at end of file diff --git a/modules/item/front/item-type/summary/index.js b/modules/item/front/item-type/summary/index.js deleted file mode 100644 index 7645de8b1..000000000 --- a/modules/item/front/item-type/summary/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import ngModule from '../../module'; -import Component from 'core/lib/component'; - -class Controller extends Component { - set itemType(value) { - this._itemType = value; - this.$.summary = null; - if (!value) return; - - const filter = { - include: [ - {relation: 'worker'}, - {relation: 'category'}, - {relation: 'itemPackingType'}, - {relation: 'temperature'} - ] - }; - this.$http.get(`ItemTypes/${value.id}`, {filter}) - .then(res => this.$.summary = res.data); - } - - get itemType() { - return this._itemType; - } -} - -ngModule.component('vnItemTypeSummary', { - template: require('./index.html'), - controller: Controller, - bindings: { - itemType: '<' - } -}); diff --git a/modules/item/front/item-type/summary/locale/es.yml b/modules/item/front/item-type/summary/locale/es.yml deleted file mode 100644 index 8f4cef70f..000000000 --- a/modules/item/front/item-type/summary/locale/es.yml +++ /dev/null @@ -1,4 +0,0 @@ -Life: Vida -Promo: Promoción -Item packing type: Tipo de embalaje -Is unconventional size: Es de tamaño poco convencional \ No newline at end of file diff --git a/modules/item/front/last-entries/index.html b/modules/item/front/last-entries/index.html deleted file mode 100644 index e3b84655c..000000000 --- a/modules/item/front/last-entries/index.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - - - - - - - - Ig - Warehouse - Landed - Entry - PVP - Label - Packing - Grouping - Stems - Quantity - Cost - Kg. - Cube - Provider - - - - - - - - - {{::entry.warehouse| dashIfEmpty}} - {{::entry.landed | date:'dd/MM/yyyy HH:mm'}} - - - {{::entry.entryFk | dashIfEmpty}} - - - - {{::entry.price2 | currency: 'EUR':2 | dashIfEmpty}} / {{::entry.price3 | currency: 'EUR':2 | dashIfEmpty}} - - {{entry.stickers | dashIfEmpty}} - - - {{::entry.packing | dashIfEmpty}} - - - - - {{::entry.grouping | dashIfEmpty}} - - - {{::entry.stems | dashIfEmpty}} - {{::entry.quantity}} - - - {{::entry.cost | currency: 'EUR':3 | dashIfEmpty}} - - - {{::entry.weight | dashIfEmpty}} - {{::entry.packagingFk | dashIfEmpty}} - {{::entry.supplier | dashIfEmpty}} - - - - - - - - - - - - - - Filter by selection - - - Exclude selection - - - Remove filter - - - Remove all filters - - - Copy value - - - diff --git a/modules/item/front/last-entries/index.js b/modules/item/front/last-entries/index.js deleted file mode 100644 index a5f1f4d9d..000000000 --- a/modules/item/front/last-entries/index.js +++ /dev/null @@ -1,105 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - - const from = Date.vnNew(); - from.setDate(from.getDate() - 75); - from.setHours(0, 0, 0, 0); - - const to = Date.vnNew(); - to.setDate(to.getDate() + 10); - to.setHours(23, 59, 59, 59); - - this.filter = { - where: { - itemFk: this.$params.id, - landed: { - between: [from, to] - } - } - }; - this._dateFrom = from; - this._dateTo = to; - } - - set dateFrom(value) { - this._dateFrom = value; - - if (!value) return; - - const from = new Date(value); - from.setHours(0, 0, 0, 0); - - const to = new Date(this._dateTo); - to.setHours(23, 59, 59, 59); - - this.filter.where.landed = { - between: [from, to] - }; - this.$.model.refresh(); - } - - set dateTo(value) { - this._dateTo = value; - - if (!value) return; - - const from = new Date(this._dateFrom); - from.setHours(0, 0, 0, 0); - - const to = new Date(value); - to.setHours(23, 59, 59, 59); - - this.filter.where.landed = { - between: [from, to] - }; - this.$.model.refresh(); - } - - get dateFrom() { - return this._dateFrom; - } - - get dateTo() { - return this._dateTo; - } - - exprBuilder(param, value) { - switch (param) { - case 'id': - case 'quantity': - case 'packagingFk': - return {[`b.${param}`]: value}; - case 'supplierFk': - return {[`s.id`]: value}; - case 'warehouseFk': - return {'tr.warehouseInFk': value}; - case 'landed': - return {'tr.landed': { - between: this.dateRange(value)} - }; - } - } - - dateRange(value) { - const minHour = new Date(value); - minHour.setHours(0, 0, 0, 0); - const maxHour = new Date(value); - maxHour.setHours(23, 59, 59, 59); - - return [minHour, maxHour]; - } -} - -Controller.$inject = ['$element', '$scope']; - -ngModule.vnComponent('vnItemLastEntries', { - template: require('./index.html'), - controller: Controller, - bindings: { - item: '<' - } -}); diff --git a/modules/item/front/last-entries/locale/es.yml b/modules/item/front/last-entries/locale/es.yml deleted file mode 100644 index f2917bb63..000000000 --- a/modules/item/front/last-entries/locale/es.yml +++ /dev/null @@ -1,15 +0,0 @@ -Since: Desde -Landed: F. entrega -Stems: Tallos -Quantity: Cantidad -Cost: Coste -Label: Etiquetas -Entry: Entrada -Ignored: Ignorado -Provider: Proveedor -Cube: Cubo -Price Per Unit: Precio Por Unidad -Price Per Package: Precio Por Paquete -Freight: Porte -Package: Embalaje -Comission: Comision \ No newline at end of file diff --git a/modules/item/front/main/index.html b/modules/item/front/main/index.html index 44d125758..e69de29bb 100644 --- a/modules/item/front/main/index.html +++ b/modules/item/front/main/index.html @@ -1,23 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/modules/item/front/main/index.js b/modules/item/front/main/index.js index 1d99c91a1..33e5822c3 100644 --- a/modules/item/front/main/index.js +++ b/modules/item/front/main/index.js @@ -3,11 +3,10 @@ import ModuleMain from 'salix/components/module-main'; export default class Items extends ModuleMain { constructor($element, $) { super($element, $); - - this.filterParams = { - isActive: true, - isFloramondo: false - }; + } + async $onInit() { + this.$state.go('home'); + window.location.href = await this.vnApp.getUrl(`claim/`); } } diff --git a/modules/item/front/request-search-panel/index.html b/modules/item/front/request-search-panel/index.html deleted file mode 100644 index 6a51a429d..000000000 --- a/modules/item/front/request-search-panel/index.html +++ /dev/null @@ -1,104 +0,0 @@ -
- - -
- - - - - - - - - - - - - - - - - - - - -
- - - - - - Or - - - - - -
- - - - - {{name}} - - - - - -
-
diff --git a/modules/item/front/request-search-panel/index.js b/modules/item/front/request-search-panel/index.js deleted file mode 100644 index 556bdd874..000000000 --- a/modules/item/front/request-search-panel/index.js +++ /dev/null @@ -1,48 +0,0 @@ -import ngModule from '../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -class Controller extends SearchPanel { - constructor($element, $) { - super($element, $); - - this.states = [ - {code: 'pending', name: this.$t('Pending')}, - {code: 'accepted', name: this.$t('Accepted')}, - {code: 'denied', name: this.$t('Denied')} - ]; - } - - get from() { - return this._from; - } - - set from(value) { - this._from = value; - this.filter.scopeDays = null; - } - - get to() { - return this._to; - } - - set to(value) { - this._to = value; - this.filter.scopeDays = null; - } - - get scopeDays() { - return this._scopeDays; - } - - set scopeDays(value) { - this._scopeDays = value; - - this.filter.from = null; - this.filter.to = null; - } -} - -ngModule.vnComponent('vnRequestSearchPanel', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/request-search-panel/index.spec.js b/modules/item/front/request-search-panel/index.spec.js deleted file mode 100644 index 56c76eabf..000000000 --- a/modules/item/front/request-search-panel/index.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -import './index'; - -describe(' Component vnRequestSearchPanel', () => { - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject($componentController => { - controller = $componentController('vnRequestSearchPanel', {$element: null}); - controller.$t = () => {}; - controller.filter = {}; - })); - - describe('from() setter', () => { - it('should clear the scope days when setting the from property', () => { - controller.filter.scopeDays = 1; - - controller.from = Date.vnNew(); - - expect(controller.filter.scopeDays).toBeNull(); - expect(controller.from).toBeDefined(); - }); - }); - - describe('to() setter', () => { - it('should clear the scope days when setting the to property', () => { - controller.filter.scopeDays = 1; - - controller.to = Date.vnNew(); - - expect(controller.filter.scopeDays).toBeNull(); - expect(controller.to).toBeDefined(); - }); - }); - - describe('scopeDays() setter', () => { - it('should clear the date range when setting the scopeDays property', () => { - controller.filter.from = Date.vnNew(); - controller.filter.to = Date.vnNew(); - - controller.scopeDays = 1; - - expect(controller.filter.from).toBeNull(); - expect(controller.filter.to).toBeNull(); - expect(controller.scopeDays).toBeDefined(); - }); - }); -}); diff --git a/modules/item/front/request-search-panel/locale/es.yml b/modules/item/front/request-search-panel/locale/es.yml deleted file mode 100644 index 8d5276194..000000000 --- a/modules/item/front/request-search-panel/locale/es.yml +++ /dev/null @@ -1,4 +0,0 @@ -Ink: Tinta -Origin: Origen -Producer: Productor -For me: Para mi \ No newline at end of file diff --git a/modules/item/front/request/index.html b/modules/item/front/request/index.html deleted file mode 100644 index 03c8db8ec..000000000 --- a/modules/item/front/request/index.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - - Ticket ID - Shipped - Description - Requester - Requested - Price - Atender - Item - Achieved - Concept - State - - - - - - - - {{request.ticketFk}} - - - - - {{::request.shipped | date: 'dd/MM/yyyy'}} - - - {{::request.description}} - - - {{::request.requesterName}} - - - {{::request.quantity}} - {{::request.price | currency: 'EUR':2}} - - - {{::request.attenderName}} - - - - {{request.itemFk}} - - - - - - - {{request.saleQuantity}} - - - - - - - - {{request.itemDescription}} - - - {{$ctrl.getState(request.isOk)}} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Filter by selection - - - Exclude selection - - - Remove filter - - - Remove all filters - - - Copy value - - - diff --git a/modules/item/front/request/index.js b/modules/item/front/request/index.js deleted file mode 100644 index 747cbeff2..000000000 --- a/modules/item/front/request/index.js +++ /dev/null @@ -1,143 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; -import './style.scss'; - -export default class Controller extends Section { - constructor($element, $) { - super($element, $); - - if (!this.$state.q) { - const today = Date.vnNew(); - today.setHours(0, 0, 0, 0); - - const nextWeek = Date.vnNew(); - nextWeek.setHours(23, 59, 59, 59); - nextWeek.setDate(nextWeek.getDate() + 7); - - this.filterParams = { - from: today, - to: nextWeek, - state: 'pending' - }; - } - } - - fetchParams($params) { - if (!Object.entries($params).length) - $params.scopeDays = 1; - - if (typeof $params.scopeDays === 'number') { - const from = Date.vnNew(); - from.setHours(0, 0, 0, 0); - - const to = new Date(from.getTime()); - to.setDate(to.getDate() + $params.scopeDays); - to.setHours(23, 59, 59, 999); - - Object.assign($params, {from, to}); - } - - return $params; - } - - getState(isOk) { - if (isOk === null) - return 'Pending'; - else if (isOk) - return 'Accepted'; - else - return 'Denied'; - } - - confirmRequest(request) { - if (request.itemFk && request.saleQuantity) { - let params = { - itemFk: request.itemFk, - quantity: request.saleQuantity - }; - - let query = `TicketRequests/${request.id}/confirm`; - this.$http.post(query, params).then(res => { - request.itemDescription = res.data.concept; - request.isOk = true; - - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - } - - changeQuantity(request) { - if (request.saleFk) { - let params = { - quantity: request.saleQuantity - }; - - let endpoint = `Sales/${request.saleFk}`; - - this.$http.patch(endpoint, params) - .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))) - .then(() => this.confirmRequest(request)); - } else - this.confirmRequest(request); - } - - compareDate(date) { - let today = Date.vnNew(); - today.setHours(0, 0, 0, 0); - let timeTicket = new Date(date); - timeTicket.setHours(0, 0, 0, 0); - - let comparation = today - timeTicket; - - if (comparation == 0) - return 'warning'; - if (comparation < 0) - return 'success'; - } - - onDenyAccept(request) { - let params = { - observation: this.denyObservation - }; - - return this.$http.post(`TicketRequests/${request.id}/deny`, params) - .then(res => { - const newRequest = res.data; - request.isOk = newRequest.isOk; - request.attenderFk = newRequest.attenderFk; - request.response = newRequest.response; - - this.vnApp.showSuccess(this.$t('Data saved!')); - }); - } - - exprBuilder(param, value) { - switch (param) { - case 'ticketFk': - case 'quantity': - case 'price': - case 'isOk': - return {[`tr.${param}`]: value}; - case 'attenderName': - return {[`ua.name`]: value}; - case 'shipped': - return {'t.shipped': { - between: this.dateRange(value)} - }; - } - } - - dateRange(value) { - const minHour = new Date(value); - minHour.setHours(0, 0, 0, 0); - const maxHour = new Date(value); - maxHour.setHours(23, 59, 59, 59); - - return [minHour, maxHour]; - } -} - -ngModule.vnComponent('vnItemRequest', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/request/index.spec.js b/modules/item/front/request/index.spec.js deleted file mode 100644 index aadeaddca..000000000 --- a/modules/item/front/request/index.spec.js +++ /dev/null @@ -1,120 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemRequest', () => { - let $scope; - let controller; - let $httpBackend; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - controller = $componentController('vnItemRequest', {$element: null, $scope}); - })); - - afterAll(() => { - $scope.$destroy(); - $element.remove(); - }); - - describe('getState()', () => { - it(`should return an string depending to the isOK value`, () => { - let isOk = null; - let result = controller.getState(isOk); - - expect(result).toEqual('Pending'); - - isOk = 1; - result = controller.getState(isOk); - - expect(result).toEqual('Accepted'); - - isOk = 0; - result = controller.getState(isOk); - - expect(result).toEqual('Denied'); - }); - }); - - describe('confirmRequest()', () => { - it(`should do nothing if the request does't have itemFk or saleQuantity`, () => { - let request = {}; - jest.spyOn(controller.vnApp, 'showSuccess'); - - controller.confirmRequest(request); - - expect(controller.vnApp.showSuccess).not.toHaveBeenCalled(); - }); - - it('should perform a query and call vnApp.showSuccess() and refresh if the conditions are met', () => { - jest.spyOn(controller.vnApp, 'showSuccess'); - - const expectedResult = {concept: 'Melee Weapon'}; - let request = {itemFk: 1, saleQuantity: 1, id: 1}; - - $httpBackend.expectPOST(`TicketRequests/${request.id}/confirm`).respond(expectedResult); - controller.confirmRequest(request); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('changeQuantity()', () => { - it(`should call confirmRequest() if there's no sale id in the request`, () => { - let request = {}; - jest.spyOn(controller, 'confirmRequest'); - - controller.changeQuantity(request); - - expect(controller.confirmRequest).toHaveBeenCalledWith(jasmine.any(Object)); - }); - - it(`should perform a query and call vnApp.showSuccess() if the conditions are met`, () => { - let request = {saleFk: 1, saleQuantity: 1}; - jest.spyOn(controller.vnApp, 'showSuccess'); - - $httpBackend.expectPATCH(`Sales/${request.saleFk}`).respond(); - controller.changeQuantity(request); - $httpBackend.flush(); - - expect(controller.vnApp.showSuccess).toHaveBeenCalled(); - }); - }); - - describe('compareDate()', () => { - it(`should return "success" if receives a future date`, () => { - let date = '3019-02-18T11:00:00.000Z'; - let result = controller.compareDate(date); - - expect(result).toEqual('success'); - }); - - it(`should return "warning" if date is today`, () => { - let date = Date.vnNew(); - let result = controller.compareDate(date); - - expect(result).toEqual('warning'); - }); - }); - - describe('onDenyAccept()', () => { - it(`should deny the request`, () => { - const request = { - id: 1, - response: 'new' - }; - - $httpBackend.expectPOST(`TicketRequests/${request.id}/deny`) - .respond({response: 'denied'}); - controller.onDenyAccept(request); - $httpBackend.flush(); - - expect(request.response).toBe('denied'); - }); - }); - }); -}); - diff --git a/modules/item/front/request/locale/es.yml b/modules/item/front/request/locale/es.yml deleted file mode 100644 index c61a00130..000000000 --- a/modules/item/front/request/locale/es.yml +++ /dev/null @@ -1,9 +0,0 @@ -Discard: Descartar -Specify the reasons to deny this request: Especifica las razones para descartar la petición -Buy requests: Peticiones de compra -Search request by id or alias: Buscar peticiones por identificador o alias -Requested: Solicitado -Achieved: Conseguido -Pending: Pendiente -Accepted: Aceptada -Denied: Rechazada \ No newline at end of file diff --git a/modules/item/front/request/style.scss b/modules/item/front/request/style.scss deleted file mode 100644 index 59612bbd6..000000000 --- a/modules/item/front/request/style.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import "variables"; - -vn-item-request { - vn-dialog[vn-id="denyReason"] { - button.close { - display: none - } - vn-button { - margin: 0 auto - } - vn-textarea { - width: 100% - } - } -} \ No newline at end of file diff --git a/modules/item/front/routes.json b/modules/item/front/routes.json index 4b7cd1490..3d04e1c8b 100644 --- a/modules/item/front/routes.json +++ b/modules/item/front/routes.json @@ -6,25 +6,7 @@ "dependencies": ["worker", "client", "ticket"], "menus": { "main": [ - {"state": "item.index", "icon": "icon-item"}, - {"state": "item.request", "icon": "icon-buyrequest"}, - {"state": "item.waste.index", "icon": "icon-claims"}, - {"state": "item.fixedPrice", "icon": "icon-fixedPrice"}, - {"state": "item.itemType", "icon": "contact_support"} - ], - "card": [ - {"state": "item.card.basicData", "icon": "settings"}, - {"state": "item.card.tags", "icon": "icon-tags"}, - {"state": "item.card.last-entries", "icon": "icon-regentry"}, - {"state": "item.card.tax", "icon": "icon-tax"}, - {"state": "item.card.botanical", "icon": "local_florist"}, - {"state": "item.card.shelving", "icon": "icon-inventory"}, - {"state": "item.card.itemBarcode", "icon": "icon-barcode"}, - {"state": "item.card.diary", "icon": "icon-transaction"}, - {"state": "item.card.log", "icon": "history"} - ], - "itemType": [ - {"state": "item.itemType.card.basicData", "icon": "settings"} + {"state": "item.index", "icon": "icon-item"} ] }, "keybindings": [ @@ -44,187 +26,11 @@ "component": "vn-item-index", "description": "Items" }, - { - "url": "/create", - "state": "item.create", - "component": "vn-item-create", - "description": "New item" - }, { "url": "/:id", "state": "item.card", "abstract": true, "component": "vn-item-card" - }, - { - "url" : "/basic-data", - "state": "item.card.basicData", - "component": "vn-item-basic-data", - "description": "Basic data", - "params": { - "item": "$ctrl.item" - }, - "acl": ["buyer"] - }, - { - "url" : "/tags", - "state": "item.card.tags", - "component": "vn-item-tags", - "description": "Tags", - "params": { - "item-tags": "$ctrl.itemTags" - }, - "acl": ["buyer", "replenisher"] - }, - { - "url" : "/tax", - "state": "item.card.tax", - "component": "vn-item-tax", - "description": "Tax", - "acl": ["administrative","buyer"] - }, - { - "url" : "/botanical", - "state": "item.card.botanical", - "component": "vn-item-botanical", - "description": "Botanical", - "params": { - "item": "$ctrl.item" - }, - "acl": ["buyer"] - }, - { - "url" : "/shelving", - "state": "item.card.shelving", - "component": "vn-item-shelving", - "description": "Shelvings", - "params": { - "item": "$ctrl.item" - }, - "acl": ["employee"] - }, - { - "url" : "/barcode", - "state": "item.card.itemBarcode", - "component": "vn-item-barcode", - "description": "Barcodes", - "params": { - "item": "$ctrl.item" - }, - "acl": ["buyer","replenisher"] - }, - { - "url" : "/summary", - "state": "item.card.summary", - "component": "vn-item-summary", - "description": "Summary", - "params": { - "item": "$ctrl.item" - } - }, - { - "url" : "/diary?warehouseFk&lineFk", - "state": "item.card.diary", - "component": "vn-item-diary", - "description": "Diary", - "params": { - "item": "$ctrl.item" - }, - "acl": ["employee"] - }, - { - "url" : "/last-entries", - "state": "item.card.last-entries", - "component": "vn-item-last-entries", - "description": "Last entries", - "params": { - "item": "$ctrl.item" - }, - "acl": ["employee"] - }, - { - "url" : "/log", - "state": "item.card.log", - "component": "vn-item-log", - "description": "Log" - }, - { - "url" : "/request?q", - "state": "item.request", - "component": "vn-item-request", - "description": "Buy requests", - "params": { - "item": "$ctrl.item" - }, - "acl": ["employee"] - }, - { - "url": "/waste", - "state": "item.waste", - "component": "ui-view", - "abstract": true - }, - { - "url" : "/index", - "state": "item.waste.index", - "component": "vn-item-waste-index", - "description": "Waste breakdown", - "acl": ["buyer"] - }, - { - "url" : "/detail?buyer&family", - "state": "item.waste.detail", - "component": "vn-item-waste-detail", - "description": "Waste breakdown by item", - "acl": ["buyer"] - }, - { - "url" : "/fixed-price?q", - "state": "item.fixedPrice", - "component": "vn-fixed-price", - "description": "Fixed prices", - "acl": ["buyer"] - }, - { - "url" : "/item-type?q", - "state": "item.itemType", - "component": "vn-item-type", - "description": "Item Type", - "acl": ["buyer"] - }, - { - "url": "/create", - "state": "item.itemType.create", - "component": "vn-item-type-create", - "description": "New itemType", - "acl": ["buyer"] - }, - { - "url": "/:id", - "state": "item.itemType.card", - "component": "vn-item-type-card", - "abstract": true, - "description": "Detail" - }, - { - "url": "/summary", - "state": "item.itemType.card.summary", - "component": "vn-item-type-summary", - "description": "Summary", - "params": { - "item-type": "$ctrl.itemType" - }, - "acl": ["buyer"] - }, - { - "url": "/basic-data", - "state": "item.itemType.card.basicData", - "component": "vn-item-type-basic-data", - "description": "Basic data", - "params": { - "item-type": "$ctrl.itemType" - }, - "acl": ["buyer"] } ] } diff --git a/modules/item/front/search-panel/index.html b/modules/item/front/search-panel/index.html deleted file mode 100644 index 33f141b18..000000000 --- a/modules/item/front/search-panel/index.html +++ /dev/null @@ -1,181 +0,0 @@ - -
-
- - - - - - - - - -
{{name}}
-
- {{category.name}} -
-
> -
-
- - - - - {{name}}: {{nickname}} - - - - - Tags - - - - - - - - - - - - - - - - - More fields - - - - - - - - -
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- - - - - - - -
-
diff --git a/modules/item/front/search-panel/index.js b/modules/item/front/search-panel/index.js deleted file mode 100644 index 2448728be..000000000 --- a/modules/item/front/search-panel/index.js +++ /dev/null @@ -1,67 +0,0 @@ -import ngModule from '../module'; -import SearchPanel from 'core/components/searchbar/search-panel'; - -class Controller extends SearchPanel { - constructor($element, $) { - super($element, $); - let model = 'Item'; - let moreFields = ['id', 'description', 'name', 'isActive']; - - let properties; - let validations = window.validations; - - if (validations && validations[model]) - properties = validations[model].properties; - else - properties = {}; - - this.moreFields = []; - for (let field of moreFields) { - let prop = properties[field]; - this.moreFields.push({ - name: field, - label: prop ? prop.description : field, - type: prop ? prop.type : null - }); - } - } - - get filter() { - let filter = this.$.filter; - - for (let fieldFilter of this.fieldFilters) - filter[fieldFilter.name] = fieldFilter.value; - - return filter; - } - - set filter(value) { - if (!value) - value = {}; - if (!value.tags) - value.tags = [{}]; - - this.fieldFilters = []; - for (let field of this.moreFields) { - if (value[field.name] != undefined) { - this.fieldFilters.push({ - name: field.name, - value: value[field.name], - info: field - }); - } - } - - this.$.filter = value; - } - - removeField(index, field) { - this.fieldFilters.splice(index, 1); - delete this.$.filter[field]; - } -} - -ngModule.vnComponent('vnItemSearchPanel', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/search-panel/index.spec.js b/modules/item/front/search-panel/index.spec.js deleted file mode 100644 index 39b5b7aa5..000000000 --- a/modules/item/front/search-panel/index.spec.js +++ /dev/null @@ -1,60 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemSearchPanel', () => { - let $element; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject($componentController => { - $element = angular.element(`
`); - controller = $componentController('vnItemSearchPanel', {$element}); - })); - - describe('filter() setter', () => { - it(`should set the tags property to the scope filter with an empty array`, () => { - const expectedFilter = { - tags: [{}] - }; - controller.filter = null; - - expect(controller.filter).toEqual(expectedFilter); - }); - - it(`should set the tags property to the scope filter with an array of tags`, () => { - const expectedFilter = { - description: 'My item', - tags: [{}] - }; - const expectedFieldFilter = [{ - info: { - label: 'description', - name: 'description', - type: null - }, - name: 'description', - value: 'My item' - }]; - controller.filter = { - description: 'My item' - }; - - expect(controller.filter).toEqual(expectedFilter); - expect(controller.fieldFilters).toEqual(expectedFieldFilter); - }); - }); - - describe('removeField()', () => { - it(`should remove the description property from the fieldFilters and from the scope filter`, () => { - const expectedFilter = {tags: [{}]}; - controller.filter = {description: 'My item'}; - - controller.removeField(0, 'description'); - - expect(controller.filter).toEqual(expectedFilter); - expect(controller.fieldFilters).toEqual([]); - }); - }); - }); -}); diff --git a/modules/item/front/search-panel/locale/es.yml b/modules/item/front/search-panel/locale/es.yml deleted file mode 100644 index 67a5200d7..000000000 --- a/modules/item/front/search-panel/locale/es.yml +++ /dev/null @@ -1,8 +0,0 @@ -Ink: Tinta -Origin: Origen -Producer: Productor -With visible: Con visible -Field: Campo -More fields: Más campos -Add field: Añadir campo -Remove field: Quitar campo \ No newline at end of file diff --git a/modules/item/front/summary/index.html b/modules/item/front/summary/index.html deleted file mode 100644 index 0e4cfc955..000000000 --- a/modules/item/front/summary/index.html +++ /dev/null @@ -1,227 +0,0 @@ - -
- - - - {{$ctrl.item.id}} - {{$ctrl.summary.item.name}} -
- - - - - -

Visible

-

{{$ctrl.summary.visible}}

-
- -

Available

-

{{$ctrl.summary.available}}

-
- -

- - -

-
-
-
- -

- - Basic data - -

-

- Basic data -

- - - - - - - - - - - - - - - - - {{$ctrl.summary.item.itemType.worker.user.name}} - - - - - - -
- -

- - Other data - -

-

- Other data -

- - - - - - - - - - - - - - - - - - - - -
- -

- - Tags - -

-

- Tags -

- - -
- -

- - Description - -

-

- Description -

-

- {{$ctrl.summary.item.description}} -

-
- -

- - Tax - -

-

- Tax -

- - -
- -

- - Botanical - -

-

- Botanical -

- - - - -
- -

- - Barcode - -

-

- Barcode -

-

- {{barcode.code}} -

-
-
-
- - diff --git a/modules/item/front/summary/index.js b/modules/item/front/summary/index.js deleted file mode 100644 index e17a6a8c4..000000000 --- a/modules/item/front/summary/index.js +++ /dev/null @@ -1,61 +0,0 @@ -import ngModule from '../module'; -import Summary from 'salix/components/summary'; -import './style.scss'; - -class Controller extends Summary { - getSummary() { - this.$http.get(`Items/${this.item.id}/getSummary`).then(response => { - this.summary = response.data; - }); - - this.$http.get('ItemConfigs/findOne') - .then(res => { - if (this.card) this.card.warehouseFk = res.data.warehouseFk; - this.getWarehouseName(res.data.warehouseFk); - }); - } - - getWarehouseName(warehouseFk) { - const filter = { - where: {id: warehouseFk} - }; - this.$http.get('Warehouses/findOne', {filter}) - .then(res => { - this.warehouseText = this.$t('WarehouseFk', { - warehouseName: res.data.name - }); - }); - } - - $onChanges() { - if (this.item && this.item.id) - this.getSummary(); - } - - get isBuyer() { - return this.aclService.hasAny(['buyer']); - } - - get isReplenisher() { - return this.aclService.hasAny(['replenisher']); - } - - get isAdministrative() { - return this.aclService.hasAny(['administrative']); - } - - get isEmployee() { - return this.aclService.hasAny(['employee']); - } -} - -ngModule.vnComponent('vnItemSummary', { - template: require('./index.html'), - controller: Controller, - bindings: { - item: '<', - }, - require: { - card: '?^vnItemCard' - } -}); diff --git a/modules/item/front/summary/index.spec.js b/modules/item/front/summary/index.spec.js deleted file mode 100644 index d7821bea0..000000000 --- a/modules/item/front/summary/index.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component summary', () => { - let controller; - let $httpBackend; - let $scope; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, _$httpBackend_, $rootScope) => { - $httpBackend = _$httpBackend_; - $scope = $rootScope.$new(); - const $element = angular.element(''); - controller = $componentController('vnItemSummary', {$element, $scope}); - controller.item = {id: 1}; - controller.card = {}; - })); - - describe('getSummary()', () => { - it('should perform a query to set summary', () => { - let data = {id: 1, name: 'Gem of mind'}; - $httpBackend.expect('GET', `Items/1/getSummary`).respond(200, data); - $httpBackend.expect('GET', `ItemConfigs/findOne`).respond({}); - $httpBackend.expect('GET', `Warehouses/findOne`).respond({}); - controller.getSummary(); - $httpBackend.flush(); - - expect(controller.summary).toEqual(data); - }); - }); - - describe('$onChanges()', () => { - it('should call getSummary when item.id is defined', () => { - jest.spyOn(controller, 'getSummary'); - controller.$onChanges(); - - expect(controller.getSummary).toHaveBeenCalledWith(); - }); - }); - }); -}); diff --git a/modules/item/front/summary/locale/en.yml b/modules/item/front/summary/locale/en.yml deleted file mode 100644 index 0ec208720..000000000 --- a/modules/item/front/summary/locale/en.yml +++ /dev/null @@ -1 +0,0 @@ -WarehouseFk: Calculated on the warehouse of {{ warehouseName }} diff --git a/modules/item/front/summary/locale/es.yml b/modules/item/front/summary/locale/es.yml deleted file mode 100644 index 80988c491..000000000 --- a/modules/item/front/summary/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Barcode: Códigos de barras -Other data: Otros datos -Go to the item: Ir al artículo -WarehouseFk: Calculado sobre el almacén de {{ warehouseName }} -Minimum sales quantity: Cantidad mínima de venta diff --git a/modules/item/front/summary/style.scss b/modules/item/front/summary/style.scss deleted file mode 100644 index d047f3e36..000000000 --- a/modules/item/front/summary/style.scss +++ /dev/null @@ -1,39 +0,0 @@ -@import "./variables"; - -vn-item-summary { - p { - margin: 0; - } -} - -.item-state { - padding: 6px; - background-color: $color-main; - color: $color-font-dark; - - p { - font-size: .75rem; - text-align: center; - margin: 0; - - &:first-child { - text-transform: uppercase; - line-height: 1; - } - &:last-child { - font-size: 1.5rem; - font-weight: bold; - } - } - vn-one { - padding: 0; - - &:nth-child(1) { - border-right: 1px solid white; - } - - &:nth-child(2) { - border-right: 1px solid white; - } - } -} diff --git a/modules/item/front/tags/index.html b/modules/item/front/tags/index.html deleted file mode 100644 index f9b5370fa..000000000 --- a/modules/item/front/tags/index.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/modules/item/front/tags/index.js b/modules/item/front/tags/index.js deleted file mode 100644 index 2c3b39d45..000000000 --- a/modules/item/front/tags/index.js +++ /dev/null @@ -1,54 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -class Controller extends Section { - constructor($element, $) { - super($element, $); - this.include = { - relation: 'tag', - scope: { - fields: ['id', 'name', 'isFree', 'sourceTable'] - } - }; - } - - add() { - this.$.model.insert({ - itemFk: this.$params.id, - priority: this.getHighestPriority() - }); - } - - getHighestPriority() { - let max = 0; - this.$.model.data.forEach(tag => { - if (tag.priority > max) - max = tag.priority; - }); - return max + 1; - } - - onSubmit() { - const changes = this.$.model.getChanges(); - const data = { - creates: changes.creates, - deletes: changes.deletes, - updates: changes.updates, - maxPriority: this.getHighestPriority() - }; - this.$http.patch(`Tags/onSubmit`, data).then(() => { - this.$.model.refresh(); - this.$.watcher.notifySaved(); - this.$.watcher.updateOriginalData(); - this.card.reload(); - }); - } -} - -ngModule.vnComponent('vnItemTags', { - template: require('./index.html'), - controller: Controller, - require: { - card: '^vnItemCard' - } -}); diff --git a/modules/item/front/tags/index.spec.js b/modules/item/front/tags/index.spec.js deleted file mode 100644 index 8b4b8596b..000000000 --- a/modules/item/front/tags/index.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -import './index.js'; -import crudModel from 'core/mocks/crud-model'; - -describe('Item', () => { - describe('Component vnItemTags', () => { - let $scope; - let controller; - - beforeEach(ngModule('item')); - - beforeEach(inject(($componentController, $rootScope) => { - $scope = $rootScope.$new(); - $scope.model = crudModel; - const $element = angular.element(''); - controller = $componentController('vnItemTags', {$element, $scope}); - })); - - describe('getHighestPriority', () => { - it('should return the highest priority value + 1 from the array', () => { - $scope.model.data = [{priority: 1}, {priority: 2}, {priority: 1}]; - let result = controller.getHighestPriority(); - - expect(result).toEqual(3); - }); - - it('should return 1 when there is no priority defined', () => { - $scope.model.data = []; - let result = controller.getHighestPriority(); - - expect(result).toEqual(1); - }); - }); - }); -}); diff --git a/modules/item/front/tax/index.html b/modules/item/front/tax/index.html deleted file mode 100644 index 78858704f..000000000 --- a/modules/item/front/tax/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - -
- - - - - - - - - - - - - - -
\ No newline at end of file diff --git a/modules/item/front/tax/index.js b/modules/item/front/tax/index.js deleted file mode 100644 index 2d70414ab..000000000 --- a/modules/item/front/tax/index.js +++ /dev/null @@ -1,41 +0,0 @@ -import ngModule from '../module'; -import Section from 'salix/components/section'; - -export default class Controller extends Section { - $onInit() { - this.getTaxes(); - } - - getTaxes() { - let filter = { - fields: ['id', 'countryFk', 'taxClassFk'], - include: [{ - relation: 'country', - scope: {fields: ['name']} - }] - }; - - let url = `Items/${this.$params.id}/taxes`; - this.$http.get(url, {params: {filter}}).then(json => { - this.taxes = json.data; - }); - } - - submit() { - let data = []; - for (let tax of this.taxes) - data.push({id: tax.id, taxClassFk: tax.taxClassFk}); - - this.$.watcher.check(); - let url = `Items/updateTaxes`; - this.$http.post(url, data).then(() => { - this.$.watcher.notifySaved(); - this.$.watcher.updateOriginalData(); - }); - } -} - -ngModule.vnComponent('vnItemTax', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/tax/index.spec.js b/modules/item/front/tax/index.spec.js deleted file mode 100644 index 9565a861d..000000000 --- a/modules/item/front/tax/index.spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import './index.js'; - -describe('Item', () => { - describe('Component vnItemTax', () => { - let $element; - let $stateParams; - let controller; - let $httpBackend; - - beforeEach(ngModule('item')); - - beforeEach(inject((_$httpBackend_, $rootScope, _$stateParams_, $compile) => { - $stateParams = _$stateParams_; - $stateParams.id = 1; - $httpBackend = _$httpBackend_; - - $httpBackend.whenRoute('GET', 'TaxClasses') - .respond([ - {id: 1, description: 'Reduced VAT', code: 'R'}, - {id: 2, description: 'General VAT', code: 'G'} - ]); - - $httpBackend.whenRoute('GET', 'Items/:id/taxes') - .respond([ - {id: 1, taxClassFk: 1} - ]); - - $element = $compile(` { - $element.remove(); - }); - - describe('getTaxes()', () => { - it('should perform a query to set the array of taxes into the controller', () => { - $httpBackend.flush(); - - expect(controller.taxes[0].id).toEqual(1); - expect(controller.taxes[0].taxClassFk).toEqual(1); - }); - }); - - describe('submit()', () => { - it('should perform a post to update taxes', () => { - jest.spyOn(controller.$.watcher, 'notifySaved'); - jest.spyOn(controller.$.watcher, 'updateOriginalData'); - - controller.$onInit(); - $httpBackend.flush(); - - controller.taxes.push({id: 3, description: 'General VAT', code: 'G'}); - - $httpBackend.whenPOST(`Items/updateTaxes`).respond(true); - controller.submit(); - $httpBackend.flush(); - - expect(controller.$.watcher.notifySaved).toHaveBeenCalledWith(); - expect(controller.$.watcher.updateOriginalData).toHaveBeenCalledWith(); - }); - }); - }); -}); diff --git a/modules/item/front/waste/index/index.html b/modules/item/front/waste/index/index.html deleted file mode 100644 index 7fb3b870e..000000000 --- a/modules/item/front/waste/index/index.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/modules/item/front/waste/index/index.js b/modules/item/front/waste/index/index.js deleted file mode 100644 index 86d9d3778..000000000 --- a/modules/item/front/waste/index/index.js +++ /dev/null @@ -1,19 +0,0 @@ -import ngModule from '../../module'; -import Section from 'salix/components/section'; -import './style.scss'; - -export default class Controller extends Section { - constructor($element, $) { - super($element, $); - } - - async $onInit() { - this.$state.go('item.index'); - window.location.href = 'https://grafana.verdnatura.es/d/TTNXQAxVk'; - } -} - -ngModule.vnComponent('vnItemWasteIndex', { - template: require('./index.html'), - controller: Controller -}); diff --git a/modules/item/front/waste/index/style.scss b/modules/item/front/waste/index/style.scss deleted file mode 100644 index 36fac3311..000000000 --- a/modules/item/front/waste/index/style.scss +++ /dev/null @@ -1,27 +0,0 @@ -@import "variables"; -@import "effects"; - -vn-item-waste-index, -vn-item-waste-detail { - .header { - padding: 12px 0 5px 0; - background-color: $color-bg; - font-size: 1.2rem; - margin-bottom: 10px; - } - - vn-table vn-th.waste-family, - vn-table vn-td.waste-family { - max-width: 64px; - width: 64px - } - - .hidden { - display: none; - } - - .arrow.hidden { - display: block; - transform: rotate(180deg); - } -} diff --git a/modules/item/front/waste/locale/es.yml b/modules/item/front/waste/locale/es.yml deleted file mode 100644 index b9cd33dec..000000000 --- a/modules/item/front/waste/locale/es.yml +++ /dev/null @@ -1,4 +0,0 @@ -Family: Familia -Percentage: Porcentaje -Dwindle: Mermas -Minimize/Maximize: Minimizar/Maximizar \ No newline at end of file From 5da6c09f6808794778ad36629e6342c29e91da66 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 18 Sep 2024 12:08:49 +0200 Subject: [PATCH 004/266] fix: refs #7529 workerPit --- db/versions/11094-maroonCyca/00-firstScript.sql | 8 -------- .../11245-turquoiseAnthurium/00-firstScript.sql | 15 +++++++++++++++ modules/worker/back/model-config.json | 2 +- modules/worker/back/models/worker-irpf.json | 2 +- modules/worker/back/models/worker-relatives.json | 8 ++++---- modules/worker/back/models/worker.json | 12 +++++++++++- 6 files changed, 32 insertions(+), 15 deletions(-) delete mode 100644 db/versions/11094-maroonCyca/00-firstScript.sql create mode 100644 db/versions/11245-turquoiseAnthurium/00-firstScript.sql diff --git a/db/versions/11094-maroonCyca/00-firstScript.sql b/db/versions/11094-maroonCyca/00-firstScript.sql deleted file mode 100644 index dfaf5b79e..000000000 --- a/db/versions/11094-maroonCyca/00-firstScript.sql +++ /dev/null @@ -1,8 +0,0 @@ --- Place your SQL code here --- Auto-generated SQL script #202406101036 -INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) - VALUES ('Worker','workerRelatives','*','ALLOW','ROLE','hr'); -INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) - VALUES ('Worker','workerIrpf','*','ALLOW','ROLE','hr'); -INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) - VALUES ('Worker','disabilityGrade','*','ALLOW','ROLE','hr'); diff --git a/db/versions/11245-turquoiseAnthurium/00-firstScript.sql b/db/versions/11245-turquoiseAnthurium/00-firstScript.sql new file mode 100644 index 000000000..6381f5db4 --- /dev/null +++ b/db/versions/11245-turquoiseAnthurium/00-firstScript.sql @@ -0,0 +1,15 @@ +ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; +ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; + +RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; + +ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; +ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; + + +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES + ('Worker','workerRelative','*','ALLOW','ROLE','hr'), + ('Worker','workerIrpf','*','ALLOW','ROLE','hr'), + ('Worker','disabilityGrade','*','ALLOW','ROLE','hr'); + diff --git a/modules/worker/back/model-config.json b/modules/worker/back/model-config.json index eb3e573e1..dc078f4d0 100644 --- a/modules/worker/back/model-config.json +++ b/modules/worker/back/model-config.json @@ -131,7 +131,7 @@ "DisabilityGrade": { "dataSource": "vn" }, - "WorkerRelatives": { + "WorkerRelative": { "dataSource": "vn" }, "MedicalReview": { diff --git a/modules/worker/back/models/worker-irpf.json b/modules/worker/back/models/worker-irpf.json index 034bed368..44bd9713c 100644 --- a/modules/worker/back/models/worker-irpf.json +++ b/modules/worker/back/models/worker-irpf.json @@ -22,7 +22,7 @@ "disabilityGradeFk": { "type" : "number" }, - "isDependent": { + "isDependend": { "type" : "number" }, "familySituation": { diff --git a/modules/worker/back/models/worker-relatives.json b/modules/worker/back/models/worker-relatives.json index 2429a2f1c..0815f7330 100644 --- a/modules/worker/back/models/worker-relatives.json +++ b/modules/worker/back/models/worker-relatives.json @@ -1,10 +1,10 @@ { - "name": "WorkerRelatives", + "name": "WorkerRelative", "description": "Model 145 IRPF", "base": "VnModel", "options": { "mysql": { - "table": "workerRelatives" + "table": "workerRelative" } }, "properties": { @@ -31,7 +31,7 @@ "isDependend": { "type" : "boolean" }, - "islointCustody": { + "isJointCustody": { "type" : "boolean" }, "updated": { @@ -46,7 +46,7 @@ }, "worker": { "type": "belongsTo", - "model": "WorkerIrpf", + "model": "VnUser", "foreignKey": "workerFK" } } diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index 21c5bd10f..568d23b91 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -135,6 +135,16 @@ "type": "hasMany", "model": "WorkerTimeControlMail", "foreignKey": "workerFk" + }, + "irpf": { + "type": "hasMany", + "model": "WorkerIrpf", + "foreignKey": "workerFk" + }, + "workerRelative": { + "type": "hasMany", + "model": "WorkerRelative", + "foreignKey": "workerFK" } }, "acls": [ @@ -207,4 +217,4 @@ ] } } -} \ No newline at end of file +} From 7c3d02817e475959a924a1d45e820ef9028cc482 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 2 Oct 2024 11:59:55 +0200 Subject: [PATCH 005/266] fix: refs #7283 remove tests --- .../05-ticket/01-sale/01_list_sales.spec.js | 99 ----- .../05-ticket/01-sale/02_edit_sale.spec.js | 415 ------------------ e2e/paths/05-ticket/01_observations.spec.js | 50 --- .../05-ticket/02_expeditions_and_log.spec.js | 32 -- e2e/paths/05-ticket/04_packages.spec.js | 78 ---- e2e/paths/05-ticket/05_tracking_state.spec.js | 72 --- .../05-ticket/06_basic_data_steps.spec.js | 143 ------ e2e/paths/05-ticket/08_components.spec.js | 30 -- e2e/paths/05-ticket/09_weekly.spec.js | 123 ------ e2e/paths/05-ticket/10_request.spec.js | 77 ---- e2e/paths/05-ticket/12_descriptor.spec.js | 148 ------- e2e/paths/05-ticket/13_services.spec.js | 127 ------ e2e/paths/05-ticket/14_create_ticket.spec.js | 69 --- .../15_create_ticket_from_client.spec.js | 37 -- e2e/paths/05-ticket/16_summary.spec.js | 108 ----- e2e/paths/05-ticket/17_log.spec.js | 34 -- e2e/paths/05-ticket/18_index_payout.spec.js | 70 --- e2e/paths/05-ticket/19_dms.spec.js | 49 --- e2e/paths/05-ticket/20_moveExpedition.spec.js | 50 --- e2e/paths/05-ticket/21_future.spec.js | 99 ----- e2e/paths/05-ticket/22_advance.spec.js | 79 ---- loopback/locale/en.json | 6 +- 22 files changed, 4 insertions(+), 1991 deletions(-) delete mode 100644 e2e/paths/05-ticket/01-sale/01_list_sales.spec.js delete mode 100644 e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js delete mode 100644 e2e/paths/05-ticket/01_observations.spec.js delete mode 100644 e2e/paths/05-ticket/02_expeditions_and_log.spec.js delete mode 100644 e2e/paths/05-ticket/04_packages.spec.js delete mode 100644 e2e/paths/05-ticket/05_tracking_state.spec.js delete mode 100644 e2e/paths/05-ticket/06_basic_data_steps.spec.js delete mode 100644 e2e/paths/05-ticket/08_components.spec.js delete mode 100644 e2e/paths/05-ticket/09_weekly.spec.js delete mode 100644 e2e/paths/05-ticket/10_request.spec.js delete mode 100644 e2e/paths/05-ticket/12_descriptor.spec.js delete mode 100644 e2e/paths/05-ticket/13_services.spec.js delete mode 100644 e2e/paths/05-ticket/14_create_ticket.spec.js delete mode 100644 e2e/paths/05-ticket/15_create_ticket_from_client.spec.js delete mode 100644 e2e/paths/05-ticket/16_summary.spec.js delete mode 100644 e2e/paths/05-ticket/17_log.spec.js delete mode 100644 e2e/paths/05-ticket/18_index_payout.spec.js delete mode 100644 e2e/paths/05-ticket/19_dms.spec.js delete mode 100644 e2e/paths/05-ticket/20_moveExpedition.spec.js delete mode 100644 e2e/paths/05-ticket/21_future.spec.js delete mode 100644 e2e/paths/05-ticket/22_advance.spec.js diff --git a/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js b/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js deleted file mode 100644 index ad0975889..000000000 --- a/e2e/paths/05-ticket/01-sale/01_list_sales.spec.js +++ /dev/null @@ -1,99 +0,0 @@ -import selectors from '../../../helpers/selectors.js'; -import getBrowser from '../../../helpers/puppeteer'; - -describe('Ticket List sale path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('13'); - await page.accessToSection('ticket.card.sale'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should confirm the first ticket sale contains the colour tag', async() => { - const value = await page - .waitToGetProperty(selectors.ticketSales.firstSaleColour, 'innerText'); - - expect(value).toContain('Black'); - }); - - it('should confirm the first sale contains the price', async() => { - const value = await page - .waitToGetProperty(selectors.ticketSales.firstSalePrice, 'innerText'); - - expect(value).toContain('1.72'); - }); - - it('should confirm the first sale contains the discount', async() => { - const value = await page - .waitToGetProperty(selectors.ticketSales.firstSaleDiscount, 'innerText'); - - expect(value).toContain('0.00%'); - }); - - it('should confirm the first sale contains the total import', async() => { - const value = await page - .waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText'); - - expect(value).toContain('34.40'); - }); - - it('should add an empty item to the sale list', async() => { - await page.waitToClick(selectors.ticketSales.newItemButton); - const sales = await page - .countElement(selectors.ticketSales.saleLine); - - expect(sales).toEqual(2); - }); - - it('should select a valid item to be added as the second item in the sales list', async() => { - let searchValue = 'Melee weapon heavy shield 100cm'; - await page.autocompleteSearch(selectors.ticketSales.secondSaleIdAutocomplete, searchValue); - await page.waitToClick(selectors.ticketSales.secondSaleQuantityCell); - await page.type(selectors.ticketSales.secondSaleQuantity, '8'); - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should update the description of the new sale', async() => { - await page.click(selectors.ticketSales.secondSaleConceptCell); - await page.write(selectors.ticketSales.secondSaleConceptInput, 'Aegis of Valor'); - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should add a third empty item to the sale list', async() => { - await page.waitToClick(selectors.ticketSales.newItemButton); - await page.waitForNumberOfElements(selectors.ticketSales.saleLine, 3); - const sales = await page.countElement(selectors.ticketSales.saleLine); - - expect(sales).toEqual(3); - }); - - it('should select the 2nd and 3th item and delete both', async() => { - await page.waitToClick(selectors.ticketSales.secondSaleCheckbox); - await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketSales.deleteSaleButton); - await page.waitToClick(selectors.globalItems.acceptButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should verify there's only 1 single line remaining`, async() => { - const sales = await page.countElement(selectors.ticketSales.saleLine); - - expect(sales).toEqual(1); - }); -}); diff --git a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js b/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js deleted file mode 100644 index d9689e31a..000000000 --- a/e2e/paths/05-ticket/01-sale/02_edit_sale.spec.js +++ /dev/null @@ -1,415 +0,0 @@ -import selectors from '../../../helpers/selectors.js'; -import getBrowser from '../../../helpers/puppeteer'; - -describe('Ticket Edit sale path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('salesPerson', 'ticket'); - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should click on the first sale claim icon to navigate over there`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleClaimIcon); - await page.waitForNavigation(); - await page.goBack(); - await page.goBack(); - }); - - it('should navigate to the tickets index', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.ticketsButton); - await page.waitForState('ticket.index'); - }); - - it(`should search for a ticket and then navigate to it's sales`, async() => { - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - }); - - it(`should set the ticket as libre`, async() => { - const searchValue = 'libre'; - await page.waitToClick(selectors.ticketSales.stateMenuButton); - await page.write(selectors.ticketSales.moreMenuState, searchValue); - try { - await page.waitForFunction(searchValue => { - const element = document.querySelector('li.active'); - if (element) - return element.innerText.toLowerCase().includes(searchValue.toLowerCase()); - }, {}, searchValue); - } catch (error) { - const builtSelector = await page.selectorFormater(selectors.ticketSales.moreMenuState); - const inputValue = await page.evaluate(() => { - return document.querySelector('.vn-drop-down.shown vn-textfield input').value; - }); - throw new Error(`${builtSelector} value is ${inputValue}! ${error}`); - } - await page.waitForState('ticket.card.sale'); - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should check it's state is libre now`, async() => { - await page.waitForTextInElement(selectors.ticketDescriptor.stateLabelValue, 'Libre'); - const result = await page.waitToGetProperty(selectors.ticketDescriptor.stateLabelValue, 'innerText'); - - expect(result).toEqual('State Libre'); - }); - - it(`should set the ticket as OK`, async() => { - await page.waitToClick(selectors.ticketSales.setOk); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should check it's state is OK now`, async() => { - await page.waitForTextInElement(selectors.ticketDescriptor.stateLabelValue, 'OK'); - const result = await page.waitToGetProperty(selectors.ticketDescriptor.stateLabelValue, 'innerText'); - - expect(result).toEqual('State OK'); - }); - - it(`should check the zoomed image isn't present`, async() => { - const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage); - - expect(result).toEqual(0); - }); - - it(`should click on the thumbnail image of the 1st sale and see the zoomed image`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleThumbnailImage); - const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage); - - expect(result).toEqual(1); - }); - - it(`should click on the zoomed image to close it`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleZoomedImage); - const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage); - - expect(result).toEqual(0); - }); - - it(`should click on the first sale ID making now the item descriptor visible`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleId); - await page.waitImgLoad(selectors.ticketSales.firstSaleDescriptorImage); - const visible = await page.isVisible(selectors.ticketSales.saleDescriptorPopover); - - expect(visible).toBeTruthy(); - }); - - it(`should click on the descriptor image of the 1st sale and see the zoomed image`, async() => { - await page.waitToClick('vn-item-descriptor img'); - const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage); - - expect(result).toEqual(1); - }); - - it(`should now click on the zoomed image to close it`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleZoomedImage); - const result = await page.countElement(selectors.ticketSales.firstSaleZoomedImage); - - expect(result).toEqual(0); - }); - - it(`should click on the summary icon of the item-descriptor to access to the item summary`, async() => { - await page.waitToClick(selectors.ticketSales.saleDescriptorPopoverSummaryButton); - await page.waitForState('item.card.summary'); - }); - - it('should return to ticket sales section', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.ticketsButton); - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - }); - - it('should remove 1 from the first sale quantity', async() => { - await page.waitToClick(selectors.ticketSales.firstSaleQuantityCell); - await page.waitForSelector(selectors.ticketSales.firstSaleQuantity); - await page.type(selectors.ticketSales.firstSaleQuantity, '9\u000d'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should update the price', async() => { - await page.waitToClick(selectors.ticketSales.firstSalePrice); - await page.waitForSelector(selectors.ticketSales.firstSalePriceInput); - await page.type(selectors.ticketSales.firstSalePriceInput, '5\u000d'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the price have been updated', async() => { - const result = await page.waitToGetProperty(selectors.ticketSales.firstSalePrice, 'innerText'); - - expect(result).toContain('5.00'); - }); - - it('should confirm the total price for that item have been updated', async() => { - const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText'); - - expect(result).toContain('45.00'); - }); - - it('should update the discount', async() => { - await page.waitToClick(selectors.ticketSales.firstSaleDiscount); - await page.waitForSelector(selectors.ticketSales.firstSaleDiscountInput); - await page.type(selectors.ticketSales.firstSaleDiscountInput, '50'); - await page.waitToClick(selectors.ticketSales.saveSaleDiscountButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the discount have been updated', async() => { - await page.waitForTextInElement(selectors.ticketSales.firstSaleDiscount, '50.00%'); - const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleDiscount, 'innerText'); - - expect(result).toContain('50.00%'); - }); - - it('should confirm the total import for that item have been updated', async() => { - await page.waitForTextInElement(selectors.ticketSales.firstSaleImport, '22.50'); - const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleImport, 'innerText'); - - expect(result).toContain('22.50'); - }); - - it('should recalculate price of sales', async() => { - await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); - await page.waitToClick(selectors.ticketSales.secondSaleCheckbox); - - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuRecalculatePrice); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should log in as salesAssistant and navigate to ticket sales', async() => { - await page.loginAndModule('salesAssistant', 'ticket'); - await page.accessToSearchResult('15'); - await page.accessToSection('ticket.card.sale'); - }); - - it('should select the first sale and create a refund with warehouse', async() => { - await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuRefund); - await page.waitToClick(selectors.ticketSales.refundWithWarehouse); - await page.waitForSnackbar(); - await page.waitForState('ticket.card.sale'); - }); - - it('should select the first sale and create a refund without warehouse', async() => { - await page.accessToSearchResult('18'); - await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuRefund); - await page.waitToClick(selectors.ticketSales.refundWithoutWarehouse); - await page.waitForSnackbar(); - await page.waitForState('ticket.card.sale'); - }); - - it('should show error trying to delete a ticket with a refund', async() => { - await page.loginAndModule('salesPerson', 'ticket'); - await page.accessToSearchResult('8'); - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket); - await page.waitToClick(selectors.globalItems.acceptButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Tickets with associated refunds can\'t be deleted'); - await page.waitToClick(selectors.globalItems.cancelButton); - }); - - it('should select the third sale and create a claim of it', async() => { - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuCreateClaim); - await page.waitToClick(selectors.globalItems.acceptButton); - await page.waitForNavigation(); - }); - - it('should search for a ticket then access to the sales section', async() => { - await page.goBack(); - await page.goBack(); - await page.loginAndModule('salesPerson', 'ticket'); - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - }); - - it('should select the third sale and delete it', async() => { - await page.waitToClick(selectors.ticketSales.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketSales.deleteSaleButton); - await page.waitToClick(selectors.globalItems.acceptButton); - await page.waitForSpinnerLoad(); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the third sale was deleted`, async() => { - const result = await page.countElement(selectors.ticketSales.saleLine); - - expect(result).toEqual(3); - }); - - it('should select the second sale and transfer it to a valid ticket', async() => { - const targetTicketId = '12'; - - await page.waitToClick(selectors.ticketSales.secondSaleCheckbox); - await page.waitToClick(selectors.ticketSales.transferSaleButton); - await page.waitToClick(selectors.ticketSales.transferQuantityCell); - await page.type(selectors.ticketSales.transferQuantityInput, '10\u000d'); - await page.type(selectors.ticketSales.moveToTicketInput, targetTicketId); - await page.waitToClick(selectors.ticketSales.moveToTicketButton); - await page.expectURL(`ticket/${targetTicketId}/sale`); - }); - - it('should confirm the transfered line is the correct one', async() => { - await page.waitForSelector(selectors.ticketSales.secondSaleText); - const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleText, 'innerText'); - - expect(result).toContain(`Melee weapon heavy shield`); - }); - - it('should confirm the transfered quantity is the correct one', async() => { - const result = await page.waitToGetProperty(selectors.ticketSales.firstSaleQuantityCell, 'innerText'); - - expect(result).toContain('20'); - }); - - it('should go back to the original ticket sales section', async() => { - await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton); - await page.accessToSearchResult('16'); - await page.accessToSection('ticket.card.sale'); - }); - - it(`should confirm the original ticket has still three lines`, async() => { - await page.waitForSelector(selectors.ticketSales.saleLine); - const result = await page.countElement(selectors.ticketSales.saleLine); - - expect(result).toEqual(3); - }); - - it(`should confirm the second sale quantity is now half of it's original value after the transfer`, async() => { - const result = await page.waitToGetProperty(selectors.ticketSales.secondSaleQuantityCell, 'innerText'); - - expect(result).toContain('10'); - }); - - it('should go back to the receiver ticket sales section', async() => { - await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton); - await page.accessToSearchResult('12'); - await page.accessToSection('ticket.card.sale'); - }); - - it('should transfer the sale back to the original ticket', async() => { - const targetTicketId = '16'; - - await page.waitToClick(selectors.ticketSales.secondSaleCheckbox); - await page.waitToClick(selectors.ticketSales.transferSaleButton); - await page.type(selectors.ticketSales.moveToTicketInput, targetTicketId); - await page.waitToClick(selectors.ticketSales.moveToTicketButton); - await page.expectURL(`ticket/${targetTicketId}/sale`); - }); - - it('should confirm the original ticket received the line', async() => { - const expectedLines = 4; - await page.waitForNumberOfElements(selectors.ticketSales.saleLine, expectedLines); - const result = await page.countElement(selectors.ticketSales.saleLine); - - expect(result).toEqual(expectedLines); - }); - - it(`should throw an error when attempting to create a ticket for an inactive client`, async() => { - await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); - await page.waitToClick(selectors.ticketSales.transferSaleButton); - await page.waitToClick(selectors.ticketSales.moveToNewTicketButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`You can't create a ticket for an inactive client`); - - await page.closePopup(); - }); - - it('should go now to the ticket sales section of an active, not frozen client', async() => { - await page.waitToClick(selectors.ticketDescriptor.goBackToModuleIndexButton); - await page.accessToSearchResult('13'); - await page.accessToSection('ticket.card.sale'); - }); - - it(`should select all sales, tranfer them to a new ticket and delete the sender ticket as it would've been left empty`, async() => { - const senderTicketId = '13'; - - await page.waitToClick(selectors.ticketSales.selectAllSalesCheckbox); - await page.waitToClick(selectors.ticketSales.transferSaleButton); - await page.waitToClick(selectors.ticketSales.moveToNewTicketButton); - await page.evaluate((selector, ticketId) => { - return document.querySelector(selector).innerText.toLowerCase().indexOf(`#${ticketId}`) == -1; - }, selectors.ticketDescriptor.id, senderTicketId); - await page.waitForState('ticket.card.sale'); - }); - - it('should confirm the new ticket received the line', async() => { - const expectedLines = 1; - const result = await page.countElement(selectors.ticketSales.saleLine); - - expect(result).toEqual(expectedLines); - }); - - it('should check the first sale reserved icon isnt visible', async() => { - const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon); - - expect(result).toBeFalsy(); - }); - - it('should mark the first sale as reserved', async() => { - await page.waitToClick(selectors.ticketSales.firstSaleCheckbox); - - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuReserve); - await page.closePopup(); - await page.waitForClassNotPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide'); - const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon); - - expect(result).toBeTruthy(); - }); - - it('should unmark the first sale as reserved', async() => { - await page.waitToClick(selectors.ticketSales.moreMenu); - await page.waitToClick(selectors.ticketSales.moreMenuUnmarkReseved); - await page.waitForClassPresent(selectors.ticketSales.firstSaleReservedIcon, 'ng-hide'); - const result = await page.isVisible(selectors.ticketSales.firstSaleReservedIcon); - - expect(result).toBeFalsy(); - }); - - it('should log in as Production role and go to a target ticket summary', async() => { - await page.loginAndModule('production', 'ticket'); - await page.accessToSearchResult('13'); - await page.waitForState('ticket.card.summary'); - }); - - it(`should check the ticket is deleted`, async() => { - await page.waitForSelector(selectors.ticketDescriptor.isDeletedIcon); - }); -}); diff --git a/e2e/paths/05-ticket/01_observations.spec.js b/e2e/paths/05-ticket/01_observations.spec.js deleted file mode 100644 index cf37f9ff1..000000000 --- a/e2e/paths/05-ticket/01_observations.spec.js +++ /dev/null @@ -1,50 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Create notes path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('5'); - await page.accessToSection('ticket.card.observation'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should create a new note', async() => { - await page.waitToClick(selectors.ticketNotes.addNoteButton); - await page.autocompleteSearch(selectors.ticketNotes.firstNoteType, 'ItemPicker'); - await page.write(selectors.ticketNotes.firstDescription, 'description'); - await page.waitToClick(selectors.ticketNotes.submitNotesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the note is the expected one', async() => { - await page.reloadSection('ticket.card.observation'); - const result = await page - .waitToGetProperty(selectors.ticketNotes.firstNoteType, 'value'); - - expect(result).toEqual('ItemPicker'); - - const firstDescription = await page - .waitToGetProperty(selectors.ticketNotes.firstDescription, 'value'); - - expect(firstDescription).toEqual('description'); - }); - - it('should delete the note', async() => { - await page.waitToClick(selectors.ticketNotes.firstNoteRemoveButton); - await page.waitToClick(selectors.ticketNotes.submitNotesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); -}); diff --git a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js b/e2e/paths/05-ticket/02_expeditions_and_log.spec.js deleted file mode 100644 index 4e8005043..000000000 --- a/e2e/paths/05-ticket/02_expeditions_and_log.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket expeditions and log path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('production', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.expedition'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should delete a former expedition and confirm the remaining expedition are the expected ones`, async() => { - await page.waitToClick(selectors.ticketExpedition.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketExpedition.deleteExpeditionButton); - await page.waitToClick(selectors.globalItems.acceptButton); - await page.reloadSection('ticket.card.expedition'); - - await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {}); - const result = await page - .countElement(selectors.ticketExpedition.expeditionRow); - - expect(result).toEqual(6); - }); -}); diff --git a/e2e/paths/05-ticket/04_packages.spec.js b/e2e/paths/05-ticket/04_packages.spec.js deleted file mode 100644 index 1e6a0a173..000000000 --- a/e2e/paths/05-ticket/04_packages.spec.js +++ /dev/null @@ -1,78 +0,0 @@ -import getBrowser from '../../helpers/puppeteer'; - -const $ = { - firstPackage: 'vn-autocomplete[label="Package"]', - firstQuantity: 'vn-ticket-package vn-horizontal:nth-child(1) vn-input-number[ng-model="package.quantity"]', - firstRemovePackageButton: 'vn-icon-button[vn-tooltip="Remove package"]', - addPackageButton: 'vn-icon-button[vn-tooltip="Add package"]', - savePackagesButton: `button[type=submit]` -}; - -describe('Ticket Create packages path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.package'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should attempt create a new package but receive an error if package is blank`, async() => { - await page.waitToClick($.firstRemovePackageButton); - await page.waitToClick($.addPackageButton); - await page.write($.firstQuantity, '99'); - await page.waitToClick($.savePackagesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Package cannot be blank'); - }); - - it(`should delete the first package and receive and error to save a new one with blank quantity`, async() => { - await page.clearInput($.firstQuantity); - await page.autocompleteSearch($.firstPackage, 'Container medical box 100cm'); - await page.waitToClick($.savePackagesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Some fields are invalid'); - }); - - it(`should confirm the quantity input isn't invalid yet`, async() => { - const result = await page - .evaluate(selector => { - return document.querySelector(`${selector} input`).checkValidity(); - }, $.firstQuantity); - - expect(result).toBeTruthy(); - }); - - it(`should create a new package with correct data`, async() => { - await page.clearInput($.firstQuantity); - await page.write($.firstQuantity, '-99'); - await page.waitToClick($.savePackagesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the first select is the expected one`, async() => { - await page.reloadSection('ticket.card.package'); - await page.waitForTextInField($.firstPackage, 'Container medical box 100cm'); - const result = await page.waitToGetProperty($.firstPackage, 'value'); - - expect(result).toEqual('Container medical box 100cm'); - }); - - it(`should confirm quantity is just a number and the string part was ignored by the imput number`, async() => { - await page.waitForTextInField($.firstQuantity, '-99'); - const result = await page.waitToGetProperty($.firstQuantity, 'value'); - - expect(result).toEqual('-99'); - }); -}); diff --git a/e2e/paths/05-ticket/05_tracking_state.spec.js b/e2e/paths/05-ticket/05_tracking_state.spec.js deleted file mode 100644 index 5cfc1c9d4..000000000 --- a/e2e/paths/05-ticket/05_tracking_state.spec.js +++ /dev/null @@ -1,72 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Create new tracking state path', () => { - let browser; - let page; - - afterAll(async() => { - await browser.close(); - }); - - describe('as production', () => { - it('should log into the ticket 1 tracking', async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('production', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.tracking.index'); - }); - - it('should access to the create state view by clicking the create floating button', async() => { - await page.waitToClick(selectors.ticketTracking.createStateButton); - await page.waitForSelector(selectors.createStateView.state, {visible: true}); - await page.waitForState('ticket.card.tracking.edit'); - }); - - it(`should create a new state`, async() => { - await page.autocompleteSearch(selectors.createStateView.state, 'OK'); - await page.waitToClick(selectors.createStateView.saveStateButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - }); - - describe('as salesPerson', () => { - it('should now log into the ticket 1 tracking', async() => { - await page.loginAndModule('salesPerson', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.tracking.index'); - }); - - it('should now access to the create state view by clicking the create floating button', async() => { - await page.waitForSelector('.vn-popup', {hidden: true}); - await page.waitToClick(selectors.ticketTracking.createStateButton); - await page.waitForState('ticket.card.tracking.edit'); - }); - - it(`should attemp to create an state for which salesPerson doesn't have permissions`, async() => { - await page.autocompleteSearch(selectors.createStateView.state, 'Encajado'); - await page.waitToClick(selectors.createStateView.saveStateButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`You don't have enough privileges`); - }); - - it(`should make sure the worker gets autocomplete uppon selecting the assigned state`, async() => { - await page.autocompleteSearch(selectors.createStateView.state, 'asignado'); - const result = await page - .waitToGetProperty(selectors.createStateView.worker, 'value'); - - expect(result).toEqual('salesperson'); - }); - - it(`should succesfully create a valid state`, async() => { - await page.waitToClick(selectors.createStateView.saveStateButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - }); -}); diff --git a/e2e/paths/05-ticket/06_basic_data_steps.spec.js b/e2e/paths/05-ticket/06_basic_data_steps.spec.js deleted file mode 100644 index 77f0e0459..000000000 --- a/e2e/paths/05-ticket/06_basic_data_steps.spec.js +++ /dev/null @@ -1,143 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Edit basic data path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('11'); - await page.accessToSection('ticket.card.basicData.stepOne'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should confirm the zone autocomplete is disabled unless your role is productionBoss`, async() => { - await page.waitForSelector(selectors.ticketBasicData.zone, {}); - const disabled = await page.evaluate(selector => { - return document.querySelector(selector).disabled; - }, `${selectors.ticketBasicData.zone} input`); - - expect(disabled).toBeTruthy(); - }); - - it(`should now log as productionBoss to perform the rest of the tests`, async() => { - await page.loginAndModule('productionBoss', 'ticket'); - await page.accessToSearchResult('11'); - await page.accessToSection('ticket.card.basicData.stepOne'); - }); - - it(`should confirm the zone autocomplete is enabled for the role productionBoss`, async() => { - await page.waitForSpinnerLoad(); - await page.waitForSelector(selectors.ticketBasicData.zone); - const disabled = await page.evaluate(selector => { - return document.querySelector(selector).disabled; - }, `${selectors.ticketBasicData.zone} input`); - - expect(disabled).toBeFalsy(); - }); - - it(`should check the zone is for Gotham247`, async() => { - let zone = await page - .waitToGetProperty(selectors.ticketBasicData.zone, 'value'); - - expect(zone).toContain('Zone 247 A'); - }); - - it(`should edit the ticket agency then check there are no zones for it`, async() => { - await page.autocompleteSearch(selectors.ticketBasicData.agency, 'Super-Man delivery'); - let emptyZone = await page - .expectPropertyValue(selectors.ticketBasicData.zone, 'value', ''); - - expect(emptyZone).toBeTruthy(); - }); - - it(`should edit the ticket zone then check the agency is for the new zone`, async() => { - await page.clearInput(selectors.ticketBasicData.agency); - await page.autocompleteSearch(selectors.ticketBasicData.zone, 'Zone expensive A'); - let zone = await page - .waitToGetProperty(selectors.ticketBasicData.agency, 'value'); - - expect(zone).toContain('Gotham247Expensive'); - }); - - it(`should click next`, async() => { - await page.waitToClick(selectors.ticketBasicData.nextStepButton); - await page.waitForState('ticket.card.basicData.stepTwo'); - }); - - it(`should have a price diference`, async() => { - const result = await page - .waitToGetProperty(selectors.ticketBasicData.stepTwoTotalPriceDif, 'innerText'); - - expect(result).toContain('-€228.25'); - }); - - it(`should select a new reason for the changes made then click on finalize`, async() => { - await page.waitToClick(selectors.ticketBasicData.chargesReason); - await page.waitToClick(selectors.ticketBasicData.finalizeButton); - await page.waitForState('ticket.card.summary'); - }); - - it(`should not find ticket`, async() => { - await page.doSearch('29'); - const count = await page.countElement(selectors.ticketsIndex.searchResult); - - expect(count).toEqual(0); - }); - - it(`should split ticket without negatives`, async() => { - const newAgency = 'Gotham247'; - const newDate = Date.vnNew(); - newDate.setDate(newDate.getDate() - 1); - - await page.accessToSearchResult('14'); - await page.accessToSection('ticket.card.basicData.stepOne'); - - await page.autocompleteSearch(selectors.ticketBasicData.agency, newAgency); - await page.pickDate(selectors.ticketBasicData.shipped, newDate); - - await page.waitToClick(selectors.ticketBasicData.nextStepButton); - - await page.waitToClick(selectors.ticketBasicData.finalizeButton); - - await page.waitForState('ticket.card.summary'); - - const newTicketAgency = await page - .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryAgency, 'innerText'); - const newTicketDate = await page - .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText'); - - expect(newAgency).toEqual(newTicketAgency); - expect(newTicketDate).toContain(newDate.getDate()); - }); - - it(`should new ticket have sale of old ticket`, async() => { - await page.accessToSection('ticket.card.sale'); - await page.waitForState('ticket.card.sale'); - - const item = await page.waitToGetProperty(selectors.ticketSales.firstSaleId, 'innerText'); - - expect(item).toEqual('4'); - }); - - it(`should old ticket have old date and agency`, async() => { - const oldDate = Date.vnNew(); - const oldAgency = 'Super-Man delivery'; - - await page.accessToSearchResult('14'); - - const oldTicketAgency = await page - .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryAgency, 'innerText'); - const oldTicketDate = await page - .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText'); - - expect(oldTicketAgency).toEqual(oldAgency); - expect(oldTicketDate).toContain(oldDate.getDate()); - }); -}); diff --git a/e2e/paths/05-ticket/08_components.spec.js b/e2e/paths/05-ticket/08_components.spec.js deleted file mode 100644 index ab2aa85b2..000000000 --- a/e2e/paths/05-ticket/08_components.spec.js +++ /dev/null @@ -1,30 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket List components path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.components'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should confirm the total base is correct', async() => { - const name = 'Base €'; - const minLength = name.length; - - await page.waitPropertyLength(selectors.ticketComponents.base, 'innerText', minLength); - const base = await page.waitToGetProperty(selectors.ticketComponents.base, 'innerText'); - - expect(base).toContain('Base'); - expect(base.length).toBeGreaterThan(minLength); - }); -}); diff --git a/e2e/paths/05-ticket/09_weekly.spec.js b/e2e/paths/05-ticket/09_weekly.spec.js deleted file mode 100644 index 370d422e6..000000000 --- a/e2e/paths/05-ticket/09_weekly.spec.js +++ /dev/null @@ -1,123 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket descriptor path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('buyerBoss', 'ticket'); - await page.accessToSection('ticket.weekly.index'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should count the amount of tickets in the turns section', async() => { - const result = await page.countElement(selectors.ticketsIndex.weeklyTicket); - - expect(result).toEqual(6); - }); - - it('should go back to the ticket index then search and access a ticket summary', async() => { - await page.accessToSection('ticket.index'); - await page.accessToSearchResult('33'); - }); - - it('should add the ticket to thursday turn using the descriptor more menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuAddToTurn); - await page.waitToClick(selectors.ticketDescriptor.thursdayButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Current ticket deleted and added to shift'); - }); - - it('should again click on the Tickets button of the top bar menu', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.ticketsButton); - await page.waitForState('ticket.index'); - }); - - it('should confirm the ticket 33 was added to thursday', async() => { - await page.accessToSection('ticket.weekly.index'); - const result = await page.waitToGetProperty(selectors.ticketsIndex.thirdWeeklyTicket, 'value'); - - expect(result).toEqual('Thursday'); - }); - - it('should click on the Tickets button of the top bar menu once more', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.ticketsButton); - await page.waitForState('ticket.index'); - }); - - it('should now search for the ticket 33', async() => { - await page.accessToSearchResult('33'); - await page.waitForState('ticket.card.summary'); - }); - - it('should add the ticket to saturday turn using the descriptor more menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuAddToTurn); - await page.waitToClick(selectors.ticketDescriptor.saturdayButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Current ticket deleted and added to shift'); - }); - - it('should click on the Tickets button of the top bar menu once again', async() => { - await page.waitToClick(selectors.globalItems.applicationsMenuButton); - await page.waitForSelector(selectors.globalItems.applicationsMenuVisible); - await page.waitToClick(selectors.globalItems.ticketsButton); - await page.waitForState('ticket.index'); - }); - - it('should confirm the ticket 33 was added on saturday', async() => { - await page.accessToSection('ticket.weekly.index'); - await page.waitForTimeout(5000); - - const result = await page.waitToGetProperty(selectors.ticketsIndex.thirdWeeklyTicket, 'value'); - - expect(result).toEqual('Saturday'); - }); - - it('should now search for the weekly ticket 33', async() => { - await page.doSearch('33'); - const nResults = await page.countElement(selectors.ticketsIndex.searchWeeklyResult); - - expect(nResults).toEqual(2); - }); - - it('should delete the weekly ticket 33', async() => { - await page.waitToClick(selectors.ticketsIndex.firstWeeklyTicketDeleteIcon); - await page.waitToClick(selectors.ticketsIndex.acceptDeleteTurn); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the sixth weekly ticket was deleted', async() => { - await page.doSearch(); - const nResults = await page.countElement(selectors.ticketsIndex.searchWeeklyResult); - - expect(nResults).toEqual(6); - }); - - it('should update the agency then remove it afterwards', async() => { - await page.autocompleteSearch(selectors.ticketsIndex.firstWeeklyTicketAgency, 'Gotham247'); - let message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - - await page.clearInput(selectors.ticketsIndex.firstWeeklyTicketAgency); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); -}); diff --git a/e2e/paths/05-ticket/10_request.spec.js b/e2e/paths/05-ticket/10_request.spec.js deleted file mode 100644 index 1b580aec2..000000000 --- a/e2e/paths/05-ticket/10_request.spec.js +++ /dev/null @@ -1,77 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket purchase request path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('salesPerson', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.request.index'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should add a new request', async() => { - await page.waitToClick(selectors.ticketRequests.addRequestButton); - await page.write(selectors.ticketRequests.descriptionInput, 'New stuff'); - await page.write(selectors.ticketRequests.quantity, '9'); - await page.autocompleteSearch(selectors.ticketRequests.atender, 'buyerNick'); - await page.write(selectors.ticketRequests.price, '999'); - await page.waitToClick(selectors.ticketRequests.saveButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should have been redirected to the request index', async() => { - await page.waitForState('ticket.card.request.index'); - }); - - it(`should edit the third request quantity as it's state is still new`, async() => { - await page.write(selectors.ticketRequests.thirdRequestQuantity, '9'); - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the new request was added', async() => { - await page.reloadSection('ticket.card.request.index'); - const result = await page.waitToGetProperty(selectors.ticketRequests.thirdRequestQuantity, 'value'); - - expect(result).toEqual('99'); - }); - - it(`should check the first request can't be edited as its state is different to new`, async() => { - await page.waitForClassPresent(selectors.ticketRequests.firstRequestQuantity, 'disabled'); - const result = await page.isDisabled(selectors.ticketRequests.firstRequestQuantity); - - expect(result).toBe(true); - }); - - it(`should check the second request can't be edited as its state is different to new`, async() => { - await page.waitForClassPresent(selectors.ticketRequests.secondRequestQuantity, 'disabled'); - const result = await page.isDisabled(selectors.ticketRequests.secondRequestQuantity); - - expect(result).toBe(true); - }); - - it('should delete the added request', async() => { - await page.waitToClick(selectors.ticketRequests.thirdRemoveRequestButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the request was deleted', async() => { - await page.reloadSection('ticket.card.request.index'); - await page.waitForSelector(selectors.ticketRequests.addRequestButton); - await page.waitForSelector(selectors.ticketRequests.thirdDescription, {hidden: true}); - }); -}); diff --git a/e2e/paths/05-ticket/12_descriptor.spec.js b/e2e/paths/05-ticket/12_descriptor.spec.js deleted file mode 100644 index 95a114c45..000000000 --- a/e2e/paths/05-ticket/12_descriptor.spec.js +++ /dev/null @@ -1,148 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket descriptor path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('salesperson', 'ticket'); - }); - - afterAll(async() => { - await browser.close(); - }); - - describe('Delete ticket', () => { - it('should search for an specific ticket', async() => { - await page.accessToSearchResult('18'); - await page.waitForState('ticket.card.summary'); - }); - - it(`should update the shipped hour using the descriptor menu`, async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuChangeShippedHour); - await page.pickTime(selectors.ticketDescriptor.changeShippedHour, '08:15'); - await page.waitToClick(selectors.ticketDescriptor.acceptChangeHourButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Shipped hour updated'); - }); - - it(`should confirm the ticket descriptor shows the correct shipping hour`, async() => { - await page.waitForState('ticket.card.summary'); - const result = await page - .waitToGetProperty(selectors.ticketDescriptor.descriptorDeliveryDate, 'innerText'); - - expect(result).toContain('08:15'); - }); - - it('should delete the ticket using the descriptor menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket); - await page.waitToClick(selectors.ticketDescriptor.acceptDialog); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Ticket deleted. You can undo this action within the first hour'); - }); - - it('should have been relocated to the ticket index', async() => { - await page.waitForState('ticket.index'); - }); - - it(`should search for the deleted ticket and check the deletedTicket icon and it's date`, async() => { - await page.write(selectors.ticketsIndex.topbarSearch, '18'); - await page.waitToClick(selectors.globalItems.searchButton); - await page.waitForState('ticket.card.summary'); - await page.isVisible(selectors.ticketDescriptor.isDeletedIcon); - const result = await page.waitToGetProperty(selectors.ticketsIndex.searchResultDate, 'innerText'); - - expect(result).toContain(2000); - }); - }); - - describe('Restore ticket', () => { - it('should restore the ticket using the descriptor menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuRestoreTicket); - await page.waitToClick(selectors.ticketDescriptor.acceptDialog); - await page.waitForState('ticket.card.summary'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - }); - - describe('Make invoice', () => { - it('should login as administrative role then search for a ticket', async() => { - const invoiceableTicketId = '14'; - - await page.loginAndModule('administrative', 'ticket'); - await page.accessToSearchResult(invoiceableTicketId); - await page.waitForState('ticket.card.summary'); - }); - - it(`should make sure the ticket doesn't have an invoiceOutFk yet`, async() => { - const result = await page - .waitToGetProperty(selectors.ticketSummary.invoiceOutRef, 'innerText'); - - expect(result).toEqual('-'); - }); - - it('should invoice the ticket using the descriptor menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitForContentLoaded(); - await page.waitToClick(selectors.ticketDescriptor.moreMenuMakeInvoice); - await page.waitToClick(selectors.ticketDescriptor.acceptInvoiceOutButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Ticket invoiced'); - }); - - it(`should make sure the ticket summary have an invoiceOutFk`, async() => { - await page.waitForTextInElement(selectors.ticketSummary.invoiceOutRef, 'T4444445'); - const result = await page.waitToGetProperty(selectors.ticketSummary.invoiceOutRef, 'innerText'); - - expect(result).toEqual('T4444445'); - }); - - it(`should regenerate the invoice using the descriptor menu`, async() => { - const expectedMessage = 'The invoice PDF document has been regenerated'; - - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitForContentLoaded(); - await page.waitToClick(selectors.ticketDescriptor.moreMenuRegenerateInvoice); - await page.respondToDialog('accept'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(expectedMessage); - }); - }); - - describe('SMS', () => { - it('should send the payment SMS using the descriptor menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuSMSOptions); - await page.waitToClick(selectors.ticketDescriptor.moreMenuPaymentSMS); - await page.waitForSelector(selectors.ticketDescriptor.SMStext); - await page.waitPropertyLength(selectors.ticketDescriptor.SMStext, 'value', 128); - await page.waitToClick(selectors.ticketDescriptor.sendSMSbutton); - const message = await page.waitForSnackbar(); - - expect(message).toBeDefined(); - }); - - it('should send the import SMS using the descriptor menu', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenuSMSOptions); - await page.waitToClick(selectors.ticketDescriptor.moreMenuSendImportSms); - await page.waitForSelector(selectors.ticketDescriptor.SMStext); - await page.waitPropertyLength(selectors.ticketDescriptor.SMStext, 'value', 144); - await page.waitToClick(selectors.ticketDescriptor.sendSMSbutton); - const message = await page.waitForSnackbar(); - - expect(message).toBeDefined(); - }); - }); -}); diff --git a/e2e/paths/05-ticket/13_services.spec.js b/e2e/paths/05-ticket/13_services.spec.js deleted file mode 100644 index 50df23582..000000000 --- a/e2e/paths/05-ticket/13_services.spec.js +++ /dev/null @@ -1,127 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket services path', () => { - let browser; - let page; - const invoicedTicketId = '1'; - - afterAll(async() => { - await browser.close(); - }); - - describe('as employee', () => { - it('should log in as employee, search for an invoice and get to services', async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult(invoicedTicketId); - await page.accessToSection('ticket.card.service'); - }); - - it('should find the add descripton button disabled for this user role', async() => { - await page.waitForClassPresent(selectors.ticketService.firstAddServiceTypeButton, 'disabled'); - await page.waitToClick(selectors.ticketService.addServiceButton); - await page.waitForSelector(selectors.ticketService.firstAddServiceTypeButton); - const disabled = await page.isDisabled(selectors.ticketService.firstAddServiceTypeButton); - - expect(disabled).toBe(true); - }); - - it('should receive an error if you attempt to save a service without access rights', async() => { - await page.clearInput(selectors.ticketService.firstPrice); - await page.write(selectors.ticketService.firstPrice, '999'); - await page.waitToClick(selectors.ticketService.saveServiceButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`The current ticket can't be modified`); - }); - }); - - describe('as administrative', () => { - let editableTicketId = '16'; - it('should navigate to the services of a target ticket', async() => { - await page.loginAndModule('administrative', 'ticket'); - await page.accessToSearchResult(editableTicketId); - await page.accessToSection('ticket.card.service'); - }); - - it('should click on the add button to prepare the form to create a new service', async() => { - await page.waitToClick(selectors.ticketService.addServiceButton); - const result = await page - .isVisible(selectors.ticketService.firstServiceType); - - expect(result).toBeTruthy(); - }); - - it('should receive an error if you attempt to save it with empty fields', async() => { - await page.waitToClick(selectors.ticketService.saveServiceButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`can't be blank`); - }); - - it('should click on the add new service type to open the dialog', async() => { - await page.waitToClick(selectors.ticketService.firstAddServiceTypeButton); - await page.waitForSelector('.vn-dialog.shown'); - const result = await page.isVisible(selectors.ticketService.newServiceTypeName); - - expect(result).toBeTruthy(); - }); - - it('should receive an error if service type is empty on submit', async() => { - await page.waitToClick(selectors.ticketService.saveServiceTypeButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain(`Name can't be empty`); - }); - - it('should create a new service type then add price then create the service', async() => { - await page.write(selectors.ticketService.newServiceTypeName, 'Documentos'); - await page.waitToClick(selectors.ticketService.saveServiceTypeButton); - await page.write(selectors.ticketService.firstPrice, '999'); - await page.waitToClick(selectors.ticketService.saveServiceButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the service description was created correctly', async() => { - await page.reloadSection('ticket.card.service'); - const result = await page - .waitToGetProperty(selectors.ticketService.firstServiceType, 'value'); - - expect(result).toEqual('Documentos'); - }); - - it('should confirm the service quantity was created correctly', async() => { - const result = await page - .waitToGetProperty(selectors.ticketService.firstQuantity, 'value'); - - expect(result).toEqual('1'); - }); - - it('should confirm the service price was created correctly', async() => { - const result = await page - .waitToGetProperty(selectors.ticketService.firstPrice, 'value'); - - expect(result).toEqual('999'); - }); - - it('should delete the service', async() => { - await page.waitToClick(selectors.ticketService.fistDeleteServiceButton); - await page.waitForNumberOfElements(selectors.ticketService.serviceLine, 0); - await page.waitToClick(selectors.ticketService.saveServiceButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should confirm the service was removed`, async() => { - await page.reloadSection('ticket.card.service'); - const nResults = await page.countElement(selectors.ticketService.serviceLine); - - expect(nResults).toEqual(0); - }); - }); -}); diff --git a/e2e/paths/05-ticket/14_create_ticket.spec.js b/e2e/paths/05-ticket/14_create_ticket.spec.js deleted file mode 100644 index 1f9c0c40a..000000000 --- a/e2e/paths/05-ticket/14_create_ticket.spec.js +++ /dev/null @@ -1,69 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket create path', () => { - let browser; - let page; - let nextMonth = Date.vnNew(); - nextMonth.setMonth(nextMonth.getMonth() + 1); - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('salesPerson', 'ticket'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should open the new ticket form', async() => { - await page.waitToClick(selectors.ticketsIndex.newTicketButton); - await page.waitForState('ticket.create'); - }); - - it('should succeed to create a ticket', async() => { - await page.autocompleteSearch(selectors.createTicketView.client, 'Clark Kent'); - await page.pickDate(selectors.createTicketView.deliveryDate, nextMonth); - await page.autocompleteSearch(selectors.createTicketView.warehouse, 'Warehouse Two'); - await page.autocompleteSearch(selectors.createTicketView.agency, 'Gotham247'); - await page.waitToClick(selectors.createTicketView.createButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the url is now the summary of the ticket', async() => { - await page.waitForState('ticket.card.summary'); - }); - - it('should again open the new ticket form', async() => { - await page.waitToClick(selectors.globalItems.returnToModuleIndexButton); - await page.waitToClick(selectors.ticketsIndex.newTicketButton); - await page.waitForState('ticket.create'); - }); - - it('should succeed to create another ticket for the same client', async() => { - await page.autocompleteSearch(selectors.createTicketView.client, 'Clark Kent'); - await page.pickDate(selectors.createTicketView.deliveryDate, nextMonth); - await page.autocompleteSearch(selectors.createTicketView.warehouse, 'Warehouse One'); - await page.autocompleteSearch(selectors.createTicketView.agency, 'Gotham247'); - await page.waitToClick(selectors.createTicketView.createButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should check the url is now the summary of the created ticket', async() => { - await page.waitForState('ticket.card.summary'); - }); - - it('should delete the current ticket', async() => { - await page.waitToClick(selectors.ticketDescriptor.moreMenu); - await page.waitToClick(selectors.ticketDescriptor.moreMenuDeleteTicket); - await page.waitToClick(selectors.ticketDescriptor.acceptDialog); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Ticket deleted. You can undo this action within the first hour'); - }); -}); diff --git a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js b/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js deleted file mode 100644 index 51ead6461..000000000 --- a/e2e/paths/05-ticket/15_create_ticket_from_client.spec.js +++ /dev/null @@ -1,37 +0,0 @@ -import getBrowser from '../../helpers/puppeteer'; - -const $ = { - form: 'vn-ticket-create-card', - moreMenu: 'vn-client-descriptor vn-icon-button[icon=more_vert]', - simpleTicketButton: '.vn-menu [name="simpleTicket"]' -}; - -describe('Ticket create from client path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'client'); - await page.accessToSearchResult('Petter Parker'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should create simple ticket and check if the client details are the expected ones', async() => { - await page.waitToClick($.moreMenu); - await page.waitToClick($.simpleTicketButton); - await page.waitForState('ticket.create'); - - const values = { - client: 'Petter Parker', - address: 'Petter Parker' - }; - const formValues = await page.fetchForm($.form, Object.keys(values)); - - expect(formValues).toEqual(values); - }); -}); diff --git a/e2e/paths/05-ticket/16_summary.spec.js b/e2e/paths/05-ticket/16_summary.spec.js deleted file mode 100644 index a6017e454..000000000 --- a/e2e/paths/05-ticket/16_summary.spec.js +++ /dev/null @@ -1,108 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Summary path', () => { - let browser; - let page; - const ticketId = '20'; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should navigate to the target ticket summary section', async() => { - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult(ticketId); - await page.waitForState('ticket.card.summary'); - }); - - it(`should display details from the ticket and it's client on the top of the header`, async() => { - await page.waitForTextInElement(selectors.ticketSummary.header, 'Bruce Banner'); - const result = await page.waitToGetProperty(selectors.ticketSummary.header, 'innerText'); - - expect(result).toContain(`Ticket #${ticketId}`); - expect(result).toContain('Bruce Banner (1109)'); - expect(result).toContain('Somewhere in Thailand'); - }); - - it('should display ticket details', async() => { - let result = await page - .waitToGetProperty(selectors.ticketSummary.state, 'innerText'); - - expect(result).toContain('Arreglar'); - }); - - it('should display delivery details', async() => { - let result = await page - .waitToGetProperty(selectors.ticketSummary.route, 'innerText'); - - expect(result).toContain('3'); - }); - - it('should display the ticket total', async() => { - let result = await page - .waitToGetProperty(selectors.ticketSummary.total, 'innerText'); - - expect(result).toContain('€155.54'); - }); - - it('should display the ticket line(s)', async() => { - let result = await page - .waitToGetProperty(selectors.ticketSummary.firstSaleItemId, 'innerText'); - - expect(result).toContain('2'); - }); - - it(`should click on the first sale ID to make the item descriptor visible`, async() => { - await page.waitToClick(selectors.ticketSummary.firstSaleItemId); - await page.waitImgLoad(selectors.ticketSummary.firstSaleDescriptorImage); - const visible = await page.isVisible(selectors.ticketSummary.itemDescriptorPopover); - - expect(visible).toBeTruthy(); - }); - - it(`should check the url for the item diary link of the descriptor is for the right item id`, async() => { - await page.waitForSelector(selectors.ticketSummary.itemDescriptorPopoverItemDiaryButton, {visible: true}); - }); - - it('should log in as production then navigate to the summary of the same ticket', async() => { - await page.loginAndModule('production', 'ticket'); - await page.accessToSearchResult(ticketId); - await page.waitForState('ticket.card.summary'); - }); - - it('should set the ticket state to OK using the top right button', async() => { - const searchValue = 'OK'; - await page.waitToClick(selectors.ticketSummary.stateButton); - await page.write(selectors.ticketSummary.stateAutocomplete, searchValue); - try { - await page.waitForFunction(text => { - const element = document.querySelector('li.active'); - if (element) - return element.innerText.toLowerCase().includes(text.toLowerCase()); - }, {}, searchValue); - } catch (error) { - const state = await page.evaluate(() => { - const stateSelector = 'vn-ticket-summary vn-label-value:nth-child(1) > section > span'; - return document.querySelector(stateSelector).value; - }); - throw new Error(`${stateSelector} innerText is ${state}! ${error}`); - } - await page.keyboard.press('Enter'); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it('should confirm the ticket state was updated', async() => { - await page.waitForSpinnerLoad(); - const result = await page.waitToGetProperty(selectors.ticketSummary.state, 'innerText'); - - expect(result).toContain('OK'); - }); -}); diff --git a/e2e/paths/05-ticket/17_log.spec.js b/e2e/paths/05-ticket/17_log.spec.js deleted file mode 100644 index e1da2df44..000000000 --- a/e2e/paths/05-ticket/17_log.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket log path', () => { - let browser; - let page; - const ticketId = '5'; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should navigate to the target ticket notes section', async() => { - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult(ticketId); - await page.accessToSection('ticket.card.observation'); - await page.waitForState('ticket.card.observation'); - }); - - it('should create a new note for the test', async() => { - await page.waitToClick(selectors.ticketNotes.addNoteButton); - await page.autocompleteSearch(selectors.ticketNotes.firstNoteType, 'ItemPicker'); - await page.write(selectors.ticketNotes.firstDescription, 'description'); - await page.waitToClick(selectors.ticketNotes.submitNotesButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); -}); diff --git a/e2e/paths/05-ticket/18_index_payout.spec.js b/e2e/paths/05-ticket/18_index_payout.spec.js deleted file mode 100644 index 9c5518424..000000000 --- a/e2e/paths/05-ticket/18_index_payout.spec.js +++ /dev/null @@ -1,70 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; -const $ = { - newPayment: '.vn-dialog.shown', - anyBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr', - firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable' -}; - -describe('Ticket index payout path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('administrative', 'ticket'); - await page.waitForState('ticket.index'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should check the second ticket from a client and 1 of another', async() => { - await page.waitToClick(selectors.globalItems.searchButton); - await page.waitToClick(selectors.ticketsIndex.thirdTicketCheckbox); - await page.waitToClick(selectors.ticketsIndex.fifthTicketCheckbox); - await page.waitToClick(selectors.ticketsIndex.payoutButton); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('You cannot make a payment on account from multiple clients'); - }); - - it('should search for tickets of the same client then open the payout form', async() => { - await page.waitToClick(selectors.ticketsIndex.openAdvancedSearchButton); - await page.write(selectors.ticketsIndex.advancedSearchClient, '1101'); - await page.keyboard.press('Enter'); - await page.waitForNumberOfElements(selectors.ticketsIndex.anySearchResult, 10); - await page.waitToClick(selectors.ticketsIndex.firstTicketCheckbox); - await page.waitToClick(selectors.ticketsIndex.secondTicketCheckbox); - - await page.waitToClick(selectors.ticketsIndex.payoutButton); - - await page.waitForSelector(selectors.ticketsIndex.payoutCompany); - }); - - it('should fill the company and bank to perform a payout and check a new balance line was entered', async() => { - await page.fillForm($.newPayment, { - company: 'VNL', - bank: 'cash', - amountPaid: 100, - description: 'Payment', - viewReceipt: false - }); - await page.respondToDialog('accept'); - const message = await page.waitForSnackbar(); - - await page.waitToClick(selectors.globalItems.homeButton); - await page.selectModule('client'); - await page.accessToSearchResult('1101'); - await page.accessToSection('client.card.balance.index'); - await page.waitForSelector($.anyBalanceLine); - const count = await page.countElement($.anyBalanceLine); - const reference = await page.innerText($.firstLineReference); - - expect(message.isSuccess).toBeTrue(); - expect(count).toEqual(4); - expect(reference).toContain('Payment'); - }); -}); diff --git a/e2e/paths/05-ticket/19_dms.spec.js b/e2e/paths/05-ticket/19_dms.spec.js deleted file mode 100644 index be2ac4338..000000000 --- a/e2e/paths/05-ticket/19_dms.spec.js +++ /dev/null @@ -1,49 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket DMS path', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.dms.index'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should import a document', async() => { - await page.waitToClick(selectors.ticketDms.import); - await page.autocompleteSearch(selectors.ticketDms.document, '1'); - await page.waitToClick(selectors.ticketDms.saveImport); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('Data saved!'); - }); - - it(`should check there's a listed document now`, async() => { - const result = await page.countElement(selectors.ticketDms.anyDocument); - - expect(result).toEqual(1); - }); - - it('should attempt to import an existing document on this ticket', async() => { - await page.waitToClick(selectors.ticketDms.import); - await page.autocompleteSearch(selectors.ticketDms.document, '1'); - await page.waitToClick(selectors.ticketDms.saveImport); - const message = await page.waitForSnackbar(); - - expect(message.text).toContain('This document already exists on this ticket'); - }); - - it(`should check there's still one document`, async() => { - const result = await page.countElement(selectors.ticketDms.anyDocument); - - expect(result).toEqual(1); - }); -}); diff --git a/e2e/paths/05-ticket/20_moveExpedition.spec.js b/e2e/paths/05-ticket/20_moveExpedition.spec.js deleted file mode 100644 index ae23c9c99..000000000 --- a/e2e/paths/05-ticket/20_moveExpedition.spec.js +++ /dev/null @@ -1,50 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket expeditions', () => { - let browser; - let page; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('production', 'ticket'); - await page.accessToSearchResult('1'); - await page.accessToSection('ticket.card.expedition'); - }); - - afterAll(async() => { - await browser.close(); - }); - - it(`should move one expedition to new ticket withoute route`, async() => { - await page.waitToClick(selectors.ticketExpedition.thirdSaleCheckbox); - await page.waitToClick(selectors.ticketExpedition.moveExpeditionButton); - await page.waitToClick(selectors.ticketExpedition.moreMenuWithoutRoute); - await page.waitToClick(selectors.ticketExpedition.saveButton); - await page.waitForState('ticket.card.summary'); - await page.accessToSection('ticket.card.expedition'); - - await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {}); - const result = await page - .countElement(selectors.ticketExpedition.expeditionRow); - - expect(result).toEqual(2); - }); - - it(`should move one expedition to new ticket with route`, async() => { - await page.waitToClick(selectors.ticketExpedition.firstSaleCheckbox); - await page.waitToClick(selectors.ticketExpedition.moveExpeditionButton); - await page.waitToClick(selectors.ticketExpedition.moreMenuWithRoute); - await page.write(selectors.ticketExpedition.newRouteId, '1'); - await page.waitToClick(selectors.ticketExpedition.saveButton); - await page.waitForState('ticket.card.summary'); - await page.accessToSection('ticket.card.expedition'); - - await page.waitForSelector(selectors.ticketExpedition.expeditionRow, {}); - const result = await page - .countElement(selectors.ticketExpedition.expeditionRow); - - expect(result).toEqual(2); - }); -}); diff --git a/e2e/paths/05-ticket/21_future.spec.js b/e2e/paths/05-ticket/21_future.spec.js deleted file mode 100644 index 60bb9c38d..000000000 --- a/e2e/paths/05-ticket/21_future.spec.js +++ /dev/null @@ -1,99 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Future path', () => { - let browser; - let page; - let httpRequest; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSection('ticket.future'); - page.on('request', req => { - if (req.url().includes(`Tickets/getTicketsFuture`)) - httpRequest = req.url(); - }); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should search with required data, check three last tickets and move to the future', async() => { - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.warehouseFk); - await page.waitToClick(selectors.ticketFuture.submit); - let message = await page.waitForSnackbar(); - - expect(message.text).toContain('warehouseFk is a required argument'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.futureScopeDays); - await page.waitToClick(selectors.ticketFuture.submit); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('futureScopeDays is a required argument'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.originScopeDays); - await page.waitToClick(selectors.ticketFuture.submit); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('originScopeDays is a required argument'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketFuture.submit); - - expect(httpRequest).toBeDefined(); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - - await page.autocompleteSearch(selectors.ticketFuture.ipt, 'H'); - await page.waitToClick(selectors.ticketFuture.submit); - - expect(httpRequest).toContain('ipt=H'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - - await page.clearInput(selectors.ticketFuture.ipt); - - await page.autocompleteSearch(selectors.ticketFuture.futureIpt, 'H'); - await page.waitToClick(selectors.ticketFuture.submit); - - expect(httpRequest).toContain('futureIpt=H'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - - await page.clearInput(selectors.ticketFuture.futureIpt); - - await page.autocompleteSearch(selectors.ticketFuture.state, 'Free'); - await page.waitToClick(selectors.ticketFuture.submit); - - expect(httpRequest).toContain('state=0'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - - await page.clearInput(selectors.ticketFuture.state); - - await page.autocompleteSearch(selectors.ticketFuture.futureState, 'Free'); - await page.waitToClick(selectors.ticketFuture.submit); - - expect(httpRequest).toContain('futureState=0'); - - await page.waitToClick(selectors.ticketFuture.openAdvancedSearchButton); - await page.clearInput(selectors.ticketFuture.state); - await page.clearInput(selectors.ticketFuture.futureState); - await page.waitToClick(selectors.ticketFuture.submit); - - await page.waitForNumberOfElements(selectors.ticketFuture.searchResult, 5); - await page.waitToClick(selectors.ticketFuture.multiCheck); - await page.waitToClick(selectors.ticketFuture.firstCheck); - await page.waitToClick(selectors.ticketFuture.moveButton); - await page.waitToClick(selectors.globalItems.acceptButton); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('Tickets moved successfully!'); - }); -}); diff --git a/e2e/paths/05-ticket/22_advance.spec.js b/e2e/paths/05-ticket/22_advance.spec.js deleted file mode 100644 index 0e5b5e0c3..000000000 --- a/e2e/paths/05-ticket/22_advance.spec.js +++ /dev/null @@ -1,79 +0,0 @@ -import selectors from '../../helpers/selectors.js'; -import getBrowser from '../../helpers/puppeteer'; - -describe('Ticket Advance path', () => { - let browser; - let page; - let httpRequest; - - beforeAll(async() => { - browser = await getBrowser(); - page = browser.page; - await page.loginAndModule('employee', 'ticket'); - await page.accessToSection('ticket.advance'); - page.on('request', req => { - if (req.url().includes(`Tickets/getTicketsAdvance`)) - httpRequest = req.url(); - }); - }); - - afterAll(async() => { - await browser.close(); - }); - - it('should search with the required data, check the first ticket and move to the present', async() => { - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.warehouseFk); - - await page.waitToClick(selectors.ticketAdvance.submit); - let message = await page.waitForSnackbar(); - - expect(message.text).toContain('warehouseFk is a required argument'); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.dateToAdvance); - await page.waitToClick(selectors.ticketAdvance.submit); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('dateToAdvance is a required argument'); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.dateFuture); - await page.waitToClick(selectors.ticketAdvance.submit); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('dateFuture is a required argument'); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.waitToClick(selectors.ticketAdvance.submit); - - expect(httpRequest).toBeDefined(); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.ticketAdvance.futureIpt, 'H'); - await page.waitToClick(selectors.ticketAdvance.submit); - - expect(httpRequest).toContain('futureIpt=H'); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.futureIpt); - await page.waitToClick(selectors.ticketAdvance.submit); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.autocompleteSearch(selectors.ticketAdvance.ipt, 'H'); - await page.waitToClick(selectors.ticketAdvance.submit); - - expect(httpRequest).toContain('ipt=H'); - - await page.waitToClick(selectors.ticketAdvance.openAdvancedSearchButton); - await page.clearInput(selectors.ticketAdvance.ipt); - await page.waitToClick(selectors.ticketAdvance.submit); - - await page.waitToClick(selectors.ticketAdvance.firstCheck); - await page.waitToClick(selectors.ticketAdvance.moveButton); - await page.waitToClick(selectors.ticketAdvance.acceptButton); - message = await page.waitForSnackbar(); - - expect(message.text).toContain('Tickets moved successfully!'); - }); -}); diff --git a/loopback/locale/en.json b/loopback/locale/en.json index ea84cb6eb..627be5122 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,5 +240,7 @@ "There is already a tray with the same height": "There is already a tray with the same height", "The height must be greater than 50cm": "The height must be greater than 50cm", "The maximum height of the wagon is 200cm": "The maximum height of the wagon is 200cm", - "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line" -} + "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line", + "null": "null", + "Invalid or expired verification code": "Invalid or expired verification code" +} \ No newline at end of file From a35c10adabbb4ea937fe43d55d8ca617a0f8d312 Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 17 Oct 2024 08:35:24 +0200 Subject: [PATCH 006/266] fix: refs #7457 error on empty from param and add translate --- loopback/locale/en.json | 3 ++- loopback/locale/es.json | 3 ++- loopback/locale/fr.json | 5 +++-- loopback/locale/pt.json | 3 ++- modules/order/back/methods/order/filter.js | 9 +++------ 5 files changed, 12 insertions(+), 11 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index ea84cb6eb..0f6457754 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,5 +240,6 @@ "There is already a tray with the same height": "There is already a tray with the same height", "The height must be greater than 50cm": "The height must be greater than 50cm", "The maximum height of the wagon is 200cm": "The maximum height of the wagon is 200cm", - "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line" + "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line", + "The from field is required": "The 'from' field is required" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 9308fd4ec..8118b6f65 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -382,5 +382,6 @@ "This buyer has already made a reservation for this date": "Este comprador ya ha hecho una reserva para esta fecha", "No valid travel thermograph found": "No se encontró un termógrafo válido", "The quantity claimed cannot be greater than the quantity of the line": "La cantidad reclamada no puede ser mayor que la cantidad de la línea", - "type cannot be blank": "Se debe rellenar el tipo" + "type cannot be blank": "Se debe rellenar el tipo", + "The from field is required": "El campo 'desde' es obligatorio" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index a6648b186..5bc98c3dd 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -123,7 +123,7 @@ "Added sale to ticket": "J'ai ajouté la ligne suivante au ticket [{{ticketId}}]({{{ticketUrl}}}): {{{addition}}}", "Changed sale discount": "J'ai changé le rabais des lignes suivantes du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", "Created claim": "J'ai créé la réclamation [{{claimId}}]({{{claimUrl}}}) des lignes suivantes du ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", - "Changed sale price": " le prix de [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* du ticket [{{ticketId}}]({{{ticketUrl}}})",, + "Changed sale price": " le prix de [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* du ticket [{{ticketId}}]({{{ticketUrl}}})", "Changed sale quantity": "J'ai changé {{changes}} du ticket [{{ticketId}}]({{{ticketUrl}}})", "Changes in sales": "la quantité de {{itemId}} {{concept}} de {{oldQuantity}} ➔ {{newQuantity}}", "State": "État", @@ -362,5 +362,6 @@ "It has been invoiced but the PDF of refund not be generated": "Il a été facturé mais le PDF de remboursement n'a pas été généré", "Cannot send mail": "Impossible d'envoyer le mail", "Original invoice not found": "Facture originale introuvable", - "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne" + "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne", + "The from field is required": "Le champ de est requis" } diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index a43f0e780..91dc372c3 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -362,5 +362,6 @@ "It has been invoiced but the PDF of refund not be generated": "Foi faturado mas não foi gerado o PDF do reembolso", "Original invoice not found": "Fatura original não encontrada", "Cannot send mail": "Não é possível enviar o email", - "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha" + "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha", + "The from field is required": "O campo de origem é obrigatório" } diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index affa53a55..5b5fe8701 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -2,6 +2,7 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; +const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethod('filter', { @@ -84,6 +85,8 @@ module.exports = Self => { const args = ctx.args; + if (!args.from) + throw new UserError('The from field is required'); // Apply filter by team const teamMembersId = []; if (args.myTeam != null) { @@ -106,12 +109,6 @@ module.exports = Self => { if (args?.to) args.to.setHours(23, 59, 0, 0); - if (!args.from) { - const yesterday = new Date(); - yesterday.setDate(yesterday.getDate() - 1); - args.from = yesterday.toISOString().split('T')[0]; - } - const where = buildFilter(args, (param, value) => { switch (param) { case 'search': From 78ee7e141d4c118099a6ecf2770771346cd296c0 Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 17 Oct 2024 08:40:25 +0200 Subject: [PATCH 007/266] fix: refs #7457 remove translate and use param definition for restriction --- loopback/locale/en.json | 3 +-- loopback/locale/es.json | 3 +-- loopback/locale/fr.json | 3 +-- loopback/locale/pt.json | 3 +-- modules/order/back/methods/order/filter.js | 7 ++----- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 0f6457754..ea84cb6eb 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,6 +240,5 @@ "There is already a tray with the same height": "There is already a tray with the same height", "The height must be greater than 50cm": "The height must be greater than 50cm", "The maximum height of the wagon is 200cm": "The maximum height of the wagon is 200cm", - "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line", - "The from field is required": "The 'from' field is required" + "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 8118b6f65..9308fd4ec 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -382,6 +382,5 @@ "This buyer has already made a reservation for this date": "Este comprador ya ha hecho una reserva para esta fecha", "No valid travel thermograph found": "No se encontró un termógrafo válido", "The quantity claimed cannot be greater than the quantity of the line": "La cantidad reclamada no puede ser mayor que la cantidad de la línea", - "type cannot be blank": "Se debe rellenar el tipo", - "The from field is required": "El campo 'desde' es obligatorio" + "type cannot be blank": "Se debe rellenar el tipo" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 5bc98c3dd..3f6cc69e7 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -362,6 +362,5 @@ "It has been invoiced but the PDF of refund not be generated": "Il a été facturé mais le PDF de remboursement n'a pas été généré", "Cannot send mail": "Impossible d'envoyer le mail", "Original invoice not found": "Facture originale introuvable", - "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne", - "The from field is required": "Le champ de est requis" + "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne" } diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index 91dc372c3..a43f0e780 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -362,6 +362,5 @@ "It has been invoiced but the PDF of refund not be generated": "Foi faturado mas não foi gerado o PDF do reembolso", "Original invoice not found": "Fatura original não encontrada", "Cannot send mail": "Não é possível enviar o email", - "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha", - "The from field is required": "O campo de origem é obrigatório" + "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha" } diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 5b5fe8701..844adb51e 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -2,7 +2,6 @@ const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; -const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { Self.remoteMethod('filter', { @@ -23,7 +22,8 @@ module.exports = Self => { }, { arg: 'from', type: 'date', - description: 'The from date' + description: 'The from date', + required: true }, { arg: 'to', type: 'date', @@ -84,9 +84,6 @@ module.exports = Self => { Object.assign(myOptions, options); const args = ctx.args; - - if (!args.from) - throw new UserError('The from field is required'); // Apply filter by team const teamMembersId = []; if (args.myTeam != null) { From 989b68c33a85259243ecfd587cbff7dafcd5eff6 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 17 Oct 2024 12:44:05 +0200 Subject: [PATCH 008/266] fix: refs #6861 setQuantity --- .../procedures/itemShelvingSale_setQuantity.sql | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql index cde1b6872..f141762b5 100644 --- a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql +++ b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql @@ -3,7 +3,8 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingSale_setQ vItemShelvingSaleFk INT(10), vQuantity DECIMAL(10,0), vIsItemShelvingSaleEmpty BOOLEAN, - vSectorFk INT + vSectorFk INT, + vShelvingFk VARCHAR(10) ) BEGIN /** @@ -24,6 +25,7 @@ BEGIN DECLARE vItemFk INT; DECLARE vTotalQuantity INT; DECLARE vStateCode VARCHAR(45); + DECLARE vCurrentShelvingFk VARCHAR(10); DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN @@ -45,18 +47,25 @@ BEGIN iss.saleFk, iss.itemShelvingFk, SUM(IFNULL(iss.quantity,0)), - IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED') + IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED'), + ish.shelvingFk INTO vItemFk, vSaleFk, vItemShelvingFk, vReservedQuantity, - vStateCode + vStateCode, + vCurrentShelvingFk FROM itemShelvingSale iss JOIN sale s ON s.id = iss.saleFk + JOIN itemShelving ish ON ish.id = iss.itemShelvingFk LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk WHERE iss.id = vItemShelvingSaleFk AND NOT iss.isPicked; + IF NOT (vCurrentShelvingFk <=> vShelvingFk) THEN + CALL util.throw('The shelving can not be different from the shelving reserved'); + END IF; + IF vQuantity > vReservedQuantity OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty) OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN From 7e0f19b368c796def55b3ebcb070535ff79c2f78 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 18 Oct 2024 08:21:09 +0200 Subject: [PATCH 009/266] feat: refs #8127 entry_getCommission --- .../vn/functions/entry_getCommission.sql | 78 +++++++++---------- .../vn/procedures/entry_updateComission.sql | 4 +- 2 files changed, 39 insertions(+), 43 deletions(-) diff --git a/db/routines/vn/functions/entry_getCommission.sql b/db/routines/vn/functions/entry_getCommission.sql index 4a19f4e63..898ac8521 100644 --- a/db/routines/vn/functions/entry_getCommission.sql +++ b/db/routines/vn/functions/entry_getCommission.sql @@ -1,58 +1,54 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`entry_getCommission`(vTravelFk INT, - vCurrencyFk INT, - vSupplierFk INT + vCurrencyFk INT, + vSupplierFk INT ) RETURNS int(11) NOT DETERMINISTIC READS SQL DATA BEGIN - DECLARE vCommission INT; - DECLARE vCurrentCommission INT; - DECLARE vIsCurrencyUsd INT; - DECLARE vLastEntryFk INT; - - SELECT count(*) INTO vIsCurrencyUsd - FROM currency c - WHERE c.code = 'USD' AND id = vCurrencyFk; - - IF NOT vIsCurrencyUsd THEN - - SELECT e.id INTO vLastEntryFk - FROM vn.entry e - JOIN vn.travel tr ON tr.id = e.travelFk - WHERE e.supplierFk = vSupplierFk - ORDER BY tr.landed DESC - LIMIT 1; - - IF vLastEntryFk THEN - - SELECT commission INTO vCurrentCommission - FROM vn.entry - WHERE id = vLastEntryFk; - - ELSE - - SELECT commission INTO vCurrentCommission - FROM supplier s - WHERE s.id = vSupplierFk; - - END IF; - - RETURN vCurrentCommission; - - ELSE + DECLARE vCommission INT; + DECLARE vCurrentCommission INT; + DECLARE vIsNotEUR INT; + DECLARE vLastEntryFk INT; + SELECT count(*) INTO vIsNotEUR + FROM currency c + WHERE c.code <> 'EUR' AND id = vCurrencyFk; + + IF vIsNotEUR THEN SELECT ROUND(-100 * (1 - (1 / r.value))) INTO vCommission FROM travel t LEFT JOIN referenceCurrent r ON r.currencyFk = vCurrencyFk AND r.`dated` <= t.shipped WHERE t.id = vTravelFk ORDER BY r.`dated` DESC LIMIT 1; - + RETURN IFNULL(vCommission, 0); - - END IF; - + + ELSE + SELECT e.id INTO vLastEntryFk + FROM vn.entry e + JOIN vn.travel tr ON tr.id = e.travelFk + WHERE e.supplierFk = vSupplierFk + ORDER BY tr.landed DESC + LIMIT 1; + + IF vLastEntryFk THEN + SELECT commission INTO vCurrentCommission + FROM vn.entry + WHERE id = vLastEntryFk; + + ELSE + SELECT commission INTO vCurrentCommission + FROM supplier s + WHERE s.id = vSupplierFk; + + END IF; + + RETURN vCurrentCommission; + + END IF; + END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/entry_updateComission.sql b/db/routines/vn/procedures/entry_updateComission.sql index e2de2a4a5..8db28f97d 100644 --- a/db/routines/vn/procedures/entry_updateComission.sql +++ b/db/routines/vn/procedures/entry_updateComission.sql @@ -22,7 +22,7 @@ BEGIN FROM vn.entry e JOIN vn.travel t ON t.id = e.travelFk JOIN vn.warehouse w ON w.id = t.warehouseInFk - WHERE t.shipped >= util.VN_CURDATE() + WHERE t.landed >= util.VN_CURDATE() AND e.currencyFk = vCurrency AND NOT e.isBooked; @@ -33,7 +33,7 @@ BEGIN SET e.commission = vComission; SELECT `name` INTO vCurrencyName - FROM currency + FROM currency WHERE id = vCurrency; CALL entry_recalc(); From 903d85a2439d10eb2d6b1a51a16feb382770ed49 Mon Sep 17 00:00:00 2001 From: carlossa Date: Fri, 18 Oct 2024 14:06:39 +0200 Subject: [PATCH 010/266] fix: refs #7529 fix back --- .../00-firstScript.sql | 20 +++++++++---------- .../11312-navyAralia/00-firstScript.sql | 15 ++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 db/versions/11312-navyAralia/00-firstScript.sql diff --git a/db/versions/11245-turquoiseAnthurium/00-firstScript.sql b/db/versions/11245-turquoiseAnthurium/00-firstScript.sql index 6381f5db4..f1c4d9471 100644 --- a/db/versions/11245-turquoiseAnthurium/00-firstScript.sql +++ b/db/versions/11245-turquoiseAnthurium/00-firstScript.sql @@ -1,15 +1,15 @@ -ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; -ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; +-- ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; +-- ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; -RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; +-- RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; -ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; -ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; +-- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; +-- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; -INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) - VALUES - ('Worker','workerRelative','*','ALLOW','ROLE','hr'), - ('Worker','workerIrpf','*','ALLOW','ROLE','hr'), - ('Worker','disabilityGrade','*','ALLOW','ROLE','hr'); +-- INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) +-- VALUES +-- ('workerRelative','*','*','ALLOW','ROLE','hr'), +-- ('workerIrpf','*','*','ALLOW','ROLE','hr'), +-- ('disabilityGrade','*','*','ALLOW','ROLE','hr'); diff --git a/db/versions/11312-navyAralia/00-firstScript.sql b/db/versions/11312-navyAralia/00-firstScript.sql new file mode 100644 index 000000000..0d58503bb --- /dev/null +++ b/db/versions/11312-navyAralia/00-firstScript.sql @@ -0,0 +1,15 @@ +ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; +ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; + +-- RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; + +-- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; +-- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; + + +INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) + VALUES + ('workerRelatives','*','*','ALLOW','ROLE','hr'), + ('workerIrpf','*','*','ALLOW','ROLE','hr'), + ('disabilityGrade','*','*','ALLOW','ROLE','hr'); + From bca22e8ad3ce93392f5701cb347bdf9a772fed90 Mon Sep 17 00:00:00 2001 From: carlossa Date: Sun, 20 Oct 2024 15:17:17 +0200 Subject: [PATCH 011/266] fix: refs #6389 saleMonitor filter --- modules/monitor/back/methods/sales-monitor/salesFilter.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 927f49999..0fa2e60e5 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -194,6 +194,7 @@ module.exports = Self => { u.name userName, c.salesPersonFk, c.credit, + pm.name payMethod, z.hour zoneLanding, z.name zoneName, z.id zoneFk, @@ -211,6 +212,7 @@ module.exports = Self => { LEFT JOIN ticketState ts ON ts.ticketFk = t.id LEFT JOIN state st ON st.id = ts.stateFk LEFT JOIN client c ON c.id = t.clientFk + LEFT JOIN payMethod pm ON pm.id = c.payMethodFk LEFT JOIN worker wk ON wk.id = c.salesPersonFk LEFT JOIN account.user u ON u.id = wk.id LEFT JOIN ( From dfdd8f28d41783e399123c60c6a1e9cbf8d268bd Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 23 Oct 2024 12:23:31 +0200 Subject: [PATCH 012/266] fix: refs #6389 filter --- modules/monitor/back/methods/sales-monitor/salesFilter.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 0fa2e60e5..9bfb69b65 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -199,6 +199,8 @@ module.exports = Self => { z.name zoneName, z.id zoneFk, st.classColor, + d.id departmentFk, + d.name department, TIME_FORMAT(t.shipped, '%H:%i') preparationHour, TIME_FORMAT(z.hour, '%H:%i') theoreticalhour, TIME_FORMAT(zed.etc, '%H:%i') practicalHour @@ -214,6 +216,8 @@ module.exports = Self => { LEFT JOIN client c ON c.id = t.clientFk LEFT JOIN payMethod pm ON pm.id = c.payMethodFk LEFT JOIN worker wk ON wk.id = c.salesPersonFk + LEFT JOIN workerDepartment wd ON wd.workerFk = wk.id + LEFT JOIN department d ON d.id = wd.departmentFk LEFT JOIN account.user u ON u.id = wk.id LEFT JOIN ( SELECT zoneFk, From 99bec3e7fe8d5179d5f8ba8ca8d61c2b0f9435cb Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 23 Oct 2024 14:58:20 +0200 Subject: [PATCH 013/266] fix: refs #6389 salesFilter --- modules/monitor/back/methods/sales-monitor/salesFilter.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 9bfb69b65..5a0ea8d9d 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -169,7 +169,7 @@ module.exports = Self => { stmt = new ParameterizedSQL(` CREATE OR REPLACE TEMPORARY TABLE tmp.filter (PRIMARY KEY (id)) - ENGINE = MEMORY + ENGINE = InnoDB SELECT t.id, t.shipped, CAST(DATE(t.shipped) AS CHAR) shippedDate, @@ -201,6 +201,11 @@ module.exports = Self => { st.classColor, d.id departmentFk, d.name department, + (SELECT GROUP_CONCAT(DISTINCT i.itemPackingTypeFk ORDER BY i.itemPackingTypeFk SEPARATOR ',') + FROM sale s + JOIN item i ON i.id = s.itemFk + WHERE s.ticketFk = t.id + ) AS packing, TIME_FORMAT(t.shipped, '%H:%i') preparationHour, TIME_FORMAT(z.hour, '%H:%i') theoreticalhour, TIME_FORMAT(zed.etc, '%H:%i') practicalHour From fa9451ea38d72a2b2dc6d6386476e65761796d79 Mon Sep 17 00:00:00 2001 From: jgallego Date: Fri, 25 Oct 2024 16:15:13 +0200 Subject: [PATCH 014/266] feat: refs #7821 isBooked with grants --- db/dump/fixtures.before.sql | 27 +++++++------ .../vn/procedures/entry_isEditable.sql | 16 ++++---- .../11322-azureAspidistra/00-entryAcl.sql | 40 +++++++++++++++++++ loopback/locale/en.json | 10 +++-- loopback/locale/es.json | 8 +++- loopback/locale/fr.json | 3 +- loopback/locale/pt.json | 3 +- modules/entry/back/models/entry.js | 19 ++++++--- .../back/methods/supplier/getWithPackaging.js | 2 +- .../supplier/specs/getWithPackaging.spec.js | 16 +------- 10 files changed, 96 insertions(+), 48 deletions(-) create mode 100644 db/versions/11322-azureAspidistra/00-entryAcl.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 4fbe16f33..40c8543fa 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1518,19 +1518,20 @@ INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseO (11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4), (12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4); -INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`) - VALUES - (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, ''), - (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two'), - (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three'), - (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four'), - (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five'), - (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six'), - (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven'), - (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, ''), - (9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, 1, ''), - (10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 10', 1, 1, ''), - (99, 69, '2000-12-01 00:00:00.000', 11, 0, 442, 'IN2009', 'Movement 99', 0, 0, ''); +INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `isRaid`, `evaNotes`, `typeFk`) + VALUES + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, 0, '', 'packaging'), + (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 0, 'observation two', 'product'), + (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 0, 'observation three', 'product'), + (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 0, 'observation four', 'product'), + (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 0, 'observation five', 'product'), + (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 0, 'observation six', 'product'), + (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 0, 'observation seven', 'product'), + (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1, 1, '', 'product'), + (9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, 1, '', 'product'), + (10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 10', 1, 1, '', 'product'), + (99, 69, '2000-12-01 00:00:00.000', 11, 0, 442, 'IN2009', 'Movement 99', 0, 0, '', 'product'); + INSERT INTO `vn`.`entryConfig` (`defaultEntry`, `inventorySupplierFk`, `defaultSupplierFk`) VALUES (2, 4, 1); diff --git a/db/routines/vn/procedures/entry_isEditable.sql b/db/routines/vn/procedures/entry_isEditable.sql index 12b6d0ef6..22cb25ba5 100644 --- a/db/routines/vn/procedures/entry_isEditable.sql +++ b/db/routines/vn/procedures/entry_isEditable.sql @@ -9,16 +9,16 @@ BEGIN * * @param vSelf Id de entrada */ - DECLARE vIsEditable BOOL; + DECLARE vIsNotEditable BOOL; - SELECT e.isBooked INTO vIsEditable + SELECT (e.typeFk IS NULL OR NOT et.isInformal) INTO vIsNotEditable FROM `entry` e - JOIN entryType et ON et.code = e.typeFk - WHERE NOT et.isInformal - AND e.id = vSelf; + LEFT JOIN entryType et ON et.code = e.typeFk + WHERE e.id = vSelf + AND e.isBooked; - IF vIsEditable AND NOT IFNULL(@isModeInventory, FALSE) THEN - CALL util.throw(CONCAT('Entry ', vSelf, ' is not editable')); - END IF; + IF vIsNotEditable AND NOT IFNULL(@isModeInventory, FALSE) THEN + CALL util.throw(CONCAT('Entry ', vSelf, ' is not editable')); + END IF; END$$ DELIMITER ; diff --git a/db/versions/11322-azureAspidistra/00-entryAcl.sql b/db/versions/11322-azureAspidistra/00-entryAcl.sql new file mode 100644 index 000000000..836737d4b --- /dev/null +++ b/db/versions/11322-azureAspidistra/00-entryAcl.sql @@ -0,0 +1,40 @@ +-- Eliminar registros existentes donde property = '*' +DELETE FROM `salix`.ACL WHERE model = 'entry' AND property = '*'; + +-- Insertar permisos para los métodos solicitados en el modelo Entry +INSERT INTO `salix`.ACL (model, property, accessType, permission, principalType, principalId) +VALUES + -- Permisos para administrative + ('Entry', 'upsert', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'updateAttributes', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'isBooked', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'findById', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'find', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'filter', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'count', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'getEntry', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'getBuys', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'findOne', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'deleteBuys', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'editLatestBuys', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'importBuys', 'WRITE', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'importBuysPreview', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'lastItemBuys', 'READ', 'ALLOW', 'ROLE', 'administrative'), + ('Entry', 'latestBuysFilter', 'READ', 'ALLOW', 'ROLE', 'administrative'), + + -- Permisos para buyer (excluyendo isBooked) + ('Entry', 'upsert', 'WRITE', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'updateAttributes', 'WRITE', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'findById', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'find', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'filter', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'count', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'getEntry', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'getBuys', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'findOne', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'deleteBuys', 'WRITE', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'editLatestBuys', 'WRITE', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'importBuys', 'WRITE', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'importBuysPreview', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'lastItemBuys', 'READ', 'ALLOW', 'ROLE', 'buyer'), + ('Entry', 'latestBuysFilter', 'READ', 'ALLOW', 'ROLE', 'buyer'); diff --git a/loopback/locale/en.json b/loopback/locale/en.json index a7e21960b..c0b5c4386 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,6 +240,10 @@ "There is already a tray with the same height": "There is already a tray with the same height", "The height must be greater than 50cm": "The height must be greater than 50cm", "The maximum height of the wagon is 200cm": "The maximum height of the wagon is 200cm", - "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line", - "There are tickets for this area, delete them first": "There are tickets for this area, delete them first" -} + "The quantity claimed cannot be greater than the quantity of the line": "The quantity claimed cannot be greater than the quantity of the line", + "There are tickets for this area, delete them first": "There are tickets for this area, delete them first", + "Payment method is required": "Payment method is required", + "You do not have permission to modify the booked field": "You do not have permission to modify the booked field", + "null": "null", + "Invalid or expired verification code": "Invalid or expired verification code" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 9f01bd290..ec7959450 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -385,5 +385,11 @@ "The quantity claimed cannot be greater than the quantity of the line": "La cantidad reclamada no puede ser mayor que la cantidad de la línea", "type cannot be blank": "Se debe rellenar el tipo", "There are tickets for this area, delete them first": "Hay tickets para esta sección, borralos primero", - "There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén" + "There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén", + "You do not have permission to modify the booked field": "No tienes permisos para modificar el campo contabilizada", + "Entry 99 is not editable": "Entry 99 is not editable", + "Entry 9 is not editable": "Entry 9 is not editable", + "Entry must have lines to be marked booked": "Entry must have lines to be marked booked", + "Entry 10 is not editable": "Entry 10 is not editable", + "Entry 7 is not editable": "Entry 7 is not editable" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 23bd5cc04..1fc25a112 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -363,5 +363,6 @@ "It has been invoiced but the PDF of refund not be generated": "Il a été facturé mais le PDF de remboursement n'a pas été généré", "Cannot send mail": "Impossible d'envoyer le mail", "Original invoice not found": "Facture originale introuvable", - "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne" + "The quantity claimed cannot be greater than the quantity of the line": "Le montant réclamé ne peut pas être supérieur au montant de la ligne", + "You do not have permission to modify the booked field": "Vous n'avez pas la permission de modifier le champ comptabilisé" } diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index f85afd607..d9f00095d 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -363,5 +363,6 @@ "It has been invoiced but the PDF of refund not be generated": "Foi faturado mas não foi gerado o PDF do reembolso", "Original invoice not found": "Fatura original não encontrada", "Cannot send mail": "Não é possível enviar o email", - "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha" + "The quantity claimed cannot be greater than the quantity of the line": "O valor reclamado não pode ser superior ao valor da linha", + "You do not have permission to modify the booked field": "Você não tem permissão para modificar o campo contabilizado" } diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index 8ca79f531..593f3fdcc 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -1,3 +1,4 @@ +const UserError = require('vn-loopback/util/user-error'); const LoopBackContext = require('loopback-context'); module.exports = Self => { require('../methods/entry/filter')(Self); @@ -18,11 +19,20 @@ module.exports = Self => { const changes = ctx.data || ctx.instance; const orgData = ctx.currentInstance; + const loopBackContext = LoopBackContext.getCurrentContext(); + const accessToken = {req: loopBackContext.active}; + const hasChanges = orgData && changes; + + const isBookedChanged = changes.isBooked !== undefined && orgData.isBooked !== changes.isBooked; + + if (isBookedChanged) { + const canEditIsBooked = await Self.app.models.ACL.checkAccessAcl(accessToken, 'Entry', 'isBooked', 'READ'); + if (!canEditIsBooked) + throw new UserError('You do not have permission to modify the booked field'); + } const observation = changes.observation || orgData.observation; - const hasChanges = orgData && changes; - const observationChanged = hasChanges - && orgData.observation != observation; + const observationChanged = hasChanges && orgData.observation != observation; if (observationChanged) { let tx; @@ -37,8 +47,7 @@ module.exports = Self => { } try { - const loopbackContext = LoopBackContext.getCurrentContext(); - const userId = loopbackContext.active.accessToken.userId; + const userId = loopBackContext.active.accessToken.userId; const id = changes.id || orgData.id; const entry = await Self.app.models.Entry.findById(id, null, myOptions); await entry.updateAttribute('observationEditorFk', userId, myOptions); diff --git a/modules/supplier/back/methods/supplier/getWithPackaging.js b/modules/supplier/back/methods/supplier/getWithPackaging.js index 07e563412..41b080964 100644 --- a/modules/supplier/back/methods/supplier/getWithPackaging.js +++ b/modules/supplier/back/methods/supplier/getWithPackaging.js @@ -15,7 +15,7 @@ module.exports = Self => { Self.getWithPackaging = async options => { const models = Self.app.models; const myOptions = {}; - const oneYearAgo = new Date(); + const oneYearAgo = Date.vnNew(); oneYearAgo.setFullYear(oneYearAgo.getFullYear() - 1); if (typeof options == 'object') diff --git a/modules/supplier/back/methods/supplier/specs/getWithPackaging.spec.js b/modules/supplier/back/methods/supplier/specs/getWithPackaging.spec.js index bd30d7437..b6a780a10 100644 --- a/modules/supplier/back/methods/supplier/specs/getWithPackaging.spec.js +++ b/modules/supplier/back/methods/supplier/specs/getWithPackaging.spec.js @@ -1,26 +1,12 @@ const {models} = require('vn-loopback/server/server'); describe('Supplier getWithPackaging()', () => { + beforeAll.mockLoopBackContext(); it('should return a list of suppliers with an entry of type packaging', async() => { - const typeFk = 'packaging'; - const tx = await models.Supplier.beginTransaction({}); const myOptions = {transaction: tx}; try { - const entry = await models.Entry.findOne( - { - where: { - id: 1 - }, - myOptions - }); - - await entry.updateAttributes({ - typeFk: typeFk, - created: new Date() - }); - const result = await models.Supplier.getWithPackaging(myOptions); expect(result.length).toEqual(1); From 55483f8e6ba8ef2293ecd59ab3ae370a0243c5ba Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 28 Oct 2024 09:01:10 +0100 Subject: [PATCH 015/266] fix: refs #6389 packing --- modules/monitor/back/methods/sales-monitor/salesFilter.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/monitor/back/methods/sales-monitor/salesFilter.js b/modules/monitor/back/methods/sales-monitor/salesFilter.js index 5a0ea8d9d..30df9c0cc 100644 --- a/modules/monitor/back/methods/sales-monitor/salesFilter.js +++ b/modules/monitor/back/methods/sales-monitor/salesFilter.js @@ -88,6 +88,11 @@ module.exports = Self => { arg: 'alertLevel', type: 'number', description: `The alert level of the tickets` + }, + { + arg: 'packing', + type: 'string', + description: `The packing of the items` } ], returns: { @@ -155,6 +160,9 @@ module.exports = Self => { case 'clientFk': param = `t.${param}`; return {[param]: value}; + case 'packing': + param = `i.${param}`; + return {[param]: value}; } }); From 6031b1fe3f42f7193bd223313e4c0dbc96feb428 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 28 Oct 2024 12:17:56 +0100 Subject: [PATCH 016/266] feat: refs #8169 create table itemTextureTag --- .../00-firstScript.sql | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 db/versions/11324-salmonCataractarum/00-firstScript.sql diff --git a/db/versions/11324-salmonCataractarum/00-firstScript.sql b/db/versions/11324-salmonCataractarum/00-firstScript.sql new file mode 100644 index 000000000..3a528382a --- /dev/null +++ b/db/versions/11324-salmonCataractarum/00-firstScript.sql @@ -0,0 +1,71 @@ +CREATE TABLE IF NOT EXISTS `vn`.`itemTextureTag` ( + `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, + `name` varchar(50) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `name_UNIQUE` (`name`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT + CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci; + +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y encerado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y esponjoso'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y foam'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y látex'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Arenosa'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Aterciopelado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Engomado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Flocado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Foam'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Gasa'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Goma'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Látex'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Latón'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Mate'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Metálico'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Natural y engomado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado y engomado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plastificado y rugoso'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Pluma'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plástico'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Plástico engomado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Poliéster'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Poliéster texturizado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Rugoso'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Rígido'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Seminatural'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Silicona'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Suave'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela con brillo'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela con texturas'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela dura'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela engomada'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela escarchada'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela flocada'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela flocada engomada'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela foam'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela micro peach'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela plastificada'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela plástico engomado'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela poliéster'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela PVC'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela ratan'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rigida'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rugosa'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela rústica'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela sintética'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y cristal'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y foam'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y goma'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y látex'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y madera'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y plástico'); +INSERT IGNORE INTO `vn`.`itemTextureTag` (`name`) VALUES ('Tela y seco'); + +UPDATE vn.tag + SET isFree=0, + sourceTable='itemTextureTag' + WHERE name= 'Textura'; + +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemFarmingTag TO logisticAssist; \ No newline at end of file From 6b10f60933f4c9bda512053aa32d1c3ce9f4fb15 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 29 Oct 2024 08:03:18 +0100 Subject: [PATCH 017/266] fix: refs #7529 mod model --- modules/worker/back/models/worker-relatives.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/worker/back/models/worker-relatives.json b/modules/worker/back/models/worker-relatives.json index 0815f7330..532a9446c 100644 --- a/modules/worker/back/models/worker-relatives.json +++ b/modules/worker/back/models/worker-relatives.json @@ -4,7 +4,7 @@ "base": "VnModel", "options": { "mysql": { - "table": "workerRelative" + "table": "workerRelatives" } }, "properties": { From cd3dd854ef33df2cac970e1e9beea2517402520c Mon Sep 17 00:00:00 2001 From: jgallego Date: Tue, 29 Oct 2024 09:26:20 +0100 Subject: [PATCH 018/266] feat: refs #7821 eslint newDate --- .eslintrc.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.eslintrc.yml b/.eslintrc.yml index edbc47195..0d74348f2 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -36,3 +36,7 @@ rules: jasmine/no-focused-tests: 0 jasmine/prefer-toHaveBeenCalledWith: 0 arrow-spacing: ["error", { "before": true, "after": true }] + no-restricted-syntax: + - "error" + - selector: "NewExpression[callee.name='Date']" + message: "Use Date.vnNew() instead of new Date()." From e0e487859fcbbe8adbc1f38f9d1bb39ed62cf6d3 Mon Sep 17 00:00:00 2001 From: carlossa Date: Tue, 29 Oct 2024 13:59:47 +0100 Subject: [PATCH 019/266] fix: refs #7529 fix models --- db/dump/fixtures.before.sql | 6 ++++++ modules/worker/back/models/worker-irpf.json | 7 +------ 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 595027b09..dd4bc7881 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4007,4 +4007,10 @@ INSERT IGNORE INTO pbx.queueMember UPDATE vn.department SET pbxQueue = '1000' WHERE name = "CAMARA"; UPDATE vn.department SET pbxQueue = '2000' WHERE name = "VENTAS"; +INSERT INTO vn.workerRelatives (workerFk, isDescendant, disabilityGradeFk, birthed, adoptionYear, isDependend, isJointCustody, updated) + VALUES + (1106, 1, NULL, 0, NULL, 0, 0, '2024-10-29 08:42:44.000'); +INSERT INTO vn.workerIrpf (workerFk,spouseNif,geographicMobilityDate) + VALUES + (1106,'26493101E','2019-09-20'); diff --git a/modules/worker/back/models/worker-irpf.json b/modules/worker/back/models/worker-irpf.json index 44bd9713c..65f72a1fd 100644 --- a/modules/worker/back/models/worker-irpf.json +++ b/modules/worker/back/models/worker-irpf.json @@ -10,7 +10,7 @@ "properties": { "workerFk": { "type": "number", - "id": true, + "id": 1, "description": "Identifier" }, "spouseNif": { @@ -50,11 +50,6 @@ "type": "belongsTo", "model": "disabilityGrade", "foreignKey": "disabilityGradeFk" - }, - "worker": { - "type": "belongsTo", - "model": "VnUser", - "foreignKey": "workerFK" } } } From 4c0dec19d415f384d2701ff8b90f7179dbd4ee21 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 4 Nov 2024 07:48:28 +0100 Subject: [PATCH 020/266] feat: refs #7266 buyFkForPrint --- db/routines/vn/procedures/itemShelving_get.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql index 606bb8bd9..58163a89f 100644 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -17,7 +17,8 @@ BEGIN s.priority, ish.isChecked, ic.url, - ish.available + ish.available, + ish.buyFk FROM itemShelving ish JOIN item i ON i.id = ish.itemFk JOIN shelving s ON vSelf = s.code COLLATE utf8_unicode_ci From 37548e5e646cc40faee6c31a73c22274f20f78b4 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 4 Nov 2024 08:59:10 +0100 Subject: [PATCH 021/266] feat: refs #7266 buyFkForPrint --- db/routines/vn/procedures/itemShelving_get.sql | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql index 58163a89f..07384b721 100644 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -7,9 +7,10 @@ BEGIN * @param vSelf matrícula del carro **/ SELECT ish.itemFk item, - IFNULL(i.longName, CONCAT(i.name, ' ', i.size)) description, + i.name, + i.longName, + i.size, ish.visible, - CEIL(ish.visible/ish.packing) stickers, ish.packing, ish.grouping, p.code, From c113d837972177d1fb2ce320847deb536d6ae7e3 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 5 Nov 2024 16:42:51 +0100 Subject: [PATCH 022/266] feat: refs #6845 userInterface --- .../vn/procedures/collection_getTickets.sql | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/procedures/collection_getTickets.sql b/db/routines/vn/procedures/collection_getTickets.sql index fed7a3eb6..a468d7582 100644 --- a/db/routines/vn/procedures/collection_getTickets.sql +++ b/db/routines/vn/procedures/collection_getTickets.sql @@ -30,7 +30,9 @@ BEGIN t.warehouseFk, w.id salesPersonFk, IFNULL(ob.description,'') observaciones, - cc.rgb + cc.rgb, + p.code parkingCode, + IF (ps.ticketFk, TRUE, FALSE) isAdvanced FROM vn.ticket t LEFT JOIN vn.ticketCollection tc ON t.id = tc.ticketFk LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk @@ -42,7 +44,10 @@ BEGIN LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN vn.worker w ON w.id = c.salesPersonFk - LEFT JOIN observation ob ON ob.ticketFk = t.id + LEFT JOIN observation ob ON ob.ticketFk = t.id + LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id + LEFT JOIN vn.parking p ON tp.parkingFk = p.id + LEFT JOIN vn.packingSiteAdvanced ps ON ps.ticketFk = t.id WHERE t.id = vParamFk AND t.shipped >= vYesterday UNION @@ -52,7 +57,9 @@ BEGIN t.warehouseFk, w.id salesPersonFk, ob.description, - IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb` + IF(NOT (vItemPackingTypeFk <=> 'V'), cc.rgb, NULL) `rgb`, + p.code parkingCode, + IF (ps.ticketFk, TRUE, FALSE) isAdvanced FROM vn.ticket t JOIN vn.ticketCollection tc ON t.id = tc.ticketFk LEFT JOIN vn.collection c2 ON c2.id = tc.collectionFk @@ -64,7 +71,10 @@ BEGIN LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN vn.client c ON c.id = t.clientFk LEFT JOIN vn.worker w ON w.id = c.salesPersonFk - LEFT JOIN observation ob ON ob.ticketFk = t.id + LEFT JOIN observation ob ON ob.ticketFk = t.id + LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id + LEFT JOIN vn.parking p ON tp.parkingFk = p.id + LEFT JOIN vn.packingSiteAdvanced ps ON ps.ticketFk = t.id WHERE tc.collectionFk = vParamFk UNION SELECT sg.ticketFk, @@ -73,7 +83,9 @@ BEGIN t.warehouseFk, c.salesPersonFk, ob.description, - NULL `rgb` + NULL `rgb`, + p.code parkingCode, + IF (ps.ticketFk, TRUE, FALSE) isAdvanced FROM vn.sectorCollection sc JOIN vn.sectorCollectionSaleGroup ss ON ss.sectorCollectionFk = sc.id JOIN vn.saleGroup sg ON sg.id = ss.saleGroupFk @@ -81,7 +93,10 @@ BEGIN LEFT JOIN vn.zone z ON z.id = t.zoneFk LEFT JOIN vn.agencyMode am ON am.id = z.agencyModeFk LEFT JOIN observation ob ON ob.ticketFk = t.id - LEFT JOIN vn.client c ON c.id = t.clientFk + LEFT JOIN vn.client c ON c.id = t.clientFk + LEFT JOIN vn.ticketParking tp ON tp.ticketFk = t.id + LEFT JOIN vn.parking p ON tp.parkingFk = p.id + LEFT JOIN vn.packingSiteAdvanced ps ON ps.ticketFk = t.id WHERE sc.id = vParamFk AND t.shipped >= vYesterday GROUP BY ticketFk; From d95e455ccf9ca542fd4e9b832e942bb0be1be966 Mon Sep 17 00:00:00 2001 From: jgallego Date: Thu, 7 Nov 2024 14:48:31 +0100 Subject: [PATCH 023/266] fix: refs #7935 sin modificar autonomy --- db/versions/11274-redGerbera/00-firstScript4.sql | 1 - 1 file changed, 1 deletion(-) delete mode 100644 db/versions/11274-redGerbera/00-firstScript4.sql diff --git a/db/versions/11274-redGerbera/00-firstScript4.sql b/db/versions/11274-redGerbera/00-firstScript4.sql deleted file mode 100644 index c1f574379..000000000 --- a/db/versions/11274-redGerbera/00-firstScript4.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE vn.autonomy MODIFY COLUMN isUeeMember tinyint(1) DEFAULT FALSE NOT NULL; \ No newline at end of file From fd36f7ecc3262b0c95381afc1ab5e6ff35d96d8c Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 8 Nov 2024 10:44:01 +0100 Subject: [PATCH 024/266] feat: refs #8150 movExpeditions --- modules/ticket/back/methods/expedition/moveExpeditions.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/expedition/moveExpeditions.js b/modules/ticket/back/methods/expedition/moveExpeditions.js index cef35ab86..1c6689912 100644 --- a/modules/ticket/back/methods/expedition/moveExpeditions.js +++ b/modules/ticket/back/methods/expedition/moveExpeditions.js @@ -13,7 +13,8 @@ module.exports = Self => { { arg: 'landed', type: 'date', - description: `The landing date` + description: `The landing date`, + required: true }, { arg: 'warehouseId', From 6927f4b28df4486277c11be1fc0e3760495b26a5 Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 8 Nov 2024 11:51:00 +0100 Subject: [PATCH 025/266] feat: refs #6818 saysimple integration --- back/model-config.json | 3 +++ back/models/country.json | 7 ++++- back/models/say-simple-country.json | 26 +++++++++++++++++++ db/dump/fixtures.before.sql | 3 +++ .../11330-greenMoss/00-firstScript.sql | 6 +++++ modules/client/back/methods/client/summary.js | 5 +++- 6 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 back/models/say-simple-country.json create mode 100644 db/versions/11330-greenMoss/00-firstScript.sql diff --git a/back/model-config.json b/back/model-config.json index 5368769fd..efb148ee8 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -139,6 +139,9 @@ "StarredModule": { "dataSource": "vn" }, + "SaySimpleCountry": { + "dataSource": "vn" + }, "TempContainer": { "dataSource": "tempStorage" }, diff --git a/back/models/country.json b/back/models/country.json index 80d456702..ee72ae49d 100644 --- a/back/models/country.json +++ b/back/models/country.json @@ -44,6 +44,11 @@ "type": "belongsTo", "model": "Continent", "foreignKey": "continentFk" + }, + "saySimpleCountry": { + "type": "hasOne", + "model": "SaySimpleCountry", + "foreignKey": "countryFk" } }, "acls": [ @@ -54,4 +59,4 @@ "permission": "ALLOW" } ] -} +} \ No newline at end of file diff --git a/back/models/say-simple-country.json b/back/models/say-simple-country.json new file mode 100644 index 000000000..39acd5f0b --- /dev/null +++ b/back/models/say-simple-country.json @@ -0,0 +1,26 @@ +{ + "name": "SaySimpleCountry", + "base": "VnModel", + "options": { + "mysql": { + "table": "saySimpleCountry" + } + }, + "properties": { + "countryFk": { + "type": "number", + "id": true + }, + "channel": { + "type": "number" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + } + ] +} \ No newline at end of file diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index f25a4aab4..7bb0ace84 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4008,3 +4008,6 @@ UPDATE vn.department SET pbxQueue = '1000' WHERE name = "CAMARA"; UPDATE vn.department SET pbxQueue = '2000' WHERE name = "VENTAS"; +INSERT INTO vn.saySimpleCountry (countryFk, channel) + VALUES (19, 1169), + (8, 1183); \ No newline at end of file diff --git a/db/versions/11330-greenMoss/00-firstScript.sql b/db/versions/11330-greenMoss/00-firstScript.sql new file mode 100644 index 000000000..e0ef77e2d --- /dev/null +++ b/db/versions/11330-greenMoss/00-firstScript.sql @@ -0,0 +1,6 @@ +CREATE TABLE IF NOT EXISTS vn.saySimpleCountry( + countryFk MEDIUMINT(8) UNSIGNED, + channel INT(4) COMMENT 'channel de whatsapp de saySimple', + PRIMARY KEY (countryFk), + CONSTRAINT `saySimpleCountry_FK` FOREIGN KEY (`countryFk`) REFERENCES vn.country (`id`) ON UPDATE CASCADE +); \ No newline at end of file diff --git a/modules/client/back/methods/client/summary.js b/modules/client/back/methods/client/summary.js index 8162096f0..9242fbd44 100644 --- a/modules/client/back/methods/client/summary.js +++ b/modules/client/back/methods/client/summary.js @@ -54,7 +54,10 @@ module.exports = Self => { { relation: 'country', scope: { - fields: ['name'] + fields: ['id', 'name'], + include: { + relation: 'saySimpleCountry', + } } }, { From fa108e2af01637a7552d9364ca4838eac6302769 Mon Sep 17 00:00:00 2001 From: carlossa Date: Fri, 8 Nov 2024 11:56:17 +0100 Subject: [PATCH 026/266] fix: refs #7529 fix sql --- .../11245-turquoiseAnthurium/00-firstScript.sql | 15 --------------- db/versions/11312-navyAralia/00-firstScript.sql | 12 +++--------- 2 files changed, 3 insertions(+), 24 deletions(-) delete mode 100644 db/versions/11245-turquoiseAnthurium/00-firstScript.sql diff --git a/db/versions/11245-turquoiseAnthurium/00-firstScript.sql b/db/versions/11245-turquoiseAnthurium/00-firstScript.sql deleted file mode 100644 index f1c4d9471..000000000 --- a/db/versions/11245-turquoiseAnthurium/00-firstScript.sql +++ /dev/null @@ -1,15 +0,0 @@ --- ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; --- ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; - --- RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; - --- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; --- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; - - --- INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) --- VALUES --- ('workerRelative','*','*','ALLOW','ROLE','hr'), --- ('workerIrpf','*','*','ALLOW','ROLE','hr'), --- ('disabilityGrade','*','*','ALLOW','ROLE','hr'); - diff --git a/db/versions/11312-navyAralia/00-firstScript.sql b/db/versions/11312-navyAralia/00-firstScript.sql index 0d58503bb..446c7d4fe 100644 --- a/db/versions/11312-navyAralia/00-firstScript.sql +++ b/db/versions/11312-navyAralia/00-firstScript.sql @@ -1,15 +1,9 @@ ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_disabilityGradeFk; ALTER TABLE vn.workerRelatives DROP FOREIGN KEY workerRelatives_workerFk; --- RENAME TABLE `vn`.`workerRelatives` TO `vn`.`workerRelative`; - --- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_disabilityGradeFk` FOREIGN KEY (`disabilityGradeFk`) REFERENCES `disabilityGrade` (`id`) ON UPDATE CASCADE; --- ALTER TABLE vn.workerRelative ADD CONSTRAINT `workerRelatives_workerFk` FOREIGN KEY (`workerFk`) REFERENCES `workerIrpf` (`workerFk`) ON DELETE CASCADE ON UPDATE CASCADE; - - INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) VALUES - ('workerRelatives','*','*','ALLOW','ROLE','hr'), - ('workerIrpf','*','*','ALLOW','ROLE','hr'), - ('disabilityGrade','*','*','ALLOW','ROLE','hr'); + ('WorkerRelative','*','*','ALLOW','ROLE','hr'), + ('WorkerIrpf','*','*','ALLOW','ROLE','hr'), + ('DisabilityGrade','*','*','ALLOW','ROLE','hr'); From 9b28cf9130dff4346f627d1888a1f7de7cb4ddcd Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 8 Nov 2024 12:51:09 +0100 Subject: [PATCH 027/266] feat: refs #6818 add records --- db/dump/fixtures.before.sql | 2 +- db/versions/11330-greenMoss/00-firstScript.sql | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 7bb0ace84..ce4e9ddfc 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4008,6 +4008,6 @@ UPDATE vn.department SET pbxQueue = '1000' WHERE name = "CAMARA"; UPDATE vn.department SET pbxQueue = '2000' WHERE name = "VENTAS"; -INSERT INTO vn.saySimpleCountry (countryFk, channel) +INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, 1169), (8, 1183); \ No newline at end of file diff --git a/db/versions/11330-greenMoss/00-firstScript.sql b/db/versions/11330-greenMoss/00-firstScript.sql index e0ef77e2d..762e456b1 100644 --- a/db/versions/11330-greenMoss/00-firstScript.sql +++ b/db/versions/11330-greenMoss/00-firstScript.sql @@ -3,4 +3,8 @@ CREATE TABLE IF NOT EXISTS vn.saySimpleCountry( channel INT(4) COMMENT 'channel de whatsapp de saySimple', PRIMARY KEY (countryFk), CONSTRAINT `saySimpleCountry_FK` FOREIGN KEY (`countryFk`) REFERENCES vn.country (`id`) ON UPDATE CASCADE -); \ No newline at end of file +); + +INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) + VALUES (19, 1169), + (8, 1183); \ No newline at end of file From f8c3d69c5de7c144b17788dfee90f497811a12fd Mon Sep 17 00:00:00 2001 From: pablone Date: Fri, 8 Nov 2024 13:44:20 +0100 Subject: [PATCH 028/266] fix: refs #7404 remove volume from ticket sold on holland --- .../vn/procedures/stockBought_calculate.sql | 46 +++++++++++++++---- 1 file changed, 36 insertions(+), 10 deletions(-) diff --git a/db/routines/vn/procedures/stockBought_calculate.sql b/db/routines/vn/procedures/stockBought_calculate.sql index 8b2a32e5d..5cd7d8859 100644 --- a/db/routines/vn/procedures/stockBought_calculate.sql +++ b/db/routines/vn/procedures/stockBought_calculate.sql @@ -13,7 +13,7 @@ proc: BEGIN LEAVE proc; END IF; - CREATE OR REPLACE TEMPORARY TABLE tStockBought + CREATE OR REPLACE TEMPORARY TABLE tCurrentData SELECT workerFk, reserve FROM stockBought WHERE dated = vDated @@ -21,15 +21,28 @@ proc: BEGIN DELETE FROM stockBought WHERE dated = vDated; + CREATE OR REPLACE TEMPORARY TABLE tStockSold + SELECT it.workerFk, + SUM(ic.cm3 * ito.quantity / vc.palletM3 / 1000000) sold + FROM itemTicketOut ito + JOIN item i ON i.id = ito.itemFk + JOIN itemType it ON it.id = i.typeFk + JOIN ticket t ON t.id = ito.ticketFk + JOIN warehouse wh ON wh.id = t.warehouseFk + JOIN itemCost ic ON ic.itemFk = ito.itemFk + AND ic.warehouseFk = t.warehouseFk + JOIN volumeConfig vc + WHERE ito.shipped BETWEEN vDated AND util.dayEnd(vDated) + AND wh.code = 'VNH' + GROUP BY it.workerFk; + CALL item_calculateStock(vDated); - INSERT INTO stockBought(workerFk, bought, dated) + CREATE OR REPLACE TEMPORARY TABLE tStockBought SELECT it.workerFk, - ROUND(SUM( - (ti.quantity / b.packing) * - buy_getVolume(b.id) - ) / vc.palletM3 / 1000000, 1) bought, - vDated + SUM((ti.quantity / b.packing) * + buy_getVolume(b.id) + ) / vc.palletM3 / 1000000 bought FROM itemType it JOIN item i ON i.typeFk = it.id LEFT JOIN tmp.item ti ON ti.itemFk = i.id @@ -43,20 +56,33 @@ proc: BEGIN GROUP BY it.workerFk HAVING bought; + + INSERT INTO stockBought(workerFk, bought, dated) + SELECT tb.workerFk, + ROUND(GREATEST(tb.bought - IFNULL(ts.sold, 0), 0), 1), + vDated + FROM tStockBought tb + LEFT JOIN tStockSold ts ON ts.workerFk = tb.workerFk; + UPDATE stockBought s - JOIN tStockBought ts ON ts.workerFk = s.workerFk + JOIN tCurrentData ts ON ts.workerFk = s.workerFk SET s.reserve = ts.reserve WHERE s.dated = vDated; INSERT INTO stockBought (workerFk, reserve, dated) SELECT ts.workerFk, ts.reserve, vDated - FROM tStockBought ts + FROM tCurrentData ts WHERE ts.workerFk NOT IN ( SELECT workerFk FROM stockBought WHERE dated = vDated ); - DROP TEMPORARY TABLE tStockBought, tmp.item, tmp.buyUltimate; + UPDATE stockBought s + JOIN tStockSold ts ON ts.workerFk = s.workerFk + SET s.bought = IF(s.bought < ts.sold, ROUND(s.bought - ts.sold, 1), 0) + WHERE s.dated = vDated; + + DROP TEMPORARY TABLE tCurrentData, tmp.item, tmp.buyUltimate, tStockSold; END$$ DELIMITER ; From 6ef1f950d17897d377cc9fb342835f4a3e745543 Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 8 Nov 2024 17:47:10 +0100 Subject: [PATCH 029/266] feat: refs #6818 add config table --- back/model-config.json | 3 +++ back/models/say-simple-config.json | 26 +++++++++++++++++++ back/models/say-simple-country.json | 2 +- db/dump/fixtures.before.sql | 6 ++++- .../11330-greenMoss/00-firstScript.sql | 8 +++++- 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 back/models/say-simple-config.json diff --git a/back/model-config.json b/back/model-config.json index efb148ee8..364ffabdf 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -142,6 +142,9 @@ "SaySimpleCountry": { "dataSource": "vn" }, + "SaySimpleConfig": { + "dataSource": "vn" + }, "TempContainer": { "dataSource": "tempStorage" }, diff --git a/back/models/say-simple-config.json b/back/models/say-simple-config.json new file mode 100644 index 000000000..edc4caa43 --- /dev/null +++ b/back/models/say-simple-config.json @@ -0,0 +1,26 @@ +{ + "name": "SaySimpleConfig", + "base": "VnModel", + "options": { + "mysql": { + "table": "saySimpleConfig" + } + }, + "properties": { + "id": { + "type": "number", + "id": true + }, + "url": { + "type": "string" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ] +} \ No newline at end of file diff --git a/back/models/say-simple-country.json b/back/models/say-simple-country.json index 39acd5f0b..adddddc02 100644 --- a/back/models/say-simple-country.json +++ b/back/models/say-simple-country.json @@ -19,7 +19,7 @@ { "accessType": "READ", "principalType": "ROLE", - "principalId": "$everyone", + "principalId": "$authenticated", "permission": "ALLOW" } ] diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index ce4e9ddfc..cd2fb8b6b 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4010,4 +4010,8 @@ UPDATE vn.department SET pbxQueue = '2000' WHERE name = "VENTAS"; INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, 1169), - (8, 1183); \ No newline at end of file + (8, 1183), + (NULL, 1320); + +INSERT IGNORE INTO vn.saySimpleConfig (url) + VALUES ('saysimle-url-mock'); \ No newline at end of file diff --git a/db/versions/11330-greenMoss/00-firstScript.sql b/db/versions/11330-greenMoss/00-firstScript.sql index 762e456b1..127c8e40e 100644 --- a/db/versions/11330-greenMoss/00-firstScript.sql +++ b/db/versions/11330-greenMoss/00-firstScript.sql @@ -5,6 +5,12 @@ CREATE TABLE IF NOT EXISTS vn.saySimpleCountry( CONSTRAINT `saySimpleCountry_FK` FOREIGN KEY (`countryFk`) REFERENCES vn.country (`id`) ON UPDATE CASCADE ); +CREATE TABLE IF NOT EXISTS vn.saySimpleConfig( + id INT AUTO_INCREMENT PRIMARY KEY, + url VARCHAR(255) NOT NULL +); + INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, 1169), - (8, 1183); \ No newline at end of file + (8, 1183), + (NULL, 1320); \ No newline at end of file From fc61f7e4aba587c1577e28e9009d673e9fd9302a Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 11 Nov 2024 07:27:50 +0100 Subject: [PATCH 030/266] fix: refs #7457 remove group by calc time reduce bellow 1s --- modules/order/back/methods/order/filter.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index 844adb51e..eff2eecb6 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -201,7 +201,6 @@ module.exports = Self => { `); stmt.merge(conn.makeWhere(filter.where)); - stmt.merge(`GROUP BY o.id`); stmt.merge(conn.makePagination(filter)); stmts.push(stmt); stmts.push(`SET SESSION optimizer_search_depth = @_optimizer_search_depth`); @@ -214,7 +213,6 @@ module.exports = Self => { const sql = ParameterizedSQL.join(stmts, ';'); const result = await conn.executeStmt(sql, myOptions); - return result[ordersIndex]; }; }; From a254cb19cda0fd44fdbe6cf668924f39a57a92e2 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 11 Nov 2024 07:40:17 +0100 Subject: [PATCH 031/266] feat: refs #4948 Added ticket_selfConsumptionPackaging --- .../expedition_selfConsumptionPackaging.sql | 93 +++++++++++++++++++ .../vn/triggers/expedition_afterDelete.sql | 2 + 2 files changed, 95 insertions(+) create mode 100644 db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql diff --git a/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql b/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql new file mode 100644 index 000000000..43660f215 --- /dev/null +++ b/db/routines/vn/procedures/expedition_selfConsumptionPackaging.sql @@ -0,0 +1,93 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`expedition_selfConsumptionPackaging`( + vSelf INT, + vAction ENUM('add', 'remove') +) +BEGIN +/** + * Maneja el consumo de cajas para autoconsumo, permitiendo + * añadir o quitar cajas utilizadas según la acción indicada. + * + * @param vSelf Id de expedición + */ + DECLARE vClientFk INT; + DECLARE vAddressFk INT; + DECLARE vItemFk INT; + DECLARE vItemName VARCHAR(50); + DECLARE vWarehouseFk INT; + DECLARE vCreated DATE; + DECLARE vTicketFk INT; + DECLARE vSaleFk INT; + DECLARE vQuantity INT; + + IF vAction NOT IN ('add', 'remove') THEN + CALL util.throw('Action not supported'); + END IF; + + SELECT pc.clientSelfConsumptionFk, + pc.addressSelfConsumptionFk, + i.id, + i.name, + t.warehouseFk, + e.created + INTO vClientFk, + vAddressFk, + vItemFk, + vItemName, + vWarehouseFk, + vCreated + FROM expedition e + JOIN packaging p ON p.id = e.packagingFk + JOIN item i ON i.id = p.itemFk + JOIN ticket t ON t.id = e.ticketFk + JOIN productionConfig pc + WHERE e.id = vSelf; + + IF vClientFk IS NULL OR vAddressFk IS NULL THEN + CALL util.throw('Some config parameters are not set'); + END IF; + + SET vCreated = DATE(vCreated); + + SELECT id INTO vTicketFk + FROM ticket + WHERE shipped BETWEEN vCreated AND util.dayEnd(vCreated) + AND clientFk = vClientFk + AND addressFk = vAddressFk + AND warehouseFk = vWarehouseFk; + + IF vTicketFk IS NULL AND vAction = 'add' THEN + INSERT INTO ticket(clientFk, warehouseFk, shipped, nickname, addressFk) + VALUES (vClientFk, vWarehouseFk, vCreated, 'CAJAS AUTOCONSUMO', vAddressFk); + + SET vTicketFk = LAST_INSERT_ID(); + END IF; + + SELECT id, quantity INTO vSaleFk, vQuantity + FROM sale + WHERE itemFk = vItemFk + AND ticketFk = vTicketFk + LIMIT 1; + + IF vAction = 'add' THEN + IF vSaleFk IS NOT NULL THEN + UPDATE sale + SET quantity = quantity + 1 + WHERE id = vSaleFk; + ELSE + INSERT INTO sale(itemFk, ticketFk, concept, quantity) + VALUES (vItemFk, vTicketFk, vItemName, 1); + END IF; + ELSE + IF vSaleFk IS NOT NULL THEN + IF vQuantity > 1 THEN + UPDATE sale + SET quantity = quantity - 1 + WHERE id = vSaleFk; + ELSE + DELETE FROM sale WHERE id = vSaleFk; + END IF; + END IF; + END IF; +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/expedition_afterDelete.sql b/db/routines/vn/triggers/expedition_afterDelete.sql index 5d74a71e5..0a9a37375 100644 --- a/db/routines/vn/triggers/expedition_afterDelete.sql +++ b/db/routines/vn/triggers/expedition_afterDelete.sql @@ -8,5 +8,7 @@ BEGIN `changedModel` = 'Expedition', `changedModelId` = OLD.id, `userFk` = account.myUser_getId(); + + CALL expedition_selfConsumptionPackaging(OLD.id, 'remove'); END$$ DELIMITER ; From 94ed23ca07fbe1cf8d2f3c5769ed309bd8d4303f Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 11 Nov 2024 07:51:26 +0100 Subject: [PATCH 032/266] feat: refs #8169 modifica role --- db/versions/11324-salmonCataractarum/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11324-salmonCataractarum/00-firstScript.sql b/db/versions/11324-salmonCataractarum/00-firstScript.sql index 3a528382a..5c17ed549 100644 --- a/db/versions/11324-salmonCataractarum/00-firstScript.sql +++ b/db/versions/11324-salmonCataractarum/00-firstScript.sql @@ -68,4 +68,4 @@ UPDATE vn.tag sourceTable='itemTextureTag' WHERE name= 'Textura'; -GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemFarmingTag TO logisticAssist; \ No newline at end of file +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE vn.itemTextureTag TO logisticAssist; From d6349f113cfb4979d3e3064d12d600a92bffb462 Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 11 Nov 2024 08:06:22 +0100 Subject: [PATCH 033/266] feat: refs #7743 add simple spec for sendMail --- .../specs/sendMail.spec.js | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js diff --git a/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js b/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js new file mode 100644 index 000000000..133d7271c --- /dev/null +++ b/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js @@ -0,0 +1,20 @@ +const models = require('vn-loopback/server/server').models; + +describe('sendMail', () => { + it('should insert in mail', async() => { + const ctx = { + req: {accessToken: {userId: 50}}, + args: {workerFk: 1106, year: 2001, week: 1} + }; + const tx = await models.Sale.beginTransaction({}); + const options = {transaction: tx}; + options.transaction = tx; + + const mailCountBefore = await models.Mail.count(options); + await models.WorkerTimeControl.sendMail(ctx, options); + const mailCountAfter = await models.Mail.count(options); + + expect(mailCountAfter).toBeGreaterThan(mailCountBefore); + await tx.rollback(); + }); +}); From 50a73c98a2b3a2e3a39f4cc2b497bc507799f171 Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 11 Nov 2024 08:12:07 +0100 Subject: [PATCH 034/266] feat: refs #7743 add try catch stmt to the test --- .../worker-time-control/specs/login.spec.js | 1 - .../specs/sendMail.spec.js | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/modules/worker/back/methods/worker-time-control/specs/login.spec.js b/modules/worker/back/methods/worker-time-control/specs/login.spec.js index e125a876d..eff0edaa7 100644 --- a/modules/worker/back/methods/worker-time-control/specs/login.spec.js +++ b/modules/worker/back/methods/worker-time-control/specs/login.spec.js @@ -1,5 +1,4 @@ const models = require('vn-loopback/server/server').models; -const LoopBackContext = require('loopback-context'); const UserError = require('vn-loopback/util/user-error'); describe('workerTimeControl login()', () => { diff --git a/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js b/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js index 133d7271c..1395c7a46 100644 --- a/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js +++ b/modules/worker/back/methods/worker-time-control/specs/sendMail.spec.js @@ -2,17 +2,24 @@ const models = require('vn-loopback/server/server').models; describe('sendMail', () => { it('should insert in mail', async() => { + const tx = await models.Sale.beginTransaction({}); + const options = {transaction: tx}; + options.transaction = tx; + let mailCountBefore; + let mailCountAfter; const ctx = { req: {accessToken: {userId: 50}}, args: {workerFk: 1106, year: 2001, week: 1} }; - const tx = await models.Sale.beginTransaction({}); - const options = {transaction: tx}; - options.transaction = tx; - const mailCountBefore = await models.Mail.count(options); - await models.WorkerTimeControl.sendMail(ctx, options); - const mailCountAfter = await models.Mail.count(options); + try { + mailCountBefore = await models.Mail.count(options); + await models.WorkerTimeControl.sendMail(ctx, options); + mailCountAfter = await models.Mail.count(options); + } catch (e) { + await tx.rollback(); + throw e; + } expect(mailCountAfter).toBeGreaterThan(mailCountBefore); await tx.rollback(); From 35f4f161ab6cd4ef8f6cc6b179bae88012d4220c Mon Sep 17 00:00:00 2001 From: Pako Date: Mon, 11 Nov 2024 09:02:04 +0100 Subject: [PATCH 035/266] fix(collection_new): remove agency condition for suitable tickets Refs: #0000 --- db/routines/vn/procedures/collection_new.sql | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/db/routines/vn/procedures/collection_new.sql b/db/routines/vn/procedures/collection_new.sql index f04d5241e..36e837869 100644 --- a/db/routines/vn/procedures/collection_new.sql +++ b/db/routines/vn/procedures/collection_new.sql @@ -173,8 +173,6 @@ BEGIN DELETE pb.* FROM tmp.productionBuffer pb JOIN state s ON s.id = pb.state - JOIN agencyMode am ON am.id = pb.agencyModeFk - JOIN agency a ON a.id = am.agencyFk LEFT JOIN ( SELECT pb.ticketFk, MAX(i.`size`) maxSize FROM tmp.productionBuffer pb @@ -185,7 +183,7 @@ BEGIN ) sub ON sub.ticketFk = pb.ticketFk JOIN productionConfig pc WHERE pb.shipped <> util.VN_CURDATE() - OR (pb.ubicacion IS NULL AND a.isOwn) + OR pb.ubicacion IS NULL OR (NOT s.isPreparable AND NOT s.isPrintable) OR pb.collectionH IS NOT NULL OR pb.collectionV IS NOT NULL From 5c054fe0d3a6e73a71ab26f8e19ada1c0b757e6c Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 11 Nov 2024 09:09:51 +0100 Subject: [PATCH 036/266] feat: refs #6869 add back --- .../vn/procedures/itemShelving_get.sql | 30 ----------- .../back/methods/item-shelving/getItems.js | 51 +++++++++++++++++++ modules/item/back/models/item-shelving.js | 1 + 3 files changed, 52 insertions(+), 30 deletions(-) delete mode 100644 db/routines/vn/procedures/itemShelving_get.sql create mode 100644 modules/item/back/methods/item-shelving/getItems.js diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql deleted file mode 100644 index 07384b721..000000000 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ /dev/null @@ -1,30 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_get`(IN vSelf VARCHAR(8)) -BEGIN -/** -* Lista artículos de itemshelving -* -* @param vSelf matrícula del carro -**/ - SELECT ish.itemFk item, - i.name, - i.longName, - i.size, - ish.visible, - ish.packing, - ish.grouping, - p.code, - ish.id, - s.priority, - ish.isChecked, - ic.url, - ish.available, - ish.buyFk - FROM itemShelving ish - JOIN item i ON i.id = ish.itemFk - JOIN shelving s ON vSelf = s.code COLLATE utf8_unicode_ci - LEFT JOIN parking p ON s.parkingFk = p.id - JOIN hedera.imageConfig ic - WHERE ish.shelvingFk COLLATE utf8_unicode_ci = vSelf; -END$$ -DELIMITER ; diff --git a/modules/item/back/methods/item-shelving/getItems.js b/modules/item/back/methods/item-shelving/getItems.js new file mode 100644 index 000000000..2fe50d785 --- /dev/null +++ b/modules/item/back/methods/item-shelving/getItems.js @@ -0,0 +1,51 @@ +module.exports = Self => { + Self.remoteMethod('getItems', { + description: 'shelving item list', + accessType: 'READ', + accepts: [{ + arg: 'code', + type: 'string', + required: true, + description: 'Shelving code' + }], + returns: { + type: 'object', + root: true + }, + http: { + path: `/getItems`, + verb: 'GET' + } + }); + + Self.getItems = async(code, options) => { + const models = Self.app.models; + const myOptions = {}; + if (typeof options == 'object') + Object.assign(myOptions, options); + + const shelving = await models.Shelving.findOne({ + fields: ['priority', 'parkingFk'], + include: { + relation: 'parking', + scope: {fields: ['code']} + }, + where: {code} + }, myOptions); + + const itemShelvings = await Self.find({ + fields: ['itemFk', 'visible', 'packing', 'grouping', 'isChecked', 'available', 'buyFk'], + include: { + relation: 'item', + scope: {fields: ['name', 'longName', 'size']} + }, + where: {shelvingFk: code} + }, myOptions); + return { + code: shelving.parking().code, + priority: shelving.priority, + itemShelvings, + }; + // Add image from hedera.imageConfig + }; +}; diff --git a/modules/item/back/models/item-shelving.js b/modules/item/back/models/item-shelving.js index be72dac37..ba6ab780d 100644 --- a/modules/item/back/models/item-shelving.js +++ b/modules/item/back/models/item-shelving.js @@ -5,4 +5,5 @@ module.exports = Self => { require('../methods/item-shelving/getAlternative')(Self); require('../methods/item-shelving/updateFromSale')(Self); require('../methods/item-shelving/getListItemNewer')(Self); + require('../methods/item-shelving/getItems')(Self); }; From f7a29cd9c79bfe605e9c938da41ad5780c4a40b6 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 11 Nov 2024 10:32:17 +0100 Subject: [PATCH 037/266] feat(Supplier): refs #6828 add companySize --- db/dump/fixtures.before.sql | 3 ++- db/versions/11331-bronzeBirch/00-firstScript.sql | 2 ++ modules/supplier/back/methods/supplier/getSummary.js | 3 ++- modules/supplier/back/models/supplier.json | 3 +++ 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 db/versions/11331-bronzeBirch/00-firstScript.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index f25a4aab4..c9b6a2206 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2476,7 +2476,8 @@ INSERT INTO `vn`.`dmsType` (20, 'Reclamación', 1, 1, 'claim'), (21, 'Entrada', 1, 1, 'entry'), (22, 'Proveedor', 1, 1, 'supplier'), - (23, 'Termografos', 35, 35, 'thermograph'); + (23, 'Termografos', 35, 35, 'thermograph'), + (24, 'Sello de calidad', 1, 1, 'qualitySeal'); INSERT INTO `vn`.`dms`(`id`, `dmsTypeFk`, `file`, `contentType`, `workerFk`, `warehouseFk`, `companyFk`, `hardCopyNumber`, `hasFile`, `reference`, `description`, `created`) VALUES diff --git a/db/versions/11331-bronzeBirch/00-firstScript.sql b/db/versions/11331-bronzeBirch/00-firstScript.sql new file mode 100644 index 000000000..ada374182 --- /dev/null +++ b/db/versions/11331-bronzeBirch/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.supplier ADD companySize ENUM('small', 'medium', 'big') NULL; + diff --git a/modules/supplier/back/methods/supplier/getSummary.js b/modules/supplier/back/methods/supplier/getSummary.js index 67767e7b4..8fcaaa53f 100644 --- a/modules/supplier/back/methods/supplier/getSummary.js +++ b/modules/supplier/back/methods/supplier/getSummary.js @@ -43,7 +43,8 @@ module.exports = Self => { 'sageWithholdingFk', 'workerFk', 'supplierActivityFk', - 'healthRegister' + 'healthRegister', + 'companySize' ], include: [ { diff --git a/modules/supplier/back/models/supplier.json b/modules/supplier/back/models/supplier.json index 90b266ba9..b79a6b80d 100644 --- a/modules/supplier/back/models/supplier.json +++ b/modules/supplier/back/models/supplier.json @@ -113,6 +113,9 @@ }, "isVies": { "type": "boolean" + }, + "companySize": { + "type": "string" } }, "relations": { From 25891e0bada36df43d809e00024504dc8808ca55 Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 11 Nov 2024 10:42:06 +0100 Subject: [PATCH 038/266] feat: refs #6924 notify absences only to department boss --- modules/worker/back/methods/worker/createAbsence.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/worker/back/methods/worker/createAbsence.js b/modules/worker/back/methods/worker/createAbsence.js index 0397886cf..c7f968edb 100644 --- a/modules/worker/back/methods/worker/createAbsence.js +++ b/modules/worker/back/methods/worker/createAbsence.js @@ -87,7 +87,8 @@ module.exports = Self => { `SELECT COUNT(*) halfHolidayCounter FROM vn.calendar c JOIN vn.business b ON b.id = c.businessFk - WHERE c.dayOffTypeFk = 6 + JOIN vn.absenceType at ON at.id = c.dayOffTypeFk + WHERE at.code = 'halfHoliday' AND b.workerFk = ? AND c.dated BETWEEN util.firstDayOfYear(?) AND LAST_DAY(DATE_ADD(?, INTERVAL 12 - MONTH(?) MONTH))`, [id, date, now, now]); @@ -120,10 +121,12 @@ module.exports = Self => { }, myOptions); const department = labour.department(); - if (department && department.notificationEmail) { + if (department) { const absenceType = await models.AbsenceType.findById(args.absenceTypeId, null, myOptions); const account = await models.VnUser.findById(userId, null, myOptions); const subordinated = await models.VnUser.findById(id, null, myOptions); + const worker = await models.Worker.findById(subordinated.id, null, myOptions); + const boss = await models.VnUser.findById(worker.bossFk, null, myOptions); const url = await Self.app.models.Url.getUrl(); const body = $t('Created absence', { author: account.nickname, @@ -135,7 +138,7 @@ module.exports = Self => { await models.Mail.create({ subject: $t('Absence change notification on the labour calendar'), body: body, - receiver: department.notificationEmail + receiver: boss.email }, myOptions); } From 0dc77851c007d22a9c83086e11dea0e05e96251b Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 11 Nov 2024 11:34:37 +0100 Subject: [PATCH 039/266] fix: refs #4948 Tests --- db/dump/fixtures.before.sql | 4 ++-- db/routines/vn/triggers/expedition_afterDelete.sql | 2 -- db/routines/vn/triggers/expedition_beforeDelete.sql | 3 ++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index f25a4aab4..b0fb3a8d9 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2954,9 +2954,9 @@ INSERT INTO `vn`.`routeConfig` (`id`, `defaultWorkCenterFk`) VALUES (1, 9); -INSERT INTO `vn`.`productionConfig` (`isPreviousPreparationRequired`, `ticketPrintedMax`, `ticketTrolleyMax`, `rookieDays`, `notBuyingMonths`, `id`, `isZoneClosedByExpeditionActivated`, `maxNotReadyCollections`, `minTicketsToCloseZone`, `movingTicketDelRoute`, `defaultZone`, `defautlAgencyMode`, `hasUniqueCollectionTime`, `maxCollectionWithoutUser`, `pendingCollectionsOrder`, `pendingCollectionsAge`, `backupPrinterNotificationDelay`) +INSERT INTO `vn`.`productionConfig` (`isPreviousPreparationRequired`, `ticketPrintedMax`, `ticketTrolleyMax`, `rookieDays`, `notBuyingMonths`, `id`, `isZoneClosedByExpeditionActivated`, `maxNotReadyCollections`, `minTicketsToCloseZone`, `movingTicketDelRoute`, `defaultZone`, `defautlAgencyMode`, `hasUniqueCollectionTime`, `maxCollectionWithoutUser`, `pendingCollectionsOrder`, `pendingCollectionsAge`, `backupPrinterNotificationDelay`, `clientSelfConsumptionFk`, `addressSelfConsumptionFk`) VALUES - (0, 8, 80, 0, 0, 1, 0, 15, 25, -1, 697, 1328, 0, 1, 8, 6, 3600); + (0, 8, 80, 0, 0, 1, 0, 15, 25, -1, 697, 1328, 0, 1, 8, 6, 3600, 1112, 12); INSERT INTO `vn`.`collection` (`id`, `created`, `workerFk`, `stateFk`, `itemPackingTypeFk`, `saleTotalCount`, `salePickedCount`, `trainFk`, `sectorFk`, `wagons`) VALUES diff --git a/db/routines/vn/triggers/expedition_afterDelete.sql b/db/routines/vn/triggers/expedition_afterDelete.sql index 0a9a37375..5d74a71e5 100644 --- a/db/routines/vn/triggers/expedition_afterDelete.sql +++ b/db/routines/vn/triggers/expedition_afterDelete.sql @@ -8,7 +8,5 @@ BEGIN `changedModel` = 'Expedition', `changedModelId` = OLD.id, `userFk` = account.myUser_getId(); - - CALL expedition_selfConsumptionPackaging(OLD.id, 'remove'); END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/expedition_beforeDelete.sql b/db/routines/vn/triggers/expedition_beforeDelete.sql index 13ba19631..60d3a6ca1 100644 --- a/db/routines/vn/triggers/expedition_beforeDelete.sql +++ b/db/routines/vn/triggers/expedition_beforeDelete.sql @@ -7,6 +7,7 @@ BEGIN SET packages = (SELECT COUNT(counter)-1 FROM expedition e WHERE e.ticketFk = OLD.ticketFk and e.freightItemFk) WHERE t.id = OLD.ticketFk; - + + CALL expedition_selfConsumptionPackaging(OLD.id, 'remove'); END$$ DELIMITER ; From a41fc36f9092105384ccdd3bcf7f8adcc193d435 Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 11 Nov 2024 13:02:09 +0100 Subject: [PATCH 040/266] feat: refs #6869 define model --- back/model-config.json | 3 ++ back/models/image-config.json | 22 ++++++++ .../back/methods/item-shelving/getItems.js | 51 ------------------- modules/item/back/models/item-shelving.js | 1 - modules/item/back/models/item-shelving.json | 3 ++ modules/shelving/back/models/shelving.json | 10 +++- 6 files changed, 36 insertions(+), 54 deletions(-) create mode 100644 back/models/image-config.json delete mode 100644 modules/item/back/methods/item-shelving/getItems.js diff --git a/back/model-config.json b/back/model-config.json index 5368769fd..73db0a31b 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -79,6 +79,9 @@ "ImageCollectionSize": { "dataSource": "vn" }, + "ImageConfig": { + "dataSource": "vn" + }, "ImageContainer": { "dataSource": "imageStorage" }, diff --git a/back/models/image-config.json b/back/models/image-config.json new file mode 100644 index 000000000..11f4c2284 --- /dev/null +++ b/back/models/image-config.json @@ -0,0 +1,22 @@ +{ + "name": "ImageConfig", + "base": "VnModel", + "options": { + "mysql": { + "table": "hedera.imageConfig" + } + }, + "properties": { + "url": { + "type": "string" + } + }, + "acls": [ + { + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$authenticated", + "permission": "ALLOW" + } + ] +} \ No newline at end of file diff --git a/modules/item/back/methods/item-shelving/getItems.js b/modules/item/back/methods/item-shelving/getItems.js deleted file mode 100644 index 2fe50d785..000000000 --- a/modules/item/back/methods/item-shelving/getItems.js +++ /dev/null @@ -1,51 +0,0 @@ -module.exports = Self => { - Self.remoteMethod('getItems', { - description: 'shelving item list', - accessType: 'READ', - accepts: [{ - arg: 'code', - type: 'string', - required: true, - description: 'Shelving code' - }], - returns: { - type: 'object', - root: true - }, - http: { - path: `/getItems`, - verb: 'GET' - } - }); - - Self.getItems = async(code, options) => { - const models = Self.app.models; - const myOptions = {}; - if (typeof options == 'object') - Object.assign(myOptions, options); - - const shelving = await models.Shelving.findOne({ - fields: ['priority', 'parkingFk'], - include: { - relation: 'parking', - scope: {fields: ['code']} - }, - where: {code} - }, myOptions); - - const itemShelvings = await Self.find({ - fields: ['itemFk', 'visible', 'packing', 'grouping', 'isChecked', 'available', 'buyFk'], - include: { - relation: 'item', - scope: {fields: ['name', 'longName', 'size']} - }, - where: {shelvingFk: code} - }, myOptions); - return { - code: shelving.parking().code, - priority: shelving.priority, - itemShelvings, - }; - // Add image from hedera.imageConfig - }; -}; diff --git a/modules/item/back/models/item-shelving.js b/modules/item/back/models/item-shelving.js index ba6ab780d..be72dac37 100644 --- a/modules/item/back/models/item-shelving.js +++ b/modules/item/back/models/item-shelving.js @@ -5,5 +5,4 @@ module.exports = Self => { require('../methods/item-shelving/getAlternative')(Self); require('../methods/item-shelving/updateFromSale')(Self); require('../methods/item-shelving/getListItemNewer')(Self); - require('../methods/item-shelving/getItems')(Self); }; diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index 5df3b0703..b0e3f17fa 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -41,6 +41,9 @@ }, "available": { "type": "number" + }, + "buyFk": { + "type": "number" } }, "relations": { diff --git a/modules/shelving/back/models/shelving.json b/modules/shelving/back/models/shelving.json index 46fce31e8..f6df57d43 100644 --- a/modules/shelving/back/models/shelving.json +++ b/modules/shelving/back/models/shelving.json @@ -1,6 +1,6 @@ { "name": "Shelving", - "base": "VnModel", + "base": "VnModel", "mixins": { "Loggable": true }, @@ -44,6 +44,12 @@ "type": "belongsTo", "model": "Worker", "foreignKey": "id" + }, + "itemShelving": { + "type": "hasMany", + "model": "ItemShelving", + "foreignKey": "shelvingFk", + "primaryKey": "code" } } -} +} \ No newline at end of file From eaad989b3afaec94f31815516ad3dcfe8d4488e7 Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 11 Nov 2024 13:57:49 +0100 Subject: [PATCH 041/266] fix: clean deletes also zoneEvent range records --- db/routines/vn/procedures/clean.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/clean.sql b/db/routines/vn/procedures/clean.sql index d3fed0242..fcee33c97 100644 --- a/db/routines/vn/procedures/clean.sql +++ b/db/routines/vn/procedures/clean.sql @@ -56,7 +56,7 @@ BEGIN AND ts.id IS NULL; DELETE FROM claim WHERE ticketCreated < v4Years; -- Robert ubicacion anterior de travelLog comentario para debug - DELETE FROM zoneEvent WHERE `type` = 'day' AND dated < v3Months; + DELETE FROM zoneEvent WHERE dated < v2Months OR ended < v2Months; DELETE b FROM buy b JOIN entryConfig e ON e.defaultEntry = b.entryFk WHERE b.created < v2Months; From cf102699d5b38ace3a1c212676369a57458c553e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 11 Nov 2024 14:19:11 +0100 Subject: [PATCH 042/266] feat: refs#8087 Redadas en travel --- db/dump/fixtures.before.sql | 24 +++++++++---------- .../procedures/availableNoRaids_refresh.sql | 2 +- .../triggers/supplyResponse_afterUpdate.sql | 2 +- .../hedera/procedures/item_getVisible.sql | 4 ++-- .../stock/procedures/log_refreshBuy.sql | 9 ++++--- .../procedures/absoluteInventoryHistory.sql | 4 ++-- .../vn/procedures/available_traslate.sql | 6 ++--- .../vn/procedures/entry_getTransfer.sql | 2 +- db/routines/vn/procedures/inventoryMake.sql | 4 ++-- db/routines/vn/procedures/item_getBalance.sql | 4 ++-- db/routines/vn/procedures/item_getMinacum.sql | 2 +- .../vn/procedures/item_multipleBuyByDate.sql | 2 +- .../vn/procedures/item_valuateInventory.sql | 6 ++--- .../vn/procedures/multipleInventory.sql | 8 +++---- .../vn/procedures/travelVolume_get.sql | 2 +- .../vn/procedures/travel_moveRaids.sql | 17 ++++++------- .../vn/triggers/entry_beforeUpdate.sql | 6 ++--- db/routines/vn/views/itemEntryIn.sql | 2 +- db/routines/vn/views/itemEntryOut.sql | 2 +- db/routines/vn/views/lastPurchases.sql | 2 +- db/routines/vn2008/views/entrySource.sql | 1 + db/routines/vn2008/views/travel.sql | 1 + db/routines/vn2008/views/v_compres.sql | 2 +- .../11332-tealErica/00-firstScript.sql | 4 ++++ modules/entry/back/locale/entry/en.yml | 1 + modules/entry/back/locale/entry/es.yml | 1 + modules/entry/back/methods/entry/filter.js | 2 +- modules/entry/back/methods/entry/getEntry.js | 4 ++-- modules/entry/back/models/entry.json | 3 +++ modules/entry/front/descriptor/index.html | 2 +- modules/entry/front/summary/index.html | 2 +- modules/travel/back/methods/travel/filter.js | 1 + modules/travel/back/models/travel.json | 3 +++ 33 files changed, 76 insertions(+), 61 deletions(-) create mode 100644 db/versions/11332-tealErica/00-firstScript.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index f25a4aab4..54dd9ec14 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1505,18 +1505,18 @@ INSERT INTO `vn`.`awb` (id, code, package, weight, created, amount, transitoryFk (9, '99610289193', 302, 2972, util.VN_CURDATE(), 3871, 442, 1), (10, '07546500856', 185, 2364, util.VN_CURDATE(), 5321, 442, 1); -INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`,`ref`, `totalEntries`, `cargoSupplierFk`, `awbFK`, `daysInForward`) - VALUES (1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1, NULL), - (2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150.00, 2000, 'second travel', 2, 2, 2, NULL), - (3, util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3, NULL), - (4, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4, NULL), - (5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5, NULL), - (6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6, NULL), - (7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7, 2), - (8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10, NULL), - (10, DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), 5, 1, 1, 50.00, 500, 'nineth travel', 1, 2, 10, 2), - (11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, NULL), - (12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, NULL); +INSERT INTO `vn`.`travel`(`id`,`shipped`, `landed`, `warehouseInFk`, `warehouseOutFk`, `agencyModeFk`, `m3`, `kg`,`ref`, `totalEntries`, `cargoSupplierFk`, `awbFK`, `isRaid`, `daysInForward`) + VALUES (1, DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -2 MONTH), 1, 2, 1, 100.00, 1000, 'first travel', 1, 1, 1, FALSE, NULL), + (2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 2, 1, 150.00, 2000, 'second travel', 2, 2, 2, FALSE, NULL), + (3, util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3, FALSE, NULL), + (4, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 3, 1, 50.00, 500, 'fourth travel', 0, 2, 4, FALSE, NULL), + (5, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 3, 1, 50.00, 500, 'fifth travel', 1, 1, 5, FALSE, NULL), + (6, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 4, 4, 1, 50.00, 500, 'sixth travel', 1, 2, 6, FALSE,NULL), + (7, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 4, 1, 50.00, 500, 'seventh travel', 2, 1, 7, TRUE, 2), + (8, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 1, 1, 50.00, 500, 'eight travel', 1, 2, 10, FALSE, NULL), + (10, DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +5 DAY), 5, 1, 1, 50.00, 500, 'nineth travel', 1, 2, 10, TRUE, 2), + (11, util.VN_CURDATE() - INTERVAL 1 DAY , util.VN_CURDATE(), 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL), + (12, util.VN_CURDATE() , util.VN_CURDATE() + INTERVAL 1 DAY, 6, 3, 0, 50.00, 500, 'eleventh travel', 1, 2, 4, FALSE, NULL); INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `evaNotes`) VALUES diff --git a/db/routines/cache/procedures/availableNoRaids_refresh.sql b/db/routines/cache/procedures/availableNoRaids_refresh.sql index efbbf6a13..447300305 100644 --- a/db/routines/cache/procedures/availableNoRaids_refresh.sql +++ b/db/routines/cache/procedures/availableNoRaids_refresh.sql @@ -53,7 +53,7 @@ proc: BEGIN WHERE t.landed BETWEEN vInventoryDate AND vStartDate AND t.warehouseInFk = vWarehouse AND s.name != 'INVENTARIO' - AND NOT t.daysInForward + AND NOT t.isRaid GROUP BY b.itemFk ) c JOIN vn.item i ON i.id = c.itemFk diff --git a/db/routines/edi/triggers/supplyResponse_afterUpdate.sql b/db/routines/edi/triggers/supplyResponse_afterUpdate.sql index 28a8c9466..f3e5aaefd 100644 --- a/db/routines/edi/triggers/supplyResponse_afterUpdate.sql +++ b/db/routines/edi/triggers/supplyResponse_afterUpdate.sql @@ -14,7 +14,7 @@ BEGIN b.stickers = NEW.NumberOfUnits WHERE i.supplyResponseFk = NEW.ID AND am.name = 'LOGIFLORA' - AND tr.daysInForward + AND tr.isRaid AND tr.landed >= util.VN_CURDATE(); END$$ diff --git a/db/routines/hedera/procedures/item_getVisible.sql b/db/routines/hedera/procedures/item_getVisible.sql index 365161bdf..d5bbe9d76 100644 --- a/db/routines/hedera/procedures/item_getVisible.sql +++ b/db/routines/hedera/procedures/item_getVisible.sql @@ -59,7 +59,7 @@ BEGIN JOIN vn.travel t ON t.id = e.travelFk WHERE t.landed BETWEEN vDateInv AND vDate AND t.warehouseInFk = vWarehouse - AND NOT t.daysInForward + AND NOT t.isRaid UNION ALL SELECT b.itemFk, -b.quantity FROM vn.buy b @@ -67,7 +67,7 @@ BEGIN JOIN vn.travel t ON t.id = e.travelFk WHERE t.shipped BETWEEN vDateInv AND util.VN_CURDATE() AND t.warehouseOutFk = vWarehouse - AND NOT t.daysInForward + AND NOT t.isRaid AND t.isDelivered UNION ALL SELECT m.itemFk, -m.quantity diff --git a/db/routines/stock/procedures/log_refreshBuy.sql b/db/routines/stock/procedures/log_refreshBuy.sql index d8e727f17..874e14072 100644 --- a/db/routines/stock/procedures/log_refreshBuy.sql +++ b/db/routines/stock/procedures/log_refreshBuy.sql @@ -6,12 +6,11 @@ BEGIN DROP TEMPORARY TABLE IF EXISTS tValues; CREATE TEMPORARY TABLE tValues ENGINE = MEMORY - SELECT - b.id buyFk, + SELECT b.id buyFk, e.id entryFk, t.id travelFk, b.itemFk, - t.daysInForward, + t.isRaid, ADDTIME(t.shipped, IFNULL(t.shipmentHour, '00:00:00')) shipped, t.warehouseOutFk, @@ -50,7 +49,7 @@ BEGIN itemFk, TIMESTAMPADD(DAY, life, @dated), quantity, - IF(isIn, isReceived, isDelivered) AND NOT daysInForward + IF(isIn, isReceived, isDelivered) AND NOT isRaid FROM tValues WHERE isIn OR !lessThanInventory; @@ -65,7 +64,7 @@ BEGIN itemFk, created, quantity, - IF(isIn, isDelivered, isReceived) AND NOT daysInForward + IF(isIn, isDelivered, isReceived) AND NOT isRaid FROM tValues WHERE !isIn OR !lessThanInventory; diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index 3ea8cf4de..d0d9ffac2 100644 --- a/db/routines/vn/procedures/absoluteInventoryHistory.sql +++ b/db/routines/vn/procedures/absoluteInventoryHistory.sql @@ -39,7 +39,7 @@ BEGIN AND vWarehouseFk IN (tr.warehouseInFk, 0) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable - AND NOT tr.daysInForward + AND NOT tr.isRaid UNION ALL SELECT tr.shipped, NULL, @@ -58,7 +58,7 @@ BEGIN AND s.id <> (SELECT supplierFk FROM inventoryConfig) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable - AND NOT tr.daysInForward + AND NOT tr.isRaid UNION ALL SELECT t.shipped, NULL, diff --git a/db/routines/vn/procedures/available_traslate.sql b/db/routines/vn/procedures/available_traslate.sql index 513f58e36..bfd5b34c8 100644 --- a/db/routines/vn/procedures/available_traslate.sql +++ b/db/routines/vn/procedures/available_traslate.sql @@ -42,7 +42,7 @@ proc: BEGIN WHERE t.landed BETWEEN vDatedInventory AND vDatedFrom AND t.warehouseInFk = vWarehouseLanding AND NOT e.isExcludedFromAvailable - AND NOT t.daysInForward + AND NOT t.isRaid GROUP BY c.itemFk; -- Tabla con el ultimo dia de last_buy para cada producto @@ -57,7 +57,7 @@ proc: BEGIN JOIN travel tr ON tr.id = e.travelFk LEFT JOIN tItemRange i ON t.itemFk = i.itemFk WHERE t.warehouseFk = vWarehouseShipment - AND NOT tr.daysInForward + AND NOT tr.isRaid ON DUPLICATE KEY UPDATE tItemRange.dated = GREATEST(tItemRange.dated, tr.landed); @@ -94,7 +94,7 @@ proc: BEGIN JOIN tItemRangeLive ir ON ir.itemFk = b.itemFk WHERE NOT e.isExcludedFromAvailable AND b.quantity <> 0 - AND NOT t.daysInForward + AND NOT t.isRaid AND t.warehouseInFk = vWarehouseLanding AND t.landed >= vDatedFrom AND (ir.dated IS NULL OR t.landed <= ir.dated) diff --git a/db/routines/vn/procedures/entry_getTransfer.sql b/db/routines/vn/procedures/entry_getTransfer.sql index 9527e0bf2..873827db2 100644 --- a/db/routines/vn/procedures/entry_getTransfer.sql +++ b/db/routines/vn/procedures/entry_getTransfer.sql @@ -166,7 +166,7 @@ BEGIN LEFT JOIN tmp.buyUltimateFromInterval bufi ON bufi.itemFk = i.id LEFT JOIN buy b3 ON b3.id = bufi.buyFk WHERE ic.display - AND NOT tr.daysInForward + AND NOT tr.isRaid AND (ti.visible OR ti.available) ORDER BY i.typeFk, i.name, i.id, i.size, i.category, o.name; diff --git a/db/routines/vn/procedures/inventoryMake.sql b/db/routines/vn/procedures/inventoryMake.sql index 65dceef3d..316083db0 100644 --- a/db/routines/vn/procedures/inventoryMake.sql +++ b/db/routines/vn/procedures/inventoryMake.sql @@ -137,7 +137,7 @@ BEGIN JOIN travel tr ON tr.id = e.travelFk WHERE tr.warehouseInFk = vWarehouseFk AND tr.landed BETWEEN vDateLastInventory AND vDateYesterday - AND NOT tr.daysInForward + AND NOT tr.isRaid GROUP BY b.itemFk; -- Transfers @@ -150,7 +150,7 @@ BEGIN JOIN travel tr ON tr.id = e.travelFk WHERE tr.warehouseOutFk = vWarehouseFk AND tr.shipped BETWEEN vDateLastInventory AND vDateYesterday - AND NOT tr.daysInForward + AND NOT tr.isRaid GROUP BY b.itemFk ) sub ON DUPLICATE KEY UPDATE quantity = IFNULL(quantity, 0) + sub.quantityOut; diff --git a/db/routines/vn/procedures/item_getBalance.sql b/db/routines/vn/procedures/item_getBalance.sql index 260f0a527..c4974491c 100644 --- a/db/routines/vn/procedures/item_getBalance.sql +++ b/db/routines/vn/procedures/item_getBalance.sql @@ -59,7 +59,7 @@ BEGIN AND (s.id <> vSupplierInventoryFk OR vDated IS NULL) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable - AND NOT tr.daysInForward + AND NOT tr.isRaid ), entriesOut AS ( SELECT 'entry', @@ -95,7 +95,7 @@ BEGIN AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable AND NOT w.isFeedStock - AND NOT tr.daysInForward + AND NOT tr.isRaid ), sales AS ( WITH itemSales AS ( diff --git a/db/routines/vn/procedures/item_getMinacum.sql b/db/routines/vn/procedures/item_getMinacum.sql index 8a42bd737..e3c915820 100644 --- a/db/routines/vn/procedures/item_getMinacum.sql +++ b/db/routines/vn/procedures/item_getMinacum.sql @@ -63,7 +63,7 @@ BEGIN AND NOT e.isExcludedFromAvailable AND b.quantity <> 0 AND (vItemFk IS NULL OR b.itemFk = vItemFk) - AND NOT t.daysInForward + AND NOT t.isRaid UNION ALL SELECT r.itemFk, r.shipment, diff --git a/db/routines/vn/procedures/item_multipleBuyByDate.sql b/db/routines/vn/procedures/item_multipleBuyByDate.sql index 7bd809312..04d3f1855 100644 --- a/db/routines/vn/procedures/item_multipleBuyByDate.sql +++ b/db/routines/vn/procedures/item_multipleBuyByDate.sql @@ -30,7 +30,7 @@ BEGIN AND NOT s.name = 'INVENTARIO' AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) AND w.isComparative - AND NOT t.daysInForward + AND NOT t.isRaid GROUP BY i.id; UPDATE tmp.itemInventory y diff --git a/db/routines/vn/procedures/item_valuateInventory.sql b/db/routines/vn/procedures/item_valuateInventory.sql index b6d687960..7e420be27 100644 --- a/db/routines/vn/procedures/item_valuateInventory.sql +++ b/db/routines/vn/procedures/item_valuateInventory.sql @@ -109,7 +109,7 @@ BEGIN JOIN warehouse w ON w.id = tr.warehouseInFk WHERE tr.landed BETWEEN vInventoried AND vDateDayEnd AND IF(tr.landed = util.VN_CURDATE(), tr.isReceived, TRUE) - AND NOT tr.daysInForward + AND NOT tr.isRaid AND w.valuatedInventory AND t.isInventory AND e.supplierFk <> vInventorySupplierFk @@ -131,7 +131,7 @@ BEGIN JOIN itemCategory ic ON ic.id = t.categoryFk JOIN warehouse w ON w.id = tr.warehouseOutFk WHERE tr.shipped BETWEEN vInventoried AND vDateDayEnd - AND NOT tr.daysInForward + AND NOT tr.isRaid AND w.valuatedInventory AND t.isInventory AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL) @@ -196,7 +196,7 @@ BEGIN JOIN warehouse wIn ON wIn.id = tr.warehouseInFk JOIN warehouse wOut ON wOut.id = tr.warehouseOutFk WHERE vDated >= tr.shipped AND vDated < tr.landed - AND NOT tr.daysInForward + AND NOT tr.isRaid AND wIn.valuatedInventory AND t.isInventory AND e.isConfirmed diff --git a/db/routines/vn/procedures/multipleInventory.sql b/db/routines/vn/procedures/multipleInventory.sql index 6b26e456f..ee18bbe96 100644 --- a/db/routines/vn/procedures/multipleInventory.sql +++ b/db/routines/vn/procedures/multipleInventory.sql @@ -60,7 +60,7 @@ proc: BEGIN AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk AND w.isComparative AND NOT e.isExcludedFromAvailable - AND NOT t.daysInForward + AND NOT t.isRaid UNION ALL SELECT b.itemFk, - b.quantity FROM buy b @@ -71,7 +71,7 @@ proc: BEGIN AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk AND w.isComparative AND NOT e.isExcludedFromAvailable - AND NOT t.daysInForward + AND NOT t.isRaid ) sub GROUP BY itemFk; @@ -121,7 +121,7 @@ proc: BEGIN AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk AND w.isComparative AND NOT e.isExcludedFromAvailable - AND NOT t.daysInForward + AND NOT t.isRaid UNION ALL SELECT b.itemFk, t.shipped, - b.quantity FROM buy b @@ -132,7 +132,7 @@ proc: BEGIN AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk AND w.isComparative AND NOT e.isExcludedFromAvailable - AND NOT t.daysInForward + AND NOT t.isRaid ) sub GROUP BY sub.itemFk, sub.dated; diff --git a/db/routines/vn/procedures/travelVolume_get.sql b/db/routines/vn/procedures/travelVolume_get.sql index bb98cacdf..ab24a6395 100644 --- a/db/routines/vn/procedures/travelVolume_get.sql +++ b/db/routines/vn/procedures/travelVolume_get.sql @@ -10,7 +10,7 @@ BEGIN JOIN vn.entry e ON e.travelFk = tr.id JOIN vn.buy b ON b.entryFk = e.id WHERE tr.landed BETWEEN vFromDated AND vToDated - AND NOT tr.daysInForward + AND NOT tr.isRaid AND tr.warehouseInFk = vWarehouseFk GROUP BY tr.landed , a.name ; END$$ diff --git a/db/routines/vn/procedures/travel_moveRaids.sql b/db/routines/vn/procedures/travel_moveRaids.sql index aa554a1a0..cf0fce23c 100644 --- a/db/routines/vn/procedures/travel_moveRaids.sql +++ b/db/routines/vn/procedures/travel_moveRaids.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`travel_moveRaids`() BEGIN /** * Desplaza los travels en el futuro y avisa a los compradores - * + * */ DECLARE vDone BOOL DEFAULT FALSE; DECLARE vBuyerEmail VARCHAR(40); @@ -11,21 +11,21 @@ BEGIN DECLARE vMailBody TEXT DEFAULT ''; DECLARE vCur CURSOR FOR - SELECT GROUP_CONCAT(DISTINCT - CONCAT('https://salix.verdnatura.es/#!/travel/', - ttm.travelFk, + SELECT GROUP_CONCAT(DISTINCT + CONCAT('https://salix.verdnatura.es/#!/travel/', + ttm.travelFk, '/summary ') ORDER BY ttm.travelFk SEPARATOR '\n\r') travelLink, CONCAT(u.name, '@verdnatura.es') buyerEmail FROM tTravelToMove ttm - JOIN entry e ON e.travelFk = ttm.travelFk + JOIN entry e ON e.travelFk = ttm.travelFk JOIN buy b ON b.entryFk = e.id JOIN item i ON i.id = b.itemFk JOIN itemType it ON it.id = i.typeFk JOIN account.user u ON u.id = it.workerFk GROUP BY u.name; - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN @@ -34,10 +34,11 @@ BEGIN END; CREATE OR REPLACE TEMPORARY TABLE tTravelToMove - SELECT id travelFk, + SELECT id travelFk, util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded FROM travel - WHERE daysInForward; + WHERE isRaid + AND daysInForward; START TRANSACTION; diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 3b999012f..1d0c26fc1 100644 --- a/db/routines/vn/triggers/entry_beforeUpdate.sql +++ b/db/routines/vn/triggers/entry_beforeUpdate.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`entry_beforeUpdate` BEFORE UPDATE ON `entry` FOR EACH ROW BEGIN - DECLARE vDaysInForward INT; + DECLARE vIsRaid BOOL; DECLARE vPrintedCount INT; DECLARE vHasDistinctWarehouses BOOL; DECLARE vTotalBuy INT; @@ -38,7 +38,7 @@ BEGIN CALL travel_throwAwb(NEW.travelFk); END IF; - SELECT daysInForward INTO vDaysInForward + SELECT isRaid INTO vIsRaid FROM travel t JOIN entry e ON e.travelFk = t.id WHERE entryFk = NEW.id; @@ -50,7 +50,7 @@ BEGIN WHERE o.id = OLD.travelFk AND n.id = NEW.travelFk; - IF vDaysInForward AND vHasDistinctWarehouses THEN + IF vIsRaid AND vHasDistinctWarehouses THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'A cloned entry cannot be moved to a travel with different warehouses'; END IF; diff --git a/db/routines/vn/views/itemEntryIn.sql b/db/routines/vn/views/itemEntryIn.sql index 6196e9396..60af585f2 100644 --- a/db/routines/vn/views/itemEntryIn.sql +++ b/db/routines/vn/views/itemEntryIn.sql @@ -6,7 +6,7 @@ AS SELECT `t`.`warehouseInFk` AS `warehouseInFk`, `b`.`itemFk` AS `itemFk`, `b`.`quantity` AS `quantity`, `t`.`isReceived` AS `isReceived`, - `t`.`daysInForward` AS `isVirtualStock`, + `t`.`isRaid` AS `isVirtualStock`, `e`.`id` AS `entryFk` FROM ( ( diff --git a/db/routines/vn/views/itemEntryOut.sql b/db/routines/vn/views/itemEntryOut.sql index f18116e61..4793ddbb8 100644 --- a/db/routines/vn/views/itemEntryOut.sql +++ b/db/routines/vn/views/itemEntryOut.sql @@ -15,5 +15,5 @@ FROM ( JOIN `vn`.`travel` `t` ON(`e`.`travelFk` = `t`.`id`) ) WHERE `e`.`isExcludedFromAvailable` = 0 - AND NOT `t`.`daysInForward` + AND NOT `t`.`isRaid` AND `b`.`quantity` <> 0 diff --git a/db/routines/vn/views/lastPurchases.sql b/db/routines/vn/views/lastPurchases.sql index 9dc5ec898..3dcaf8c1d 100644 --- a/db/routines/vn/views/lastPurchases.sql +++ b/db/routines/vn/views/lastPurchases.sql @@ -31,5 +31,5 @@ FROM ( LEFT JOIN `edi`.`ekt` `ek` ON(`ek`.`id` = `b`.`ektFk`) ) WHERE `tr`.`landed` BETWEEN `util`.`yesterday`() AND `util`.`tomorrow`() - AND NOT `tr`.`daysInForward` + AND NOT `tr`.`isRaid` AND `b`.`stickers` > 0 diff --git a/db/routines/vn2008/views/entrySource.sql b/db/routines/vn2008/views/entrySource.sql index 9c0c0f6ed..732603617 100644 --- a/db/routines/vn2008/views/entrySource.sql +++ b/db/routines/vn2008/views/entrySource.sql @@ -8,6 +8,7 @@ AS SELECT `e`.`gestDocFk` AS `gestdoc_id`, `e`.`isExcludedFromAvailable` AS `Inventario`, `e`.`isConfirmed` AS `Confirmada`, `e`.`isOrdered` AS `Pedida`, + `tr`.`isRaid` AS `isRaid`, `tr`.`daysInForward` AS `daysInForward`, `e`.`evaNotes` AS `notas`, `e`.`supplierFk` AS `Id_Proveedor`, diff --git a/db/routines/vn2008/views/travel.sql b/db/routines/vn2008/views/travel.sql index 0e1f5acb2..38dfd40ea 100644 --- a/db/routines/vn2008/views/travel.sql +++ b/db/routines/vn2008/views/travel.sql @@ -18,5 +18,6 @@ AS SELECT `t`.`id` AS `id`, `t`.`totalEntries` AS `totalEntries`, `t`.`appointment` AS `appointment`, `t`.`awbFk` AS `awbFk`, + `t`.`isRaid` AS `isRaid`, `t`.`daysInForward` AS `daysInForward` FROM `vn`.`travel` `t` diff --git a/db/routines/vn2008/views/v_compres.sql b/db/routines/vn2008/views/v_compres.sql index 324e459f6..633feb471 100644 --- a/db/routines/vn2008/views/v_compres.sql +++ b/db/routines/vn2008/views/v_compres.sql @@ -86,4 +86,4 @@ FROM ( ) WHERE NOT `W_IN`.`isFeedStock` AND NOT `E`.`Inventario` - AND NOT `TR`.`daysInForward` + AND NOT `TR`.`isRaid` diff --git a/db/versions/11332-tealErica/00-firstScript.sql b/db/versions/11332-tealErica/00-firstScript.sql new file mode 100644 index 000000000..9d87f6dea --- /dev/null +++ b/db/versions/11332-tealErica/00-firstScript.sql @@ -0,0 +1,4 @@ +ALTER TABLE vn.travel ADD isRaid tinyint(1) DEFAULT 0 NOT NULL COMMENT 'Redada'; + +ALTER TABLE vn.travel MODIFY COLUMN daysInForward int(10) unsigned DEFAULT NULL + COMMENT 'Cuando es una redada, indica el número de días que se añadirán a la fecha de hoy para establecer el landed'; diff --git a/modules/entry/back/locale/entry/en.yml b/modules/entry/back/locale/entry/en.yml index ab8c0fd1c..6bc2333e6 100644 --- a/modules/entry/back/locale/entry/en.yml +++ b/modules/entry/back/locale/entry/en.yml @@ -9,6 +9,7 @@ columns: notes: notes isConfirmed: confirmed isVirtual: virtual + isRaid: raid commission: commission isOrdered: price3 created: created diff --git a/modules/entry/back/locale/entry/es.yml b/modules/entry/back/locale/entry/es.yml index 18bf1ca33..a892b05d2 100644 --- a/modules/entry/back/locale/entry/es.yml +++ b/modules/entry/back/locale/entry/es.yml @@ -9,6 +9,7 @@ columns: notes: notas isConfirmed: confirmado isVirtual: virtual + isRaid: redada commission: comisión isOrdered: pedida created: creado diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index a5c236fe4..b23e44212 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -194,7 +194,7 @@ module.exports = Self => { e.evaNotes observation, e.isConfirmed, e.isOrdered, - t.daysInForward, + t.isRaid, e.commission, e.created, e.travelFk, diff --git a/modules/entry/back/methods/entry/getEntry.js b/modules/entry/back/methods/entry/getEntry.js index 4612de9a5..92be9a9dd 100644 --- a/modules/entry/back/methods/entry/getEntry.js +++ b/modules/entry/back/methods/entry/getEntry.js @@ -49,8 +49,8 @@ module.exports = Self => { 'isReceived', 'isDelivered', 'ref', - 'daysInForward', - ], + 'isRaid', + 'daysInForward'], include: [ { relation: 'agency', diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 4a09c7d6a..e2da2c629 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -33,6 +33,9 @@ "isConfirmed": { "type": "boolean" }, + "isRaid": { + "type": "boolean" + }, "commission": { "type": "number" }, diff --git a/modules/entry/front/descriptor/index.html b/modules/entry/front/descriptor/index.html index 40625a4d5..957bcafb5 100644 --- a/modules/entry/front/descriptor/index.html +++ b/modules/entry/front/descriptor/index.html @@ -30,7 +30,7 @@ + ng-if="$ctrl.entryData.travel.isRaid">