From 33f1ed360b7dc91ec7e5c453e6b693edf3d69aef Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 23 May 2024 12:16:12 +0200 Subject: [PATCH 001/135] 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 592ed11e60..d22fa0804e 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 155597bf857c1c61c49d35449d803fed519f7d8f Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 2 Sep 2024 13:36:03 +0200 Subject: [PATCH 002/135] 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 51195be484..0000000000 --- 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 3bad183037..0000000000 --- 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 6013094e95..0000000000 --- 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 f13cf9aa48..0000000000 --- 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 1671cc5d28..0000000000 --- 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 36c9c39ae2..0000000000 --- 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 c20be9ebcd..0000000000 --- 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 9b30747760..0000000000 --- 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 6e0a4bd5c8..0000000000 --- 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 c88fbd337e..0000000000 --- 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 eb9ed25732..0000000000 --- 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 e0f3a1b45b..0000000000 --- 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 f36138e18e..0000000000 --- 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 8d6cb3af82..0000000000 --- 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 4ceb87b9da..0000000000 --- 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 af76d59668..0000000000 --- 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 5a303f15fc..0000000000 --- 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 274453d309..0000000000 --- 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 fc490e4481..0000000000 --- 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 2388f4e8f1..0000000000 --- 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 8ade0fd9d5..0000000000 --- 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 afec83cfdb..0000000000 --- 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 e1234bd718..0000000000 --- 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 330d274c01..0000000000 --- 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 2fe42fd047..0000000000 --- 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 6ebce3d36b..0000000000 --- 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 b284abf06a..0000000000 --- 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 4ca5f8f9f0..0000000000 --- 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 9e54988d7d..0000000000 --- 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 041826e1c2..0000000000 --- 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 7fb3b870e0..0000000000 --- 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 3d86b0b60a..0000000000 --- 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 df5936871c..0000000000 --- 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 e3584be23a..0000000000 --- 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 250ca07abf..0000000000 --- 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 347e65571f..0000000000 --- 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 0882eb5ac4..0000000000 --- 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 597bc108e8..0000000000 --- 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 06e5e6b26c..0000000000 --- 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 e386033dd2..0000000000 --- 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 f1f6e1419f..0000000000 --- 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 fe6788e9cb..0000000000 --- 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 ae24da60b0..0000000000 --- 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 6dacf96c9e..0000000000 --- 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 f70ec2f50b..0000000000 --- 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 354477d4d4..fb1aacd398 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 6f5cce7c0f..0000000000 --- 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 2bcc2302a6..0000000000 --- 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 18abde5810..0000000000 --- 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 0d72edd28a..0000000000 --- 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 5d56b5f346..0000000000 --- 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 e9fd9f9350..0000000000 --- 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 fa7a705440..0000000000 --- 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 b8584039b8..0000000000 --- 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 55df1c27dd..0000000000 --- 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 006363cfa1..0000000000 --- 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 1417a05ab0..0000000000 --- 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 ec280fdf81..0000000000 --- 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 80af6088e0..0000000000 --- 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 fa6b37340e..0000000000 --- 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 ab2314bb91..0000000000 --- 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 44cb5183de..0000000000 --- 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 ccf7744be8..0000000000 --- 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 4b000df9a4..0000000000 --- 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 5a0e8ed490..0000000000 --- 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 9322c599ac..0000000000 --- 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 5dcbe40978..0000000000 --- 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 50b9eb1722..0000000000 --- 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 54ecba9976..0000000000 --- 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 887c03f7fa..0000000000 --- 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 1a71ff2122..0000000000 --- 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 faba696c00..0000000000 --- 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 0dea00abb3..0000000000 --- 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 dcb14ec0ea..0000000000 --- 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 7aceac46f6..0000000000 --- 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 4aa7629006..0000000000 --- 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 17a439c39b..0000000000 --- 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 d003c8f385..0000000000 --- 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 7645de8b14..0000000000 --- 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 8f4cef70ff..0000000000 --- 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 e3b84655c8..0000000000 --- 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 a5f1f4d9d9..0000000000 --- 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 f2917bb631..0000000000 --- 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 44d1257587..e69de29bb2 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 1d99c91a10..33e5822c36 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 6a51a429d6..0000000000 --- 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 556bdd8747..0000000000 --- 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 56c76eabf0..0000000000 --- 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 8d5276194c..0000000000 --- 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 03c8db8eca..0000000000 --- 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 747cbeff2f..0000000000 --- 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 aadeaddcaf..0000000000 --- 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 c61a001302..0000000000 --- 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 59612bbd63..0000000000 --- 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 4b7cd1490d..3d04e1c8b2 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 33f141b18b..0000000000 --- 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 2448728be0..0000000000 --- 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 39b5b7aa5b..0000000000 --- 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 67a5200d7e..0000000000 --- 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 0e4cfc9558..0000000000 --- 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 e17a6a8c4d..0000000000 --- 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 d7821bea01..0000000000 --- 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 0ec2087209..0000000000 --- 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 80988c4917..0000000000 --- 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 d047f3e36c..0000000000 --- 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 f9b5370fa7..0000000000 --- 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 2c3b39d452..0000000000 --- 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 8b4b8596b4..0000000000 --- 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 78858704fb..0000000000 --- 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 2d70414ab3..0000000000 --- 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 9565a861de..0000000000 --- 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 7fb3b870e0..0000000000 --- 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 86d9d37781..0000000000 --- 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 36fac33114..0000000000 --- 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 b9cd33dec6..0000000000 --- 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 7c3d02817e475959a924a1d45e820ef9028cc482 Mon Sep 17 00:00:00 2001 From: carlossa Date: Wed, 2 Oct 2024 11:59:55 +0200 Subject: [PATCH 003/135] 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 ad0975889b..0000000000 --- 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 d9689e31ad..0000000000 --- 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 cf37f9ff1f..0000000000 --- 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 4e80050438..0000000000 --- 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 1e6a0a173c..0000000000 --- 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 5cfc1c9d43..0000000000 --- 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 77f0e0459c..0000000000 --- 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 ab2aa85b2e..0000000000 --- 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 370d422e63..0000000000 --- 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 1b580aec2b..0000000000 --- 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 95a114c458..0000000000 --- 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 50df235822..0000000000 --- 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 1f9c0c40a3..0000000000 --- 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 51ead64615..0000000000 --- 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 a6017e4546..0000000000 --- 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 e1da2df44c..0000000000 --- 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 9c55184243..0000000000 --- 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 be2ac43381..0000000000 --- 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 ae23c9c999..0000000000 --- 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 60bb9c38df..0000000000 --- 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 0e5b5e0c33..0000000000 --- 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 ea84cb6ebe..627be5122f 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 06296e7bd5fff378be03592e7a2048e813cd0c0b Mon Sep 17 00:00:00 2001 From: robert Date: Wed, 2 Oct 2024 13:39:10 +0200 Subject: [PATCH 004/135] feat: refs #8071 travel_weeklyClone --- db/routines/vn/procedures/travel_cloneWithEntries.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/travel_cloneWithEntries.sql b/db/routines/vn/procedures/travel_cloneWithEntries.sql index ee26aea320..0199c452f3 100644 --- a/db/routines/vn/procedures/travel_cloneWithEntries.sql +++ b/db/routines/vn/procedures/travel_cloneWithEntries.sql @@ -62,7 +62,7 @@ BEGIN END IF; CALL entry_cloneHeader(vAuxEntryFk, vNewEntryFk, vNewTravelFk); - CALL entry_copyBuys(vAuxEntryFk, vNewEntryFk); + CALL entry_copyBuys(vAuxEntryFk, vNewEntryFk); SELECT evaNotes INTO vEvaNotes FROM entry @@ -71,6 +71,8 @@ BEGIN UPDATE entry SET evaNotes = vEvaNotes WHERE id = vNewEntryFk; + + CALL vn.buy_recalcPricesByEntry(vNewEntryFk); END LOOP; SET @isModeInventory = FALSE; From 78a9b788bf3d77ca736694d4f3fadc259cde69e7 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 14 Oct 2024 08:42:54 +0200 Subject: [PATCH 005/135] feat: refs #7006 itemTypeLog created --- .../vn/triggers/itemType_afterDelete.sql | 12 ++++++++++ .../vn/triggers/itemType_beforeInsert.sql | 8 +++++++ .../vn/triggers/itemType_beforeUpdate.sql | 1 + .../triggers/productionConfig_afterDelete.sql | 2 +- .../11297-graySalal/00-firstScript.sql | 24 +++++++++++++++++++ modules/item/back/models/item-type-log.json | 9 +++++++ 6 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 db/routines/vn/triggers/itemType_afterDelete.sql create mode 100644 db/routines/vn/triggers/itemType_beforeInsert.sql create mode 100644 db/versions/11297-graySalal/00-firstScript.sql create mode 100644 modules/item/back/models/item-type-log.json diff --git a/db/routines/vn/triggers/itemType_afterDelete.sql b/db/routines/vn/triggers/itemType_afterDelete.sql new file mode 100644 index 0000000000..32a1ba31c9 --- /dev/null +++ b/db/routines/vn/triggers/itemType_afterDelete.sql @@ -0,0 +1,12 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemType_afterDelete` + AFTER DELETE ON `itemType` + FOR EACH ROW +BEGIN + INSERT INTO itemTypeLog + SET `action` = 'delete', + `changedModel` = 'ItemType', + `changedModelId` = OLD.id, + `userFk` = account.myUser_getId(); +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/itemType_beforeInsert.sql b/db/routines/vn/triggers/itemType_beforeInsert.sql new file mode 100644 index 0000000000..d33d8fb56a --- /dev/null +++ b/db/routines/vn/triggers/itemType_beforeInsert.sql @@ -0,0 +1,8 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemType_beforeInsert` + BEFORE INSERT ON `itemType` + FOR EACH ROW +BEGIN + SET NEW.editorFk = account.myUser_getId(); +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/itemType_beforeUpdate.sql b/db/routines/vn/triggers/itemType_beforeUpdate.sql index 613ae8bfa3..6a03d40d0f 100644 --- a/db/routines/vn/triggers/itemType_beforeUpdate.sql +++ b/db/routines/vn/triggers/itemType_beforeUpdate.sql @@ -3,6 +3,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`itemType_beforeUpdate` BEFORE UPDATE ON `itemType` FOR EACH ROW BEGIN + SET NEW.editorFk = account.myUser_getId(); IF NEW.itemPackingTypeFk = '' THEN SET NEW.itemPackingTypeFk = NULL; diff --git a/db/routines/vn/triggers/productionConfig_afterDelete.sql b/db/routines/vn/triggers/productionConfig_afterDelete.sql index 6b6800d4f0..bd485d590d 100644 --- a/db/routines/vn/triggers/productionConfig_afterDelete.sql +++ b/db/routines/vn/triggers/productionConfig_afterDelete.sql @@ -3,7 +3,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`productionConfig_afterD AFTER DELETE ON `productionConfig` FOR EACH ROW BEGIN - INSERT INTO productionConfig + INSERT INTO productionConfigLog SET `action` = 'delete', `changedModel` = 'ProductionConfig', `changedModelId` = OLD.id, diff --git a/db/versions/11297-graySalal/00-firstScript.sql b/db/versions/11297-graySalal/00-firstScript.sql new file mode 100644 index 0000000000..d6aeb1ec25 --- /dev/null +++ b/db/versions/11297-graySalal/00-firstScript.sql @@ -0,0 +1,24 @@ +ALTER TABLE vn.itemType + ADD editorFk int(10) unsigned DEFAULT NULL NULL, + ADD CONSTRAINT itemType_user_FK FOREIGN KEY (editorFk) REFERENCES account.`user`(id); + +CREATE TABLE `vn`.`itemTypeLog` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `originFk` int(11) DEFAULT NULL, + `userFk` int(10) unsigned DEFAULT NULL, + `action` set('insert','update','delete') NOT NULL, + `creationDate` timestamp NULL DEFAULT current_timestamp(), + `description` text CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL, + `changedModel` enum('ItemType') NOT NULL DEFAULT 'ItemType', + `oldInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`oldInstance`)), + `newInstance` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL CHECK (json_valid(`newInstance`)), + `changedModelId` int(11) NOT NULL, + `changedModelValue` varchar(45) DEFAULT NULL, + `summaryId` varchar(30) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `itemTypeLogUserFk_idx` (`userFk`), + KEY `itemTypeLog_changedModel` (`changedModel`,`changedModelId`,`creationDate`), + KEY `itemTypeLog_originFk` (`originFk`,`creationDate`), + KEY `itemTypeLog_creationDate_IDX` (`creationDate` DESC) USING BTREE, + CONSTRAINT `itemTypeLogUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci `PAGE_COMPRESSED`=1; diff --git a/modules/item/back/models/item-type-log.json b/modules/item/back/models/item-type-log.json new file mode 100644 index 0000000000..61e27e9ba1 --- /dev/null +++ b/modules/item/back/models/item-type-log.json @@ -0,0 +1,9 @@ +{ + "name": "ItemTypeLog", + "base": "Log", + "options": { + "mysql": { + "table": "ItemTypeLog" + } + } +} From 6c621726334adf2a4e93816c7dfceac28f9a6009 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 14 Oct 2024 09:31:35 +0200 Subject: [PATCH 006/135] feat: refs #7006 itemTypeLog created --- db/versions/11297-graySalal/00-firstScript.sql | 3 +++ modules/item/back/model-config.json | 3 +++ modules/item/back/models/item-type-log.json | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/db/versions/11297-graySalal/00-firstScript.sql b/db/versions/11297-graySalal/00-firstScript.sql index d6aeb1ec25..372af804c9 100644 --- a/db/versions/11297-graySalal/00-firstScript.sql +++ b/db/versions/11297-graySalal/00-firstScript.sql @@ -22,3 +22,6 @@ CREATE TABLE `vn`.`itemTypeLog` ( KEY `itemTypeLog_creationDate_IDX` (`creationDate` DESC) USING BTREE, CONSTRAINT `itemTypeLogUserFk` FOREIGN KEY (`userFk`) REFERENCES `account`.`user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci `PAGE_COMPRESSED`=1; + +INSERT IGNORE INTO salix.ACL (model,property,principalId) + VALUES ('ItemTypeLog','*','employee'); diff --git a/modules/item/back/model-config.json b/modules/item/back/model-config.json index 5dbe4d62a4..dcd9735249 100644 --- a/modules/item/back/model-config.json +++ b/modules/item/back/model-config.json @@ -47,6 +47,9 @@ "ItemType": { "dataSource": "vn" }, + "ItemTypeLog": { + "dataSource": "vn" + }, "ItemTypeTag": { "dataSource": "vn" }, diff --git a/modules/item/back/models/item-type-log.json b/modules/item/back/models/item-type-log.json index 61e27e9ba1..82a218aa63 100644 --- a/modules/item/back/models/item-type-log.json +++ b/modules/item/back/models/item-type-log.json @@ -3,7 +3,7 @@ "base": "Log", "options": { "mysql": { - "table": "ItemTypeLog" + "table": "itemTypeLog" } } } From de0fe37ffe978118101fdd2c34615b103ec84da7 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 16 Oct 2024 16:16:51 +0200 Subject: [PATCH 007/135] feat: refs #8083 add prop --- modules/ticket/back/models/expedition.json | 117 +++++++++++---------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/modules/ticket/back/models/expedition.json b/modules/ticket/back/models/expedition.json index 2dcca1e87a..f3f912ec30 100644 --- a/modules/ticket/back/models/expedition.json +++ b/modules/ticket/back/models/expedition.json @@ -1,63 +1,66 @@ { - "name": "Expedition", - "base": "VnModel", - "mixins": { - "Loggable": true + "name": "Expedition", + "base": "VnModel", + "mixins": { + "Loggable": true + }, + "options": { + "mysql": { + "table": "expedition" + } + }, + "properties": { + "id": { + "id": true, + "type": "number", + "description": "Identifier" }, - "options": { - "mysql": { - "table": "expedition" - } + "freightItemFk": { + "type": "number" }, - "properties": { - "id": { - "id": true, - "type": "number", - "description": "Identifier" - }, - "freightItemFk": { - "type": "number" - }, - "created": { - "type": "date" - }, - "counter": { - "type": "number" - }, - "externalId": { - "type": "string" - } + "created": { + "type": "date" }, - "relations": { - "ticket": { - "type": "belongsTo", - "model": "Ticket", - "foreignKey": "ticketFk" - }, - "agencyMode": { - "type": "belongsTo", - "model": "AgencyMode", - "foreignKey": "agencyModeFk" - }, - "worker": { - "type": "belongsTo", - "model": "Worker", - "foreignKey": "workerFk" - }, - "packages": { - "type": "hasMany", - "model": "TicketPackaging", - "foreignKey": "ticketFk" - }, - "freightItem": { - "type": "belongsTo", - "model": "Item", - "foreignKey": "freightItemFk" - }, - "packaging": { - "type": "belongsTo", - "model": "Package", - "foreignKey": "packagingFk" - } + "counter": { + "type": "number" + }, + "externalId": { + "type": "string" + }, + "stateTypeFk": { + "type": "number" + } + }, + "relations": { + "ticket": { + "type": "belongsTo", + "model": "Ticket", + "foreignKey": "ticketFk" + }, + "agencyMode": { + "type": "belongsTo", + "model": "AgencyMode", + "foreignKey": "agencyModeFk" + }, + "worker": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerFk" + }, + "packages": { + "type": "hasMany", + "model": "TicketPackaging", + "foreignKey": "ticketFk" + }, + "freightItem": { + "type": "belongsTo", + "model": "Item", + "foreignKey": "freightItemFk" + }, + "packaging": { + "type": "belongsTo", + "model": "Package", + "foreignKey": "packagingFk" } } +} \ 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 008/135] 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 ea84cb6ebe..0f64577544 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 9308fd4ec7..8118b6f652 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 a6648b1864..5bc98c3ddc 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 a43f0e7806..91dc372c39 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 affa53a55a..5b5fe8701d 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 009/135] 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 0f64577544..ea84cb6ebe 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 8118b6f652..9308fd4ec7 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 5bc98c3ddc..3f6cc69e7c 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 91dc372c39..a43f0e7806 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 5b5fe8701d..844adb51e9 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 7e0f19b368c796def55b3ebcb070535ff79c2f78 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 18 Oct 2024 08:21:09 +0200 Subject: [PATCH 010/135] 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 4a19f4e634..898ac85210 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 e2de2a4a5c..8db28f97d2 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 34deba406bbb8d6792a5334cb4c0367fe43b35a2 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 18 Oct 2024 12:59:52 +0200 Subject: [PATCH 011/135] feat: refs #7266 First commit --- .../reports/item-label/assets/css/style.css | 113 +++++------------- .../reports/item-label/item-label.html | 66 +++++----- 2 files changed, 68 insertions(+), 111 deletions(-) diff --git a/print/templates/reports/item-label/assets/css/style.css b/print/templates/reports/item-label/assets/css/style.css index 1101604b91..0dea5a9e41 100644 --- a/print/templates/reports/item-label/assets/css/style.css +++ b/print/templates/reports/item-label/assets/css/style.css @@ -1,88 +1,37 @@ -* { - box-sizing: border-box; +html { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + font-size: 12px; } -.label { - font-size: 1.2em; -} - -.barcode { - float: left; - width: 40%; -} - -.barcode h1 { - text-align: center; - font-size: 1.8em; - margin: 0 0 10px 0 -} - -.barcode .image { - text-align: center -} - -.barcode .image img { - width: 170px -} - -.data { - float: left; - width: 60%; -} - -.data .header { - background-color: #000; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - margin-bottom: 25px; - text-align: right; - font-size: 1.2em; - padding: 0.2em; - color: #FFF -} - -.data .color, -.data .producer { - text-transform: uppercase; - text-align: right; - font-size: 1.5em; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; -} - -.data .producer { - text-justify: inter-character; -} - -.data .details { - border-top: 4px solid #000; - padding-top: 2px; -} - -.data .details .package { - padding-right: 5px; - float: left; +table { width: 50%; + font-size: 12px; + float: right; } - -.package .packing, -.package .dated, -.package .labelNumber { - text-align: right +td { + border: 3px solid white; } - -.package .packing { - font-size: 1.8em; - font-weight: 400 -} - -.data .details .size { - background-color: #000; +.center { text-align: center; - font-size: 3em; - padding: 0.2em 0; - float: left; - width: 50%; - color: #FFF +} +.cursive { + font-style: italic; +} +.bold { + font-weight: bold; +} +.black { + background-color: black; + color: white; +} +.md { + font-size: 18px; +} +.xl { + font-size: 36px; +} +.border-black { + border: 2px solid #000000; +} +.regular-with { + width: 60px; } \ No newline at end of file diff --git a/print/templates/reports/item-label/item-label.html b/print/templates/reports/item-label/item-label.html index 66509ab384..e2526fc6b8 100644 --- a/print/templates/reports/item-label/item-label.html +++ b/print/templates/reports/item-label/item-label.html @@ -1,29 +1,37 @@ - - -
-
-

{{item.id}}

-
- -
-
-
-
{{item.name}}
-
{{tags.color}}
-
{{tags.producer}}
-
-
-
{{packing()}}
-
{{formatDate(new Date(), '%W/%d')}}
-
{{labelPage}}
-
-
{{item.size}}
-
-
-
- -
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
1
EUC Cinerea60
Color: LIV150
Origen: VCL
Productor: L'Arenal
Comprador: ATJF:42/11 / 50
Entrada: 358799
E622/2
+ + \ No newline at end of file From 2b05e8c48e4c2dae7920fdbff21a178767d84f89 Mon Sep 17 00:00:00 2001 From: jgallego Date: Mon, 21 Oct 2024 13:29:33 +0200 Subject: [PATCH 012/135] feat: refs #7943 quitar lectura en metodos comunes --- db/routines/salix/triggers/ACL_beforeInsert.sql | 3 +++ db/versions/11314-redTulip/00-restrictedAsterisk.sql | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 db/versions/11314-redTulip/00-restrictedAsterisk.sql diff --git a/db/routines/salix/triggers/ACL_beforeInsert.sql b/db/routines/salix/triggers/ACL_beforeInsert.sql index 94fb51adac..cb0b5761b2 100644 --- a/db/routines/salix/triggers/ACL_beforeInsert.sql +++ b/db/routines/salix/triggers/ACL_beforeInsert.sql @@ -4,5 +4,8 @@ CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `salix`.`ACL_beforeInsert` FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + IF NEW.`property` = '*' THEN + CALL util.throw('The property field cannot be *'); + END IF; END$$ DELIMITER ; diff --git a/db/versions/11314-redTulip/00-restrictedAsterisk.sql b/db/versions/11314-redTulip/00-restrictedAsterisk.sql new file mode 100644 index 0000000000..20f1b43803 --- /dev/null +++ b/db/versions/11314-redTulip/00-restrictedAsterisk.sql @@ -0,0 +1,3 @@ +DELETE FROM `salix`.`ACL` +WHERE `model` = 'Worker' + AND `property` IN ('find', 'findById', 'findOne'); From bf2d7541a5c956ba48a7f9a8c31553f36ce74418 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 21 Oct 2024 14:57:55 +0200 Subject: [PATCH 013/135] feat: refs #7266 Item label QR --- db/dump/.dump/data.sql | 2 +- loopback/locale/es.json | 4 +- .../item/{labelPdf.js => itemLabelQr.js} | 27 ++--- modules/item/back/models/item.js | 2 +- .../assets/css/import.js | 0 .../item-label-qr/assets/css/style.css | 87 ++++++++++++++ .../reports/item-label-qr/item-label-qr.html | 112 ++++++++++++++++++ .../reports/item-label-qr/item-label-qr.js | 43 +++++++ .../reports/item-label-qr/locale/es.yml | 1 + .../options.json | 2 +- .../reports/item-label-qr/sql/item.sql | 42 +++++++ .../reports/item-label/assets/css/style.css | 37 ------ .../reports/item-label/item-label.html | 37 ------ .../reports/item-label/item-label.js | 58 --------- .../reports/item-label/locale/es.yml | 1 - .../templates/reports/item-label/sql/item.sql | 14 --- .../reports/item-label/sql/itemTags.sql | 4 - 17 files changed, 298 insertions(+), 175 deletions(-) rename modules/item/back/methods/item/{labelPdf.js => itemLabelQr.js} (62%) rename print/templates/reports/{item-label => item-label-qr}/assets/css/import.js (100%) create mode 100644 print/templates/reports/item-label-qr/assets/css/style.css create mode 100644 print/templates/reports/item-label-qr/item-label-qr.html create mode 100755 print/templates/reports/item-label-qr/item-label-qr.js create mode 100644 print/templates/reports/item-label-qr/locale/es.yml rename print/templates/reports/{item-label => item-label-qr}/options.json (86%) create mode 100644 print/templates/reports/item-label-qr/sql/item.sql delete mode 100644 print/templates/reports/item-label/assets/css/style.css delete mode 100644 print/templates/reports/item-label/item-label.html delete mode 100755 print/templates/reports/item-label/item-label.js delete mode 100644 print/templates/reports/item-label/locale/es.yml delete mode 100644 print/templates/reports/item-label/sql/item.sql delete mode 100644 print/templates/reports/item-label/sql/itemTags.sql diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index ca254055bb..315bfe7c52 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -1723,7 +1723,7 @@ INSERT INTO `ACL` VALUES (378,'OsTicket','osTicketReportEmail','WRITE','ALLOW',' INSERT INTO `ACL` VALUES (379,'Item','buyerWasteEmail','WRITE','ALLOW','ROLE','system',NULL); INSERT INTO `ACL` VALUES (380,'Claim','claimPickupPdf','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (381,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','claimManager',NULL); -INSERT INTO `ACL` VALUES (382,'Item','labelPdf','READ','ALLOW','ROLE','employee',NULL); +INSERT INTO `ACL` VALUES (382,'Item','itemLabelQr','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (383,'Sector','*','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (384,'Sector','*','WRITE','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (385,'Route','driverRoutePdf','READ','ALLOW','ROLE','employee',NULL); diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 6d50f634e2..8e758d1ab1 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -383,5 +383,5 @@ "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", - "There are tickets for this area, delete them first": "Hay tickets para esta sección, borralos primero" -} + "There are tickets for this area, delete them first": "Hay tickets para esta sección, borralos primero" +} \ No newline at end of file diff --git a/modules/item/back/methods/item/labelPdf.js b/modules/item/back/methods/item/itemLabelQr.js similarity index 62% rename from modules/item/back/methods/item/labelPdf.js rename to modules/item/back/methods/item/itemLabelQr.js index d7a50397e7..8d92d51e86 100644 --- a/modules/item/back/methods/item/labelPdf.js +++ b/modules/item/back/methods/item/itemLabelQr.js @@ -1,5 +1,5 @@ module.exports = Self => { - Self.remoteMethodCtx('labelPdf', { + Self.remoteMethodCtx('itemLabelQr', { description: 'Returns the item label pdf', accessType: 'READ', accepts: [ @@ -11,26 +11,15 @@ module.exports = Self => { http: {source: 'path'} }, { - arg: 'recipientId', + arg: 'copies', type: 'number', - description: 'The recipient id', required: false - }, - { - arg: 'warehouseId', + }, { + arg: 'userId', type: 'number', - description: 'The warehouse id', + description: 'The user id from accessToken', + http: ctx => ctx.req.accessToken.userId, required: true - }, - { - arg: 'labelNumber', - type: 'number', - required: false - }, - { - arg: 'totalLabels', - type: 'number', - required: false } ], returns: [ @@ -49,11 +38,11 @@ module.exports = Self => { } ], http: { - path: '/:id/label-pdf', + path: '/:id/item-label-qr', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.labelPdf = (ctx, id) => Self.printReport(ctx, id, 'item-label'); + Self.itemLabelQr = (ctx, id) => Self.printReport(ctx, id, 'item-label-qr'); }; diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js index e715ab4313..4fb9af8fa6 100644 --- a/modules/item/back/models/item.js +++ b/modules/item/back/models/item.js @@ -15,7 +15,7 @@ module.exports = Self => { require('../methods/item/getWasteByItem')(Self); require('../methods/item/createIntrastat')(Self); require('../methods/item/buyerWasteEmail')(Self); - require('../methods/item/labelPdf')(Self); + require('../methods/item/itemLabelQr')(Self); require('../methods/item/setVisibleDiscard')(Self); require('../methods/item/get')(Self); diff --git a/print/templates/reports/item-label/assets/css/import.js b/print/templates/reports/item-label-qr/assets/css/import.js similarity index 100% rename from print/templates/reports/item-label/assets/css/import.js rename to print/templates/reports/item-label-qr/assets/css/import.js diff --git a/print/templates/reports/item-label-qr/assets/css/style.css b/print/templates/reports/item-label-qr/assets/css/style.css new file mode 100644 index 0000000000..b868f39662 --- /dev/null +++ b/print/templates/reports/item-label-qr/assets/css/style.css @@ -0,0 +1,87 @@ +html { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + margin-top: -7px; +} +.leftTable { + width: 47%; + font-size: 12px; + float: left; + text-align: center; +} +.leftTable img { + width: 110px; +} +.rightTable { + width: 53%; + font-size: 14px; + float: right; +} +.rightTable td { + border: 3px solid white; +} +.center { + text-align: center; +} +.cursive { + font-style: italic; +} +.bold { + font-weight: bold; +} +.black-bg { + background-color: black; + color: white; +} +.md-txt { + font-size: 20px; +} +.xl-txt { + font-size: 36px; +} +.cell { + border: 2px solid black; + box-sizing: content-box; + width: 100%; + height: 30px; + display: flex; + justify-content: center; + align-items: center; +} +.padding { + padding: 7px; +} +.md-height { + height: 60px; + max-height: 60px; +} +.xs-width { + width: 60px; + max-width: 60px; +} +.sm-width { + width: 140px; + max-width: 140px; +} +.md-width { + width: 200px; + max-width: 200px; +} +.lg-width { + width: 270px; + max-width: 270px; +} +.overflow-multiline { + max-height: inherit; + display: -webkit-box; + overflow: hidden; + word-wrap: break-word; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.overflow-line { + width: inherit; + max-width: inherit; + overflow: hidden; + white-space: nowrap; +} \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/item-label-qr/item-label-qr.html new file mode 100644 index 0000000000..3b61e1542a --- /dev/null +++ b/print/templates/reports/item-label-qr/item-label-qr.html @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + +
+ + + +
+ {{item.buyFk}} +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ {{item.itemFk}} +
+
+
+ {{item.item}} +
+
+
+ {{item.size}} +
+
+
+ Color: {{item.inkFk}} +
+
+
+ {{item.packing}} +
+
+
+ {{item.stems}} +
+
+
+ Origen: {{item.origin}} +
+
+
+ Productor: {{item.producer}} +
+
+
+ Comprador: {{item.buyerName}} +
+
+
+ F: {{date}} +
+
+
+ {{`${item.labelNum} / ${totalPages}`}} +
+
+
+ Entrada: {{item.entryFk}} +
+
+
+ {{item.comment}} +
+
+ + \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/item-label-qr.js b/print/templates/reports/item-label-qr/item-label-qr.js new file mode 100755 index 0000000000..99744b0bd7 --- /dev/null +++ b/print/templates/reports/item-label-qr/item-label-qr.js @@ -0,0 +1,43 @@ +const UserError = require('vn-loopback/util/user-error'); +const moment = require('moment'); +const qrcode = require('qrcode'); + +module.exports = { + name: 'item-label-qr', + async serverPrefetch() { + this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.id]); + if (!this.items.length) throw new UserError(`Empty data source`); + this.qr = await this.getQr(this.items[0].buyFk); + this.vnDate = Date.vnNew(); + this.date = moment(this.vnDate).format('YY/DD'); + this.totalPages = this.items.length; + }, + methods: { + getQr(data) { + data = { + company: 'vnl', + user: this.userId, + created: this.vnDate, + table: 'buy', + id: data + }; + return qrcode.toDataURL(JSON.stringify(data), { + margin: 0, + errorCorrectionLevel: 'H' + }); + } + }, + props: { + id: { + type: Number, + required: true, + description: 'The item id' + }, + copies: { + type: Number + }, + userId: { + type: Number + } + } +}; diff --git a/print/templates/reports/item-label-qr/locale/es.yml b/print/templates/reports/item-label-qr/locale/es.yml new file mode 100644 index 0000000000..81dbc18771 --- /dev/null +++ b/print/templates/reports/item-label-qr/locale/es.yml @@ -0,0 +1 @@ +reportName: Etiqueta de artículo QR \ No newline at end of file diff --git a/print/templates/reports/item-label/options.json b/print/templates/reports/item-label-qr/options.json similarity index 86% rename from print/templates/reports/item-label/options.json rename to print/templates/reports/item-label-qr/options.json index 98c5788b1f..5a3c3b1ebb 100644 --- a/print/templates/reports/item-label/options.json +++ b/print/templates/reports/item-label-qr/options.json @@ -2,7 +2,7 @@ "width": "10.4cm", "height": "4.8cm", "margin": { - "top": "0cm", + "top": "0.17cm", "right": "0cm", "bottom": "0cm", "left": "0cm" diff --git a/print/templates/reports/item-label-qr/sql/item.sql b/print/templates/reports/item-label-qr/sql/item.sql new file mode 100644 index 0000000000..11ee60d1ad --- /dev/null +++ b/print/templates/reports/item-label-qr/sql/item.sql @@ -0,0 +1,42 @@ +WITH RECURSIVE numbers AS ( + SELECT 1 n + UNION ALL + SELECT n + 1 + FROM numbers + WHERE n < ? +) +SELECT ROW_NUMBER() OVER() labelNum, + b.id buyFk, + b.itemFk, + b.quantity, + b.packing, + b.isPickedOff, + b.entryFk, + e.sub, + o.code origin, + COALESCE(p.`name`, p.id, '') producer, + i.name item, + i.`size`, + i.category, + i.stems, + i.inkFk, + IFNULL(CONCAT(ig.longName, ' ', ig.`size`, ' ', ig.subName), i.comment) comment, + i.typeFk, + i.isLaid, + w.code buyerName, + w.code, + s.company_name companyName, + t.shipped + FROM vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk + LEFT JOIN edi.ekt e ON e.id = b.ektFk + JOIN vn.origin o ON o.id = i.originFk + LEFT JOIN vn.producer p ON p.id = i.producerFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.worker w ON w.id = it.workerFk + LEFT JOIN edi.supplier s ON s.supplier_id = e.pro + JOIN vn.entry e2 ON e2.id = b.entryFk + JOIN vn.travel t ON t.id = e2.travelFk + JOIN numbers num + WHERE b.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label/assets/css/style.css b/print/templates/reports/item-label/assets/css/style.css deleted file mode 100644 index 0dea5a9e41..0000000000 --- a/print/templates/reports/item-label/assets/css/style.css +++ /dev/null @@ -1,37 +0,0 @@ -html { - font-family: "Roboto", "Helvetica", "Arial", sans-serif; - font-size: 12px; -} -table { - width: 50%; - font-size: 12px; - float: right; -} -td { - border: 3px solid white; -} -.center { - text-align: center; -} -.cursive { - font-style: italic; -} -.bold { - font-weight: bold; -} -.black { - background-color: black; - color: white; -} -.md { - font-size: 18px; -} -.xl { - font-size: 36px; -} -.border-black { - border: 2px solid #000000; -} -.regular-with { - width: 60px; -} \ No newline at end of file diff --git a/print/templates/reports/item-label/item-label.html b/print/templates/reports/item-label/item-label.html deleted file mode 100644 index e2526fc6b8..0000000000 --- a/print/templates/reports/item-label/item-label.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1
EUC Cinerea60
Color: LIV150
Origen: VCL
Productor: L'Arenal
Comprador: ATJF:42/11 / 50
Entrada: 358799
E622/2
- - \ No newline at end of file diff --git a/print/templates/reports/item-label/item-label.js b/print/templates/reports/item-label/item-label.js deleted file mode 100755 index c5b9cdfd79..0000000000 --- a/print/templates/reports/item-label/item-label.js +++ /dev/null @@ -1,58 +0,0 @@ -const vnReport = require('../../../core/mixins/vn-report.js'); -const qrcode = require('qrcode'); - -module.exports = { - name: 'item-label', - mixins: [vnReport], - async serverPrefetch() { - this.item = await this.findOneFromDef('item', [this.id, this.warehouseId]); - this.checkMainEntity(this.item); - this.tags = await this.fetchItemTags(this.id); - this.barcode = await this.getBarcodeBase64(this.id); - }, - - computed: { - labelPage() { - const labelNumber = this.labelNumber ? this.labelNumber : 1; - const totalLabels = this.totalLabels ? this.totalLabels : 1; - - return `${labelNumber}/${totalLabels}`; - } - }, - methods: { - fetchItemTags(id) { - return this.rawSqlFromDef('itemTags', [id]).then(rows => { - const tags = {}; - rows.forEach(row => tags[row.code] = row.value); - - return tags; - }); - }, - getBarcodeBase64(id) { - const data = String(id); - - return qrcode.toDataURL(data, {margin: 0}); - }, - packing() { - const stems = this.item.stems ? this.item.stems : 1; - return `${this.item.packing}x${stems}`; - } - }, - props: { - id: { - type: Number, - required: true, - description: 'The item id' - }, - warehouseId: { - type: Number, - required: true - }, - labelNumber: { - type: Number - }, - totalLabels: { - type: Number - } - } -}; diff --git a/print/templates/reports/item-label/locale/es.yml b/print/templates/reports/item-label/locale/es.yml deleted file mode 100644 index 278946f3ee..0000000000 --- a/print/templates/reports/item-label/locale/es.yml +++ /dev/null @@ -1 +0,0 @@ -reportName: Etiqueta \ No newline at end of file diff --git a/print/templates/reports/item-label/sql/item.sql b/print/templates/reports/item-label/sql/item.sql deleted file mode 100644 index 46aacc2fae..0000000000 --- a/print/templates/reports/item-label/sql/item.sql +++ /dev/null @@ -1,14 +0,0 @@ -SELECT - i.id, - i.name, - i.stems, - i.size, - b.packing, - p.name as 'producer' -FROM vn.item i - JOIN cache.last_buy clb ON clb.item_id = i.id - JOIN vn.buy b ON b.id = clb.buy_id - JOIN vn.entry e ON e.id = b.entryFk - JOIN vn.producer p ON p.id = i.producerFk - -WHERE i.id = ? AND clb.warehouse_id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label/sql/itemTags.sql b/print/templates/reports/item-label/sql/itemTags.sql deleted file mode 100644 index 3c20098a6f..0000000000 --- a/print/templates/reports/item-label/sql/itemTags.sql +++ /dev/null @@ -1,4 +0,0 @@ -SELECT t.code, t.name, it.value -FROM vn.itemTag it - JOIN vn.tag t ON t.id = it.tagFk -WHERE it.itemFk = ? \ No newline at end of file From 0af58b20bea4025736feb55ac286ec441237691a Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 22 Oct 2024 12:02:04 +0200 Subject: [PATCH 014/135] feat: refs #7266 Item label QR finished --- db/routines/vn/functions/buy_getUltimate.sql | 31 +++++++++++++++++++ loopback/locale/es.json | 3 +- modules/item/back/methods/item/itemLabelQr.js | 11 +++++-- .../reports/item-label-qr/item-label-qr.html | 4 +-- .../reports/item-label-qr/item-label-qr.js | 28 ++++++++++++----- .../reports/item-label-qr/sql/company.sql | 6 ++++ .../reports/item-label-qr/sql/lastBuy.sql | 1 + 7 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 db/routines/vn/functions/buy_getUltimate.sql create mode 100644 print/templates/reports/item-label-qr/sql/company.sql create mode 100644 print/templates/reports/item-label-qr/sql/lastBuy.sql diff --git a/db/routines/vn/functions/buy_getUltimate.sql b/db/routines/vn/functions/buy_getUltimate.sql new file mode 100644 index 0000000000..173e6e01f5 --- /dev/null +++ b/db/routines/vn/functions/buy_getUltimate.sql @@ -0,0 +1,31 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`buy_getUltimate`( + vItemFk INT, + vWarehouseFk SMALLINT, + vDated DATE +) + RETURNS int(11) + DETERMINISTIC +BEGIN +/** + * Calcula las últimas compras realizadas hasta una fecha. + * + * @param vItemFk Id del artículo + * @param vWarehouseFk Id del almacén + * @param vDated Compras hasta fecha + * @return Id de compra + */ + DECLARE vBuyFk INT; + + CALL buy_getUltimate(vItemFk, vWarehouseFk, vDated); + + SELECT buyFk INTO vBuyFk + FROM tmp.buyUltimate; + + DROP TEMPORARY TABLE IF EXISTS + tmp.buyUltimate, + tmp.buyUltimateFromInterval; + + RETURN vBuyFk; +END$$ +DELIMITER ; diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 8e758d1ab1..8f0869eb52 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -383,5 +383,6 @@ "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", - "There are tickets for this area, delete them first": "Hay tickets para esta sección, borralos primero" + "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" } \ No newline at end of file diff --git a/modules/item/back/methods/item/itemLabelQr.js b/modules/item/back/methods/item/itemLabelQr.js index 8d92d51e86..88d8ce950e 100644 --- a/modules/item/back/methods/item/itemLabelQr.js +++ b/modules/item/back/methods/item/itemLabelQr.js @@ -9,8 +9,15 @@ module.exports = Self => { required: true, description: 'The item id', http: {source: 'path'} - }, - { + }, { + arg: 'warehouseId', + type: 'number', + required: true + }, { + arg: 'packing', + type: 'number', + required: false + }, { arg: 'copies', type: 'number', required: false diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/item-label-qr/item-label-qr.html index 3b61e1542a..2ece8943e7 100644 --- a/print/templates/reports/item-label-qr/item-label-qr.html +++ b/print/templates/reports/item-label-qr/item-label-qr.html @@ -52,7 +52,7 @@
- {{item.packing}} + {{packing || item.packing}}
@@ -89,7 +89,7 @@
- {{`${item.labelNum} / ${totalPages}`}} + {{`${item.labelNum}/${item.quantity / (packing || item.packing)}`}}
diff --git a/print/templates/reports/item-label-qr/item-label-qr.js b/print/templates/reports/item-label-qr/item-label-qr.js index 99744b0bd7..1a0ef767bd 100755 --- a/print/templates/reports/item-label-qr/item-label-qr.js +++ b/print/templates/reports/item-label-qr/item-label-qr.js @@ -5,25 +5,33 @@ const qrcode = require('qrcode'); module.exports = { name: 'item-label-qr', async serverPrefetch() { - this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.id]); + this.company = await this.findOneFromDef('company', [this.warehouseId]); + if (!this.company) + throw new UserError(`There is no company associated with that warehouse`); + + this.date = Date.vnNew(); + this.lastBuy = await this.findOneFromDef('lastBuy', [ + this.id, + this.warehouseId, + this.date + ]); + this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy.id]); if (!this.items.length) throw new UserError(`Empty data source`); this.qr = await this.getQr(this.items[0].buyFk); - this.vnDate = Date.vnNew(); - this.date = moment(this.vnDate).format('YY/DD'); - this.totalPages = this.items.length; + this.date = moment(this.date).format('WW/E'); }, methods: { getQr(data) { data = { - company: 'vnl', + company: this.company, user: this.userId, - created: this.vnDate, + created: this.date, table: 'buy', id: data }; return qrcode.toDataURL(JSON.stringify(data), { margin: 0, - errorCorrectionLevel: 'H' + errorCorrectionLevel: 'L' }); } }, @@ -33,6 +41,12 @@ module.exports = { required: true, description: 'The item id' }, + warehouseId: { + type: Number + }, + packing: { + type: Number + }, copies: { type: Number }, diff --git a/print/templates/reports/item-label-qr/sql/company.sql b/print/templates/reports/item-label-qr/sql/company.sql new file mode 100644 index 0000000000..e130b4033f --- /dev/null +++ b/print/templates/reports/item-label-qr/sql/company.sql @@ -0,0 +1,6 @@ +SELECT co.code + FROM warehouse w + JOIN address a ON a.id = w.addressFk + JOIN client c ON c.id = a.clientFk + JOIN company co ON co.clientFk = c.id + WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/sql/lastBuy.sql b/print/templates/reports/item-label-qr/sql/lastBuy.sql new file mode 100644 index 0000000000..d103399985 --- /dev/null +++ b/print/templates/reports/item-label-qr/sql/lastBuy.sql @@ -0,0 +1 @@ +SELECT buy_getUltimate(?, ?, ?) id \ No newline at end of file From c3f8da52c61b7070ade2de36800d8c1c91f8f698 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 22 Oct 2024 13:43:54 +0200 Subject: [PATCH 015/135] feat: refs #7266 Item label barcode --- db/dump/.dump/data.sql | 1 - .../11315-grayCamellia/00-firstScript.sql | 3 + .../item/back/methods/item/labelBarcodePdf.js | 55 ++++++++++++ .../item/{itemLabelQr.js => labelQrPdf.js} | 8 +- modules/item/back/models/item.js | 3 +- .../item-label-barcode/assets/css/import.js | 12 +++ .../item-label-barcode/assets/css/style.css | 83 ++++++++++++++++++ .../item-label-barcode.html | 87 +++++++++++++++++++ .../item-label-barcode/item-label-barcode.js | 58 +++++++++++++ .../reports/item-label-barcode/locale/es.yml | 1 + .../reports/item-label-barcode/options.json | 11 +++ .../item-label-barcode/sql/company.sql | 6 ++ .../reports/item-label-barcode/sql/item.sql | 42 +++++++++ .../item-label-barcode/sql/lastBuy.sql | 1 + .../reports/item-label-qr/item-label-qr.html | 2 +- 15 files changed, 366 insertions(+), 7 deletions(-) create mode 100644 db/versions/11315-grayCamellia/00-firstScript.sql create mode 100644 modules/item/back/methods/item/labelBarcodePdf.js rename modules/item/back/methods/item/{itemLabelQr.js => labelQrPdf.js} (86%) create mode 100644 print/templates/reports/item-label-barcode/assets/css/import.js create mode 100644 print/templates/reports/item-label-barcode/assets/css/style.css create mode 100644 print/templates/reports/item-label-barcode/item-label-barcode.html create mode 100755 print/templates/reports/item-label-barcode/item-label-barcode.js create mode 100644 print/templates/reports/item-label-barcode/locale/es.yml create mode 100644 print/templates/reports/item-label-barcode/options.json create mode 100644 print/templates/reports/item-label-barcode/sql/company.sql create mode 100644 print/templates/reports/item-label-barcode/sql/item.sql create mode 100644 print/templates/reports/item-label-barcode/sql/lastBuy.sql diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index 315bfe7c52..5f464c5e29 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -1723,7 +1723,6 @@ INSERT INTO `ACL` VALUES (378,'OsTicket','osTicketReportEmail','WRITE','ALLOW',' INSERT INTO `ACL` VALUES (379,'Item','buyerWasteEmail','WRITE','ALLOW','ROLE','system',NULL); INSERT INTO `ACL` VALUES (380,'Claim','claimPickupPdf','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (381,'Claim','claimPickupEmail','WRITE','ALLOW','ROLE','claimManager',NULL); -INSERT INTO `ACL` VALUES (382,'Item','itemLabelQr','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (383,'Sector','*','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (384,'Sector','*','WRITE','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (385,'Route','driverRoutePdf','READ','ALLOW','ROLE','employee',NULL); diff --git a/db/versions/11315-grayCamellia/00-firstScript.sql b/db/versions/11315-grayCamellia/00-firstScript.sql new file mode 100644 index 0000000000..60eea0e01b --- /dev/null +++ b/db/versions/11315-grayCamellia/00-firstScript.sql @@ -0,0 +1,3 @@ +DELETE FROM salix.ACL + WHERE property = 'labelPdf' + AND model = 'Item'; diff --git a/modules/item/back/methods/item/labelBarcodePdf.js b/modules/item/back/methods/item/labelBarcodePdf.js new file mode 100644 index 0000000000..3325e3da10 --- /dev/null +++ b/modules/item/back/methods/item/labelBarcodePdf.js @@ -0,0 +1,55 @@ +module.exports = Self => { + Self.remoteMethodCtx('labelBarcodePdf', { + description: 'Returns the item label pdf with barcode', + accessType: 'READ', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The item id', + http: {source: 'path'} + }, { + arg: 'warehouseId', + type: 'number', + required: true + }, { + arg: 'packing', + type: 'number', + required: false + }, { + arg: 'copies', + type: 'number', + required: false + }, { + arg: 'userId', + type: 'number', + description: 'The user id from accessToken', + http: ctx => ctx.req.accessToken.userId, + required: true + } + ], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/label-barcode-pdf', + verb: 'GET' + }, + accessScopes: ['DEFAULT', 'read:multimedia'] + }); + + Self.labelBarcodePdf = (ctx, id) => Self.printReport(ctx, id, 'item-label-barcode'); +}; diff --git a/modules/item/back/methods/item/itemLabelQr.js b/modules/item/back/methods/item/labelQrPdf.js similarity index 86% rename from modules/item/back/methods/item/itemLabelQr.js rename to modules/item/back/methods/item/labelQrPdf.js index 88d8ce950e..4d0e345286 100644 --- a/modules/item/back/methods/item/itemLabelQr.js +++ b/modules/item/back/methods/item/labelQrPdf.js @@ -1,6 +1,6 @@ module.exports = Self => { - Self.remoteMethodCtx('itemLabelQr', { - description: 'Returns the item label pdf', + Self.remoteMethodCtx('labelQrPdf', { + description: 'Returns the item label pdf with qr', accessType: 'READ', accepts: [ { @@ -45,11 +45,11 @@ module.exports = Self => { } ], http: { - path: '/:id/item-label-qr', + path: '/:id/label-qr-pdf', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.itemLabelQr = (ctx, id) => Self.printReport(ctx, id, 'item-label-qr'); + Self.labelQrPdf = (ctx, id) => Self.printReport(ctx, id, 'item-label-qr'); }; diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js index 4fb9af8fa6..d39586a907 100644 --- a/modules/item/back/models/item.js +++ b/modules/item/back/models/item.js @@ -15,7 +15,8 @@ module.exports = Self => { require('../methods/item/getWasteByItem')(Self); require('../methods/item/createIntrastat')(Self); require('../methods/item/buyerWasteEmail')(Self); - require('../methods/item/itemLabelQr')(Self); + require('../methods/item/labelBarcodePdf')(Self); + require('../methods/item/labelQrPdf')(Self); require('../methods/item/setVisibleDiscard')(Self); require('../methods/item/get')(Self); diff --git a/print/templates/reports/item-label-barcode/assets/css/import.js b/print/templates/reports/item-label-barcode/assets/css/import.js new file mode 100644 index 0000000000..37a98dfddb --- /dev/null +++ b/print/templates/reports/item-label-barcode/assets/css/import.js @@ -0,0 +1,12 @@ +const Stylesheet = require(`vn-print/core/stylesheet`); + +const path = require('path'); +const vnPrintPath = path.resolve('print'); + +module.exports = new Stylesheet([ + `${vnPrintPath}/common/css/spacing.css`, + `${vnPrintPath}/common/css/misc.css`, + `${vnPrintPath}/common/css/layout.css`, + `${vnPrintPath}/common/css/report.css`, + `${__dirname}/style.css`]) + .mergeStyles(); diff --git a/print/templates/reports/item-label-barcode/assets/css/style.css b/print/templates/reports/item-label-barcode/assets/css/style.css new file mode 100644 index 0000000000..48b8819869 --- /dev/null +++ b/print/templates/reports/item-label-barcode/assets/css/style.css @@ -0,0 +1,83 @@ +html { + font-family: "Roboto", "Helvetica", "Arial", sans-serif; + margin-top: -7px; +} +table { + width: 100%; + font-size: 14px; +} +td { + border: 6px solid white; +} +.center { + text-align: center; +} +.right { + text-align: right; +} +.cursive { + font-style: italic; +} +.bold { + font-weight: bold; +} +.black-bg { + background-color: black; + color: white; +} +.xs-txt { + font-size: 18px; +} +.md-txt { + font-size: 26px; +} +.xl-txt { + font-size: 50px; +} +.cell { + border: 2px solid black; + box-sizing: content-box; + width: 100%; + height: 30px; + display: flex; + justify-content: center; + align-items: center; +} +.padding { + padding: 7px; +} +.xs-height { + height: 50px; + max-height: 50px; +} +.md-height { + height: 60px; + max-height: 60px; +} +.sm-width { + width: 60px; + max-width: 60px; +} +.md-width { + width: 120px; + max-width: 120px; +} +.lg-width { + width: 400px; + max-width: 400px; +} +.overflow-multiline { + max-height: inherit; + display: -webkit-box; + overflow: hidden; + word-wrap: break-word; + line-clamp: 2; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; +} +.overflow-line { + width: inherit; + max-width: inherit; + overflow: hidden; + white-space: nowrap; +} \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.html b/print/templates/reports/item-label-barcode/item-label-barcode.html new file mode 100644 index 0000000000..79de494118 --- /dev/null +++ b/print/templates/reports/item-label-barcode/item-label-barcode.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ {{item.item}} +
+
+
+ {{item.size}} +
+
+
+ {{item.comment}} +
+
+
+ {{item.producer}} +
+
+
+ {{item.inkFk}} +
+
+
+ {{item.itemFk}} +
+
+
+ {{`${(packing || item.packing)} x ${item.stems || ''}`}} +
+
+
+
+
+ {{item.entryFk}} +
+
+
+ {{item.buyerName}} +
+
+
+ {{item.origin}} +
+
+
+ {{item.buyFk}} +
+
+
+ {{date}} +
+
+
+ {{`${item.labelNum}/${item.quantity / (packing || item.packing)}`}} +
+
+ + \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.js b/print/templates/reports/item-label-barcode/item-label-barcode.js new file mode 100755 index 0000000000..29a2b9ad50 --- /dev/null +++ b/print/templates/reports/item-label-barcode/item-label-barcode.js @@ -0,0 +1,58 @@ +const UserError = require('vn-loopback/util/user-error'); +const {DOMImplementation, XMLSerializer} = require('xmldom'); +const moment = require('moment'); +const jsbarcode = require('jsbarcode'); + +module.exports = { + name: 'item-label-qr', + async serverPrefetch() { + this.company = await this.findOneFromDef('company', [this.warehouseId]); + if (!this.company) + throw new UserError(`There is no company associated with that warehouse`); + + this.date = Date.vnNew(); + this.lastBuy = await this.findOneFromDef('lastBuy', [ + this.id, + this.warehouseId, + this.date + ]); + this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy.id]); + if (!this.items.length) throw new UserError(`Empty data source`); + this.date = moment(this.date).format('WW/E'); + }, + methods: { + getBarcode(data) { + const document = new DOMImplementation().createDocument('http://www.w3.org/1999/xhtml', 'html', null); + const svgNode = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); + + jsbarcode(svgNode, data, { + xmlDocument: document, + format: 'code128', + displayValue: false, + width: 3.9, + height: 85, + margin: 0 + }); + return new XMLSerializer().serializeToString(svgNode); + } + }, + props: { + id: { + type: Number, + required: true, + description: 'The item id' + }, + warehouseId: { + type: Number + }, + packing: { + type: Number + }, + copies: { + type: Number + }, + userId: { + type: Number + } + } +}; diff --git a/print/templates/reports/item-label-barcode/locale/es.yml b/print/templates/reports/item-label-barcode/locale/es.yml new file mode 100644 index 0000000000..3cf8d2ce84 --- /dev/null +++ b/print/templates/reports/item-label-barcode/locale/es.yml @@ -0,0 +1 @@ +reportName: Etiqueta de artículo barcode \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/options.json b/print/templates/reports/item-label-barcode/options.json new file mode 100644 index 0000000000..5a3c3b1ebb --- /dev/null +++ b/print/templates/reports/item-label-barcode/options.json @@ -0,0 +1,11 @@ +{ + "width": "10.4cm", + "height": "4.8cm", + "margin": { + "top": "0.17cm", + "right": "0cm", + "bottom": "0cm", + "left": "0cm" + }, + "printBackground": true +} \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/sql/company.sql b/print/templates/reports/item-label-barcode/sql/company.sql new file mode 100644 index 0000000000..e130b4033f --- /dev/null +++ b/print/templates/reports/item-label-barcode/sql/company.sql @@ -0,0 +1,6 @@ +SELECT co.code + FROM warehouse w + JOIN address a ON a.id = w.addressFk + JOIN client c ON c.id = a.clientFk + JOIN company co ON co.clientFk = c.id + WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/sql/item.sql b/print/templates/reports/item-label-barcode/sql/item.sql new file mode 100644 index 0000000000..11ee60d1ad --- /dev/null +++ b/print/templates/reports/item-label-barcode/sql/item.sql @@ -0,0 +1,42 @@ +WITH RECURSIVE numbers AS ( + SELECT 1 n + UNION ALL + SELECT n + 1 + FROM numbers + WHERE n < ? +) +SELECT ROW_NUMBER() OVER() labelNum, + b.id buyFk, + b.itemFk, + b.quantity, + b.packing, + b.isPickedOff, + b.entryFk, + e.sub, + o.code origin, + COALESCE(p.`name`, p.id, '') producer, + i.name item, + i.`size`, + i.category, + i.stems, + i.inkFk, + IFNULL(CONCAT(ig.longName, ' ', ig.`size`, ' ', ig.subName), i.comment) comment, + i.typeFk, + i.isLaid, + w.code buyerName, + w.code, + s.company_name companyName, + t.shipped + FROM vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk + LEFT JOIN edi.ekt e ON e.id = b.ektFk + JOIN vn.origin o ON o.id = i.originFk + LEFT JOIN vn.producer p ON p.id = i.producerFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.worker w ON w.id = it.workerFk + LEFT JOIN edi.supplier s ON s.supplier_id = e.pro + JOIN vn.entry e2 ON e2.id = b.entryFk + JOIN vn.travel t ON t.id = e2.travelFk + JOIN numbers num + WHERE b.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/sql/lastBuy.sql b/print/templates/reports/item-label-barcode/sql/lastBuy.sql new file mode 100644 index 0000000000..d103399985 --- /dev/null +++ b/print/templates/reports/item-label-barcode/sql/lastBuy.sql @@ -0,0 +1 @@ +SELECT buy_getUltimate(?, ?, ?) id \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/item-label-qr/item-label-qr.html index 2ece8943e7..231c94818a 100644 --- a/print/templates/reports/item-label-qr/item-label-qr.html +++ b/print/templates/reports/item-label-qr/item-label-qr.html @@ -1,6 +1,6 @@ - + - @@ -103,7 +103,11 @@ diff --git a/print/templates/reports/item-label-qr/sql/company.sql b/print/templates/reports/item-label-qr/sql/company.sql index e130b4033f..4047786a9e 100644 --- a/print/templates/reports/item-label-qr/sql/company.sql +++ b/print/templates/reports/item-label-qr/sql/company.sql @@ -1,6 +1,5 @@ SELECT co.code FROM warehouse w JOIN address a ON a.id = w.addressFk - JOIN client c ON c.id = a.clientFk - JOIN company co ON co.clientFk = c.id + JOIN company co ON co.clientFk = a.clientFk WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/sql/item.sql b/print/templates/reports/item-label-qr/sql/item.sql index 11ee60d1ad..3cb42d139f 100644 --- a/print/templates/reports/item-label-qr/sql/item.sql +++ b/print/templates/reports/item-label-qr/sql/item.sql @@ -6,37 +6,29 @@ WITH RECURSIVE numbers AS ( WHERE n < ? ) SELECT ROW_NUMBER() OVER() labelNum, - b.id buyFk, - b.itemFk, - b.quantity, - b.packing, - b.isPickedOff, - b.entryFk, - e.sub, - o.code origin, - COALESCE(p.`name`, p.id, '') producer, - i.name item, - i.`size`, - i.category, - i.stems, - i.inkFk, - IFNULL(CONCAT(ig.longName, ' ', ig.`size`, ' ', ig.subName), i.comment) comment, - i.typeFk, - i.isLaid, - w.code buyerName, - w.code, - s.company_name companyName, - t.shipped - FROM vn.buy b - JOIN vn.item i ON i.id = b.itemFk - LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk - LEFT JOIN edi.ekt e ON e.id = b.ektFk - JOIN vn.origin o ON o.id = i.originFk - LEFT JOIN vn.producer p ON p.id = i.producerFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.worker w ON w.id = it.workerFk - LEFT JOIN edi.supplier s ON s.supplier_id = e.pro - JOIN vn.entry e2 ON e2.id = b.entryFk - JOIN vn.travel t ON t.id = e2.travelFk - JOIN numbers num - WHERE b.id = ? \ No newline at end of file + b.itemFk, + i.name item, + b.id buyFk, + b.quantity, + b.packing, + b.entryFk, + o.code origin, + p.`name` producerName, + p.id producerFk, + i.`size`, + i.category, + i.stems, + i.inkFk, + ig.longName, + ig.subName, + i.comment, + w.code buyerName + FROM vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk + JOIN vn.origin o ON o.id = i.originFk + LEFT JOIN vn.producer p ON p.id = i.producerFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.worker w ON w.id = it.workerFk + JOIN numbers num + WHERE b.id = ? \ No newline at end of file From 8569bec34ac139a3846837e278009844ed6cbaac Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 24 Oct 2024 12:18:09 +0200 Subject: [PATCH 020/135] feat: refs #7266 Minor change --- db/versions/11321-wheatChrysanthemum/00-firstScript.sql | 3 +++ .../templates/reports/item-label-barcode/item-label-barcode.js | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 db/versions/11321-wheatChrysanthemum/00-firstScript.sql diff --git a/db/versions/11321-wheatChrysanthemum/00-firstScript.sql b/db/versions/11321-wheatChrysanthemum/00-firstScript.sql new file mode 100644 index 0000000000..e3ba70e2cd --- /dev/null +++ b/db/versions/11321-wheatChrysanthemum/00-firstScript.sql @@ -0,0 +1,3 @@ +INSERT INTO vn.report (name, `method`) + VALUES ('LabelItemBarcode','Items/{id}/label-barcode-pdf'), + ('LabelItemQr','Items/{id}/label-qr-pdf'); diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.js b/print/templates/reports/item-label-barcode/item-label-barcode.js index 8a294afc18..5f9a11ea11 100755 --- a/print/templates/reports/item-label-barcode/item-label-barcode.js +++ b/print/templates/reports/item-label-barcode/item-label-barcode.js @@ -4,7 +4,7 @@ const moment = require('moment'); const jsbarcode = require('jsbarcode'); module.exports = { - name: 'item-label-qr', + name: 'item-label-barcode', async serverPrefetch() { this.company = await this.findOneFromDef('company', [this.warehouseId]); if (!this.company) From 1bf900f81b7824acf144a4fb21fd55ed32ab5a5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Thu, 24 Oct 2024 12:33:47 +0200 Subject: [PATCH 021/135] feat: refs #8087 Traspasar redadas a travels --- db/dump/fixtures.before.sql | 24 +- .../procedures/availableNoRaids_refresh.sql | 2 +- .../triggers/supplyResponse_afterUpdate.sql | 8 +- .../hedera/procedures/item_getVisible.sql | 4 +- .../stock/procedures/log_refreshBuy.sql | 6 +- db/routines/vn/events/raidUpdate.sql | 8 - .../procedures/absoluteInventoryHistory.sql | 10 +- .../vn/procedures/available_traslate.sql | 12 +- db/routines/vn/procedures/clean_logiflora.sql | 2 +- .../vn/procedures/entry_cloneHeader.sql | 2 - .../vn/procedures/entry_getTransfer.sql | 4 +- db/routines/vn/procedures/inventoryMake.sql | 4 +- db/routines/vn/procedures/item_getBalance.sql | 40 +- db/routines/vn/procedures/item_getMinacum.sql | 2 +- .../vn/procedures/item_multipleBuyByDate.sql | 12 +- .../vn/procedures/item_valuateInventory.sql | 16 +- .../vn/procedures/multipleInventory.sql | 346 +++++++++--------- db/routines/vn/procedures/raidUpdate.sql | 31 -- .../vn/procedures/travelVolume_get.sql | 2 +- .../vn/procedures/travel_moveRaids.sql | 60 ++- .../vn/triggers/entry_beforeUpdate.sql | 16 +- 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/Entradas.sql | 1 - db/routines/vn2008/views/Entradas_Auto.sql | 5 - db/routines/vn2008/views/entrySource.sql | 2 +- db/routines/vn2008/views/travel.sql | 3 +- db/routines/vn2008/views/v_compres.sql | 7 +- .../11316-chocolateErica/00-firstScript.sql | 2 + 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 | 5 +- modules/entry/back/models/entry.json | 12 +- .../travel/back/methods/travel/getTravel.js | 3 +- modules/travel/back/models/travel.json | 3 + 37 files changed, 305 insertions(+), 359 deletions(-) delete mode 100644 db/routines/vn/events/raidUpdate.sql delete mode 100644 db/routines/vn/procedures/raidUpdate.sql delete mode 100644 db/routines/vn2008/views/Entradas_Auto.sql create mode 100644 db/versions/11316-chocolateErica/00-firstScript.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index e93bb3b8e4..51ffba3d02 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1518,19 +1518,19 @@ 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`) +INSERT INTO `vn`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `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, ''); + (1, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 1, 1, 442, 'IN2001', 'Movement 1', 0, ''), + (2, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 442, 'IN2002', 'Movement 2', 0, 'observation two'), + (3, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 3, 0, 442, 'IN2003', 'Movement 3', 0, 'observation three'), + (4, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 2, 0, 69, 'IN2004', 'Movement 4', 0, 'observation four'), + (5, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 5, 0, 442, 'IN2005', 'Movement 5', 0, 'observation five'), + (6, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 6, 0, 442, 'IN2006', 'Movement 6', 0, 'observation six'), + (7, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2007', 'Movement 7', 0, 'observation seven'), + (8, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL -1 MONTH), 7, 0, 442, 'IN2008', 'Movement 8', 1,''), + (9, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 9', 1, ''), + (10, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL +2 DAY), 10, 0, 442, 'IN2009', 'Movement 10', 1, ''), + (99, 69, '2000-12-01 00:00:00.000', 11, 0, 442, 'IN2009', 'Movement 99', 0, ''); INSERT INTO `vn`.`entryConfig` (`defaultEntry`, `inventorySupplierFk`, `defaultSupplierFk`) VALUES (2, 4, 1); diff --git a/db/routines/cache/procedures/availableNoRaids_refresh.sql b/db/routines/cache/procedures/availableNoRaids_refresh.sql index 37715d270d..efbbf6a132 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 e.isRaid + AND NOT t.daysInForward 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 389ef9f1cf..28a8c9466c 100644 --- a/db/routines/edi/triggers/supplyResponse_afterUpdate.sql +++ b/db/routines/edi/triggers/supplyResponse_afterUpdate.sql @@ -6,16 +6,16 @@ BEGIN UPDATE vn.buy b JOIN vn.entry e ON e.id = b.entryFk - JOIN vn.travel tr ON tr.id = e.travelFk - JOIN vn.agencyMode am ON am.id = tr.agencyModeFk + JOIN vn.travel tr ON tr.id = e.travelFk + JOIN vn.agencyMode am ON am.id = tr.agencyModeFk JOIN vn.item i ON i.id = b.itemFk JOIN edi.supplyResponse sr ON i.supplyResponseFk = sr.ID SET b.quantity = NEW.NumberOfItemsPerCask * NEW.NumberOfUnits, b.stickers = NEW.NumberOfUnits WHERE i.supplyResponseFk = NEW.ID AND am.name = 'LOGIFLORA' - AND e.isRaid + AND tr.daysInForward AND tr.landed >= util.VN_CURDATE(); - + END$$ DELIMITER ; diff --git a/db/routines/hedera/procedures/item_getVisible.sql b/db/routines/hedera/procedures/item_getVisible.sql index 2f4ef32abe..365161bdfe 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 e.isRaid + AND NOT t.daysInForward 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 e.isRaid + AND NOT t.daysInForward 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 488c00a28a..d8e727f174 100644 --- a/db/routines/stock/procedures/log_refreshBuy.sql +++ b/db/routines/stock/procedures/log_refreshBuy.sql @@ -11,7 +11,7 @@ BEGIN e.id entryFk, t.id travelFk, b.itemFk, - e.isRaid, + t.daysInForward, ADDTIME(t.shipped, IFNULL(t.shipmentHour, '00:00:00')) shipped, t.warehouseOutFk, @@ -50,7 +50,7 @@ BEGIN itemFk, TIMESTAMPADD(DAY, life, @dated), quantity, - IF(isIn, isReceived, isDelivered) AND !isRaid + IF(isIn, isReceived, isDelivered) AND NOT daysInForward FROM tValues WHERE isIn OR !lessThanInventory; @@ -65,7 +65,7 @@ BEGIN itemFk, created, quantity, - IF(isIn, isDelivered, isReceived) AND !isRaid + IF(isIn, isDelivered, isReceived) AND NOT daysInForward FROM tValues WHERE !isIn OR !lessThanInventory; diff --git a/db/routines/vn/events/raidUpdate.sql b/db/routines/vn/events/raidUpdate.sql deleted file mode 100644 index c0c6f03c58..0000000000 --- a/db/routines/vn/events/raidUpdate.sql +++ /dev/null @@ -1,8 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` EVENT `vn`.`raidUpdate` - ON SCHEDULE EVERY 1 DAY - STARTS '2017-12-29 00:05:00.000' - ON COMPLETION PRESERVE - ENABLE -DO CALL raidUpdate$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/absoluteInventoryHistory.sql b/db/routines/vn/procedures/absoluteInventoryHistory.sql index d2a2029f04..3ea8cf4deb 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 e.isRaid + AND NOT tr.daysInForward 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 e.isRaid + AND NOT tr.daysInForward UNION ALL SELECT t.shipped, NULL, @@ -81,7 +81,7 @@ BEGIN FROM tHistoricalPast WHERE `date` < vDate; - SELECT p1.*, NULL v_virtual + SELECT p1.*, NULL v_virtual FROM ( SELECT vDate `date`, vCalculatedInventory input, @@ -96,7 +96,7 @@ BEGIN FROM tHistoricalPast WHERE `date` >= vDate ) p1; - + DROP TEMPORARY TABLE tHistoricalPast; END$$ -DELIMITER ; \ No newline at end of file +DELIMITER ; diff --git a/db/routines/vn/procedures/available_traslate.sql b/db/routines/vn/procedures/available_traslate.sql index 03eb376aba..28b187e58f 100644 --- a/db/routines/vn/procedures/available_traslate.sql +++ b/db/routines/vn/procedures/available_traslate.sql @@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`available_traslate`( vWarehouseShipment INT) proc: BEGIN /** - * Calcular la disponibilidad dependiendo del almacen + * Calcular la disponibilidad dependiendo del almacen * de origen y destino según la fecha. * * @param vWarehouseLanding Almacén de llegada @@ -42,10 +42,10 @@ proc: BEGIN WHERE t.landed BETWEEN vDatedInventory AND vDatedFrom AND t.warehouseInFk = vWarehouseLanding AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid + AND NOT t.daysInForward GROUP BY c.itemFk; - -- Tabla con el ultimo dia de last_buy para cada producto + -- Tabla con el ultimo dia de last_buy para cada producto -- que hace un replace de la anterior. CALL buy_getUltimate (NULL, vWarehouseShipment, util.VN_CURDATE()); @@ -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 e.isRaid + AND NOT t.daysInForward 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 e.isRaid + AND NOT t.daysInForward AND t.warehouseInFk = vWarehouseLanding AND t.landed >= vDatedFrom AND (ir.dated IS NULL OR t.landed <= ir.dated) @@ -135,4 +135,4 @@ proc: BEGIN DROP TEMPORARY TABLE tmp.itemList, tItemRange, tItemRangeLive; END$$ -DELIMITER ; \ No newline at end of file +DELIMITER ; diff --git a/db/routines/vn/procedures/clean_logiflora.sql b/db/routines/vn/procedures/clean_logiflora.sql index fd645a158f..ac119631da 100644 --- a/db/routines/vn/procedures/clean_logiflora.sql +++ b/db/routines/vn/procedures/clean_logiflora.sql @@ -28,7 +28,7 @@ BEGIN JOIN agencyMode am ON am.id = tr.agencyModeFk WHERE NOT b.quantity AND am.code = 'logiflora' - AND e.isRaid; + AND tr.daysInForward; START TRANSACTION; diff --git a/db/routines/vn/procedures/entry_cloneHeader.sql b/db/routines/vn/procedures/entry_cloneHeader.sql index c988cc5925..f83c5c5010 100644 --- a/db/routines/vn/procedures/entry_cloneHeader.sql +++ b/db/routines/vn/procedures/entry_cloneHeader.sql @@ -17,7 +17,6 @@ BEGIN supplierFk, dated, isExcludedFromAvailable, - isRaid, commission, currencyFk, companyFk, @@ -28,7 +27,6 @@ BEGIN supplierFk, dated, isExcludedFromAvailable, - isRaid, commission, currencyFk, companyFk, diff --git a/db/routines/vn/procedures/entry_getTransfer.sql b/db/routines/vn/procedures/entry_getTransfer.sql index c835564089..9527e0bf26 100644 --- a/db/routines/vn/procedures/entry_getTransfer.sql +++ b/db/routines/vn/procedures/entry_getTransfer.sql @@ -5,7 +5,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_getTransfer`( BEGIN /** * Retorna los artículos trasladables a partir de una entrada. - * + * * @param vSelf Id de entrada */ DECLARE vDateShipped DATE; @@ -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 e.isRaid + AND NOT tr.daysInForward 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 91065771a8..65dceef3da 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 isRaid + AND NOT tr.daysInForward 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 isRaid + AND NOT tr.daysInForward 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 4aa589d196..260f0a527b 100644 --- a/db/routines/vn/procedures/item_getBalance.sql +++ b/db/routines/vn/procedures/item_getBalance.sql @@ -50,16 +50,16 @@ BEGIN JOIN vn.entry e ON e.id = b.entryFk JOIN vn.travel tr ON tr.id = e.travelFk JOIN vn.supplier s ON s.id = e.supplierFk - JOIN vn.state st ON st.`code` = IF(tr.landed < util.VN_CURDATE() + JOIN vn.state st ON st.`code` = IF(tr.landed < util.VN_CURDATE() OR (util.VN_CURDATE() AND tr.isReceived), 'DELIVERED', 'FREE') WHERE tr.landed >= vDateInventory AND tr.warehouseInFk = vWarehouseFk - AND (s.id <> vSupplierInventoryFk OR vDated IS NULL) + AND (s.id <> vSupplierInventoryFk OR vDated IS NULL) AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid + AND NOT tr.daysInForward ), entriesOut AS ( SELECT 'entry', @@ -95,7 +95,7 @@ BEGIN AND b.itemFk = vItemFk AND NOT e.isExcludedFromAvailable AND NOT w.isFeedStock - AND NOT e.isRaid + AND NOT tr.daysInForward ), sales AS ( WITH itemSales AS ( @@ -147,10 +147,10 @@ BEGIN NULL FROM itemSales s LEFT JOIN vn.state stPrep ON stPrep.`code` = 'PREPARED' - LEFT JOIN vn.saleTracking stk ON stk.saleFk = s.saleFk + LEFT JOIN vn.saleTracking stk ON stk.saleFk = s.saleFk AND stk.stateFk = stPrep.id GROUP BY s.saleFk - ), + ), orders AS ( SELECT 'order' originType, o.id originId, @@ -215,9 +215,9 @@ BEGIN t.`in` invalue, t.`out`, @a := @a + IFNULL(t.`in`, 0) - IFNULL(t.`out`, 0) balance, - @currentLineFk := IF (@shipped < util.VN_CURDATE() + @currentLineFk := IF (@shipped < util.VN_CURDATE() OR (@shipped = util.VN_CURDATE() AND (t.isPicked OR a.`code` >= 'ON_PREPARATION')), - t.lineFk, + t.lineFk, @currentLineFk) lastPreparedLineFk, t.isTicket, t.lineFk, @@ -254,21 +254,21 @@ BEGIN UNION ALL SELECT originType, originId, - shipped, - alertlevel, - stateName, + shipped, + alertlevel, + stateName, reference, entityType, - entityId, + entityId, entityName, - `in`, - `out`, - @a := @a + IFNULL(`in`, 0) - IFNULL(`out`, 0), - 0, - isTicket, - lineFk, - isPicked, - clientType, + `in`, + `out`, + @a := @a + IFNULL(`in`, 0) - IFNULL(`out`, 0), + 0, + isTicket, + lineFk, + isPicked, + clientType, claimFk, `order` FROM tItemDiary diff --git a/db/routines/vn/procedures/item_getMinacum.sql b/db/routines/vn/procedures/item_getMinacum.sql index 85474fc3f9..8a42bd737e 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 e.isRaid + AND NOT t.daysInForward 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 115202895d..7bd8093120 100644 --- a/db/routines/vn/procedures/item_multipleBuyByDate.sql +++ b/db/routines/vn/procedures/item_multipleBuyByDate.sql @@ -17,22 +17,22 @@ BEGIN ALTER TABLE tmp.itemInventory ADD `buy_date` datetime NOT NULL; - + CREATE OR REPLACE TEMPORARY TABLE lastBuyScope SELECT i.id, MAX(t.landed) lastLanded - FROM item i - JOIN buy b ON b.itemFk = i.id + FROM item i + JOIN buy b ON b.itemFk = i.id JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk + JOIN travel t ON t.id = e.travelFk JOIN supplier s ON s.id = e.supplierFk JOIN warehouse w ON w.id = t.warehouseInFk WHERE t.landed BETWEEN (vDated + INTERVAL - vLastBuyScope DAY) AND vDated AND NOT s.name = 'INVENTARIO' AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) AND w.isComparative - AND NOT e.isRaid + AND NOT t.daysInForward GROUP BY i.id; - + UPDATE tmp.itemInventory y JOIN lastBuyScope lbs ON lbs.id = y.id SET y.buy_date = lbs.lastLanded; diff --git a/db/routines/vn/procedures/item_valuateInventory.sql b/db/routines/vn/procedures/item_valuateInventory.sql index 5642ba8125..8809891016 100644 --- a/db/routines/vn/procedures/item_valuateInventory.sql +++ b/db/routines/vn/procedures/item_valuateInventory.sql @@ -25,7 +25,7 @@ BEGIN LIMIT 1; SET vHasNotInventory = (vInventoried IS NULL); - + IF vHasNotInventory THEN SELECT landed INTO vInventoryClone FROM travel tr @@ -50,7 +50,7 @@ BEGIN PRIMARY KEY (warehouseInventory, itemFk) USING HASH ) ENGINE = MEMORY; - + -- Inventario inicial IF vHasNotInventory THEN INSERT INTO tInventory(warehouseFk, itemFk, quantity, warehouseInventory) @@ -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 e.isRaid + AND NOT tr.daysInForward 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 e.isRaid + AND NOT t.daysInForward AND w.valuatedInventory AND t.isInventory AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL) @@ -159,7 +159,7 @@ BEGIN ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + s.quantity * IF(vHasNotInventory, 1, -1); -- Volver a poner lo que esta aun en las estanterias - IF vDated = util.VN_CURDATE() THEN + IF vDated = util.VN_CURDATE() THEN INSERT INTO tInventory(warehouseFk, itemFk, quantity, warehouseInventory) SELECT w.id, s.itemFk, @@ -196,14 +196,14 @@ 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 isRaid + AND NOT tr.daysInForward AND wIn.valuatedInventory AND t.isInventory AND e.isConfirmed AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL) AND (ic.id = vItemCategoryFk OR vItemCategoryFk IS NULL) ON DUPLICATE KEY UPDATE tInventory.quantity = tInventory.quantity + (b.quantity); - + CALL buy_getUltimate (NULL, NULL, vDateDayEnd); DELETE FROM tInventory WHERE quantity IS NULL OR NOT quantity; @@ -233,7 +233,7 @@ BEGIN JOIN warehouse w ON w.id = warehouseFk JOIN item i ON i.id = ti.itemFk JOIN itemType tp ON tp.id = i.typeFk - JOIN itemCategory ic ON ic.id = tp.categoryFk + JOIN itemCategory ic ON ic.id = tp.categoryFk WHERE w.valuatedInventory AND ti.total > 0; diff --git a/db/routines/vn/procedures/multipleInventory.sql b/db/routines/vn/procedures/multipleInventory.sql index c051706b7b..6b26e456f0 100644 --- a/db/routines/vn/procedures/multipleInventory.sql +++ b/db/routines/vn/procedures/multipleInventory.sql @@ -1,173 +1,173 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`multipleInventory`( - vDate DATE, - vWarehouseFk TINYINT, - vMaxDays TINYINT -) -proc: BEGIN - DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY; - DECLARE vDateFrom DATE DEFAULT vDate; - DECLARE vDateTo DATETIME; - DECLARE vDateToTomorrow DATETIME; - DECLARE vDefaultDayRange INT; - DECLARE vCalcFk INT; - - IF vDate < util.VN_CURDATE() THEN - LEAVE proc; - END IF; - - IF vDate = util.VN_CURDATE() THEN - SELECT inventoried INTO vDateFrom - FROM config; - END IF; - - SELECT defaultDayRange INTO vDefaultDayRange - FROM comparativeConfig; - - SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY; - SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY; - - ALTER TABLE tmp.itemInventory - ADD `avalaible` INT NOT NULL, - ADD `sd` INT NOT NULL, - ADD `rest` INT NOT NULL, - ADD `expected` INT NOT NULL, - ADD `inventory` INT NOT NULL, - ADD `visible` INT NOT NULL, - ADD `life` TINYINT NOT NULL DEFAULT '0'; - - -- Calculo del inventario - CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc - (PRIMARY KEY (itemFk)) - ENGINE = MEMORY - SELECT itemFk, - SUM(quantity) quantity - FROM ( - SELECT s.itemFk, - s.quantity quantity - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - JOIN warehouse w ON w.id = t.warehouseFk - WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk - AND w.isComparative - UNION ALL - SELECT b.itemFk, b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseInFk - WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - UNION ALL - SELECT b.itemFk, - b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseOutFk - WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - ) sub - GROUP BY itemFk; - - -- Cálculo del visible - CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk); - - CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc - (PRIMARY KEY (item_id)) - ENGINE = MEMORY - SELECT item_id, visible - FROM cache.visible - WHERE calc_id = vCalcFk; - - UPDATE tmp.itemInventory it - LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id - LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id - SET it.inventory = iic.quantity, - it.visible = ivc.visible, - it.avalaible = iic.quantity, - it.sd = iic.quantity; - - -- Calculo del disponible - CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc - (INDEX (itemFk, warehouseFk)) - ENGINE = MEMORY - SELECT sub.itemFk, - vWarehouseFk warehouseFk, - sub.dated, - SUM(sub.quantity) quantity - FROM ( - SELECT s.itemFk, - DATE(t.shipped) dated, - - s.quantity quantity - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - JOIN warehouse w ON w.id = t.warehouseFk - WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk - AND w.isComparative - UNION ALL - SELECT b.itemFk, t.landed, b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseInFk - WHERE t.landed BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - UNION ALL - SELECT b.itemFk, t.shipped, - b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseOutFk - WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - ) sub - GROUP BY sub.itemFk, sub.dated; - - CALL item_getAtp(vDate); - CALL travel_upcomingArrivals(vWarehouseFk, vDate); - - CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc - (PRIMARY KEY (itemFk)) - ENGINE = MEMORY - SELECT it.itemFk, - SUM(it.quantity) quantity, - im.quantity minQuantity - FROM tmp.itemCalc it - JOIN tmp.itemAtp im ON im.itemFk = it.itemFk - JOIN item i ON i.id = it.itemFk - LEFT JOIN origin o ON o.id = i.originFk - LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk - WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL, - t.landing, - vDateToTomorrow) - GROUP BY it.itemFk; - - UPDATE tmp.itemInventory it - JOIN tItemAvailableCalc iac ON iac.itemFk = it.id - SET it.avalaible = IF(iac.minQuantity > 0, - it.avalaible, - it.avalaible + iac.minQuantity), - it.sd = it.inventory + iac.quantity; - - DROP TEMPORARY TABLE - tmp.itemTravel, - tmp.itemCalc, - tmp.itemAtp, - tItemInventoryCalc, - tItemVisibleCalc, - tItemAvailableCalc; -END$$ -DELIMITER ; +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`multipleInventory`( + vDate DATE, + vWarehouseFk TINYINT, + vMaxDays TINYINT +) +proc: BEGIN + DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY; + DECLARE vDateFrom DATE DEFAULT vDate; + DECLARE vDateTo DATETIME; + DECLARE vDateToTomorrow DATETIME; + DECLARE vDefaultDayRange INT; + DECLARE vCalcFk INT; + + IF vDate < util.VN_CURDATE() THEN + LEAVE proc; + END IF; + + IF vDate = util.VN_CURDATE() THEN + SELECT inventoried INTO vDateFrom + FROM config; + END IF; + + SELECT defaultDayRange INTO vDefaultDayRange + FROM comparativeConfig; + + SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY; + SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY; + + ALTER TABLE tmp.itemInventory + ADD `avalaible` INT NOT NULL, + ADD `sd` INT NOT NULL, + ADD `rest` INT NOT NULL, + ADD `expected` INT NOT NULL, + ADD `inventory` INT NOT NULL, + ADD `visible` INT NOT NULL, + ADD `life` TINYINT NOT NULL DEFAULT '0'; + + -- Calculo del inventario + CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT itemFk, + SUM(quantity) quantity + FROM ( + SELECT s.itemFk, - s.quantity quantity + FROM sale s + JOIN ticket t ON t.id = s.ticketFk + JOIN warehouse w ON w.id = t.warehouseFk + WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk + AND w.isComparative + UNION ALL + SELECT b.itemFk, b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseInFk + WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT t.daysInForward + UNION ALL + SELECT b.itemFk, - b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseOutFk + WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT t.daysInForward + ) sub + GROUP BY itemFk; + + -- Cálculo del visible + CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk); + + CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc + (PRIMARY KEY (item_id)) + ENGINE = MEMORY + SELECT item_id, visible + FROM cache.visible + WHERE calc_id = vCalcFk; + + UPDATE tmp.itemInventory it + LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id + LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id + SET it.inventory = iic.quantity, + it.visible = ivc.visible, + it.avalaible = iic.quantity, + it.sd = iic.quantity; + + -- Calculo del disponible + CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc + (INDEX (itemFk, warehouseFk)) + ENGINE = MEMORY + SELECT sub.itemFk, + vWarehouseFk warehouseFk, + sub.dated, + SUM(sub.quantity) quantity + FROM ( + SELECT s.itemFk, + DATE(t.shipped) dated, + - s.quantity quantity + FROM sale s + JOIN ticket t ON t.id = s.ticketFk + JOIN warehouse w ON w.id = t.warehouseFk + WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk + AND w.isComparative + UNION ALL + SELECT b.itemFk, t.landed, b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseInFk + WHERE t.landed BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT t.daysInForward + UNION ALL + SELECT b.itemFk, t.shipped, - b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseOutFk + WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT t.daysInForward + ) sub + GROUP BY sub.itemFk, sub.dated; + + CALL item_getAtp(vDate); + CALL travel_upcomingArrivals(vWarehouseFk, vDate); + + CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT it.itemFk, + SUM(it.quantity) quantity, + im.quantity minQuantity + FROM tmp.itemCalc it + JOIN tmp.itemAtp im ON im.itemFk = it.itemFk + JOIN item i ON i.id = it.itemFk + LEFT JOIN origin o ON o.id = i.originFk + LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk + WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL, + t.landing, + vDateToTomorrow) + GROUP BY it.itemFk; + + UPDATE tmp.itemInventory it + JOIN tItemAvailableCalc iac ON iac.itemFk = it.id + SET it.avalaible = IF(iac.minQuantity > 0, + it.avalaible, + it.avalaible + iac.minQuantity), + it.sd = it.inventory + iac.quantity; + + DROP TEMPORARY TABLE + tmp.itemTravel, + tmp.itemCalc, + tmp.itemAtp, + tItemInventoryCalc, + tItemVisibleCalc, + tItemAvailableCalc; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/raidUpdate.sql b/db/routines/vn/procedures/raidUpdate.sql deleted file mode 100644 index 71352868e7..0000000000 --- a/db/routines/vn/procedures/raidUpdate.sql +++ /dev/null @@ -1,31 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`raidUpdate`() -BEGIN -/** - * Actualiza el travel de las entradas de redadas - */ - UPDATE entry e - JOIN entryVirtual ev ON ev.entryFk = e.id - JOIN travel t ON t.id = e.travelFk - JOIN ( - SELECT * - FROM ( - SELECT t.id, t.landed, tt.warehouseInFk, tt.warehouseOutFk - FROM travel t - JOIN ( - SELECT t.warehouseInFk, t.warehouseOutFk - FROM entryVirtual ev - JOIN entry e ON e.id = ev.entryFk - JOIN travel t ON t.id = e.travelFk - GROUP BY t.warehouseInFk, t.warehouseOutFk - ) tt ON t.warehouseInFk = tt.warehouseInFk AND t.warehouseOutFk = tt.warehouseOutFk - WHERE shipped > util.VN_CURDATE() AND NOT isDelivered - ORDER BY t.landed - LIMIT 10000000000000000000 - ) t - GROUP BY t.warehouseInFk, t.warehouseOutFk - ) tt ON t.warehouseInFk = tt.warehouseInFk AND t.warehouseOutFk = tt.warehouseOutFk - SET e.travelFk = t.id; - -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/travelVolume_get.sql b/db/routines/vn/procedures/travelVolume_get.sql index 99c0acbb82..bb98cacdf2 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 e.isRaid = FALSE + AND NOT tr.daysInForward 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 95e02ec55b..aa554a1a06 100644 --- a/db/routines/vn/procedures/travel_moveRaids.sql +++ b/db/routines/vn/procedures/travel_moveRaids.sql @@ -1,72 +1,68 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`travel_moveRaids`() BEGIN - -/* - * Desplaza al dia siguiente los travels que contengan redadas y avisa a los compradores +/** + * Desplaza los travels en el futuro y avisa a los compradores * */ DECLARE vDone BOOL DEFAULT FALSE; - DECLARE vWorkerName VARCHAR(50); - DECLARE vRaid TEXT; - DECLARE vWorker VARCHAR(50) DEFAULT ''; + DECLARE vBuyerEmail VARCHAR(40); + DECLARE vTravelLink TEXT; DECLARE vMailBody TEXT DEFAULT ''; DECLARE vCur CURSOR FOR - SELECT GROUP_CONCAT( DISTINCT CONCAT('https://salix.verdnatura.es/#!/travel/', ttr.id, '/summary ') ORDER BY ttr.id SEPARATOR '\n\r'), - u.name - FROM tmp.travel ttr - JOIN entry e ON e.travelFk = ttr.id + 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 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 ROLLBACK; RESIGNAL; END; - - DROP TEMPORARY TABLE IF EXISTS tmp.travel; - CREATE TEMPORARY TABLE tmp.travel - SELECT tr.id,tr.landed - FROM travel tr - JOIN entry e ON e.travelFk = tr.id - WHERE tr.landed = util.tomorrow() - AND e.isRaid - GROUP BY tr.id; + + CREATE OR REPLACE TEMPORARY TABLE tTravelToMove + SELECT id travelFk, + util.VN_CURDATE() + INTERVAL daysInForward DAY newLanded + FROM travel + WHERE daysInForward; START TRANSACTION; UPDATE travel tr - JOIN tmp.travel ttr ON ttr.id = tr.id - SET tr.landed = TIMESTAMPADD(DAY, 1, tr.landed); + JOIN tTravelToMove ttm ON ttm.travelFk = tr.id + SET tr.landed = ttm.newLanded; OPEN vCur; l: LOOP SET vDone = FALSE; - FETCH vCur INTO vRaid, vWorkerName; + FETCH vCur INTO vTravelLink, vBuyerEmail; IF vDone THEN LEAVE l; END IF; - CALL `vn`.`mail_insert`(CONCAT(vWorkerName, '@verdnatura.es'), - 'noreply@verdnatura.es', - 'Cambio de fecha en Redadas', - CONCAT('Se ha movido las siguientes redadas: \n\r ', vRaid) - ); - + CALL `vn`.`mail_insert`( + vBuyerEmail, + 'noreply@verdnatura.es', + 'Cambio de fecha en Redadas', + CONCAT('Se ha movido los siguientes travels: \n\r ', vTravelLink)); END LOOP; CLOSE vCur; COMMIT; - DROP TEMPORARY TABLE tmp.travel; - + DROP TEMPORARY TABLE tTravelToMove; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/entry_beforeUpdate.sql b/db/routines/vn/triggers/entry_beforeUpdate.sql index 8e5a326a07..3b999012fd 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 vIsVirtual BOOL; + DECLARE vDaysInForward INT; DECLARE vPrintedCount INT; DECLARE vHasDistinctWarehouses BOOL; DECLARE vTotalBuy INT; @@ -37,18 +37,20 @@ BEGIN IF NEW.travelFk IS NOT NULL THEN CALL travel_throwAwb(NEW.travelFk); END IF; - - SELECT COUNT(*) > 0 INTO vIsVirtual - FROM entryVirtual WHERE entryFk = NEW.id; + + SELECT daysInForward INTO vDaysInForward + FROM travel t + JOIN entry e ON e.travelFk = t.id + WHERE entryFk = NEW.id; SELECT NOT (o.warehouseInFk <=> n.warehouseInFk) - OR NOT (o.warehouseOutFk <=> n.warehouseOutFk) + OR NOT (o.warehouseOutFk <=> n.warehouseOutFk) INTO vHasDistinctWarehouses FROM travel o, travel n WHERE o.id = OLD.travelFk AND n.id = NEW.travelFk; - IF vIsVirtual AND vHasDistinctWarehouses THEN + IF vDaysInForward AND vHasDistinctWarehouses THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'A cloned entry cannot be moved to a travel with different warehouses'; END IF; @@ -71,7 +73,7 @@ BEGIN SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk); END IF; - IF NOT (NEW.travelFk <=> OLD.travelFk) + IF NOT (NEW.travelFk <=> OLD.travelFk) OR NOT (NEW.currencyFk <=> OLD.currencyFk) OR NOT (NEW.supplierFk <=> OLD.supplierFk) THEN diff --git a/db/routines/vn/views/itemEntryIn.sql b/db/routines/vn/views/itemEntryIn.sql index 4f7855d2bd..6196e9396f 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`, - `e`.`isRaid` AS `isVirtualStock`, + `t`.`daysInForward` AS `isVirtualStock`, `e`.`id` AS `entryFk` FROM ( ( diff --git a/db/routines/vn/views/itemEntryOut.sql b/db/routines/vn/views/itemEntryOut.sql index 1e8718c535..f18116e619 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 `e`.`isRaid` = 0 + AND NOT `t`.`daysInForward` AND `b`.`quantity` <> 0 diff --git a/db/routines/vn/views/lastPurchases.sql b/db/routines/vn/views/lastPurchases.sql index 3099acd006..9dc5ec8986 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 `e`.`isRaid` = 0 + AND NOT `tr`.`daysInForward` AND `b`.`stickers` > 0 diff --git a/db/routines/vn2008/views/Entradas.sql b/db/routines/vn2008/views/Entradas.sql index 63fbaa7287..78b73bb246 100644 --- a/db/routines/vn2008/views/Entradas.sql +++ b/db/routines/vn2008/views/Entradas.sql @@ -8,7 +8,6 @@ AS SELECT `e`.`id` AS `Id_Entrada`, `e`.`isExcludedFromAvailable` AS `Inventario`, `e`.`isConfirmed` AS `Confirmada`, `e`.`isOrdered` AS `Pedida`, - `e`.`isRaid` AS `Redada`, `e`.`commission` AS `comision`, `e`.`created` AS `odbc_date`, `e`.`evaNotes` AS `Notas_Eva`, diff --git a/db/routines/vn2008/views/Entradas_Auto.sql b/db/routines/vn2008/views/Entradas_Auto.sql deleted file mode 100644 index 5d12669656..0000000000 --- a/db/routines/vn2008/views/Entradas_Auto.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE OR REPLACE DEFINER=`root`@`localhost` - SQL SECURITY DEFINER - VIEW `vn2008`.`Entradas_Auto` -AS SELECT `ev`.`entryFk` AS `Id_Entrada` -FROM `vn`.`entryVirtual` `ev` diff --git a/db/routines/vn2008/views/entrySource.sql b/db/routines/vn2008/views/entrySource.sql index 3a8df41bfc..e6e8744055 100644 --- a/db/routines/vn2008/views/entrySource.sql +++ b/db/routines/vn2008/views/entrySource.sql @@ -8,7 +8,7 @@ AS SELECT `e`.`gestDocFk` AS `gestdoc_id`, `e`.`isExcludedFromAvailable` AS `Inventario`, `e`.`isConfirmed` AS `Confirmada`, `e`.`isOrdered` AS `Pedida`, - `e`.`isRaid` AS `Redada`, + `tr`.`daysInForward` AS `Redada`, `e`.`evaNotes` AS `notas`, `e`.`supplierFk` AS `Id_Proveedor`, `tr`.`shipped` AS `shipment`, diff --git a/db/routines/vn2008/views/travel.sql b/db/routines/vn2008/views/travel.sql index b55dbf9b65..0e1f5acb2a 100644 --- a/db/routines/vn2008/views/travel.sql +++ b/db/routines/vn2008/views/travel.sql @@ -17,5 +17,6 @@ AS SELECT `t`.`id` AS `id`, `t`.`cargoSupplierFk` AS `cargoSupplierFk`, `t`.`totalEntries` AS `totalEntries`, `t`.`appointment` AS `appointment`, - `t`.`awbFk` AS `awbFk` + `t`.`awbFk` AS `awbFk`, + `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 8bd6a4a64e..324e459f6c 100644 --- a/db/routines/vn2008/views/v_compres.sql +++ b/db/routines/vn2008/views/v_compres.sql @@ -28,7 +28,6 @@ AS SELECT `TP`.`Id_Tipo` AS `Familia`, `E`.`Id_Proveedor` AS `Id_Proveedor`, `E`.`Fecha` AS `Fecha`, `E`.`Confirmada` AS `Confirmada`, - `E`.`Redada` AS `Redada`, `E`.`empresa_id` AS `empresa_id`, `E`.`travel_id` AS `travel_id`, `E`.`Pedida` AS `Pedida`, @@ -85,6 +84,6 @@ FROM ( ) JOIN `vn2008`.`Cubos` `cb` ON(`cb`.`Id_Cubo` = `C`.`Id_Cubo`) ) -WHERE `W_IN`.`isFeedStock` = 0 - AND `E`.`Inventario` = 0 - AND `E`.`Redada` = 0 +WHERE NOT `W_IN`.`isFeedStock` + AND NOT `E`.`Inventario` + AND NOT `TR`.`daysInForward` diff --git a/db/versions/11316-chocolateErica/00-firstScript.sql b/db/versions/11316-chocolateErica/00-firstScript.sql new file mode 100644 index 0000000000..b973d8a412 --- /dev/null +++ b/db/versions/11316-chocolateErica/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.travel ADD IF NOT EXISTS daysInForward INT UNSIGNED DEFAULT NULL NULL + COMMENT 'Número de días donde se siturá el landed de las entradas con respecto a hoy'; diff --git a/modules/entry/back/locale/entry/en.yml b/modules/entry/back/locale/entry/en.yml index 6bc2333e6b..ab8c0fd1cb 100644 --- a/modules/entry/back/locale/entry/en.yml +++ b/modules/entry/back/locale/entry/en.yml @@ -9,7 +9,6 @@ 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 a892b05d28..18bf1ca331 100644 --- a/modules/entry/back/locale/entry/es.yml +++ b/modules/entry/back/locale/entry/es.yml @@ -9,7 +9,6 @@ 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 f4703245cc..a5c236fe4f 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, - e.isRaid, + t.daysInForward, 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 cac3c65f86..4612de9a56 100644 --- a/modules/entry/back/methods/entry/getEntry.js +++ b/modules/entry/back/methods/entry/getEntry.js @@ -48,7 +48,9 @@ module.exports = Self => { 'warehouseInFk', 'isReceived', 'isDelivered', - 'ref'], + 'ref', + 'daysInForward', + ], include: [ { relation: 'agency', @@ -85,7 +87,6 @@ module.exports = Self => { } ], }; - return models.Entry.findOne(filter, myOptions); }; }; diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 383585fce1..4a09c7d6a5 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -33,15 +33,6 @@ "isConfirmed": { "type": "boolean" }, - "isVirtual": { - "type": "boolean", - "mysql": { - "columnName": "isRaid" - } - }, - "isRaid": { - "type": "boolean" - }, "commission": { "type": "number" }, @@ -88,7 +79,8 @@ "travel": { "type": "belongsTo", "model": "Travel", - "foreignKey": "travelFk" + "foreignKey": "travelFk", + "daysInForward": "daysInForward" }, "company": { "type": "belongsTo", diff --git a/modules/travel/back/methods/travel/getTravel.js b/modules/travel/back/methods/travel/getTravel.js index 171b64db19..59d30a0c77 100644 --- a/modules/travel/back/methods/travel/getTravel.js +++ b/modules/travel/back/methods/travel/getTravel.js @@ -44,7 +44,6 @@ module.exports = Self => { ], }; - let travel = await Self.app.models.Travel.findOne(filter); - return travel; + return Self.app.models.Travel.findOne(filter); }; }; diff --git a/modules/travel/back/models/travel.json b/modules/travel/back/models/travel.json index 0ebf683e75..04f53f1c88 100644 --- a/modules/travel/back/models/travel.json +++ b/modules/travel/back/models/travel.json @@ -50,6 +50,9 @@ }, "landingHour": { "type": "string" + }, + "daysInForward": { + "type": "number" } }, "relations": { From 4d3bc2c8377e85041e952283561901ec91a78049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Thu, 24 Oct 2024 19:32:02 +0200 Subject: [PATCH 022/135] feat: refs #8087 Traspasar redadas a travels --- modules/entry/front/descriptor/index.html | 130 +++++++++---------- modules/entry/front/summary/index.html | 2 +- modules/travel/back/methods/travel/filter.js | 1 + 3 files changed, 67 insertions(+), 66 deletions(-) diff --git a/modules/entry/front/descriptor/index.html b/modules/entry/front/descriptor/index.html index 3354d41554..40625a4d5b 100644 --- a/modules/entry/front/descriptor/index.html +++ b/modules/entry/front/descriptor/index.html @@ -1,65 +1,65 @@ - - - - Show entry report - - - -
- - - - - - -
-
- - - - -
- -
-
- - - \ No newline at end of file + + + + Show entry report + + + +
+ + + + + + +
+
+ + + + +
+ +
+
+ + + diff --git a/modules/entry/front/summary/index.html b/modules/entry/front/summary/index.html index 22ea87bdfa..e58169fa54 100644 --- a/modules/entry/front/summary/index.html +++ b/modules/entry/front/summary/index.html @@ -86,7 +86,7 @@ auto-load="true"> { t.landingHour, t.cargoSupplierFk, t.totalEntries, + t.daysInForward, am.name agencyModeName, win.name warehouseInName, wout.name warehouseOutName, From 11e13fdb200838e29e815aa8d88c547cf49815b4 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 25 Oct 2024 06:40:06 +0200 Subject: [PATCH 023/135] feat: refs #7922 refs #792 scanOrder --- db/routines/vn/procedures/expedition_getFromRoute.sql | 4 +++- db/versions/11319-redEucalyptus/00-firstScript.sql | 3 +++ .../back/methods/expedition-state/addExpeditionState.js | 2 ++ modules/ticket/back/models/expedition-state.json | 3 +++ 4 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 db/versions/11319-redEucalyptus/00-firstScript.sql diff --git a/db/routines/vn/procedures/expedition_getFromRoute.sql b/db/routines/vn/procedures/expedition_getFromRoute.sql index f95936413d..8c2ab057dc 100644 --- a/db/routines/vn/procedures/expedition_getFromRoute.sql +++ b/db/routines/vn/procedures/expedition_getFromRoute.sql @@ -16,7 +16,8 @@ BEGIN a.nickname, sub2.itemPackingTypeConcat, est.code, - es.isScanned + es2.isScanned, + es2.scanOrder FROM expedition e JOIN ticket t ON t.id = e.ticketFk JOIN ticketState ts ON ts.ticketFk = e.ticketFk @@ -38,6 +39,7 @@ BEGIN SELECT MAX(id) FROM expeditionState es WHERE expeditionFk = e.id) + LEFT JOIN expeditionState es2 ON es2.id = es.id WHERE t.routeFk = vRouteFk AND e.freightItemFk <> FALSE ORDER BY r.created, t.priority DESC; END$$ diff --git a/db/versions/11319-redEucalyptus/00-firstScript.sql b/db/versions/11319-redEucalyptus/00-firstScript.sql new file mode 100644 index 0000000000..62bd64f4af --- /dev/null +++ b/db/versions/11319-redEucalyptus/00-firstScript.sql @@ -0,0 +1,3 @@ +USE vn; + +ALTER TABLE vn.expeditionState ADD scanOrder int(11) DEFAULT NULL NULL COMMENT 'Indica la posición al cargar la furgoneta'; diff --git a/modules/ticket/back/methods/expedition-state/addExpeditionState.js b/modules/ticket/back/methods/expedition-state/addExpeditionState.js index 80d74ee920..0ba402ff7e 100644 --- a/modules/ticket/back/methods/expedition-state/addExpeditionState.js +++ b/modules/ticket/back/methods/expedition-state/addExpeditionState.js @@ -44,6 +44,7 @@ module.exports = Self => { const typeFk = expeditionStateType.id; expeditionId = expedition.expeditionFk; + expeditionPosition = expedition?.scanOrder ?? null; const isScannedExpedition = expedition.isScanned ?? false; await models.ExpeditionState.create({ @@ -51,6 +52,7 @@ module.exports = Self => { typeFk, userFk: userId, isScanned: isScannedExpedition, + scanOrder: expeditionPosition }, myOptions); } diff --git a/modules/ticket/back/models/expedition-state.json b/modules/ticket/back/models/expedition-state.json index 159a9275eb..e96d2544c7 100644 --- a/modules/ticket/back/models/expedition-state.json +++ b/modules/ticket/back/models/expedition-state.json @@ -26,6 +26,9 @@ }, "isScanned": { "type": "boolean" + }, + "scanOrder": { + "type": "number" } }, "relations": { From 8f102607953ba587527a2122cb82537e3db0be6e Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 25 Oct 2024 11:37:45 +0200 Subject: [PATCH 024/135] feat: refs #7943 return just the required content --- modules/worker/back/models/worker.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index c334c0d055..53be3ebb7f 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -204,6 +204,15 @@ ] }, "summary": { + "fields": [ + "id", + "firstName", + "lastName", + "bossFk", + "sex", + "phone", + "mobileExtension" + ], "include": [ { "relation": "user", From e775e561201d96604f0706b17948c3aeaa8af5b2 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 25 Oct 2024 13:48:27 +0200 Subject: [PATCH 025/135] feat: refs #7921 refs#7921 sendLostExpedition --- loopback/locale/en.json | 7 ++- loopback/locale/es.json | 3 +- loopback/locale/fr.json | 11 ++-- loopback/locale/pt.json | 9 +-- .../specs/addExpeditionState.spec.js | 1 + .../ticket/back/models/expedition-state.js | 62 +++++++++++++++++++ 6 files changed, 80 insertions(+), 13 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index a7e21960b6..ed1f28a04e 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,6 +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", - "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", + "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 9f01bd2900..a31e0688b4 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -385,5 +385,6 @@ "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", + "ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}" } \ No newline at end of file diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 23bd5cc04c..1c7923ab46 100644 --- a/loopback/locale/fr.json +++ b/loopback/locale/fr.json @@ -123,8 +123,8 @@ "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 quantity": "J'ai changé {{changes}} 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", "regular": "normal", @@ -362,6 +362,7 @@ "The invoices have been created but the PDFs could not be generated": "La facture a été émise mais le PDF n'a pas pu être généré", "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" -} + "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", + "ticketLostExpedition": "Le ticket [{{ticketId}}]({{{ticketUrl}}}) a l'expédition perdue suivante : {{expeditionId}}" +} \ No newline at end of file diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index f85afd6073..6894491635 100644 --- a/loopback/locale/pt.json +++ b/loopback/locale/pt.json @@ -124,7 +124,7 @@ "Changed sale discount": "Desconto da venda alterado no ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", "Created claim": "Reclamação criada [{{claimId}}]({{{claimUrl}}}) no ticket [{{ticketId}}]({{{ticketUrl}}}): {{{changes}}}", "Changed sale price": "Preço da venda alterado para [{{itemId}} {{concept}}]({{{itemUrl}}}) ({{quantity}}) de {{oldPrice}}€ ➔ *{{newPrice}}€* no ticket [{{ticketId}}]({{{ticketUrl}}})", - "Changed sale quantity": "Quantidade da venda alterada para {{changes}} no ticket [{{ticketId}}]({{{ticketUrl}}})", + "Changed sale quantity": "Quantidade da venda alterada para {{changes}} no ticket [{{ticketId}}]({{{ticketUrl}}})", "Changes in sales": " [{{itemId}} {{concept}}]({{{itemUrl}}}) de {{oldQuantity}} ➔ *{{newQuantity}}* ", "State": "Estado", "regular": "normal", @@ -361,7 +361,8 @@ "It was not able to create the invoice": "Não foi possível criar a fatura", "The invoices have been created but the PDFs could not be generated": "Foi faturado, mas o PDF não pôde ser gerado", "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", + "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", + "ticketLostExpedition": "O ticket [{{ticketId}}]({{{ticketUrl}}}) tem a seguinte expedição perdida: {{expeditionId}}" +} \ No newline at end of file diff --git a/modules/ticket/back/methods/expedition-state/specs/addExpeditionState.spec.js b/modules/ticket/back/methods/expedition-state/specs/addExpeditionState.spec.js index 7473522866..71bc453de5 100644 --- a/modules/ticket/back/methods/expedition-state/specs/addExpeditionState.spec.js +++ b/modules/ticket/back/methods/expedition-state/specs/addExpeditionState.spec.js @@ -2,6 +2,7 @@ const models = require('vn-loopback/server/server').models; describe('expeditionState addExpeditionState()', () => { const ctx = beforeAll.getCtx(); + beforeAll.mockLoopBackContext(); it('should update the expedition states', async() => { const tx = await models.ExpeditionState.beginTransaction({}); try { diff --git a/modules/ticket/back/models/expedition-state.js b/modules/ticket/back/models/expedition-state.js index 496dd88d32..18bab580e5 100644 --- a/modules/ticket/back/models/expedition-state.js +++ b/modules/ticket/back/models/expedition-state.js @@ -1,4 +1,66 @@ +const LoopBackContext = require('loopback-context'); + module.exports = function(Self) { require('../methods/expedition-state/filter')(Self); require('../methods/expedition-state/addExpeditionState')(Self); + + Self.observe('before save', async ctx => { + const models = Self.app.models; + const changes = ctx.data || ctx.instance; + const instance = ctx.currentInstance; + const loopBackContext = LoopBackContext.getCurrentContext(); + const httpCtx = {req: loopBackContext.active}; + const httpRequest = httpCtx.req.http.req; + const $t = httpRequest.__; + const myOptions = {}; + + if (ctx.options && ctx.options.transaction) + myOptions.transaction = ctx.options.transaction; + + const newStateType = changes?.typeFk; + if (newStateType == null) return; + + const expeditionId = changes?.expeditionFk || instance?.expeditionFk; + + const {code} = await models.ExpeditionStateType.findById( + newStateType, + { + fields: ['code'] + }, + myOptions); + + if (code !== 'LOST') return; + + const dataExpedition = await models.Expedition.findById( + expeditionId, { + fields: ['ticketFk'], + include: [{ + relation: 'ticket', + scope: { + fields: ['clientFk'], + include: [{ + relation: 'client', + scope: { + fields: ['name', 'salesPersonFk'] + } + }] + } + }], + + }, myOptions); + + const salesPersonFk = dataExpedition.toJSON().ticket?.client?.salesPersonFk; + + if (salesPersonFk) { + const url = await Self.app.models.Url.getUrl(); + const fullUrl = `${url}ticket/${dataExpedition.ticketFk}/expedition`; + const message = $t('ticketLostExpedition', { + ticketId: dataExpedition.ticketFk, + expeditionId: expeditionId, + url: fullUrl + }); + await models.Chat.sendCheckingPresence(httpCtx, salesPersonFk, message); + } + }); }; + From 80764b6495290a5e9090114956fc5260df53f42f Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 25 Oct 2024 14:17:57 +0200 Subject: [PATCH 026/135] feat: refs #7006 itemTypeLog --- db/versions/11297-graySalal/01-firstScript.sql | 3 +++ modules/item/back/models/item-type.json | 6 ++++++ 2 files changed, 9 insertions(+) create mode 100644 db/versions/11297-graySalal/01-firstScript.sql diff --git a/db/versions/11297-graySalal/01-firstScript.sql b/db/versions/11297-graySalal/01-firstScript.sql new file mode 100644 index 0000000000..78ce1a5401 --- /dev/null +++ b/db/versions/11297-graySalal/01-firstScript.sql @@ -0,0 +1,3 @@ +ALTER TABLE vn.itemType + ADD CONSTRAINT itemType_itemPackingType_FK FOREIGN KEY (itemPackingTypeFk) + REFERENCES vn.itemPackingType(code) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/modules/item/back/models/item-type.json b/modules/item/back/models/item-type.json index c5c920b2fe..88f66899ea 100644 --- a/modules/item/back/models/item-type.json +++ b/modules/item/back/models/item-type.json @@ -29,6 +29,12 @@ }, "isLaid": { "type": "boolean" + }, + "maxRefs": { + "type": "string" + }, + "isFragile": { + "type": "boolean" } }, "relations": { From 14d6eb722ee5087402b3d213a1d5f1b6399d53fe Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 25 Oct 2024 14:24:26 +0200 Subject: [PATCH 027/135] feat: refs #7006 Requested changes --- db/versions/11297-graySalal/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11297-graySalal/00-firstScript.sql b/db/versions/11297-graySalal/00-firstScript.sql index 372af804c9..4d4711306d 100644 --- a/db/versions/11297-graySalal/00-firstScript.sql +++ b/db/versions/11297-graySalal/00-firstScript.sql @@ -24,4 +24,4 @@ CREATE TABLE `vn`.`itemTypeLog` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_unicode_ci `PAGE_COMPRESSED`=1; INSERT IGNORE INTO salix.ACL (model,property,principalId) - VALUES ('ItemTypeLog','*','employee'); + VALUES ('ItemTypeLog','find','employee'); From fb0764bc1fa35c5ce8942c2105fe805d7cb54eba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Fri, 25 Oct 2024 14:34:51 +0200 Subject: [PATCH 028/135] feat: refs #8087 Traspasar redadas a travels --- db/dump/fixtures.before.sql | 24 +++++++++---------- .../vn/procedures/available_traslate.sql | 2 +- .../vn/procedures/item_valuateInventory.sql | 2 +- .../11316-chocolateErica/00-firstScript.sql | 7 +++++- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 51ffba3d02..63230aa080 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`) - 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), - (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), - (3, util.VN_CURDATE(), util.VN_CURDATE(), 1, 2, 1, 0.00, 0.00, 'third travel', 1, 1, 3), - (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), - (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), - (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), - (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), - (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), - (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), - (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`.`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`.`entry`(`id`, `supplierFk`, `created`, `travelFk`, `isConfirmed`, `companyFk`, `invoiceNumber`, `reference`, `isExcludedFromAvailable`, `evaNotes`) VALUES diff --git a/db/routines/vn/procedures/available_traslate.sql b/db/routines/vn/procedures/available_traslate.sql index 28b187e58f..513f58e369 100644 --- a/db/routines/vn/procedures/available_traslate.sql +++ b/db/routines/vn/procedures/available_traslate.sql @@ -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 t.daysInForward + AND NOT tr.daysInForward ON DUPLICATE KEY UPDATE tItemRange.dated = GREATEST(tItemRange.dated, tr.landed); diff --git a/db/routines/vn/procedures/item_valuateInventory.sql b/db/routines/vn/procedures/item_valuateInventory.sql index 8809891016..b6d6879601 100644 --- a/db/routines/vn/procedures/item_valuateInventory.sql +++ b/db/routines/vn/procedures/item_valuateInventory.sql @@ -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 t.daysInForward + AND NOT tr.daysInForward AND w.valuatedInventory AND t.isInventory AND (t.id = vItemTypeFk OR vItemTypeFk IS NULL) diff --git a/db/versions/11316-chocolateErica/00-firstScript.sql b/db/versions/11316-chocolateErica/00-firstScript.sql index b973d8a412..8fd0c72ded 100644 --- a/db/versions/11316-chocolateErica/00-firstScript.sql +++ b/db/versions/11316-chocolateErica/00-firstScript.sql @@ -1,2 +1,7 @@ -ALTER TABLE vn.travel ADD IF NOT EXISTS daysInForward INT UNSIGNED DEFAULT NULL NULL +ALTER TABLE vn.travel ADD IF NOT EXISTS daysInForward INT UNSIGNED DEFAULT 0 NOT NULL COMMENT 'Número de días donde se siturá el landed de las entradas con respecto a hoy'; + +ALTER TABLE vn.entry CHANGE isRaid isRaid_ tinyint(1) DEFAULT 0 NOT NULL COMMENT '@deprecated 2024-11-05'; + +RENAME TABLE vn.entryVirtual TO vn.entryVirtual__; +ALTER TABLE vn.entryVirtual__ COMMENT='@deprecated 2024-11-05'; From d8e241740f9e5df512c44c5fbc31ecdaa3f9f000 Mon Sep 17 00:00:00 2001 From: jorgep Date: Sun, 27 Oct 2024 13:47:52 +0100 Subject: [PATCH 029/135] feat: refs #7524 restrict fields --- modules/worker/back/models/worker.json | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index 53be3ebb7f..937df98c0d 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -256,10 +256,21 @@ } }, { - "relation": "boss" + "relation": "boss", + "scope": { + "fields": [ + "id", + "name" + ] + } }, { - "relation": "client" + "relation": "client", + "scope": { + "fields": [ + "id" + ] + } }, { "relation": "sip", @@ -281,14 +292,16 @@ "fields": [ "id", "fiDueDate", - "sex", "seniority", "fi", "isFreelance", "isSsDiscounted", "hasMachineryAuthorized", "isDisable", - "birth" + "birth", + "educationLevelFk", + "originCountryFk", + "maritalStatus" ] } } From 869c7ab598ffa951a479987b6ba2946efd2aeb5a Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 28 Oct 2024 07:37:42 +0100 Subject: [PATCH 030/135] fix: refs #6644 email and translations --- loopback/locale/en.json | 9 ++++++--- loopback/locale/es.json | 5 +++-- loopback/locale/fr.json | 3 ++- loopback/locale/pt.json | 3 ++- modules/client/back/methods/client/createWithUser.js | 3 +++ 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index a7e21960b6..8c1ee7bb9e 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -240,6 +240,9 @@ "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", + "null": "null", + "Invalid or expired verification code": "Invalid or expired verification code", + "Payment method is required": "Payment method is required" +} \ No newline at end of file diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 9f01bd2900..144046f561 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -385,5 +385,6 @@ "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" -} \ No newline at end of file + "There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén", + "The web user's email already exists": "El correo del usuario web ya existe" +} diff --git a/loopback/locale/fr.json b/loopback/locale/fr.json index 23bd5cc04c..446c2ad0d3 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", + "The web user's email already exists": "L'email de l'internaute existe déjà" } diff --git a/loopback/locale/pt.json b/loopback/locale/pt.json index f85afd6073..4f68dfa53b 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", + "The web user's email already exists": "O e-mail do utilizador da web já existe." } diff --git a/modules/client/back/methods/client/createWithUser.js b/modules/client/back/methods/client/createWithUser.js index c8cd282e19..1d5e71fcae 100644 --- a/modules/client/back/methods/client/createWithUser.js +++ b/modules/client/back/methods/client/createWithUser.js @@ -1,3 +1,4 @@ +/* eslint max-len: ["error", { "code": 150 }]*/ const UserError = require('vn-loopback/util/user-error'); module.exports = function(Self) { @@ -98,6 +99,8 @@ module.exports = function(Self) { return client; } catch (e) { if (tx) await tx.rollback(); + if (e.message && e.message.includes(`Email already exists`)) throw new UserError(`The web user's email already exists`); + throw e; } }; From 6efc2c340c932b1437689cf5decb30bf8b7b7d3a Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 28 Oct 2024 08:57:22 +0100 Subject: [PATCH 031/135] feat: refs #7921 refs#7921 sendLostExpedition --- modules/ticket/back/models/expedition-state.js | 2 +- modules/ticket/back/models/expedition-state.json | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/ticket/back/models/expedition-state.js b/modules/ticket/back/models/expedition-state.js index 18bab580e5..f819dc05cc 100644 --- a/modules/ticket/back/models/expedition-state.js +++ b/modules/ticket/back/models/expedition-state.js @@ -49,7 +49,7 @@ module.exports = function(Self) { }, myOptions); - const salesPersonFk = dataExpedition.toJSON().ticket?.client?.salesPersonFk; + const salesPersonFk = dataExpedition.ticket()?.client()?.salesPersonFk; if (salesPersonFk) { const url = await Self.app.models.Url.getUrl(); diff --git a/modules/ticket/back/models/expedition-state.json b/modules/ticket/back/models/expedition-state.json index 159a9275eb..5223270312 100644 --- a/modules/ticket/back/models/expedition-state.json +++ b/modules/ticket/back/models/expedition-state.json @@ -19,7 +19,8 @@ "type": "number" }, "typeFk": { - "type": "number" + "type": "number", + "required": true }, "userFk": { "type": "number" From eb5f57285aaf242b1d54ce4a8bd881f4e69dea3b Mon Sep 17 00:00:00 2001 From: Jon Date: Mon, 28 Oct 2024 10:40:43 +0100 Subject: [PATCH 032/135] feat: refs #7193 added scope in parking model --- modules/shelving/back/models/parking.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/shelving/back/models/parking.json b/modules/shelving/back/models/parking.json index 47a3305ae2..a9393fc6a7 100644 --- a/modules/shelving/back/models/parking.json +++ b/modules/shelving/back/models/parking.json @@ -38,5 +38,13 @@ "model": "Sector", "foreignKey": "sectorFk" } + }, + "scope": { + "include": { + "relation": "sector", + "scope": { + "fields": ["id", "description"] + } + } } } From c43bdb502155dec92ed51787bd65ed98902cecd6 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 28 Oct 2024 11:29:15 +0100 Subject: [PATCH 033/135] feat: refs #7266 Added details and improvements in item label reports --- .../back/methods/entry/labelBarcodePdf.js | 48 ++++++++++++++++++ .../entry/back/methods/entry/labelQrPdf.js | 49 +++++++++++++++++++ modules/entry/back/models/buy.js | 2 + .../item/back/methods/item/labelBarcodePdf.js | 11 ++--- modules/item/back/methods/item/labelQrPdf.js | 12 ++--- .../item-label-barcode/assets/css/style.css | 6 +-- .../item-label-barcode.html | 5 +- .../item-label-barcode/item-label-barcode.js | 25 +++++----- .../reports/item-label-barcode/options.json | 2 +- .../reports/item-label-barcode/sql/item.sql | 3 +- .../item-label-qr/assets/css/style.css | 2 +- .../reports/item-label-qr/item-label-qr.html | 9 +++- .../reports/item-label-qr/item-label-qr.js | 24 +++++---- .../reports/item-label-qr/options.json | 2 +- .../reports/item-label-qr/sql/item.sql | 3 +- 15 files changed, 157 insertions(+), 46 deletions(-) create mode 100644 modules/entry/back/methods/entry/labelBarcodePdf.js create mode 100644 modules/entry/back/methods/entry/labelQrPdf.js diff --git a/modules/entry/back/methods/entry/labelBarcodePdf.js b/modules/entry/back/methods/entry/labelBarcodePdf.js new file mode 100644 index 0000000000..847859aeb0 --- /dev/null +++ b/modules/entry/back/methods/entry/labelBarcodePdf.js @@ -0,0 +1,48 @@ +module.exports = Self => { + Self.remoteMethodCtx('labelBarcodePdf', { + description: 'Returns the item label pdf with barcode', + accessType: 'READ', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The item id', + http: {source: 'path'} + }, { + arg: 'packing', + type: 'number', + required: false + }, { + arg: 'copies', + type: 'number', + required: false + } + ], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/label-barcode-pdf', + verb: 'GET' + }, + accessScopes: ['DEFAULT', 'read:multimedia'] + }); + + Self.labelBarcodePdf = (ctx, id) => { + ctx.args.typeId = 'buy'; + return Self.printReport(ctx, id, 'item-label-barcode'); + }; +}; diff --git a/modules/entry/back/methods/entry/labelQrPdf.js b/modules/entry/back/methods/entry/labelQrPdf.js new file mode 100644 index 0000000000..9668dfffdc --- /dev/null +++ b/modules/entry/back/methods/entry/labelQrPdf.js @@ -0,0 +1,49 @@ +module.exports = Self => { + Self.remoteMethodCtx('labelQrPdf', { + description: 'Returns the item label pdf with qr', + accessType: 'READ', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The item id', + http: {source: 'path'} + }, { + arg: 'packing', + type: 'number', + required: false + }, { + arg: 'copies', + type: 'number', + required: false + } + ], + returns: [ + { + arg: 'body', + type: 'file', + root: true + }, { + arg: 'Content-Type', + type: 'String', + http: {target: 'header'} + }, { + arg: 'Content-Disposition', + type: 'String', + http: {target: 'header'} + } + ], + http: { + path: '/:id/label-qr-pdf', + verb: 'GET' + }, + accessScopes: ['DEFAULT', 'read:multimedia'] + }); + + Self.labelQrPdf = (ctx, id) => { + ctx.args.userId = ctx.req.accessToken.userId; + ctx.args.typeId = 'buy'; + return Self.printReport(ctx, id, 'item-label-qr'); + }; +}; diff --git a/modules/entry/back/models/buy.js b/modules/entry/back/models/buy.js index 34f19e765a..70d92195c5 100644 --- a/modules/entry/back/models/buy.js +++ b/modules/entry/back/models/buy.js @@ -2,4 +2,6 @@ module.exports = Self => { require('../methods/entry/editLatestBuys')(Self); require('../methods/entry/latestBuysFilter')(Self); require('../methods/entry/deleteBuys')(Self); + require('../methods/entry/labelBarcodePdf')(Self); + require('../methods/entry/labelQrPdf')(Self); }; diff --git a/modules/item/back/methods/item/labelBarcodePdf.js b/modules/item/back/methods/item/labelBarcodePdf.js index 3325e3da10..8e28ddfe26 100644 --- a/modules/item/back/methods/item/labelBarcodePdf.js +++ b/modules/item/back/methods/item/labelBarcodePdf.js @@ -21,12 +21,6 @@ module.exports = Self => { arg: 'copies', type: 'number', required: false - }, { - arg: 'userId', - type: 'number', - description: 'The user id from accessToken', - http: ctx => ctx.req.accessToken.userId, - required: true } ], returns: [ @@ -51,5 +45,8 @@ module.exports = Self => { accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.labelBarcodePdf = (ctx, id) => Self.printReport(ctx, id, 'item-label-barcode'); + Self.labelBarcodePdf = (ctx, id) => { + ctx.args.typeId = 'item'; + return Self.printReport(ctx, id, 'item-label-barcode'); + }; }; diff --git a/modules/item/back/methods/item/labelQrPdf.js b/modules/item/back/methods/item/labelQrPdf.js index 4d0e345286..2c42a978a7 100644 --- a/modules/item/back/methods/item/labelQrPdf.js +++ b/modules/item/back/methods/item/labelQrPdf.js @@ -21,12 +21,6 @@ module.exports = Self => { arg: 'copies', type: 'number', required: false - }, { - arg: 'userId', - type: 'number', - description: 'The user id from accessToken', - http: ctx => ctx.req.accessToken.userId, - required: true } ], returns: [ @@ -51,5 +45,9 @@ module.exports = Self => { accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.labelQrPdf = (ctx, id) => Self.printReport(ctx, id, 'item-label-qr'); + Self.labelQrPdf = (ctx, id) => { + ctx.args.userId = ctx.req.accessToken.userId; + ctx.args.typeId = 'item'; + return Self.printReport(ctx, id, 'item-label-qr'); + }; }; diff --git a/print/templates/reports/item-label-barcode/assets/css/style.css b/print/templates/reports/item-label-barcode/assets/css/style.css index 884faef564..fabecd28e1 100644 --- a/print/templates/reports/item-label-barcode/assets/css/style.css +++ b/print/templates/reports/item-label-barcode/assets/css/style.css @@ -1,7 +1,7 @@ html { font-family: "Roboto", "Helvetica", "Arial", sans-serif; margin-top: -9px; - margin-left: -6px; + margin-left: -3px; } table { width: 100%; @@ -52,8 +52,8 @@ td { max-height: 50px; } .md-height { - height: 75px; - max-height: 75px; + height: 70px; + max-height: 70px; } .sm-width { width: 60px; diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.html b/print/templates/reports/item-label-barcode/item-label-barcode.html index 929ce5fe2c..8bf3ce8eb8 100644 --- a/print/templates/reports/item-label-barcode/item-label-barcode.html +++ b/print/templates/reports/item-label-barcode/item-label-barcode.html @@ -52,7 +52,10 @@
diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.js b/print/templates/reports/item-label-barcode/item-label-barcode.js index 5f9a11ea11..e2945ae390 100755 --- a/print/templates/reports/item-label-barcode/item-label-barcode.js +++ b/print/templates/reports/item-label-barcode/item-label-barcode.js @@ -6,17 +6,18 @@ const jsbarcode = require('jsbarcode'); module.exports = { name: 'item-label-barcode', async serverPrefetch() { - this.company = await this.findOneFromDef('company', [this.warehouseId]); - if (!this.company) - throw new UserError(`There is no company associated with that warehouse`); - this.date = Date.vnNew(); - this.lastBuy = await this.findOneFromDef('lastBuy', [ - this.id, - this.warehouseId, - this.date - ]); - this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy.id]); + if (this.typeId === 'item') { + this.company = await this.findOneFromDef('company', [this.warehouseId]); + if (!this.company) + throw new UserError(`There is no company associated with that warehouse`); + this.lastBuy = await this.findOneFromDef('lastBuy', [ + this.id, + this.warehouseId, + this.date + ]); + } + this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy?.id || this.id]); if (!this.items.length) throw new UserError(`Empty data source`); this.date = moment(this.date).format('WW/E'); }, @@ -51,8 +52,8 @@ module.exports = { copies: { type: Number }, - userId: { - type: Number + typeId: { + type: String } } }; diff --git a/print/templates/reports/item-label-barcode/options.json b/print/templates/reports/item-label-barcode/options.json index 1ae2630b09..17c43e69f5 100644 --- a/print/templates/reports/item-label-barcode/options.json +++ b/print/templates/reports/item-label-barcode/options.json @@ -3,7 +3,7 @@ "height": "4.9cm", "margin": { "top": "0.17cm", - "right": "0.745cm", + "right": "0.37cm", "bottom": "0cm", "left": "0cm" }, diff --git a/print/templates/reports/item-label-barcode/sql/item.sql b/print/templates/reports/item-label-barcode/sql/item.sql index 3cb42d139f..c56097c8dd 100644 --- a/print/templates/reports/item-label-barcode/sql/item.sql +++ b/print/templates/reports/item-label-barcode/sql/item.sql @@ -22,7 +22,8 @@ SELECT ROW_NUMBER() OVER() labelNum, ig.longName, ig.subName, i.comment, - w.code buyerName + w.code buyerName, + i.isLaid FROM vn.buy b JOIN vn.item i ON i.id = b.itemFk LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk diff --git a/print/templates/reports/item-label-qr/assets/css/style.css b/print/templates/reports/item-label-qr/assets/css/style.css index fe6668c9a3..0e288704bc 100644 --- a/print/templates/reports/item-label-qr/assets/css/style.css +++ b/print/templates/reports/item-label-qr/assets/css/style.css @@ -1,7 +1,7 @@ html { font-family: "Roboto", "Helvetica", "Arial", sans-serif; margin-top: -7px; - margin-left: -6px; + margin-left: -3px; } .leftTable { width: 47%; diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/item-label-qr/item-label-qr.html index 712bd6c7db..6218a4513f 100644 --- a/print/templates/reports/item-label-qr/item-label-qr.html +++ b/print/templates/reports/item-label-qr/item-label-qr.html @@ -74,7 +74,14 @@ Productor: {{item.producerName || item.producerFk}} - +
From 62f9f31279f829b204e55e4c52b2370c3a0b5244 Mon Sep 17 00:00:00 2001 From: jgallego Date: Wed, 23 Oct 2024 07:44:41 +0200 Subject: [PATCH 016/135] feat: refs #7943 usa back con permisos --- .../item/front/item-type/basic-data/index.html | 16 ++++++++-------- modules/item/front/item-type/create/index.html | 14 +++++++------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/item/front/item-type/basic-data/index.html b/modules/item/front/item-type/basic-data/index.html index 1417a05ab0..c3f7a57f1d 100644 --- a/modules/item/front/item-type/basic-data/index.html +++ b/modules/item/front/item-type/basic-data/index.html @@ -11,26 +11,26 @@ - \ No newline at end of file + diff --git a/modules/item/front/item-type/create/index.html b/modules/item/front/item-type/create/index.html index 44cb5183de..4a199a1b17 100644 --- a/modules/item/front/item-type/create/index.html +++ b/modules/item/front/item-type/create/index.html @@ -12,26 +12,26 @@ Date: Wed, 23 Oct 2024 09:46:06 +0200 Subject: [PATCH 017/135] feat: refs #7266 Print corrections --- .../item-label-barcode/assets/css/style.css | 15 ++++++++------- .../item-label-barcode/item-label-barcode.html | 2 +- .../item-label-barcode/item-label-barcode.js | 2 +- .../reports/item-label-barcode/options.json | 4 ++-- .../reports/item-label-qr/assets/css/style.css | 18 ++++++++++-------- .../reports/item-label-qr/options.json | 4 ++-- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/print/templates/reports/item-label-barcode/assets/css/style.css b/print/templates/reports/item-label-barcode/assets/css/style.css index 48b8819869..884faef564 100644 --- a/print/templates/reports/item-label-barcode/assets/css/style.css +++ b/print/templates/reports/item-label-barcode/assets/css/style.css @@ -1,6 +1,7 @@ html { font-family: "Roboto", "Helvetica", "Arial", sans-serif; - margin-top: -7px; + margin-top: -9px; + margin-left: -6px; } table { width: 100%; @@ -51,20 +52,20 @@ td { max-height: 50px; } .md-height { - height: 60px; - max-height: 60px; + height: 75px; + max-height: 75px; } .sm-width { width: 60px; max-width: 60px; } .md-width { - width: 120px; - max-width: 120px; + width: 125px; + max-width: 125px; } .lg-width { - width: 400px; - max-width: 400px; + width: 380px; + max-width: 380px; } .overflow-multiline { max-height: inherit; diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.html b/print/templates/reports/item-label-barcode/item-label-barcode.html index 79de494118..224338c2fc 100644 --- a/print/templates/reports/item-label-barcode/item-label-barcode.html +++ b/print/templates/reports/item-label-barcode/item-label-barcode.html @@ -8,7 +8,7 @@ {{item.item}} +
{{item.size}}
diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.js b/print/templates/reports/item-label-barcode/item-label-barcode.js index 29a2b9ad50..8a294afc18 100755 --- a/print/templates/reports/item-label-barcode/item-label-barcode.js +++ b/print/templates/reports/item-label-barcode/item-label-barcode.js @@ -29,7 +29,7 @@ module.exports = { xmlDocument: document, format: 'code128', displayValue: false, - width: 3.9, + width: 3.8, height: 85, margin: 0 }); diff --git a/print/templates/reports/item-label-barcode/options.json b/print/templates/reports/item-label-barcode/options.json index 5a3c3b1ebb..1ae2630b09 100644 --- a/print/templates/reports/item-label-barcode/options.json +++ b/print/templates/reports/item-label-barcode/options.json @@ -1,9 +1,9 @@ { "width": "10.4cm", - "height": "4.8cm", + "height": "4.9cm", "margin": { "top": "0.17cm", - "right": "0cm", + "right": "0.745cm", "bottom": "0cm", "left": "0cm" }, diff --git a/print/templates/reports/item-label-qr/assets/css/style.css b/print/templates/reports/item-label-qr/assets/css/style.css index b868f39662..fe6668c9a3 100644 --- a/print/templates/reports/item-label-qr/assets/css/style.css +++ b/print/templates/reports/item-label-qr/assets/css/style.css @@ -1,6 +1,7 @@ html { font-family: "Roboto", "Helvetica", "Arial", sans-serif; margin-top: -7px; + margin-left: -6px; } .leftTable { width: 47%; @@ -9,6 +10,7 @@ html { text-align: center; } .leftTable img { + margin-top: 3px; width: 110px; } .rightTable { @@ -51,24 +53,24 @@ html { padding: 7px; } .md-height { - height: 60px; - max-height: 60px; + height: 68px; + max-height: 68px; } .xs-width { width: 60px; max-width: 60px; } .sm-width { - width: 140px; - max-width: 140px; + width: 130px; + max-width: 130px; } .md-width { - width: 200px; - max-width: 200px; + width: 190px; + max-width: 190px; } .lg-width { - width: 270px; - max-width: 270px; + width: 240px; + max-width: 240px; } .overflow-multiline { max-height: inherit; diff --git a/print/templates/reports/item-label-qr/options.json b/print/templates/reports/item-label-qr/options.json index 5a3c3b1ebb..c3c3950403 100644 --- a/print/templates/reports/item-label-qr/options.json +++ b/print/templates/reports/item-label-qr/options.json @@ -1,9 +1,9 @@ { "width": "10.4cm", - "height": "4.8cm", + "height": "4.9cm", "margin": { "top": "0.17cm", - "right": "0cm", + "right": "0.6cm", "bottom": "0cm", "left": "0cm" }, From 3da08e3a23292353eca229b7c140898bec852cf3 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Wed, 23 Oct 2024 11:33:45 +0200 Subject: [PATCH 018/135] feat: refs #8020 machineWorkerDeprecated --- .../machine-worker/specs/updateInTime.spec.js | 132 ------------------ back/methods/machine-worker/updateInTime.js | 77 ---------- back/model-config.json | 6 - back/models/machine-worker-config.json | 18 --- back/models/machine-worker.js | 3 - back/models/machine-worker.json | 33 ----- db/dump/fixtures.before.sql | 11 -- .../workerMachinery_isRegistered.sql | 23 --- .../vn/procedures/machineWorker_add.sql | 22 --- .../machineWorker_getHistorical.sql | 21 --- .../vn/procedures/machineWorker_update.sql | 38 ----- .../vn/procedures/machine_getWorkerPlate.sql | 16 --- db/routines/vn/views/workerWithoutTractor.sql | 7 +- .../11317-silverCordyline/00-firstScript.sql | 9 ++ 14 files changed, 12 insertions(+), 404 deletions(-) delete mode 100644 back/methods/machine-worker/specs/updateInTime.spec.js delete mode 100644 back/methods/machine-worker/updateInTime.js delete mode 100644 back/models/machine-worker-config.json delete mode 100644 back/models/machine-worker.js delete mode 100644 back/models/machine-worker.json delete mode 100644 db/routines/vn/functions/workerMachinery_isRegistered.sql delete mode 100644 db/routines/vn/procedures/machineWorker_add.sql delete mode 100644 db/routines/vn/procedures/machineWorker_getHistorical.sql delete mode 100644 db/routines/vn/procedures/machineWorker_update.sql delete mode 100644 db/routines/vn/procedures/machine_getWorkerPlate.sql create mode 100644 db/versions/11317-silverCordyline/00-firstScript.sql diff --git a/back/methods/machine-worker/specs/updateInTime.spec.js b/back/methods/machine-worker/specs/updateInTime.spec.js deleted file mode 100644 index f166214b05..0000000000 --- a/back/methods/machine-worker/specs/updateInTime.spec.js +++ /dev/null @@ -1,132 +0,0 @@ -const {models} = require('vn-loopback/server/server'); - -describe('machineWorker updateInTime()', () => { - const itBoss = 104; - const davidCharles = 1106; - - beforeAll(async() => { - ctx = { - req: { - accessToken: {}, - headers: {origin: 'http://localhost'}, - __: value => value - } - }; - }); - - it('should throw an error if the plate does not exist', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - const plate = 'RE-123'; - ctx.req.accessToken.userId = 1106; - try { - await models.MachineWorker.updateInTime(ctx, plate, options); - await tx.rollback(); - } catch (e) { - const error = e; - - expect(error.message).toContain('the plate does not exist'); - await tx.rollback(); - } - }); - - it('should grab a machine where is not in use', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - const plate = 'RE-003'; - ctx.req.accessToken.userId = 1107; - try { - const totalBefore = await models.MachineWorker.find(null, options); - await models.MachineWorker.updateInTime(ctx, plate, options); - const totalAfter = await models.MachineWorker.find(null, options); - - expect(totalAfter.length).toEqual(totalBefore.length + 1); - await tx.rollback(); - } catch (e) { - await tx.rollback(); - } - }); - - describe('less than 12h', () => { - const plate = 'RE-001'; - it('should trow an error if it is not himself', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - ctx.req.accessToken.userId = davidCharles; - - try { - await models.MachineWorker.updateInTime(ctx, plate, options); - await tx.rollback(); - } catch (e) { - const error = e; - - expect(error.message).toContain('This machine is already in use'); - await tx.rollback(); - } - }); - - it('should throw an error if it is himself with a different machine', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - ctx.req.accessToken.userId = itBoss; - const plate = 'RE-003'; - try { - await models.MachineWorker.updateInTime(ctx, plate, options); - await tx.rollback(); - } catch (e) { - const error = e; - - expect(error.message).toEqual('You are already using a machine'); - await tx.rollback(); - } - }); - - it('should set the out time if it is himself', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - ctx.req.accessToken.userId = itBoss; - - try { - const isNotParked = await models.MachineWorker.findOne({ - where: {workerFk: itBoss} - }, options); - await models.MachineWorker.updateInTime(ctx, plate, options); - const isParked = await models.MachineWorker.findOne({ - where: {workerFk: itBoss} - }, options); - - expect(isNotParked.outTime).toBeNull(); - expect(isParked.outTime).toBeDefined(); - await tx.rollback(); - } catch (e) { - await tx.rollback(); - } - }); - }); - - describe('equal or more than 12h', () => { - const plate = 'RE-002'; - it('should set the out time and grab the machine', async() => { - const tx = await models.MachineWorker.beginTransaction({}); - const options = {transaction: tx}; - ctx.req.accessToken.userId = davidCharles; - const filter = { - where: {workerFk: davidCharles, machineFk: 2} - }; - try { - const isNotParked = await models.MachineWorker.findOne(filter, options); - const totalBefore = await models.MachineWorker.find(null, options); - await models.MachineWorker.updateInTime(ctx, plate, options); - const isParked = await models.MachineWorker.findOne(filter, options); - const totalAfter = await models.MachineWorker.find(null, options); - - expect(isNotParked.outTime).toBeNull(); - expect(isParked.outTime).toBeDefined(); - expect(totalAfter.length).toEqual(totalBefore.length + 1); - await tx.rollback(); - } catch (e) { - await tx.rollback(); - } - }); - }); -}); diff --git a/back/methods/machine-worker/updateInTime.js b/back/methods/machine-worker/updateInTime.js deleted file mode 100644 index 44fad2c05d..0000000000 --- a/back/methods/machine-worker/updateInTime.js +++ /dev/null @@ -1,77 +0,0 @@ -const UserError = require('vn-loopback/util/user-error'); -module.exports = Self => { - Self.remoteMethodCtx('updateInTime', { - description: 'Updates the corresponding registry if the worker has been registered in the last few hours', - accessType: 'WRITE', - accepts: [ - { - arg: 'plate', - type: 'string', - } - ], - http: { - path: `/updateInTime`, - verb: 'POST' - } - }); - - Self.updateInTime = async(ctx, plate, options) => { - const models = Self.app.models; - const userId = ctx.req.accessToken.userId; - const $t = ctx.req.__; - - let tx; - const myOptions = {}; - - if (typeof options == 'object') - Object.assign(myOptions, options); - - if (!myOptions.transaction) { - tx = await Self.beginTransaction({}); - myOptions.transaction = tx; - } - - try { - const machine = await models.Machine.findOne({ - fields: ['id', 'plate'], - where: {plate} - }, myOptions); - - if (!machine) - throw new UserError($t('the plate does not exist', {plate})); - - const machineWorker = await Self.findOne({ - where: { - or: [{machineFk: machine.id}, {workerFk: userId}], - outTime: null, - } - }, myOptions); - - const {maxHours} = await models.MachineWorkerConfig.findOne({fields: ['maxHours']}, myOptions); - const hoursDifference = (Date.vnNow() - machineWorker?.inTime?.getTime() ?? 0) / (60 * 60 * 1000); - - if (machineWorker) { - const isHimself = userId == machineWorker.workerFk; - const isSameMachine = machine.id == machineWorker.machineFk; - - if (hoursDifference < maxHours && !isHimself) - throw new UserError($t('This machine is already in use.')); - - if (hoursDifference < maxHours && isHimself && !isSameMachine) - throw new UserError($t('You are already using a machine')); - - await machineWorker.updateAttributes({ - outTime: Date.vnNew() - }, myOptions); - } - - if (!machineWorker || hoursDifference >= maxHours) - await models.MachineWorker.create({machineFk: machine.id, workerFk: userId}, myOptions); - - if (tx) await tx.commit(); - } catch (e) { - if (tx) await tx.rollback(); - throw e; - } - }; -}; diff --git a/back/model-config.json b/back/model-config.json index b6d3046759..5368769fdc 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -88,12 +88,6 @@ "Machine": { "dataSource": "vn" }, - "MachineWorker": { - "dataSource": "vn" - }, - "MachineWorkerConfig": { - "dataSource": "vn" - }, "MobileAppVersionControl": { "dataSource": "vn" }, diff --git a/back/models/machine-worker-config.json b/back/models/machine-worker-config.json deleted file mode 100644 index dfb77124e9..0000000000 --- a/back/models/machine-worker-config.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "MachineWorkerConfig", - "base": "VnModel", - "options": { - "mysql": { - "table": "vn.machineWorkerConfig" - } - }, - "properties": { - "id": { - "type": "number", - "id": true - }, - "maxHours": { - "type": "number" - } - } -} diff --git a/back/models/machine-worker.js b/back/models/machine-worker.js deleted file mode 100644 index cbc5fd53e4..0000000000 --- a/back/models/machine-worker.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = Self => { - require('../methods/machine-worker/updateInTime')(Self); -}; diff --git a/back/models/machine-worker.json b/back/models/machine-worker.json deleted file mode 100644 index 2244a533fa..0000000000 --- a/back/models/machine-worker.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "MachineWorker", - "base": "VnModel", - "options": { - "mysql": { - "table": "vn.machineWorker" - } - }, - "properties": { - "id": { - "type": "number", - "id": true - }, - "workerFk": { - "type": "number" - }, - "machineFk": { - "type": "number" - }, - "inTime": { - "type": "date", - "mysql": { - "columnName": "inTimed" - } - }, - "outTime": { - "type": "date", - "mysql": { - "columnName": "outTimed" - } - } - } -} diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index e93bb3b8e4..4fbe16f33c 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2842,12 +2842,6 @@ INSERT INTO `vn`.`machine` (`plate`, `maker`, `model`, `warehouseFk`, `departmen ('RE-001', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442), ('RE-002', 'STILL', 'LTX-20', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442); -INSERT INTO `vn`.`machineWorker` (`workerFk`, `machineFk`, `inTimed`, `outTimed`) - VALUES - (1106, 1, util.VN_CURDATE(), util.VN_CURDATE()), - (1106, 1, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)), - (1106, 2, util.VN_CURDATE(), NULL), - (1106, 2, DATE_ADD(util.VN_CURDATE(), INTERVAL + 1 DAY), DATE_ADD(util.VN_CURDATE(), INTERVAL +1 DAY)); INSERT INTO `vn`.`zoneExclusion` (`id`, `zoneFk`, `dated`, `created`, `userFk`) VALUES @@ -3831,8 +3825,6 @@ UPDATE vn.collection UPDATE vn.sale SET isPicked =FALSE; -INSERT INTO vn.machineWorkerConfig(id, maxHours) - VALUES(1, 12); INSERT INTO vn.workerAppTester(workerFk) VALUES(66); @@ -3840,9 +3832,6 @@ INSERT INTO `vn`.`machine` (`plate`, `maker`, `model`, `warehouseFk`, `departmen VALUES ('RE-003', 'IRON', 'JPH-24', 60, 23, 'ELECTRIC TOW', 'Drag cars', 2020, 103, 442); - -INSERT INTO vn.machineWorker(workerFk,machineFk,inTimed) VALUES (104,1,'2001-01-01 10:00:00.00.000'); - UPDATE vn.buy SET itemOriginalFk = 1 WHERE id = 1; UPDATE vn.saleTracking SET stateFk = 26 WHERE id = 5; diff --git a/db/routines/vn/functions/workerMachinery_isRegistered.sql b/db/routines/vn/functions/workerMachinery_isRegistered.sql deleted file mode 100644 index 60f458e9e7..0000000000 --- a/db/routines/vn/functions/workerMachinery_isRegistered.sql +++ /dev/null @@ -1,23 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`workerMachinery_isRegistered`(vWorkerFk VARCHAR(10)) - RETURNS tinyint(1) - NOT DETERMINISTIC - READS SQL DATA -BEGIN -/** - * Comprueba si existen registros en las últimas horas (maxHours de machineWorkerConfig) del trabajador vWorkerFk y si tiene a nulo la hora outTimed (indica la hora que deja el vehículo) - * - * @param vWorkerFk id del trabajador - * @return Devuelve TRUE/FALSE en caso de que haya o no registros - */ - IF (SELECT COUNT(*) - FROM machineWorker m - WHERE m.workerFk = vWorkerFk - AND m.inTimed >= TIMESTAMPADD(HOUR , -(SELECT maxHours from machineWorkerConfig), util.VN_NOW()) AND ISNULL(m.outTimed)) - THEN - RETURN TRUE; - ELSE - RETURN FALSE; - END IF; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/machineWorker_add.sql b/db/routines/vn/procedures/machineWorker_add.sql deleted file mode 100644 index 41000f556b..0000000000 --- a/db/routines/vn/procedures/machineWorker_add.sql +++ /dev/null @@ -1,22 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`machineWorker_add`(vPlate VARCHAR(10), vWorkerFk INT) -BEGIN - -/** - * Inserta registro si el vWorkerFk no ha registrado nada en las últimas 12 horas - * @param vPlate número de matrícula - * @param vWorkerFk id del worker - * -*/ - UPDATE vn.machineWorker mw - JOIN vn.machine m ON m.id = mw.machineFk - SET mw.outTimed = util.VN_NOW() - WHERE (mw.workerFk = vWorkerFk OR m.plate = vPlate) - AND ISNULL(mw.outTimed); - - INSERT INTO machineWorker (machineFk, workerFk) - SELECT m.id, vWorkerFk - FROM machine m - WHERE m.plate= vPlate; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/machineWorker_getHistorical.sql b/db/routines/vn/procedures/machineWorker_getHistorical.sql deleted file mode 100644 index 67b1971a2f..0000000000 --- a/db/routines/vn/procedures/machineWorker_getHistorical.sql +++ /dev/null @@ -1,21 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`machineWorker_getHistorical`(vPlate VARCHAR(20), vWorkerFk INT) -BEGIN -/** - * Obtiene historial de la matrícula vPlate que el trabajador vWorkerFk escanea, - * si es jefe de producción muestra el historial completo. - * - * @param vPlate número de matrícula - * @param vWorkerFk id del trabajador - * -*/ - DECLARE vWorkerName VARCHAR(255) DEFAULT account.user_getNameFromId(vWorkerFk); - - SELECT mw.inTimed,account.user_getNameFromId(mw.workerFk) as workerName, mw.outTimed - FROM machineWorker mw - JOIN machine m ON m.plate = vPlate - WHERE mw.machineFk = m.id - AND mw.workerFk = IF(account.user_hasRole(vWorkerName, 'coolerAssist'), mw.workerFk, vWorkerFk) - ORDER BY mw.inTimed DESC; -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/machineWorker_update.sql b/db/routines/vn/procedures/machineWorker_update.sql deleted file mode 100644 index f1a6e40b59..0000000000 --- a/db/routines/vn/procedures/machineWorker_update.sql +++ /dev/null @@ -1,38 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`machineWorker_update`(vPlate VARCHAR(10), vWorkerFk INT) -BEGIN - -/** - * Actualiza el registro correspondiente si el vWorkerFk se ha registrado en las últimas horas (campo maxHours de machineWorkerConfig) con vPlate, - * - * @param vPlate número de matrícula - * @param vWorkerFk id del trabajador - * -*/ - - DECLARE vMachineFk INT(10); - DECLARE vMaxHours INT(10); - - SELECT m.id INTO vMachineFk - FROM machine m - WHERE m.plate = vPlate; - - SELECT maxHours INTO vMaxHours - FROM machineWorkerConfig; - - IF (SELECT COUNT(*) - FROM machineWorker m - WHERE m.workerFk = vWorkerFk - AND m.inTimed >= TIMESTAMPADD(HOUR , -vMaxHours, util.VN_NOW()) AND ISNULL(m.outTimed)) THEN - - UPDATE machineWorker m - SET m.outTimed = CURRENT_TIMESTAMP() - WHERE m.workerFk = vWorkerFk - AND m.inTimed >= TIMESTAMPADD(HOUR , -vMaxHours, util.VN_NOW()) - AND ISNULL(m.outTimed) - AND m.machineFk = vMachineFk; - - END IF; - -END$$ -DELIMITER ; diff --git a/db/routines/vn/procedures/machine_getWorkerPlate.sql b/db/routines/vn/procedures/machine_getWorkerPlate.sql deleted file mode 100644 index cbb71c4cf8..0000000000 --- a/db/routines/vn/procedures/machine_getWorkerPlate.sql +++ /dev/null @@ -1,16 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`machine_getWorkerPlate`(vWorkerFk INT) -BEGIN -/** - * Selecciona la matrícula del vehículo del workerfk - * - * @param vWorkerFk el id del trabajador - */ - SELECT m.plate - FROM machine m - JOIN machineWorker mw ON mw.machineFk = m.id - WHERE mw.inTimed >= TIMESTAMPADD(HOUR , -12,util.VN_NOW()) - AND ISNULL(mw.outTimed) - AND mw.workerFk = vWorkerFk; -END$$ -DELIMITER ; diff --git a/db/routines/vn/views/workerWithoutTractor.sql b/db/routines/vn/views/workerWithoutTractor.sql index 205c665993..15b62d4a92 100644 --- a/db/routines/vn/views/workerWithoutTractor.sql +++ b/db/routines/vn/views/workerWithoutTractor.sql @@ -10,11 +10,10 @@ FROM ( `vn`.`collection` `c` JOIN `vn`.`client` `cl` ON(`cl`.`id` = `c`.`workerFk`) ) - LEFT JOIN `vn`.`machineWorker` `mw` ON( - `mw`.`workerFk` = `c`.`workerFk` - AND `mw`.`inTimed` > `util`.`VN_CURDATE`() + JOIN `vn`.`operator` `o` ON( + `o`.`workerFk` = `c`.`workerFk` ) ) WHERE `c`.`created` > `util`.`VN_CURDATE`() - AND `mw`.`workerFk` IS NULL + AND `o`.`machineFk` IS NULL GROUP BY `c`.`workerFk` diff --git a/db/versions/11317-silverCordyline/00-firstScript.sql b/db/versions/11317-silverCordyline/00-firstScript.sql new file mode 100644 index 0000000000..35dffcd641 --- /dev/null +++ b/db/versions/11317-silverCordyline/00-firstScript.sql @@ -0,0 +1,9 @@ + +USE vn; +RENAME TABLE machineWorker TO machineWorker__; +ALTER TABLE machineWorker__ COMMENT = '@deprecated 2024-10-23 not used'; + +RENAME TABLE machineWorkerConfig TO machineWorkerConfig__; +ALTER TABLE machineWorkerConfig__ COMMENT = '@deprecated 2024-10-23 not used'; + +DELETE FROM salix.ACL WHERE model = 'MachineWorker'; From 4c529da620871d1c78f824aad3a781f7ea1fd0e8 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 24 Oct 2024 07:31:26 +0200 Subject: [PATCH 019/135] feat: refs #7266 Requested changes and query optimization --- db/routines/vn/functions/buy_getUltimate.sql | 2 +- db/routines/vn/procedures/buy_getUltimate.sql | 2 +- .../item-label-barcode.html | 8 ++- .../item-label-barcode/sql/company.sql | 3 +- .../reports/item-label-barcode/sql/item.sql | 60 ++++++++----------- .../reports/item-label-qr/item-label-qr.html | 8 ++- .../reports/item-label-qr/sql/company.sql | 3 +- .../reports/item-label-qr/sql/item.sql | 60 ++++++++----------- 8 files changed, 68 insertions(+), 78 deletions(-) diff --git a/db/routines/vn/functions/buy_getUltimate.sql b/db/routines/vn/functions/buy_getUltimate.sql index 173e6e01f5..8f5e9ce590 100644 --- a/db/routines/vn/functions/buy_getUltimate.sql +++ b/db/routines/vn/functions/buy_getUltimate.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`buy_getUltimate`( vItemFk INT, - vWarehouseFk SMALLINT, + vWarehouseFk INT, vDated DATE ) RETURNS int(11) diff --git a/db/routines/vn/procedures/buy_getUltimate.sql b/db/routines/vn/procedures/buy_getUltimate.sql index 1532222ada..77e2029fc7 100644 --- a/db/routines/vn/procedures/buy_getUltimate.sql +++ b/db/routines/vn/procedures/buy_getUltimate.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`buy_getUltimate`( vItemFk INT, - vWarehouseFk SMALLINT, + vWarehouseFk INT, vDated DATE ) BEGIN diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.html b/print/templates/reports/item-label-barcode/item-label-barcode.html index 224338c2fc..929ce5fe2c 100644 --- a/print/templates/reports/item-label-barcode/item-label-barcode.html +++ b/print/templates/reports/item-label-barcode/item-label-barcode.html @@ -17,12 +17,16 @@
- {{item.comment}} + {{ + (item.longName && item.size && item.subName) + ? `${item.longName} ${item.size} ${item.subName}` + : item.comment + }}
- {{item.producer}} + {{item.producerName || item.producerFk}}
diff --git a/print/templates/reports/item-label-barcode/sql/company.sql b/print/templates/reports/item-label-barcode/sql/company.sql index e130b4033f..4047786a9e 100644 --- a/print/templates/reports/item-label-barcode/sql/company.sql +++ b/print/templates/reports/item-label-barcode/sql/company.sql @@ -1,6 +1,5 @@ SELECT co.code FROM warehouse w JOIN address a ON a.id = w.addressFk - JOIN client c ON c.id = a.clientFk - JOIN company co ON co.clientFk = c.id + JOIN company co ON co.clientFk = a.clientFk WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/sql/item.sql b/print/templates/reports/item-label-barcode/sql/item.sql index 11ee60d1ad..3cb42d139f 100644 --- a/print/templates/reports/item-label-barcode/sql/item.sql +++ b/print/templates/reports/item-label-barcode/sql/item.sql @@ -6,37 +6,29 @@ WITH RECURSIVE numbers AS ( WHERE n < ? ) SELECT ROW_NUMBER() OVER() labelNum, - b.id buyFk, - b.itemFk, - b.quantity, - b.packing, - b.isPickedOff, - b.entryFk, - e.sub, - o.code origin, - COALESCE(p.`name`, p.id, '') producer, - i.name item, - i.`size`, - i.category, - i.stems, - i.inkFk, - IFNULL(CONCAT(ig.longName, ' ', ig.`size`, ' ', ig.subName), i.comment) comment, - i.typeFk, - i.isLaid, - w.code buyerName, - w.code, - s.company_name companyName, - t.shipped - FROM vn.buy b - JOIN vn.item i ON i.id = b.itemFk - LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk - LEFT JOIN edi.ekt e ON e.id = b.ektFk - JOIN vn.origin o ON o.id = i.originFk - LEFT JOIN vn.producer p ON p.id = i.producerFk - JOIN vn.itemType it ON it.id = i.typeFk - JOIN vn.worker w ON w.id = it.workerFk - LEFT JOIN edi.supplier s ON s.supplier_id = e.pro - JOIN vn.entry e2 ON e2.id = b.entryFk - JOIN vn.travel t ON t.id = e2.travelFk - JOIN numbers num - WHERE b.id = ? \ No newline at end of file + b.itemFk, + i.name item, + b.id buyFk, + b.quantity, + b.packing, + b.entryFk, + o.code origin, + p.`name` producerName, + p.id producerFk, + i.`size`, + i.category, + i.stems, + i.inkFk, + ig.longName, + ig.subName, + i.comment, + w.code buyerName + FROM vn.buy b + JOIN vn.item i ON i.id = b.itemFk + LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk + JOIN vn.origin o ON o.id = i.originFk + LEFT JOIN vn.producer p ON p.id = i.producerFk + JOIN vn.itemType it ON it.id = i.typeFk + JOIN vn.worker w ON w.id = it.workerFk + JOIN numbers num + WHERE b.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/item-label-qr/item-label-qr.html index 231c94818a..712bd6c7db 100644 --- a/print/templates/reports/item-label-qr/item-label-qr.html +++ b/print/templates/reports/item-label-qr/item-label-qr.html @@ -71,7 +71,7 @@
- Productor: {{item.producer}} + Productor: {{item.producerName || item.producerFk}}
- {{item.comment}} + {{ + (item.longName && item.size && item.subName) + ? `${item.longName} ${item.size} ${item.subName}` + : item.comment + }}
-
+
+ {{'LAID'}} +
+
{{item.entryFk}}
+
+ {{'LAID'}} +
+
+ {{item.entryFk}} +
+
diff --git a/print/templates/reports/item-label-qr/item-label-qr.js b/print/templates/reports/item-label-qr/item-label-qr.js index 1a0ef767bd..ab57783a8d 100755 --- a/print/templates/reports/item-label-qr/item-label-qr.js +++ b/print/templates/reports/item-label-qr/item-label-qr.js @@ -5,17 +5,18 @@ const qrcode = require('qrcode'); module.exports = { name: 'item-label-qr', async serverPrefetch() { - this.company = await this.findOneFromDef('company', [this.warehouseId]); - if (!this.company) - throw new UserError(`There is no company associated with that warehouse`); - this.date = Date.vnNew(); - this.lastBuy = await this.findOneFromDef('lastBuy', [ - this.id, - this.warehouseId, - this.date - ]); - this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy.id]); + if (this.typeId === 'item') { + this.company = await this.findOneFromDef('company', [this.warehouseId]); + if (!this.company) + throw new UserError(`There is no company associated with that warehouse`); + this.lastBuy = await this.findOneFromDef('lastBuy', [ + this.id, + this.warehouseId, + this.date + ]); + } + this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy?.id || this.id]); if (!this.items.length) throw new UserError(`Empty data source`); this.qr = await this.getQr(this.items[0].buyFk); this.date = moment(this.date).format('WW/E'); @@ -52,6 +53,9 @@ module.exports = { }, userId: { type: Number + }, + typeId: { + type: String } } }; diff --git a/print/templates/reports/item-label-qr/options.json b/print/templates/reports/item-label-qr/options.json index c3c3950403..c6ffaddea1 100644 --- a/print/templates/reports/item-label-qr/options.json +++ b/print/templates/reports/item-label-qr/options.json @@ -3,7 +3,7 @@ "height": "4.9cm", "margin": { "top": "0.17cm", - "right": "0.6cm", + "right": "0.3cm", "bottom": "0cm", "left": "0cm" }, diff --git a/print/templates/reports/item-label-qr/sql/item.sql b/print/templates/reports/item-label-qr/sql/item.sql index 3cb42d139f..c56097c8dd 100644 --- a/print/templates/reports/item-label-qr/sql/item.sql +++ b/print/templates/reports/item-label-qr/sql/item.sql @@ -22,7 +22,8 @@ SELECT ROW_NUMBER() OVER() labelNum, ig.longName, ig.subName, i.comment, - w.code buyerName + w.code buyerName, + i.isLaid FROM vn.buy b JOIN vn.item i ON i.id = b.itemFk LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk From 0180998683ed40e951eb4a81671bcf411dc112c0 Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 28 Oct 2024 13:08:27 +0100 Subject: [PATCH 034/135] fix: refs #7283 item filters --- modules/item/back/methods/item/filter.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/modules/item/back/methods/item/filter.js b/modules/item/back/methods/item/filter.js index 909b3dff82..54dd975a4d 100644 --- a/modules/item/back/methods/item/filter.js +++ b/modules/item/back/methods/item/filter.js @@ -38,13 +38,23 @@ module.exports = Self => { type: 'integer', description: 'Type id', }, + { + arg: 'producerFk', + type: 'integer', + description: 'Producer id', + }, + { + arg: 'instrastatFk', + type: 'string', + description: 'intrastat id', + }, { arg: 'isActive', type: 'boolean', description: 'Whether the item is or not active', }, { - arg: 'buyerFk', + arg: 'workerFk', type: 'integer', description: 'The buyer of the item', }, @@ -126,14 +136,16 @@ module.exports = Self => { return {'i.stemMultiplier': value}; case 'categoryFk': return {'ic.id': value}; - case 'buyerFk': + case 'workerFk': return {'it.workerFk': value}; + case 'producerFk': + return {'pr.id': value}; case 'supplierFk': return {'s.id': value}; case 'origin': return {'ori.code': value}; - case 'intrastat': - return {'intr.description': value}; + case 'intrastatFk': + return {'i.intrastatFk': value}; case 'landed': return {'lb.landed': value}; } @@ -172,6 +184,7 @@ module.exports = Self => { u.name AS userName, ori.code AS origin, ic.name AS category, + i.intrastatFk, intr.description AS intrastat, b.grouping, b.packing, From 385279b39df4c829c99bf29913b233afa5644747 Mon Sep 17 00:00:00 2001 From: carlossa Date: Mon, 28 Oct 2024 13:15:40 +0100 Subject: [PATCH 035/135] fix: refs #7283 tback --- modules/item/back/methods/item/specs/filter.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/item/back/methods/item/specs/filter.spec.js b/modules/item/back/methods/item/specs/filter.spec.js index 14467d1d8c..a8aaca786a 100644 --- a/modules/item/back/methods/item/specs/filter.spec.js +++ b/modules/item/back/methods/item/specs/filter.spec.js @@ -86,7 +86,7 @@ describe('item filter()', () => { try { const filter = {}; - const ctx = {args: {filter: filter, buyerFk: 16}, req: {accessToken: {userId: 1}}}; + const ctx = {args: {filter: filter, workerFk: 16}, req: {accessToken: {userId: 1}}}; const result = await models.Item.filter(ctx, filter, options); expect(result.length).toEqual(2); From 61026d2d34095cc2078dd18bb9473138e2a78935 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 28 Oct 2024 14:02:27 +0100 Subject: [PATCH 036/135] feat: refs #8087 Traspasar redadas a travels --- db/routines/vn2008/views/entrySource.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn2008/views/entrySource.sql b/db/routines/vn2008/views/entrySource.sql index e6e8744055..9c0c0f6ed4 100644 --- a/db/routines/vn2008/views/entrySource.sql +++ b/db/routines/vn2008/views/entrySource.sql @@ -8,7 +8,7 @@ AS SELECT `e`.`gestDocFk` AS `gestdoc_id`, `e`.`isExcludedFromAvailable` AS `Inventario`, `e`.`isConfirmed` AS `Confirmada`, `e`.`isOrdered` AS `Pedida`, - `tr`.`daysInForward` AS `Redada`, + `tr`.`daysInForward` AS `daysInForward`, `e`.`evaNotes` AS `notas`, `e`.`supplierFk` AS `Id_Proveedor`, `tr`.`shipped` AS `shipment`, From 511c848342cad70f0ec5f8624c4438f30e0bad54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 28 Oct 2024 14:22:08 +0100 Subject: [PATCH 037/135] feat: refs #8087 Traspasar redadas a travels --- db/versions/11316-chocolateErica/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11316-chocolateErica/00-firstScript.sql b/db/versions/11316-chocolateErica/00-firstScript.sql index 8fd0c72ded..e24f38b2ef 100644 --- a/db/versions/11316-chocolateErica/00-firstScript.sql +++ b/db/versions/11316-chocolateErica/00-firstScript.sql @@ -1,5 +1,5 @@ ALTER TABLE vn.travel ADD IF NOT EXISTS daysInForward INT UNSIGNED DEFAULT 0 NOT NULL - COMMENT 'Número de días donde se siturá el landed de las entradas con respecto a hoy'; + COMMENT 'Indica si las entradas están asociadas a redadas: 0 significa que no es una redada, y un valor distinto a 0 indica el número de días para el landed respecto a hoy'; ALTER TABLE vn.entry CHANGE isRaid isRaid_ tinyint(1) DEFAULT 0 NOT NULL COMMENT '@deprecated 2024-11-05'; From bffb13f94a59ea27e5ec880aa9bacf69d17373cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Mon, 28 Oct 2024 14:24:44 +0100 Subject: [PATCH 038/135] feat: refs #8087 Traspasar redadas a travels --- db/versions/11316-chocolateErica/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11316-chocolateErica/00-firstScript.sql b/db/versions/11316-chocolateErica/00-firstScript.sql index e24f38b2ef..9f2f15bdd7 100644 --- a/db/versions/11316-chocolateErica/00-firstScript.sql +++ b/db/versions/11316-chocolateErica/00-firstScript.sql @@ -1,5 +1,5 @@ ALTER TABLE vn.travel ADD IF NOT EXISTS daysInForward INT UNSIGNED DEFAULT 0 NOT NULL - COMMENT 'Indica si las entradas están asociadas a redadas: 0 significa que no es una redada, y un valor distinto a 0 indica el número de días para el landed respecto a hoy'; + COMMENT 'Indica que sus entradas son redadas: 0 significa que no es un travel de redadas, y un valor distinto a 0 indica el número de días para el landed respecto a hoy'; ALTER TABLE vn.entry CHANGE isRaid isRaid_ tinyint(1) DEFAULT 0 NOT NULL COMMENT '@deprecated 2024-11-05'; From f05b6a46b090c0913eb248083b02ac723f92c8dd Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 28 Oct 2024 14:36:10 +0100 Subject: [PATCH 039/135] feat: refs #8071 quitar esquema --- db/routines/vn/procedures/travel_cloneWithEntries.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/travel_cloneWithEntries.sql b/db/routines/vn/procedures/travel_cloneWithEntries.sql index 0199c452f3..5b2958edc5 100644 --- a/db/routines/vn/procedures/travel_cloneWithEntries.sql +++ b/db/routines/vn/procedures/travel_cloneWithEntries.sql @@ -72,7 +72,7 @@ BEGIN SET evaNotes = vEvaNotes WHERE id = vNewEntryFk; - CALL vn.buy_recalcPricesByEntry(vNewEntryFk); + CALL buy_recalcPricesByEntry(vNewEntryFk); END LOOP; SET @isModeInventory = FALSE; From a37b7b71a872fc696918ae29ce54ba63d0591449 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 28 Oct 2024 14:51:19 +0100 Subject: [PATCH 040/135] feat: refs #7266 Requested changes and improvements --- modules/entry/back/methods/entry/buyLabel.js | 27 ++++++++-- ...labelBarcodePdf.js => buyLabelSupplier.js} | 21 ++------ .../entry/back/methods/entry/labelQrPdf.js | 49 ----------------- modules/entry/back/models/buy.js | 3 +- .../item/back/methods/item/labelBarcodePdf.js | 52 ------------------ modules/item/back/methods/item/labelQrPdf.js | 53 ------------------- modules/item/back/models/item.js | 2 - .../assets/css/import.js | 0 .../assets/css/style.css | 0 .../buy-label-barcode.html} | 34 ++++++------ .../buy-label-barcode.js} | 16 ++---- .../locale/es.yml | 0 .../options.json | 0 .../sql/buy.sql} | 5 +- .../assets/css/import.js | 0 .../assets/css/style.css | 0 .../buy-label-qr.html} | 36 ++++++------- .../buy-label-qr.js} | 20 ++----- .../locale/es.yml | 0 .../options.json | 0 .../sql/item.sql => buy-label-qr/sql/buy.sql} | 5 +- .../assets/css/import.js | 0 .../assets/css/style.css | 0 .../buy-label-supplier.html} | 0 .../buy-label-supplier.js} | 2 +- .../locale/en.yml | 0 .../locale/es.yml | 0 .../options.json | 0 .../sql/buy.sql | 0 .../item-label-barcode/sql/company.sql | 5 -- .../item-label-barcode/sql/lastBuy.sql | 1 - .../reports/item-label-qr/sql/company.sql | 5 -- .../reports/item-label-qr/sql/lastBuy.sql | 1 - 33 files changed, 81 insertions(+), 256 deletions(-) rename modules/entry/back/methods/entry/{labelBarcodePdf.js => buyLabelSupplier.js} (57%) delete mode 100644 modules/entry/back/methods/entry/labelQrPdf.js delete mode 100644 modules/item/back/methods/item/labelBarcodePdf.js delete mode 100644 modules/item/back/methods/item/labelQrPdf.js rename print/templates/reports/{buy-label => buy-label-barcode}/assets/css/import.js (100%) rename print/templates/reports/{item-label-barcode => buy-label-barcode}/assets/css/style.css (100%) rename print/templates/reports/{item-label-barcode/item-label-barcode.html => buy-label-barcode/buy-label-barcode.html} (69%) rename print/templates/reports/{item-label-barcode/item-label-barcode.js => buy-label-barcode/buy-label-barcode.js} (66%) rename print/templates/reports/{item-label-barcode => buy-label-barcode}/locale/es.yml (100%) rename print/templates/reports/{item-label-barcode => buy-label-barcode}/options.json (100%) rename print/templates/reports/{item-label-barcode/sql/item.sql => buy-label-barcode/sql/buy.sql} (84%) rename print/templates/reports/{item-label-barcode => buy-label-qr}/assets/css/import.js (100%) rename print/templates/reports/{item-label-qr => buy-label-qr}/assets/css/style.css (100%) rename print/templates/reports/{item-label-qr/item-label-qr.html => buy-label-qr/buy-label-qr.html} (72%) rename print/templates/reports/{item-label-qr/item-label-qr.js => buy-label-qr/buy-label-qr.js} (59%) rename print/templates/reports/{item-label-qr => buy-label-qr}/locale/es.yml (100%) rename print/templates/reports/{item-label-qr => buy-label-qr}/options.json (100%) rename print/templates/reports/{item-label-qr/sql/item.sql => buy-label-qr/sql/buy.sql} (84%) rename print/templates/reports/{item-label-qr => buy-label-supplier}/assets/css/import.js (100%) rename print/templates/reports/{buy-label => buy-label-supplier}/assets/css/style.css (100%) rename print/templates/reports/{buy-label/buy-label.html => buy-label-supplier/buy-label-supplier.html} (100%) rename print/templates/reports/{buy-label/buy-label.js => buy-label-supplier/buy-label-supplier.js} (97%) rename print/templates/reports/{buy-label => buy-label-supplier}/locale/en.yml (100%) rename print/templates/reports/{buy-label => buy-label-supplier}/locale/es.yml (100%) rename print/templates/reports/{buy-label => buy-label-supplier}/options.json (100%) rename print/templates/reports/{buy-label => buy-label-supplier}/sql/buy.sql (100%) delete mode 100644 print/templates/reports/item-label-barcode/sql/company.sql delete mode 100644 print/templates/reports/item-label-barcode/sql/lastBuy.sql delete mode 100644 print/templates/reports/item-label-qr/sql/company.sql delete mode 100644 print/templates/reports/item-label-qr/sql/lastBuy.sql diff --git a/modules/entry/back/methods/entry/buyLabel.js b/modules/entry/back/methods/entry/buyLabel.js index 919f7c4d7b..fb807fb5ff 100644 --- a/modules/entry/back/methods/entry/buyLabel.js +++ b/modules/entry/back/methods/entry/buyLabel.js @@ -1,14 +1,28 @@ module.exports = Self => { Self.remoteMethodCtx('buyLabel', { - description: 'Returns the entry buy labels', + description: 'Returns the buy label', accessType: 'READ', accepts: [ { arg: 'id', type: 'number', required: true, - description: 'The entry id', + description: 'The buy id', http: {source: 'path'} + }, { + arg: 'labelType', + type: 'string', + required: true, + description: 'The label type', + http: {source: 'path'} + }, { + arg: 'packing', + type: 'number', + required: false + }, { + arg: 'copies', + type: 'number', + required: false } ], returns: [ @@ -27,11 +41,16 @@ module.exports = Self => { } ], http: { - path: '/:id/buy-label', + path: '/:id/:labelType/buy-label', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.buyLabel = (ctx, id) => Self.printReport(ctx, id, 'buy-label'); + Self.buyLabel = (ctx, id, labelType) => { + if (labelType == 'qr') + return Self.printReport(ctx, id, 'buy-label-qr'); + else + return Self.printReport(ctx, id, 'buy-label-barcode'); + }; }; diff --git a/modules/entry/back/methods/entry/labelBarcodePdf.js b/modules/entry/back/methods/entry/buyLabelSupplier.js similarity index 57% rename from modules/entry/back/methods/entry/labelBarcodePdf.js rename to modules/entry/back/methods/entry/buyLabelSupplier.js index 847859aeb0..61938f2f86 100644 --- a/modules/entry/back/methods/entry/labelBarcodePdf.js +++ b/modules/entry/back/methods/entry/buyLabelSupplier.js @@ -1,22 +1,14 @@ module.exports = Self => { - Self.remoteMethodCtx('labelBarcodePdf', { - description: 'Returns the item label pdf with barcode', + Self.remoteMethodCtx('buyLabelSupplier', { + description: 'Returns the entry buy labels', accessType: 'READ', accepts: [ { arg: 'id', type: 'number', required: true, - description: 'The item id', + description: 'The entry id', http: {source: 'path'} - }, { - arg: 'packing', - type: 'number', - required: false - }, { - arg: 'copies', - type: 'number', - required: false } ], returns: [ @@ -35,14 +27,11 @@ module.exports = Self => { } ], http: { - path: '/:id/label-barcode-pdf', + path: '/:id/buy-label-supplier', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.labelBarcodePdf = (ctx, id) => { - ctx.args.typeId = 'buy'; - return Self.printReport(ctx, id, 'item-label-barcode'); - }; + Self.buyLabelSupplier = (ctx, id) => Self.printReport(ctx, id, 'buy-label-supplier'); }; diff --git a/modules/entry/back/methods/entry/labelQrPdf.js b/modules/entry/back/methods/entry/labelQrPdf.js deleted file mode 100644 index 9668dfffdc..0000000000 --- a/modules/entry/back/methods/entry/labelQrPdf.js +++ /dev/null @@ -1,49 +0,0 @@ -module.exports = Self => { - Self.remoteMethodCtx('labelQrPdf', { - description: 'Returns the item label pdf with qr', - accessType: 'READ', - accepts: [ - { - arg: 'id', - type: 'number', - required: true, - description: 'The item id', - http: {source: 'path'} - }, { - arg: 'packing', - type: 'number', - required: false - }, { - arg: 'copies', - type: 'number', - required: false - } - ], - returns: [ - { - arg: 'body', - type: 'file', - root: true - }, { - arg: 'Content-Type', - type: 'String', - http: {target: 'header'} - }, { - arg: 'Content-Disposition', - type: 'String', - http: {target: 'header'} - } - ], - http: { - path: '/:id/label-qr-pdf', - verb: 'GET' - }, - accessScopes: ['DEFAULT', 'read:multimedia'] - }); - - Self.labelQrPdf = (ctx, id) => { - ctx.args.userId = ctx.req.accessToken.userId; - ctx.args.typeId = 'buy'; - return Self.printReport(ctx, id, 'item-label-qr'); - }; -}; diff --git a/modules/entry/back/models/buy.js b/modules/entry/back/models/buy.js index 70d92195c5..a027a861e1 100644 --- a/modules/entry/back/models/buy.js +++ b/modules/entry/back/models/buy.js @@ -2,6 +2,5 @@ module.exports = Self => { require('../methods/entry/editLatestBuys')(Self); require('../methods/entry/latestBuysFilter')(Self); require('../methods/entry/deleteBuys')(Self); - require('../methods/entry/labelBarcodePdf')(Self); - require('../methods/entry/labelQrPdf')(Self); + require('../methods/entry/buyLabel')(Self); }; diff --git a/modules/item/back/methods/item/labelBarcodePdf.js b/modules/item/back/methods/item/labelBarcodePdf.js deleted file mode 100644 index 8e28ddfe26..0000000000 --- a/modules/item/back/methods/item/labelBarcodePdf.js +++ /dev/null @@ -1,52 +0,0 @@ -module.exports = Self => { - Self.remoteMethodCtx('labelBarcodePdf', { - description: 'Returns the item label pdf with barcode', - accessType: 'READ', - accepts: [ - { - arg: 'id', - type: 'number', - required: true, - description: 'The item id', - http: {source: 'path'} - }, { - arg: 'warehouseId', - type: 'number', - required: true - }, { - arg: 'packing', - type: 'number', - required: false - }, { - arg: 'copies', - type: 'number', - required: false - } - ], - returns: [ - { - arg: 'body', - type: 'file', - root: true - }, { - arg: 'Content-Type', - type: 'String', - http: {target: 'header'} - }, { - arg: 'Content-Disposition', - type: 'String', - http: {target: 'header'} - } - ], - http: { - path: '/:id/label-barcode-pdf', - verb: 'GET' - }, - accessScopes: ['DEFAULT', 'read:multimedia'] - }); - - Self.labelBarcodePdf = (ctx, id) => { - ctx.args.typeId = 'item'; - return Self.printReport(ctx, id, 'item-label-barcode'); - }; -}; diff --git a/modules/item/back/methods/item/labelQrPdf.js b/modules/item/back/methods/item/labelQrPdf.js deleted file mode 100644 index 2c42a978a7..0000000000 --- a/modules/item/back/methods/item/labelQrPdf.js +++ /dev/null @@ -1,53 +0,0 @@ -module.exports = Self => { - Self.remoteMethodCtx('labelQrPdf', { - description: 'Returns the item label pdf with qr', - accessType: 'READ', - accepts: [ - { - arg: 'id', - type: 'number', - required: true, - description: 'The item id', - http: {source: 'path'} - }, { - arg: 'warehouseId', - type: 'number', - required: true - }, { - arg: 'packing', - type: 'number', - required: false - }, { - arg: 'copies', - type: 'number', - required: false - } - ], - returns: [ - { - arg: 'body', - type: 'file', - root: true - }, { - arg: 'Content-Type', - type: 'String', - http: {target: 'header'} - }, { - arg: 'Content-Disposition', - type: 'String', - http: {target: 'header'} - } - ], - http: { - path: '/:id/label-qr-pdf', - verb: 'GET' - }, - accessScopes: ['DEFAULT', 'read:multimedia'] - }); - - Self.labelQrPdf = (ctx, id) => { - ctx.args.userId = ctx.req.accessToken.userId; - ctx.args.typeId = 'item'; - return Self.printReport(ctx, id, 'item-label-qr'); - }; -}; diff --git a/modules/item/back/models/item.js b/modules/item/back/models/item.js index d39586a907..44a51594cd 100644 --- a/modules/item/back/models/item.js +++ b/modules/item/back/models/item.js @@ -15,8 +15,6 @@ module.exports = Self => { require('../methods/item/getWasteByItem')(Self); require('../methods/item/createIntrastat')(Self); require('../methods/item/buyerWasteEmail')(Self); - require('../methods/item/labelBarcodePdf')(Self); - require('../methods/item/labelQrPdf')(Self); require('../methods/item/setVisibleDiscard')(Self); require('../methods/item/get')(Self); diff --git a/print/templates/reports/buy-label/assets/css/import.js b/print/templates/reports/buy-label-barcode/assets/css/import.js similarity index 100% rename from print/templates/reports/buy-label/assets/css/import.js rename to print/templates/reports/buy-label-barcode/assets/css/import.js diff --git a/print/templates/reports/item-label-barcode/assets/css/style.css b/print/templates/reports/buy-label-barcode/assets/css/style.css similarity index 100% rename from print/templates/reports/item-label-barcode/assets/css/style.css rename to print/templates/reports/buy-label-barcode/assets/css/style.css diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.html b/print/templates/reports/buy-label-barcode/buy-label-barcode.html similarity index 69% rename from print/templates/reports/item-label-barcode/item-label-barcode.html rename to print/templates/reports/buy-label-barcode/buy-label-barcode.html index 8bf3ce8eb8..f14f0b70b5 100644 --- a/print/templates/reports/item-label-barcode/item-label-barcode.html +++ b/print/templates/reports/buy-label-barcode/buy-label-barcode.html @@ -1,16 +1,16 @@ - + @@ -18,64 +18,64 @@ diff --git a/print/templates/reports/item-label-barcode/item-label-barcode.js b/print/templates/reports/buy-label-barcode/buy-label-barcode.js similarity index 66% rename from print/templates/reports/item-label-barcode/item-label-barcode.js rename to print/templates/reports/buy-label-barcode/buy-label-barcode.js index e2945ae390..8c39a7046f 100755 --- a/print/templates/reports/item-label-barcode/item-label-barcode.js +++ b/print/templates/reports/buy-label-barcode/buy-label-barcode.js @@ -4,21 +4,11 @@ const moment = require('moment'); const jsbarcode = require('jsbarcode'); module.exports = { - name: 'item-label-barcode', + name: 'buy-label-barcode', async serverPrefetch() { this.date = Date.vnNew(); - if (this.typeId === 'item') { - this.company = await this.findOneFromDef('company', [this.warehouseId]); - if (!this.company) - throw new UserError(`There is no company associated with that warehouse`); - this.lastBuy = await this.findOneFromDef('lastBuy', [ - this.id, - this.warehouseId, - this.date - ]); - } - this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy?.id || this.id]); - if (!this.items.length) throw new UserError(`Empty data source`); + this.buys = await this.rawSqlFromDef('buy', [this.copies || 1, this.id]); + if (!this.buys.length) throw new UserError(`Empty data source`); this.date = moment(this.date).format('WW/E'); }, methods: { diff --git a/print/templates/reports/item-label-barcode/locale/es.yml b/print/templates/reports/buy-label-barcode/locale/es.yml similarity index 100% rename from print/templates/reports/item-label-barcode/locale/es.yml rename to print/templates/reports/buy-label-barcode/locale/es.yml diff --git a/print/templates/reports/item-label-barcode/options.json b/print/templates/reports/buy-label-barcode/options.json similarity index 100% rename from print/templates/reports/item-label-barcode/options.json rename to print/templates/reports/buy-label-barcode/options.json diff --git a/print/templates/reports/item-label-barcode/sql/item.sql b/print/templates/reports/buy-label-barcode/sql/buy.sql similarity index 84% rename from print/templates/reports/item-label-barcode/sql/item.sql rename to print/templates/reports/buy-label-barcode/sql/buy.sql index c56097c8dd..739f8449f8 100644 --- a/print/templates/reports/item-label-barcode/sql/item.sql +++ b/print/templates/reports/buy-label-barcode/sql/buy.sql @@ -23,7 +23,8 @@ SELECT ROW_NUMBER() OVER() labelNum, ig.subName, i.comment, w.code buyerName, - i.isLaid + i.isLaid, + c.code company FROM vn.buy b JOIN vn.item i ON i.id = b.itemFk LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk @@ -31,5 +32,7 @@ SELECT ROW_NUMBER() OVER() labelNum, LEFT JOIN vn.producer p ON p.id = i.producerFk JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.worker w ON w.id = it.workerFk + JOIN vn.entry e ON e.id = b.entryFk + JOIN vn.company c ON c.id = e.companyFk JOIN numbers num WHERE b.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/assets/css/import.js b/print/templates/reports/buy-label-qr/assets/css/import.js similarity index 100% rename from print/templates/reports/item-label-barcode/assets/css/import.js rename to print/templates/reports/buy-label-qr/assets/css/import.js diff --git a/print/templates/reports/item-label-qr/assets/css/style.css b/print/templates/reports/buy-label-qr/assets/css/style.css similarity index 100% rename from print/templates/reports/item-label-qr/assets/css/style.css rename to print/templates/reports/buy-label-qr/assets/css/style.css diff --git a/print/templates/reports/item-label-qr/item-label-qr.html b/print/templates/reports/buy-label-qr/buy-label-qr.html similarity index 72% rename from print/templates/reports/item-label-qr/item-label-qr.html rename to print/templates/reports/buy-label-qr/buy-label-qr.html index 6218a4513f..00e64b57d7 100644 --- a/print/templates/reports/item-label-qr/item-label-qr.html +++ b/print/templates/reports/buy-label-qr/buy-label-qr.html @@ -1,6 +1,6 @@ - +
- {{item.item}} + {{buy.item}}
- {{item.size}} + {{buy.size}}
{{ - (item.longName && item.size && item.subName) - ? `${item.longName} ${item.size} ${item.subName}` - : item.comment + (buy.longName && buy.size && buy.subName) + ? `${buy.longName} ${buy.size} ${buy.subName}` + : buy.comment }}
- {{item.producerName || item.producerFk}} + {{buy.producerName || buy.producerFk}}
- {{item.inkFk}} + {{buy.inkFk}}
- {{item.itemFk}} + {{buy.itemFk}}
- {{`${(packing || item.packing)} x ${item.stems || ''}`}} + {{`${(packing || buy.packing)} x ${buy.stems || ''}`}}
-
+
-
+
{{'LAID'}}
- {{item.entryFk}} + {{buy.entryFk}}
- {{item.buyerName}} + {{buy.buyerName}}
- {{item.origin}} + {{buy.origin}}
- {{item.buyFk}} + {{buy.buyFk}}
@@ -85,7 +85,7 @@
- {{`${item.labelNum}/${item.quantity / (packing || item.packing)}`}} + {{`${buy.labelNum}/${buy.quantity / (packing || buy.packing)}`}}
@@ -28,65 +28,65 @@ @@ -111,9 +111,9 @@ diff --git a/print/templates/reports/item-label-qr/item-label-qr.js b/print/templates/reports/buy-label-qr/buy-label-qr.js similarity index 59% rename from print/templates/reports/item-label-qr/item-label-qr.js rename to print/templates/reports/buy-label-qr/buy-label-qr.js index ab57783a8d..74470ad6dc 100755 --- a/print/templates/reports/item-label-qr/item-label-qr.js +++ b/print/templates/reports/buy-label-qr/buy-label-qr.js @@ -3,28 +3,18 @@ const moment = require('moment'); const qrcode = require('qrcode'); module.exports = { - name: 'item-label-qr', + name: 'buy-label-qr', async serverPrefetch() { this.date = Date.vnNew(); - if (this.typeId === 'item') { - this.company = await this.findOneFromDef('company', [this.warehouseId]); - if (!this.company) - throw new UserError(`There is no company associated with that warehouse`); - this.lastBuy = await this.findOneFromDef('lastBuy', [ - this.id, - this.warehouseId, - this.date - ]); - } - this.items = await this.rawSqlFromDef('item', [this.copies || 1, this.lastBuy?.id || this.id]); - if (!this.items.length) throw new UserError(`Empty data source`); - this.qr = await this.getQr(this.items[0].buyFk); + this.buys = await this.rawSqlFromDef('buy', [this.copies || 1, this.id]); + if (!this.buys.length) throw new UserError(`Empty data source`); + this.qr = await this.getQr(this.buys[0].buyFk); this.date = moment(this.date).format('WW/E'); }, methods: { getQr(data) { data = { - company: this.company, + company: this.buys.company, user: this.userId, created: this.date, table: 'buy', diff --git a/print/templates/reports/item-label-qr/locale/es.yml b/print/templates/reports/buy-label-qr/locale/es.yml similarity index 100% rename from print/templates/reports/item-label-qr/locale/es.yml rename to print/templates/reports/buy-label-qr/locale/es.yml diff --git a/print/templates/reports/item-label-qr/options.json b/print/templates/reports/buy-label-qr/options.json similarity index 100% rename from print/templates/reports/item-label-qr/options.json rename to print/templates/reports/buy-label-qr/options.json diff --git a/print/templates/reports/item-label-qr/sql/item.sql b/print/templates/reports/buy-label-qr/sql/buy.sql similarity index 84% rename from print/templates/reports/item-label-qr/sql/item.sql rename to print/templates/reports/buy-label-qr/sql/buy.sql index c56097c8dd..739f8449f8 100644 --- a/print/templates/reports/item-label-qr/sql/item.sql +++ b/print/templates/reports/buy-label-qr/sql/buy.sql @@ -23,7 +23,8 @@ SELECT ROW_NUMBER() OVER() labelNum, ig.subName, i.comment, w.code buyerName, - i.isLaid + i.isLaid, + c.code company FROM vn.buy b JOIN vn.item i ON i.id = b.itemFk LEFT JOIN vn.item ig ON ig.id = b.itemOriginalFk @@ -31,5 +32,7 @@ SELECT ROW_NUMBER() OVER() labelNum, LEFT JOIN vn.producer p ON p.id = i.producerFk JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.worker w ON w.id = it.workerFk + JOIN vn.entry e ON e.id = b.entryFk + JOIN vn.company c ON c.id = e.companyFk JOIN numbers num WHERE b.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/assets/css/import.js b/print/templates/reports/buy-label-supplier/assets/css/import.js similarity index 100% rename from print/templates/reports/item-label-qr/assets/css/import.js rename to print/templates/reports/buy-label-supplier/assets/css/import.js diff --git a/print/templates/reports/buy-label/assets/css/style.css b/print/templates/reports/buy-label-supplier/assets/css/style.css similarity index 100% rename from print/templates/reports/buy-label/assets/css/style.css rename to print/templates/reports/buy-label-supplier/assets/css/style.css diff --git a/print/templates/reports/buy-label/buy-label.html b/print/templates/reports/buy-label-supplier/buy-label-supplier.html similarity index 100% rename from print/templates/reports/buy-label/buy-label.html rename to print/templates/reports/buy-label-supplier/buy-label-supplier.html diff --git a/print/templates/reports/buy-label/buy-label.js b/print/templates/reports/buy-label-supplier/buy-label-supplier.js similarity index 97% rename from print/templates/reports/buy-label/buy-label.js rename to print/templates/reports/buy-label-supplier/buy-label-supplier.js index 2894830511..3cef5f2950 100755 --- a/print/templates/reports/buy-label/buy-label.js +++ b/print/templates/reports/buy-label-supplier/buy-label-supplier.js @@ -5,7 +5,7 @@ const jsBarcode = require('jsbarcode'); const moment = require('moment'); module.exports = { - name: 'buy-label', + name: 'buy-label-supplier', mixins: [vnReport], async serverPrefetch() { const buy = await models.Buy.findById(this.id, null); diff --git a/print/templates/reports/buy-label/locale/en.yml b/print/templates/reports/buy-label-supplier/locale/en.yml similarity index 100% rename from print/templates/reports/buy-label/locale/en.yml rename to print/templates/reports/buy-label-supplier/locale/en.yml diff --git a/print/templates/reports/buy-label/locale/es.yml b/print/templates/reports/buy-label-supplier/locale/es.yml similarity index 100% rename from print/templates/reports/buy-label/locale/es.yml rename to print/templates/reports/buy-label-supplier/locale/es.yml diff --git a/print/templates/reports/buy-label/options.json b/print/templates/reports/buy-label-supplier/options.json similarity index 100% rename from print/templates/reports/buy-label/options.json rename to print/templates/reports/buy-label-supplier/options.json diff --git a/print/templates/reports/buy-label/sql/buy.sql b/print/templates/reports/buy-label-supplier/sql/buy.sql similarity index 100% rename from print/templates/reports/buy-label/sql/buy.sql rename to print/templates/reports/buy-label-supplier/sql/buy.sql diff --git a/print/templates/reports/item-label-barcode/sql/company.sql b/print/templates/reports/item-label-barcode/sql/company.sql deleted file mode 100644 index 4047786a9e..0000000000 --- a/print/templates/reports/item-label-barcode/sql/company.sql +++ /dev/null @@ -1,5 +0,0 @@ -SELECT co.code - FROM warehouse w - JOIN address a ON a.id = w.addressFk - JOIN company co ON co.clientFk = a.clientFk - WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-barcode/sql/lastBuy.sql b/print/templates/reports/item-label-barcode/sql/lastBuy.sql deleted file mode 100644 index d103399985..0000000000 --- a/print/templates/reports/item-label-barcode/sql/lastBuy.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT buy_getUltimate(?, ?, ?) id \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/sql/company.sql b/print/templates/reports/item-label-qr/sql/company.sql deleted file mode 100644 index 4047786a9e..0000000000 --- a/print/templates/reports/item-label-qr/sql/company.sql +++ /dev/null @@ -1,5 +0,0 @@ -SELECT co.code - FROM warehouse w - JOIN address a ON a.id = w.addressFk - JOIN company co ON co.clientFk = a.clientFk - WHERE w.id = ? \ No newline at end of file diff --git a/print/templates/reports/item-label-qr/sql/lastBuy.sql b/print/templates/reports/item-label-qr/sql/lastBuy.sql deleted file mode 100644 index d103399985..0000000000 --- a/print/templates/reports/item-label-qr/sql/lastBuy.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT buy_getUltimate(?, ?, ?) id \ No newline at end of file From bfc446ab79b839d83045f82820307872ff88d235 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 28 Oct 2024 14:56:01 +0100 Subject: [PATCH 041/135] feat: refs #7266 Requested changes and improvements --- db/versions/11325-navyEucalyptus/00-firstScript.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/versions/11325-navyEucalyptus/00-firstScript.sql diff --git a/db/versions/11325-navyEucalyptus/00-firstScript.sql b/db/versions/11325-navyEucalyptus/00-firstScript.sql new file mode 100644 index 0000000000..8bc4bd82b4 --- /dev/null +++ b/db/versions/11325-navyEucalyptus/00-firstScript.sql @@ -0,0 +1,7 @@ +UPDATE salix.ACL + SET property='buyLabelSupplier' + WHERE property = 'buyLabel' + AND model = 'Entry'; + +INSERT IGNORE INTO salix.ACL (model,property,principalId) + VALUES ('Entry','buyLabel','employee'); From 2f0fa56040a46e81e7ed4b80b66e23a878c62424 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 29 Oct 2024 07:19:51 +0100 Subject: [PATCH 042/135] feat: refs #7266 Version --- db/versions/11326-limeOrchid/00-firstScript.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/versions/11326-limeOrchid/00-firstScript.sql diff --git a/db/versions/11326-limeOrchid/00-firstScript.sql b/db/versions/11326-limeOrchid/00-firstScript.sql new file mode 100644 index 0000000000..afec994597 --- /dev/null +++ b/db/versions/11326-limeOrchid/00-firstScript.sql @@ -0,0 +1,7 @@ +DELETE FROM vn.report + WHERE `name` = 'LabelItemQr'; + +UPDATE vn.report + SET `method` = 'Entries/{id}/{itemType}/buy-label', + `name` = 'LabelBuy' + WHERE `name` = 'LabelItemBarcode'; From 17412c5b849fe0663c760b5f51c6bd028138073c Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 29 Oct 2024 09:57:04 +0100 Subject: [PATCH 043/135] feat: refs #7266 Version --- db/versions/11326-limeOrchid/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11326-limeOrchid/00-firstScript.sql b/db/versions/11326-limeOrchid/00-firstScript.sql index afec994597..64d772043e 100644 --- a/db/versions/11326-limeOrchid/00-firstScript.sql +++ b/db/versions/11326-limeOrchid/00-firstScript.sql @@ -2,6 +2,6 @@ DELETE FROM vn.report WHERE `name` = 'LabelItemQr'; UPDATE vn.report - SET `method` = 'Entries/{id}/{itemType}/buy-label', + SET `method` = 'Entries/{id}/{labelType}/buy-label', `name` = 'LabelBuy' WHERE `name` = 'LabelItemBarcode'; From 4c0dec19d415f384d2701ff8b90f7179dbd4ee21 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Mon, 4 Nov 2024 07:48:28 +0100 Subject: [PATCH 044/135] 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 606bb8bd9b..58163a89fa 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 045/135] 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 58163a89fa..07384b7216 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 85ded59cb36ecd3c894be58a45cb9d2b36eb7b28 Mon Sep 17 00:00:00 2001 From: alexm Date: Mon, 4 Nov 2024 13:46:54 +0100 Subject: [PATCH 046/135] refactor: refs #6920 add correct role --- db/dump/fixtures.before.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 595027b092..f25a4aab4c 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -2454,7 +2454,7 @@ INSERT INTO `vn`.`workerTimeControl`(`userFk`, `timed`, `manual`, `direction`, ` INSERT INTO `vn`.`dmsType` (`id`, `name`, `readRoleFk`, `writeRoleFk`, `code`) VALUES - (1, 'Facturas Recibidas', NULL, NULL, 'invoiceIn'), + (1, 'Facturas Recibidas', 1, 1, 'invoiceIn'), (2, 'Doc oficial', NULL, NULL, 'officialDoc'), (3, 'Laboral', 37, 37, 'hhrrData'), (4, 'Albaranes recibidos', NULL, NULL, 'deliveryNote'), From c113d837972177d1fb2ce320847deb536d6ae7e3 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 5 Nov 2024 16:42:51 +0100 Subject: [PATCH 047/135] 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 fed7a3eb62..a468d75821 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 fd36f7ecc3262b0c95381afc1ab5e6ff35d96d8c Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 8 Nov 2024 10:44:01 +0100 Subject: [PATCH 048/135] 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 cef35ab867..1c6689912f 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 049/135] 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 5368769fdc..efb148ee84 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 80d4567025..ee72ae49de 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 0000000000..39acd5f0b8 --- /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 f25a4aab4c..7bb0ace847 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 0000000000..e0ef77e2df --- /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 8162096f08..9242fbd442 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 9b28cf9130dff4346f627d1888a1f7de7cb4ddcd Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 8 Nov 2024 12:51:09 +0100 Subject: [PATCH 050/135] 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 7bb0ace847..ce4e9ddfc5 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 e0ef77e2df..762e456b1d 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 6ef1f950d17897d377cc9fb342835f4a3e745543 Mon Sep 17 00:00:00 2001 From: jorgep Date: Fri, 8 Nov 2024 17:47:10 +0100 Subject: [PATCH 051/135] 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 efb148ee84..364ffabdf1 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 0000000000..edc4caa43b --- /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 39acd5f0b8..adddddc02e 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 ce4e9ddfc5..cd2fb8b6b8 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 762e456b1d..127c8e40e6 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 052/135] 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 844adb51e9..eff2eecb60 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 053/135] 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 0000000000..43660f2154 --- /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 5d74a71e59..0a9a373754 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 d6349f113cfb4979d3e3064d12d600a92bffb462 Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 11 Nov 2024 08:06:22 +0100 Subject: [PATCH 054/135] 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 0000000000..133d7271c0 --- /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 055/135] 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 e125a876df..eff0edaa7c 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 133d7271c0..1395c7a46c 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 5c054fe0d3a6e73a71ab26f8e19ada1c0b757e6c Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 11 Nov 2024 09:09:51 +0100 Subject: [PATCH 056/135] 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 07384b7216..0000000000 --- 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 0000000000..2fe50d7854 --- /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 be72dac37b..ba6ab780d8 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 057/135] 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 f25a4aab4c..c9b6a22067 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 0000000000..ada3741824 --- /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 67767e7b4f..8fcaaa53f6 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 90b266ba9f..b79a6b80d0 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 0dc77851c007d22a9c83086e11dea0e05e96251b Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 11 Nov 2024 11:34:37 +0100 Subject: [PATCH 058/135] 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 f25a4aab4c..b0fb3a8d9d 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 0a9a373754..5d74a71e59 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 13ba196311..60d3a6ca10 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 059/135] 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 5368769fdc..73db0a31ba 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 0000000000..11f4c2284b --- /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 2fe50d7854..0000000000 --- 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 ba6ab780d8..be72dac37b 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 5df3b07039..b0e3f17fa9 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 46fce31e85..f6df57d43e 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 060/135] 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 d3fed02425..fcee33c979 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 7c016da8f9bb16218965e991fc4b5b14a46581b6 Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 11 Nov 2024 16:16:42 +0100 Subject: [PATCH 061/135] refactor: refs #7641 entry report style --- .../reports/entry-order/assets/css/style.css | 5 +++ .../reports/entry-order/entry-order.html | 44 +++++++++---------- 2 files changed, 27 insertions(+), 22 deletions(-) diff --git a/print/templates/reports/entry-order/assets/css/style.css b/print/templates/reports/entry-order/assets/css/style.css index 767b1185ab..1a5ea3eb6f 100644 --- a/print/templates/reports/entry-order/assets/css/style.css +++ b/print/templates/reports/entry-order/assets/css/style.css @@ -17,4 +17,9 @@ h3 { .tags { font-size: 10px; margin: 0; +} + +.column-oriented th, +.column-oriented td{ + padding: 5px } \ No newline at end of file diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index e5d3bfb6de..ff5159aa26 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -41,36 +41,36 @@
@@ -12,7 +12,7 @@
- {{item.buyFk}} + {{buy.buyFk}}
- {{item.itemFk}} + {{buy.itemFk}}
- {{item.item}} + {{buy.item}}
- {{item.size}} + {{buy.size}}
- Color: {{item.inkFk}} + Color: {{buy.inkFk}}
- {{packing || item.packing}} + {{packing || buy.packing}}
- {{item.stems}} + {{buy.stems}}
- Origen: {{item.origin}} + Origen: {{buy.origin}}
- Productor: {{item.producerName || item.producerFk}} + Productor: {{buy.producerName || buy.producerFk}}
-
+
{{'LAID'}}
- {{item.entryFk}} + {{buy.entryFk}}
- Comprador: {{item.buyerName}} + Comprador: {{buy.buyerName}}
@@ -96,14 +96,14 @@
- {{`${item.labelNum}/${item.quantity / (packing || item.packing)}`}} + {{`${buy.labelNum}/${buy.quantity / (packing || buy.packing)}`}}
- Entrada: {{item.entryFk}} + Entrada: {{buy.entryFk}}
{{ - (item.longName && item.size && item.subName) - ? `${item.longName} ${item.size} ${item.subName}` - : item.comment + (buy.longName && buy.size && buy.subName) + ? `${buy.longName} ${buy.size} ${buy.subName}` + : buy.comment }}
+ - + - - - - - - - - + + + + + + + + - - - - - + + + - - - - - + + + + From e38adf4296c55492ff62fb9c14fd6c1e0adb3d92 Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 11 Nov 2024 16:23:17 +0100 Subject: [PATCH 062/135] fix: refs #7641 align columns --- print/templates/reports/entry-order/entry-order.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index ff5159aa26..5ce306827c 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -77,8 +77,8 @@ - + From 90e7ab1ec1d18366c7b1a394ddfaa03e90c01d52 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 08:25:23 +0100 Subject: [PATCH 063/135] refactor: refs #7950 Created cmr model --- db/dump/.dump/data.sql | 2 +- db/versions/11336-chocolateRaphis/00-firstScript.sql | 8 ++++++++ .../{route/downloadCmrsZip.js => cmr/downloadZip.js} | 8 ++++---- .../route/back/methods/{route/cmrs.js => cmr/filter.js} | 6 +++--- modules/route/back/methods/{route/cmr.js => cmr/print.js} | 8 ++++---- .../specs/downloadZip.spec.js} | 4 ++-- modules/route/back/model-config.json | 3 +++ modules/route/back/models/cmr.js | 5 +++++ modules/route/back/models/route.js | 4 ---- modules/ticket/back/methods/ticket/saveCmr.js | 6 +++--- modules/ticket/back/methods/ticket/saveSign.js | 4 ++-- .../back/methods/ticket/sendCmrEmail.js} | 8 ++++---- modules/ticket/back/models/ticket-methods.js | 1 + 13 files changed, 40 insertions(+), 27 deletions(-) create mode 100644 db/versions/11336-chocolateRaphis/00-firstScript.sql rename modules/route/back/methods/{route/downloadCmrsZip.js => cmr/downloadZip.js} (87%) rename modules/route/back/methods/{route/cmrs.js => cmr/filter.js} (98%) rename modules/route/back/methods/{route/cmr.js => cmr/print.js} (82%) rename modules/route/back/methods/{route/specs/downloadCmrsZip.spec.js => cmr/specs/downloadZip.spec.js} (83%) create mode 100644 modules/route/back/models/cmr.js rename modules/{route/back/methods/route/cmrEmail.js => ticket/back/methods/ticket/sendCmrEmail.js} (92%) diff --git a/db/dump/.dump/data.sql b/db/dump/.dump/data.sql index 5f464c5e29..13e4a466fa 100644 --- a/db/dump/.dump/data.sql +++ b/db/dump/.dump/data.sql @@ -2045,7 +2045,7 @@ INSERT INTO `ACL` VALUES (756,'Route','findOne','READ','ALLOW','ROLE','employee' INSERT INTO `ACL` VALUES (757,'Route','getRoutesByWorker','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (758,'Route','canViewAllRoute','READ','ALLOW','ROLE','deliveryAssistant',NULL); INSERT INTO `ACL` VALUES (759,'Route','cmr','READ','ALLOW','ROLE','employee',NULL); -INSERT INTO `ACL` VALUES (760,'Route','downloadCmrsZip','READ','ALLOW','ROLE','employee',NULL); +INSERT INTO `ACL` VALUES (760,'Cmr','downloadZip','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (761,'Route','downloadZip','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (762,'Route','filter','READ','ALLOW','ROLE','employee',NULL); INSERT INTO `ACL` VALUES (763,'Route','getByWorker','READ','ALLOW','ROLE','employee',NULL); diff --git a/db/versions/11336-chocolateRaphis/00-firstScript.sql b/db/versions/11336-chocolateRaphis/00-firstScript.sql new file mode 100644 index 0000000000..c86dc39e9a --- /dev/null +++ b/db/versions/11336-chocolateRaphis/00-firstScript.sql @@ -0,0 +1,8 @@ +DELETE FROM salix.ACL + WHERE property IN ('cmrs', 'cmr', 'downloadCmrsZip') + AND model = 'Route'; + +INSERT INTO salix.ACL (model,property,principalId) + VALUES ('Cmr','filter','production'), + ('Cmr','downloadZip','production'), + ('Cmr','print','production') \ No newline at end of file diff --git a/modules/route/back/methods/route/downloadCmrsZip.js b/modules/route/back/methods/cmr/downloadZip.js similarity index 87% rename from modules/route/back/methods/route/downloadCmrsZip.js rename to modules/route/back/methods/cmr/downloadZip.js index 895ff7a168..fcf4ce61cc 100644 --- a/modules/route/back/methods/route/downloadCmrsZip.js +++ b/modules/route/back/methods/cmr/downloadZip.js @@ -1,7 +1,7 @@ const JSZip = require('jszip'); module.exports = Self => { - Self.remoteMethodCtx('downloadCmrsZip', { + Self.remoteMethodCtx('downloadZip', { description: 'Download a zip file with multiple cmrs pdfs', accessType: 'READ', accepts: [ @@ -27,13 +27,13 @@ module.exports = Self => { } ], http: { - path: '/downloadCmrsZip', + path: '/downloadZip', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.downloadCmrsZip = async function(ctx, ids, options) { + Self.downloadZip = async function(ctx, ids, options) { const models = Self.app.models; const myOptions = {}; const zip = new JSZip(); @@ -44,7 +44,7 @@ module.exports = Self => { const downloadAddZip = async id => { ctx.args = ctx.args || {}; ctx.args.id = Number(id); - const [data] = await models.Route.cmr(ctx, myOptions); + const [data] = await models.Cmr.print(ctx, myOptions); zip.file(`${id}.pdf`, data, {binary: true}); }; diff --git a/modules/route/back/methods/route/cmrs.js b/modules/route/back/methods/cmr/filter.js similarity index 98% rename from modules/route/back/methods/route/cmrs.js rename to modules/route/back/methods/cmr/filter.js index 6f271a4cf2..d5a217b1cf 100644 --- a/modules/route/back/methods/route/cmrs.js +++ b/modules/route/back/methods/cmr/filter.js @@ -3,7 +3,7 @@ const buildFilter = require('vn-loopback/util/filter').buildFilter; const mergeFilters = require('vn-loopback/util/filter').mergeFilters; module.exports = Self => { - Self.remoteMethod('cmrs', { + Self.remoteMethod('filter', { description: 'Returns an array of cmrs', accessType: 'READ', accepts: [ @@ -57,12 +57,12 @@ module.exports = Self => { root: true }, http: { - path: `/cmrs`, + path: `/filter`, verb: 'GET' } }); - Self.cmrs = async( + Self.filter = async( filter, cmrFk, ticketFk, routeFk, country, clientFk, hasCmrDms, shipped, warehouseFk, options ) => { const params = {cmrFk, ticketFk, routeFk, country, clientFk, hasCmrDms, warehouseFk, shipped}; diff --git a/modules/route/back/methods/route/cmr.js b/modules/route/back/methods/cmr/print.js similarity index 82% rename from modules/route/back/methods/route/cmr.js rename to modules/route/back/methods/cmr/print.js index 5033dee2f5..2fe8078290 100644 --- a/modules/route/back/methods/route/cmr.js +++ b/modules/route/back/methods/cmr/print.js @@ -1,6 +1,6 @@ module.exports = Self => { - Self.remoteMethodCtx('cmr', { - description: 'Returns the cmr', + Self.remoteMethodCtx('print', { + description: 'Returns the cmr pdf', accessType: 'READ', accepts: [ { @@ -27,11 +27,11 @@ module.exports = Self => { } ], http: { - path: '/:id/cmr', + path: '/:id/print', verb: 'GET' }, accessScopes: ['DEFAULT', 'read:multimedia'] }); - Self.cmr = (ctx, id) => Self.printReport(ctx, id, 'cmr'); + Self.print = (ctx, id) => Self.printReport(ctx, id, 'cmr'); }; diff --git a/modules/route/back/methods/route/specs/downloadCmrsZip.spec.js b/modules/route/back/methods/cmr/specs/downloadZip.spec.js similarity index 83% rename from modules/route/back/methods/route/specs/downloadCmrsZip.spec.js rename to modules/route/back/methods/cmr/specs/downloadZip.spec.js index 7312a5d44a..74870038fe 100644 --- a/modules/route/back/methods/route/specs/downloadCmrsZip.spec.js +++ b/modules/route/back/methods/cmr/specs/downloadZip.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('route downloadCmrsZip()', () => { +describe('route downloadZip()', () => { it('should create a zip file with the given cmr ids', async() => { const tx = await models.Route.beginTransaction({}); const ctx = { @@ -13,7 +13,7 @@ describe('route downloadCmrsZip()', () => { }; let cmrs = '1,2'; try { - const stream = await models.Route.downloadCmrsZip(ctx, cmrs); + const stream = await models.Cmr.downloadZip(ctx, cmrs); expect(stream[0]).toBeDefined(); await tx.rollback(); diff --git a/modules/route/back/model-config.json b/modules/route/back/model-config.json index ccae87bd94..be5aa07ca4 100644 --- a/modules/route/back/model-config.json +++ b/modules/route/back/model-config.json @@ -5,6 +5,9 @@ "AgencyTermConfig": { "dataSource": "vn" }, + "Cmr": { + "dataSource": "vn" + }, "DeliveryPoint": { "dataSource": "vn" }, diff --git a/modules/route/back/models/cmr.js b/modules/route/back/models/cmr.js new file mode 100644 index 0000000000..f9a153d52f --- /dev/null +++ b/modules/route/back/models/cmr.js @@ -0,0 +1,5 @@ +module.exports = Self => { + require('../methods/cmr/print')(Self); + require('../methods/cmr/filter')(Self); + require('../methods/cmr/downloadZip')(Self); +}; diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js index 242623d6e1..cd8685cec0 100644 --- a/modules/route/back/models/route.js +++ b/modules/route/back/models/route.js @@ -14,10 +14,6 @@ module.exports = Self => { require('../methods/route/driverRouteEmail')(Self); require('../methods/route/sendSms')(Self); require('../methods/route/downloadZip')(Self); - require('../methods/route/cmr')(Self); - require('../methods/route/cmrs')(Self); - require('../methods/route/downloadCmrsZip')(Self); - require('../methods/route/cmrEmail')(Self); require('../methods/route/getExpeditionSummary')(Self); require('../methods/route/getByWorker')(Self); }; diff --git a/modules/ticket/back/methods/ticket/saveCmr.js b/modules/ticket/back/methods/ticket/saveCmr.js index 339ac1e38a..4571508db1 100644 --- a/modules/ticket/back/methods/ticket/saveCmr.js +++ b/modules/ticket/back/methods/ticket/saveCmr.js @@ -41,7 +41,7 @@ module.exports = Self => { for (const ticketId of tickets) { const ticket = await models.Ticket.findById(ticketId, null, myOptions); - if (ticket.cmrFk) { + if (ticket.$cmrFk) { const hasDmsCmr = await Self.rawSql(` SELECT d.id FROM ticketDms td @@ -53,8 +53,8 @@ module.exports = Self => { if (hasDmsCmr.length) throw new UserError('This ticket already has a cmr saved'); - ctx.args.id = ticket.cmrFk; - const response = await models.Route.cmr(ctx, myOptions); + ctx.args.id = ticket.$cmrFk; + const response = await models.Cmr.print(ctx, myOptions); const pdfStream = Readable.from(Buffer.from(response[0])); const data = { workerFk: ctx.req.accessToken.userId, diff --git a/modules/ticket/back/methods/ticket/saveSign.js b/modules/ticket/back/methods/ticket/saveSign.js index bc0da686c2..ac2a7bc669 100644 --- a/modules/ticket/back/methods/ticket/saveSign.js +++ b/modules/ticket/back/methods/ticket/saveSign.js @@ -151,7 +151,7 @@ module.exports = Self => { await Self.rawSql(`CALL vn.ticket_setState(?, ?)`, [ticketId, stateCode], myOptions); - if (ticket?.address()?.province()?.country()?.code != 'ES' && ticket.cmrFk) { + if (ticket?.address()?.province()?.country()?.code != 'ES' && ticket.$cmrFk) { await models.Ticket.saveCmr(ctx, [ticketId], myOptions); externalTickets.push(ticketId); } @@ -161,6 +161,6 @@ module.exports = Self => { if (tx) await tx.rollback(); throw e; } - await models.Route.cmrEmail(ctx, externalTickets); + await models.Ticket.sendCmrEmail(ctx, externalTickets); }; }; diff --git a/modules/route/back/methods/route/cmrEmail.js b/modules/ticket/back/methods/ticket/sendCmrEmail.js similarity index 92% rename from modules/route/back/methods/route/cmrEmail.js rename to modules/ticket/back/methods/ticket/sendCmrEmail.js index 0c4cc50613..27f22ca147 100644 --- a/modules/route/back/methods/route/cmrEmail.js +++ b/modules/ticket/back/methods/ticket/sendCmrEmail.js @@ -2,7 +2,7 @@ const {Email} = require('vn-print'); const UserError = require('vn-loopback/util/user-error'); module.exports = Self => { - Self.remoteMethodCtx('cmrEmail', { + Self.remoteMethodCtx('sendCmrEmail', { description: 'Sends the email with an cmr attached PDF', accessType: 'WRITE', accepts: [ @@ -14,12 +14,12 @@ module.exports = Self => { } ], http: { - path: '/cmrEmail', + path: '/sendCmrEmail', verb: 'POST' } }); - Self.cmrEmail = async function(ctx, tickets, options) { + Self.sendCmrEmail = async function(ctx, tickets, options) { const models = Self.app.models; const myOptions = {}; let tx; @@ -70,7 +70,7 @@ module.exports = Self => { await email.send({ overrideAttachments: true, attachments: [{ - filename: `${ticket.cmrFk}.pdf`, + filename: `${ticket.$cmrFk}.pdf`, content: response[0] }] }); diff --git a/modules/ticket/back/models/ticket-methods.js b/modules/ticket/back/models/ticket-methods.js index 7fe968b267..620b3e1841 100644 --- a/modules/ticket/back/models/ticket-methods.js +++ b/modules/ticket/back/models/ticket-methods.js @@ -40,6 +40,7 @@ module.exports = function(Self) { require('../methods/ticket/expeditionPalletLabel')(Self); require('../methods/ticket/saveSign')(Self); require('../methods/ticket/saveCmr')(Self); + require('../methods/ticket/sendCmrEmail')(Self); require('../methods/ticket/invoiceTickets')(Self); require('../methods/ticket/invoiceTicketsAndPdf')(Self); require('../methods/ticket/docuwareDownload')(Self); From 76d072e00f8e8ba5689ac4f3fd1273125403b333 Mon Sep 17 00:00:00 2001 From: Pako Date: Tue, 12 Nov 2024 08:28:26 +0100 Subject: [PATCH 064/135] fix: more data for fixture.before --- db/dump/fixtures.before.sql | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index bb620ac49d..8544686e8b 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -400,11 +400,11 @@ INSERT INTO `vn`.`client`(`id`,`name`,`fi`,`socialName`,`contact`,`street`,`city (1108, 'Charles Xavier', '22641921P', 'PROFESSOR X', 'Beast', '3800 VICTORY PKWY, CINCINNATI, OH 45207, USA', 'Gotham', 46460, 1111111111, 222222222, 1, 'CharlesXavier@mydomain.com', NULL, 0, 1234567890, 0, 5, 1, 300, 13, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 1, NULL, 0, 0, 19, 0, 'florist','normal'), (1109, 'Bruce Banner', '16104829E', 'HULK', 'Black widow', 'SOMEWHERE IN NEW YORK', 'Gotham', 46460, 1111111111, 222222222, 1, 'BruceBanner@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 0, 0, NULL, 0, 0, 9, 0, 'florist','normal'), (1110, 'Jessica Jones', '58282869H', 'JESSICA JONES', 'Luke Cage', 'NYCC 2015 POSTER', 'Gotham', 46460, 1111111111, 222222222, 1, 'JessicaJones@mydomain.com', NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 1, 1, 0, NULL, 0, 0, NULL, 1, 'florist','normal'), - (1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'), - (1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 1, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'); + (1111, 'Missing', NULL, 'MISSING MAN', 'Anton', 'THE SPACE, UNIVERSE FAR AWAY', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'), + (1112, 'Trash', NULL, 'GARBAGE MAN', 'Unknown name', 'NEW YORK CITY, UNDERGROUND', 'Gotham', 46460, 1111111111, 222222222, 0, NULL, NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1, 5, 1, 1, 1, '0000-00-00', 0, 1, 0, NULL, 1, 0, NULL, 0, 'others','loses'); INSERT INTO `vn`.`client`(`id`, `name`, `fi`, `socialName`, `contact`, `street`, `city`, `postcode`, `isRelevant`, `email`, `iban`,`dueDay`,`accountingAccount`, `isEqualizated`, `provinceFk`, `hasToInvoice`, `credit`, `countryFk`, `isActive`, `quality`, `payMethodFk`,`created`, `isTaxDataChecked`) - SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), UPPER(CONCAT(name, 'Street')), 'GOTHAM', 46460, 1, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1 + SELECT id, name, CONCAT(RPAD(CONCAT(id,9),8,id),'A'), UPPER(CONCAT(name, 'Social')), CONCAT(name, 'Contact'), UPPER(CONCAT(name, 'Street')), 'GOTHAM', 46460, 0, CONCAT(name,'@mydomain.com'), NULL, 0, 1234567890, 0, 1, 1, 300, 1, 1, 10, 5, util.VN_CURDATE(), 1 FROM `account`.`role` `r` WHERE `r`.`hasLogin` = 1; @@ -4008,4 +4008,17 @@ 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 srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, code, stratus, hasWorkerWaiting, reserve, routeFk, dayMinute, lastUnloaded, hasStrapper, typeDefaultFk, motors, editorFk) + VALUES (0, 0, 0, 0, NULL, 3, 1, 0, 'ENT', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (1, 0, 9900, 0, NULL, 1, 0, 0, 'NOK', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (2, 0, 0, 450, 13000, 1, 0, 1, '01A', 1, 1, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (3, 1400, 0, 450, 13000, 1, 0, 1, '01B', 1, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (4, 0, 500, 500, 13000, 1, 4, 1, '02A', 2, 1, NULL, NULL, NULL, NULL, 1, 4, 13, NULL), + (5, 1400, 500, 500, 13000, 1, 4, 1, '02B', 2, 1, NULL, NULL, NULL, NULL, 1, 4, 13, NULL), + (6, 0, 1000, 500, 13000, 1, 1, 1, '03A', 3, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (7, 1400, 1000, 500, 13000, 1, 1, 1, '03B', 3, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (8, 0, 1500, 500, 13000, 1, 0, 1, '04A', 4, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (9, 1400, 1500, 500, 13000, 1, 1, 1, '04B', 4, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (10, 0, 2000, 500, 13000, 1, 1, 1, '05A', 5, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL); + From a921e5102314c174c85e0276581bcd048172885d Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 09:51:48 +0100 Subject: [PATCH 065/135] refactor: refs #7715 Deleted hasNewLabelMrwMethod column --- db/versions/11337-limeAsparagus/00-firstScript.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 db/versions/11337-limeAsparagus/00-firstScript.sql diff --git a/db/versions/11337-limeAsparagus/00-firstScript.sql b/db/versions/11337-limeAsparagus/00-firstScript.sql new file mode 100644 index 0000000000..4cfedc8a86 --- /dev/null +++ b/db/versions/11337-limeAsparagus/00-firstScript.sql @@ -0,0 +1 @@ +ALTER TABLE vn.productionConfig DROP COLUMN hasNewLabelMrwMethod; From f989b72fab7ad2c784717296022696c65afc67e4 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 10:18:00 +0100 Subject: [PATCH 066/135] feat: refs #8080 Added column comment --- db/versions/11339-goldenMastic/00-firstScript.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 db/versions/11339-goldenMastic/00-firstScript.sql diff --git a/db/versions/11339-goldenMastic/00-firstScript.sql b/db/versions/11339-goldenMastic/00-firstScript.sql new file mode 100644 index 0000000000..f1da5798a3 --- /dev/null +++ b/db/versions/11339-goldenMastic/00-firstScript.sql @@ -0,0 +1 @@ +ALTER TABLE vn.dua ADD comment TEXT DEFAULT NULL NULL; From d52f537f0cb3d993eba447dbdbe42ffb21c70c12 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 13:04:23 +0100 Subject: [PATCH 067/135] refactor: refs #8153 Optimized order_getTax --- .../hedera/procedures/order_getTax.sql | 60 ++++++++++--------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/db/routines/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql index d24ffe7efe..8fa965343d 100644 --- a/db/routines/hedera/procedures/order_getTax.sql +++ b/db/routines/hedera/procedures/order_getTax.sql @@ -15,41 +15,47 @@ BEGIN ENGINE = MEMORY SELECT DISTINCT o.address_id addressFk, o.company_id companyFk FROM tmp.`order` tmpOrder - JOIN hedera.`order` o ON o.id = tmpOrder.orderFk; + JOIN `order` o ON o.id = tmpOrder.orderFk; - CALL vn.addressTaxArea; + CALL vn.addressTaxArea(); -- Calcula el IVA y el recargo desglosado. - - DROP TEMPORARY TABLE IF EXISTS tmp.orderTax; - CREATE TEMPORARY TABLE tmp.orderTax - (INDEX (orderFk)) + CREATE OR REPLACE TEMPORARY TABLE tmp.orderTax + (PRIMARY KEY (orderFk, code, rate)) ENGINE = MEMORY - SELECT o.id orderFk, + WITH orders AS ( + SELECT tor.orderFk, + oro.amount * oro.price total, + s.countryFk, + ata.areaFk, + itc.taxClassFk + FROM orderRow oro + JOIN tmp.order tor ON tor.orderFk = oro.orderFk + JOIN `order` o ON o.id = tor.orderFk + JOIN vn.item i ON i.id = oro.itemFk + JOIN vn.`client` c ON c.id = o.customer_id + JOIN vn.supplier s ON s.id = o.company_id + JOIN tmp.addressTaxArea ata ON ata.addressFk = o.address_id + AND ata.companyFk = o.company_id + JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id + AND itc.countryFk = s.countryFk + HAVING total + ) + SELECT o.orderFk, tc.code, - SUM(m.amount * m.price) taxableBase, + SUM(o.total) taxableBase, pgc.rate - FROM tmp.`order` tmpOrder - JOIN `order` o ON o.id = tmpOrder.orderFk - JOIN orderRow m ON m.orderFk = o.id - JOIN vn.item i ON i.id = m.itemFk - JOIN vn.`client` c ON c.id = o.customer_id - JOIN vn.supplier s ON s.id = o.company_id - JOIN tmp.addressTaxArea ata - ON ata.addressFk = o.address_id AND ata.companyFk = o.company_id - JOIN vn.itemTaxCountry itc - ON itc.itemFk = i.id AND itc.countryFk = s.countryFk - JOIN vn.bookingPlanner bp - ON bp.countryFk = s.countryFk - AND bp.taxAreaFk = ata.areaFk - AND bp.taxClassFk = itc.taxClassFk - JOIN vn.pgc ON pgc.`code` = bp.pgcFk + FROM orders o + JOIN vn.bookingPlanner bp ON bp.countryFk = o.countryFk + AND bp.taxAreaFk = o.areaFk + AND bp.taxClassFk = o.taxClassFk + JOIN vn.pgc ON pgc.code = bp.pgcFk JOIN vn.taxClass tc ON tc.id = bp.taxClassFk - GROUP BY tmpOrder.orderFk, pgc.`code`, pgc.rate - HAVING taxableBase != 0; + GROUP BY o.orderFk, pgc.code, pgc.rate + HAVING taxableBase + ORDER BY bp.priority; - DROP TEMPORARY TABLE IF EXISTS tmp.orderAmount; - CREATE TEMPORARY TABLE tmp.orderAmount + CREATE OR REPLACE TEMPORARY TABLE tmp.orderAmount (INDEX (orderFk)) ENGINE = MEMORY SELECT orderFk, taxableBase, `code`, From 2ece748138d59091498ccb326823d2ccf6d20105 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 13:13:13 +0100 Subject: [PATCH 068/135] refactor: refs #7242 Deleted select column --- db/routines/vn/procedures/item_getInfo.sql | 1 - 1 file changed, 1 deletion(-) diff --git a/db/routines/vn/procedures/item_getInfo.sql b/db/routines/vn/procedures/item_getInfo.sql index 341142892c..bd59728f7e 100644 --- a/db/routines/vn/procedures/item_getInfo.sql +++ b/db/routines/vn/procedures/item_getInfo.sql @@ -42,7 +42,6 @@ BEGIN i.minimum `min`, p.name producer, o.code origin, - v.visible - IFNULL(vVisibleItemShelving, 0) unlocated, a.available, vVisibleItemShelving, v.visible, From 127c6fced0cd744794f2eda0e65d3667dfcf8bab Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 13:25:51 +0100 Subject: [PATCH 069/135] refactor: refs #8153 Optimized order_getTax --- db/routines/hedera/procedures/order_getTax.sql | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/db/routines/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql index 8fa965343d..90c47bfc74 100644 --- a/db/routines/hedera/procedures/order_getTax.sql +++ b/db/routines/hedera/procedures/order_getTax.sql @@ -9,6 +9,7 @@ BEGIN * @param vOrder El identificador del pedido * @return tmp.orderTax Bases imponibles, IVA y recargo de equivalencia */ + -- No poner create or replace, ya que da problemas DROP TEMPORARY TABLE IF EXISTS tmp.addressCompany; CREATE TEMPORARY TABLE tmp.addressCompany (INDEX (addressFk, companyFk)) @@ -55,7 +56,9 @@ BEGIN HAVING taxableBase ORDER BY bp.priority; - CREATE OR REPLACE TEMPORARY TABLE tmp.orderAmount + -- No poner create or replace, ya que da problemas + DROP TEMPORARY TABLE IF EXISTS tmp.orderAmount; + CREATE TEMPORARY TABLE tmp.orderAmount (INDEX (orderFk)) ENGINE = MEMORY SELECT orderFk, taxableBase, `code`, From 3c8ef7cdba7ab7dfe9f237f23a92871ce9ac2b86 Mon Sep 17 00:00:00 2001 From: guillermo Date: Tue, 12 Nov 2024 14:54:11 +0100 Subject: [PATCH 070/135] refactor: refs #7950 Requested changes --- modules/ticket/back/methods/ticket/saveCmr.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket/saveCmr.js b/modules/ticket/back/methods/ticket/saveCmr.js index 4571508db1..a96bb6a272 100644 --- a/modules/ticket/back/methods/ticket/saveCmr.js +++ b/modules/ticket/back/methods/ticket/saveCmr.js @@ -53,7 +53,7 @@ module.exports = Self => { if (hasDmsCmr.length) throw new UserError('This ticket already has a cmr saved'); - ctx.args.id = ticket.$cmrFk; + Object.assign(ctx.args, {id: ticket.$cmrFk}); const response = await models.Cmr.print(ctx, myOptions); const pdfStream = Readable.from(Buffer.from(response[0])); const data = { From 628b67e1e58e98e594d0dd9a1ed2cd4580fd7c90 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 07:10:52 +0100 Subject: [PATCH 071/135] fix: refs #8153 Version --- db/routines/hedera/procedures/order_getTax.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql index 90c47bfc74..c33b421f38 100644 --- a/db/routines/hedera/procedures/order_getTax.sql +++ b/db/routines/hedera/procedures/order_getTax.sql @@ -30,7 +30,7 @@ BEGIN s.countryFk, ata.areaFk, itc.taxClassFk - FROM orderRow oro + FROM hedera.orderRow oro JOIN tmp.order tor ON tor.orderFk = oro.orderFk JOIN `order` o ON o.id = tor.orderFk JOIN vn.item i ON i.id = oro.itemFk From ab2e35b64cd7f0cd1f6d82816dcb6e3d6b7cb440 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 07:12:49 +0100 Subject: [PATCH 072/135] fix: refs #8153 Version --- db/routines/hedera/procedures/order_getTax.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/hedera/procedures/order_getTax.sql b/db/routines/hedera/procedures/order_getTax.sql index c33b421f38..371416c297 100644 --- a/db/routines/hedera/procedures/order_getTax.sql +++ b/db/routines/hedera/procedures/order_getTax.sql @@ -32,7 +32,7 @@ BEGIN itc.taxClassFk FROM hedera.orderRow oro JOIN tmp.order tor ON tor.orderFk = oro.orderFk - JOIN `order` o ON o.id = tor.orderFk + JOIN hedera.`order` o ON o.id = tor.orderFk JOIN vn.item i ON i.id = oro.itemFk JOIN vn.`client` c ON c.id = o.customer_id JOIN vn.supplier s ON s.id = o.company_id From c2381f0febba0dd5414466712c019df469ef9142 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 07:42:58 +0100 Subject: [PATCH 073/135] refactor: refs #7920 Main change --- db/dump/fixtures.before.sql | 42 +++++++++---------- .../11342-crimsonDendro/00-firstScript.sql | 20 +++++++++ 2 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 db/versions/11342-crimsonDendro/00-firstScript.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 8544686e8b..630e24e1d0 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -1254,9 +1254,9 @@ INSERT INTO `vn`.`saleComponent`(`saleFk`, `componentFk`, `value`) INSERT INTO `vn`.`itemShelving` (`itemFk`, `shelvingFk`, `visible`, `grouping`, `packing`,`buyFk`, `userFk`) VALUES - (2, 'GVC', 1, 1, 1, 2,1106), - (4, 'HEJ', 1, 1, 1, NULL,1106), - (1, 'UXN', 2, 12, 12, NULL,1106); + (2, 11, 1, 1, 1, 2,1106), + (4, 12, 1, 1, 1, NULL,1106), + (1, 13, 2, 12, 12, NULL,1106); INSERT INTO `vn`.`itemShelvingSale` (`itemShelvingFk`, `saleFk`, `quantity`, `created`, `userFk`) VALUES @@ -3425,7 +3425,7 @@ INSERT INTO vn.buy INSERT INTO vn.itemShelving SET id = 9931, itemFk = 999993, - shelvingFk = 'NCC', + shelvingFk = 16, visible = 10, `grouping` = 5, packing = 10; @@ -3752,7 +3752,7 @@ INSERT vn.sale USE vn; DELETE ish.* FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk JOIN vn.warehouse w ON w.id = s.warehouseFk @@ -3761,22 +3761,22 @@ DELETE ish.* FROM vn.itemShelving ish INSERT INTO vn.itemShelving (itemFk, shelvingFk, visible, created, `grouping`, packing, packagingFk, userFk, isChecked) VALUES - (999991, 'NAA', 8, '2023-09-20', 1, 20, NULL, 103, NULL), - (999998, 'NAA', 80, '2023-09-20', 10, 30, NULL, 103, NULL), - (1000001, 'NAA', 6, '2023-09-20', 3, 50, NULL, 103, NULL), - (1000000, 'NBB', 50, '2023-09-18', 25, 500, NULL, 103, NULL), - (999993, 'NBB', 25, '2023-09-18', NULL, 10, NULL, 103, NULL), - (999999, 'NBB', 30, '2023-09-18', 10, 500, NULL, 103, NULL), - (999993, 'NCC', 25, '2023-09-20', 5, 10, NULL, 103, NULL), - (999997, 'NCC', 10, '2023-09-20', NULL, 100, NULL, 103, NULL), - (999999, 'NCC', 40, '2023-09-20', 10, 500, NULL, 103, NULL), - (999995, 'NDD', 10, '2023-09-19', NULL, 20, NULL, 103, NULL), - (999994, 'NDD', 48, '2023-09-19', 4, 20, NULL, 103, NULL), - (1000001, 'NEE', 6, '2023-09-21', 3, 50, NULL, 103, NULL), - (999992, 'NEE', 50, '2023-09-21', NULL, 1, NULL, 103, NULL), - (1000000, 'NEE', 25, '2023-09-21', 25, 500, NULL, 103, NULL), - (999996, 'PAA', 5, '2023-09-27', 1, 5, NULL, 103, NULL), - (999997, 'PCC', 10, '2023-09-27', 5, 100, NULL, 103, NULL); + (999991, 14, 8, '2023-09-20', 1, 20, NULL, 103, NULL), + (999998, 14, 80, '2023-09-20', 10, 30, NULL, 103, NULL), + (1000001, 14, 6, '2023-09-20', 3, 50, NULL, 103, NULL), + (1000000, 15, 50, '2023-09-18', 25, 500, NULL, 103, NULL), + (999993, 15, 25, '2023-09-18', NULL, 10, NULL, 103, NULL), + (999999, 15, 30, '2023-09-18', 10, 500, NULL, 103, NULL), + (999993, 16, 25, '2023-09-20', 5, 10, NULL, 103, NULL), + (999997, 16, 10, '2023-09-20', NULL, 100, NULL, 103, NULL), + (999999, 16, 40, '2023-09-20', 10, 500, NULL, 103, NULL), + (999995, 17, 10, '2023-09-19', NULL, 20, NULL, 103, NULL), + (999994, 17, 48, '2023-09-19', 4, 20, NULL, 103, NULL), + (1000001, 18, 6, '2023-09-21', 3, 50, NULL, 103, NULL), + (999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL), + (1000000, 18, 25, '2023-09-21', 25, 500, NULL, 103, NULL), + (999996, 19, 5, '2023-09-27', 1, 5, NULL, 103, NULL), + (999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL); -- Previous for Bolas de madera INSERT IGNORE INTO vn.sectorCollection diff --git a/db/versions/11342-crimsonDendro/00-firstScript.sql b/db/versions/11342-crimsonDendro/00-firstScript.sql new file mode 100644 index 0000000000..56bea2c032 --- /dev/null +++ b/db/versions/11342-crimsonDendro/00-firstScript.sql @@ -0,0 +1,20 @@ +CREATE OR REPLACE TEMPORARY TABLE tItemShelving + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT ish.id, s.id shelvingFk + FROM shelving s + JOIN itemShelving ish ON ish.shelvingFk = s.code; + +ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, + MODIFY COLUMN shelvingFk int(11) NOT NULL; + +UPDATE itemShelving ish + JOIN tItemShelving tis ON tis.id = ish.id + SET ish.shelvingFk = tis.shelvingFk; + +DROP TEMPORARY TABLE tItemShelving; + +ALTER TABLE vn.itemShelving + ADD CONSTRAINT itemShelving_shelving_FK FOREIGN KEY (shelvingFk) REFERENCES vn.shelving(id) + ON DELETE RESTRICT + ON UPDATE CASCADE; From 779a75cd7823e0e8cc202ae56831aa8495ffcd33 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 09:03:44 +0100 Subject: [PATCH 074/135] refactor: refs #7920 Major changes --- db/dump/.dump/structure.sql | 3390 ++++++++--------- .../inventoryDiscrepancyDetail_replace.sql | 2 +- db/routines/vn/functions/hasItemsInSector.sql | 2 +- .../vn/functions/itemsInSector_get.sql | 2 +- .../vn/procedures/collectionPlacement_get.sql | 2 +- .../vn/procedures/entry_splitByShelving.sql | 20 +- .../procedures/itemPlacementSupplyAiming.sql | 22 +- .../itemPlacementSupplyGetOrder.sql | 30 +- .../itemPlacementSupplyStockGetTargetList.sql | 15 +- .../vn/procedures/itemShelvingMatch.sql | 2 +- .../procedures/itemShelvingSale_addBySale.sql | 4 +- .../vn/procedures/itemShelving_add.sql | 15 +- .../vn/procedures/itemShelving_addByClaim.sql | 17 +- .../vn/procedures/itemShelving_addList.sql | 15 +- .../vn/procedures/itemShelving_get.sql | 14 +- .../itemShelving_getAlternatives.sql | 28 +- .../vn/procedures/itemShelving_getInfo.sql | 2 +- .../itemShelving_getItemDetails.sql | 19 +- .../procedures/itemShelving_getSaleDate.sql | 30 +- .../vn/procedures/itemShelving_inventory.sql | 2 +- .../itemShelving_selfConsumption.sql | 17 +- .../vn/procedures/itemShelving_transfer.sql | 15 +- db/routines/vn/procedures/item_devalueA2.sql | 30 +- .../vn/procedures/productionControl.sql | 2 +- .../vn/procedures/sale_boxPickingPrint.sql | 4 +- .../vn/procedures/sale_getBoxPickingList.sql | 2 +- .../vn/procedures/sale_getProblems.sql | 2 +- db/routines/vn/procedures/shelving_clean.sql | 10 +- 28 files changed, 1892 insertions(+), 1823 deletions(-) diff --git a/db/dump/.dump/structure.sql b/db/dump/.dump/structure.sql index e4e59a6bff..e6c0e66740 100644 --- a/db/dump/.dump/structure.sql +++ b/db/dump/.dump/structure.sql @@ -2955,55 +2955,55 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `analisis_ventas_update`() -BEGIN - DECLARE vLastMonth DATE; - - SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE())); - - DELETE FROM analisis_ventas - WHERE Año > YEAR(vLastMonth) - OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth)); - - INSERT INTO analisis_ventas ( - Familia, - Reino, - Comercial, - Comprador, - Provincia, - almacen, - Año, - Mes, - Semana, - Vista, - Importe - ) - SELECT - it.name, - ic.name, - w.code, - w2.code, - p.name, - wa.name, - tm.year, - tm.month, - tm.week, - dm.description, - bt.importe - FROM bs.ventas bt - LEFT JOIN vn.itemType it ON it.id = bt.tipo_id - LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk - LEFT JOIN vn.client c on c.id = bt.Id_Cliente - LEFT JOIN vn.worker w ON w.id = c.salesPersonFk - LEFT JOIN vn.worker w2 ON w2.id = it.workerFk - JOIN vn.time tm ON tm.dated = bt.fecha - JOIN vn.sale s ON s.id = bt.Id_Movimiento - LEFT JOIN vn.ticket t ON t.id = s.ticketFk - JOIN vn.agencyMode am ON am.id = t.agencyModeFk - LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk - LEFT JOIN vn.address a ON a.id = t.addressFk - LEFT JOIN vn.province p ON p.id = a.provinceFk - LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk - WHERE bt.fecha >= vLastMonth AND ic.merchandise; +BEGIN + DECLARE vLastMonth DATE; + + SET vLastMonth = util.firstDayOfMonth(TIMESTAMPADD(MONTH, -1, util.VN_CURDATE())); + + DELETE FROM analisis_ventas + WHERE Año > YEAR(vLastMonth) + OR (Año = YEAR(vLastMonth) AND Mes >= MONTH(vLastMonth)); + + INSERT INTO analisis_ventas ( + Familia, + Reino, + Comercial, + Comprador, + Provincia, + almacen, + Año, + Mes, + Semana, + Vista, + Importe + ) + SELECT + it.name, + ic.name, + w.code, + w2.code, + p.name, + wa.name, + tm.year, + tm.month, + tm.week, + dm.description, + bt.importe + FROM bs.ventas bt + LEFT JOIN vn.itemType it ON it.id = bt.tipo_id + LEFT JOIN vn.itemCategory ic ON ic.id = it.categoryFk + LEFT JOIN vn.client c on c.id = bt.Id_Cliente + LEFT JOIN vn.worker w ON w.id = c.salesPersonFk + LEFT JOIN vn.worker w2 ON w2.id = it.workerFk + JOIN vn.time tm ON tm.dated = bt.fecha + JOIN vn.sale s ON s.id = bt.Id_Movimiento + LEFT JOIN vn.ticket t ON t.id = s.ticketFk + JOIN vn.agencyMode am ON am.id = t.agencyModeFk + LEFT JOIN vn.deliveryMethod dm ON dm.id = am.deliveryMethodFk + LEFT JOIN vn.address a ON a.id = t.addressFk + LEFT JOIN vn.province p ON p.id = a.provinceFk + LEFT JOIN vn.warehouse wa ON wa.id = t.warehouseFk + WHERE bt.fecha >= vLastMonth AND ic.merchandise; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -3021,21 +3021,21 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `clean`() -BEGIN - DECLARE vDateShort DATETIME; - DECLARE vDateLong DATETIME; - DECLARE vOneYearAgo DATETIME; - - SET vDateShort = TIMESTAMPADD(MONTH, -2, util.VN_CURDATE()); - SET vDateLong = TIMESTAMPADD(MONTH, -18,util.VN_CURDATE()); - SET vOneYearAgo = TIMESTAMPADD(YEAR, -1,util.VN_CURDATE()); - - DELETE FROM bi.Greuge_Evolution - WHERE (Fecha < vDateShort AND weekday(Fecha) != 1) - OR Fecha < vOneYearAgo; - - DELETE FROM bi.defaulters WHERE `date` < vDateLong; - DELETE FROM bi.defaulting WHERE `date` < vDateLong; +BEGIN + DECLARE vDateShort DATETIME; + DECLARE vDateLong DATETIME; + DECLARE vOneYearAgo DATETIME; + + SET vDateShort = TIMESTAMPADD(MONTH, -2, util.VN_CURDATE()); + SET vDateLong = TIMESTAMPADD(MONTH, -18,util.VN_CURDATE()); + SET vOneYearAgo = TIMESTAMPADD(YEAR, -1,util.VN_CURDATE()); + + DELETE FROM bi.Greuge_Evolution + WHERE (Fecha < vDateShort AND weekday(Fecha) != 1) + OR Fecha < vOneYearAgo; + + DELETE FROM bi.defaulters WHERE `date` < vDateLong; + DELETE FROM bi.defaulting WHERE `date` < vDateLong; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -3224,18 +3224,18 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `facturacion_media_anual_update`() -BEGIN - TRUNCATE TABLE bs.clientAnnualConsumption; - - REPLACE bi.facturacion_media_anual(Id_Cliente, Consumo) - SELECT clientFk, avg(Facturacion) - FROM ( - SELECT clientFk, YEAR(issued) year, MONTH(issued) month, sum(amount) as Facturacion - FROM vn.invoiceOut - WHERE issued BETWEEN TIMESTAMPADD(YEAR,-1,util.VN_CURDATE()) AND TIMESTAMPADD(DAY, - DAY(util.VN_CURDATE()),util.VN_CURDATE()) - GROUP BY clientFk, year, month - ) vol - GROUP BY clientFk; +BEGIN + TRUNCATE TABLE bs.clientAnnualConsumption; + + REPLACE bi.facturacion_media_anual(Id_Cliente, Consumo) + SELECT clientFk, avg(Facturacion) + FROM ( + SELECT clientFk, YEAR(issued) year, MONTH(issued) month, sum(amount) as Facturacion + FROM vn.invoiceOut + WHERE issued BETWEEN TIMESTAMPADD(YEAR,-1,util.VN_CURDATE()) AND TIMESTAMPADD(DAY, - DAY(util.VN_CURDATE()),util.VN_CURDATE()) + GROUP BY clientFk, year, month + ) vol + GROUP BY clientFk; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -4516,29 +4516,29 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `carteras_add`() -BEGIN -/** - * Inserta en la tabla @bs.carteras las ventas desde el año pasado - * agrupadas por trabajador, año y mes - */ - DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1; - - DELETE FROM bs.carteras WHERE Año >= vYear; - - CALL util.time_generate( - MAKEDATE(vYear, 1), - (SELECT MAX(fecha) FROM ventas) - ); - - INSERT INTO carteras(Año, Mes , CodigoTrabajador, Peso) - SELECT t.`year`, t.`month`, w.code, SUM(v.importe) - FROM tmp.time t - JOIN ventas v on t.dated = v.fecha - JOIN vn.client c on c.id = v.Id_Cliente - JOIN vn.worker w ON w.id = c.salesPersonFk - GROUP BY w.code, t.`year`, t.`month`; - - DROP TEMPORARY TABLE tmp.time; +BEGIN +/** + * Inserta en la tabla @bs.carteras las ventas desde el año pasado + * agrupadas por trabajador, año y mes + */ + DECLARE vYear INT DEFAULT YEAR(util.VN_CURDATE()) - 1; + + DELETE FROM bs.carteras WHERE Año >= vYear; + + CALL util.time_generate( + MAKEDATE(vYear, 1), + (SELECT MAX(fecha) FROM ventas) + ); + + INSERT INTO carteras(Año, Mes , CodigoTrabajador, Peso) + SELECT t.`year`, t.`month`, w.code, SUM(v.importe) + FROM tmp.time t + JOIN ventas v on t.dated = v.fecha + JOIN vn.client c on c.id = v.Id_Cliente + JOIN vn.worker w ON w.id = c.salesPersonFk + GROUP BY w.code, t.`year`, t.`month`; + + DROP TEMPORARY TABLE tmp.time; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -5465,82 +5465,82 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `nightTask_launchAll`() -BEGIN -/** - * Runs all nightly tasks. - */ - DECLARE vDone BOOL; - DECLARE vError VARCHAR(255); - DECLARE vErrorCode VARCHAR(255); - DECLARE vSchema VARCHAR(255); - DECLARE vProcedure VARCHAR(255); - DECLARE vLogMail VARCHAR(255); - DECLARE vNightTaskFk INT; - - DECLARE vQueue CURSOR FOR - SELECT id, `schema`, `procedure` - FROM nightTask - WHERE finished <= util.VN_CURDATE() - OR finished IS NULL - ORDER BY `order`; - - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET vDone = TRUE; - - SET max_sp_recursion_depth = 3; - - SELECT logMail INTO vLogMail - FROM nightTaskConfig LIMIT 1; - - OPEN vQueue; - l: LOOP - SET vDone = FALSE; - FETCH vQueue INTO vNightTaskFk, vSchema, vProcedure; - - IF vDone THEN - LEAVE l; - END IF; - - UPDATE nightTask - SET `started` = util.VN_NOW(), - `finished` = NULL, - `error` = NULL, - `errorCode` = NULL - WHERE id = vNightTaskFk; - - SET vError = NULL; - CALL nightTask_launchTask( - vSchema, - vProcedure, - vError, - vErrorCode - ); - - IF vError IS NOT NULL THEN - IF vLogMail IS NOT NULL THEN - CALL vn.mail_insert( - vLogMail, - NULL, - CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'), - CONCAT( - '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break - 'See ', SCHEMA(), '.nightTask table for more info.' - ) - ); - END IF; - - UPDATE nightTask - SET `error` = vError, - `errorCode` = vErrorCode - WHERE id = vNightTaskFk; - ELSE - UPDATE nightTask - SET finished = util.VN_NOW(), - lastFinished = util.VN_NOW() - WHERE id = vNightTaskFk; - END IF; - END LOOP; - CLOSE vQueue; +BEGIN +/** + * Runs all nightly tasks. + */ + DECLARE vDone BOOL; + DECLARE vError VARCHAR(255); + DECLARE vErrorCode VARCHAR(255); + DECLARE vSchema VARCHAR(255); + DECLARE vProcedure VARCHAR(255); + DECLARE vLogMail VARCHAR(255); + DECLARE vNightTaskFk INT; + + DECLARE vQueue CURSOR FOR + SELECT id, `schema`, `procedure` + FROM nightTask + WHERE finished <= util.VN_CURDATE() + OR finished IS NULL + ORDER BY `order`; + + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + SET max_sp_recursion_depth = 3; + + SELECT logMail INTO vLogMail + FROM nightTaskConfig LIMIT 1; + + OPEN vQueue; + l: LOOP + SET vDone = FALSE; + FETCH vQueue INTO vNightTaskFk, vSchema, vProcedure; + + IF vDone THEN + LEAVE l; + END IF; + + UPDATE nightTask + SET `started` = util.VN_NOW(), + `finished` = NULL, + `error` = NULL, + `errorCode` = NULL + WHERE id = vNightTaskFk; + + SET vError = NULL; + CALL nightTask_launchTask( + vSchema, + vProcedure, + vError, + vErrorCode + ); + + IF vError IS NOT NULL THEN + IF vLogMail IS NOT NULL THEN + CALL vn.mail_insert( + vLogMail, + NULL, + CONCAT('Nightly task failed (', vSchema, '.', vProcedure, ')'), + CONCAT( + '[', vErrorCode, '] ', vError, CHAR(13, 10), -- Line break + 'See ', SCHEMA(), '.nightTask table for more info.' + ) + ); + END IF; + + UPDATE nightTask + SET `error` = vError, + `errorCode` = vErrorCode + WHERE id = vNightTaskFk; + ELSE + UPDATE nightTask + SET finished = util.VN_NOW(), + lastFinished = util.VN_NOW() + WHERE id = vNightTaskFk; + END IF; + END LOOP; + CLOSE vQueue; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7285,27 +7285,27 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `cache_calc_end`(IN `v_calc` INT) -BEGIN - DECLARE v_cache_name VARCHAR(255); - DECLARE v_params VARCHAR(255); - - -- Libera el bloqueo y actualiza la fecha de ultimo refresco. - - UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id - SET - cc.last_refresh = NOW(), - cc.expires = ADDTIME(NOW(), c.lifetime), - cc.connection_id = NULL - WHERE cc.id = v_calc; - - SELECT c.name, ca.params INTO v_cache_name, v_params - FROM cache c - JOIN cache_calc ca ON c.id = ca.cache_id - WHERE ca.id = v_calc; - - IF v_cache_name IS NOT NULL THEN - DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); - END IF; +BEGIN + DECLARE v_cache_name VARCHAR(255); + DECLARE v_params VARCHAR(255); + + -- Libera el bloqueo y actualiza la fecha de ultimo refresco. + + UPDATE cache_calc cc JOIN cache c ON c.id = cc.cache_id + SET + cc.last_refresh = NOW(), + cc.expires = ADDTIME(NOW(), c.lifetime), + cc.connection_id = NULL + WHERE cc.id = v_calc; + + SELECT c.name, ca.params INTO v_cache_name, v_params + FROM cache c + JOIN cache_calc ca ON c.id = ca.cache_id + WHERE ca.id = v_calc; + + IF v_cache_name IS NOT NULL THEN + DO RELEASE_LOCK(CONCAT_WS('/', v_cache_name, IFNULL(v_params, ''))); + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -7323,89 +7323,89 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `cache_calc_start`(OUT `v_calc` INT, INOUT `v_refresh` INT, IN `v_cache_name` VARCHAR(50), IN `v_params` VARCHAR(100)) -proc: BEGIN - DECLARE v_valid BOOL; - DECLARE v_lock_id VARCHAR(100); - DECLARE v_cache_id INT; - DECLARE v_expires DATETIME; - DECLARE v_clean_time DATETIME; - DECLARE vLastRefresh DATETIME; - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - IF v_lock_id IS NOT NULL THEN - DO RELEASE_LOCK(v_lock_id); - END IF; - - RESIGNAL; - END; - - SET v_params = IFNULL(v_params, ''); - - -- Si el servidor se ha reiniciado invalida todos los calculos. - - SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid; - - IF !v_valid - THEN - DELETE FROM cache_calc; - INSERT INTO cache_valid (valid) VALUES (TRUE); - END IF; - - -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia. - - SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params); - - IF !GET_LOCK(v_lock_id, 30) - THEN - SET v_calc = NULL; - SET v_refresh = FALSE; - LEAVE proc; - END IF; - - -- Comprueba si el calculo solicitado existe y esta actualizado. - - SELECT c.id, ca.id, ca.expires, ca.last_refresh - INTO v_cache_id, v_calc, v_expires, vLastRefresh - FROM cache c - LEFT JOIN cache_calc ca - ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci' - WHERE c.name = v_cache_name COLLATE 'utf8_general_ci'; - - -- Si existe una calculo valido libera el bloqueo y devuelve su identificador. - - IF !v_refresh AND NOW() < v_expires AND vLastRefresh >= CURDATE() - THEN - DO RELEASE_LOCK(v_lock_id); - SET v_refresh = FALSE; - LEAVE proc; - END IF; - - -- Si el calculo no existe le crea una entrada en la tabla de calculos. - - IF v_calc IS NULL - THEN - INSERT INTO cache_calc SET - cache_id = v_cache_id, - cacheName = v_cache_name, - params = v_params, - last_refresh = NULL, - expires = NULL, - connection_id = CONNECTION_ID(); - - SET v_calc = LAST_INSERT_ID(); - ELSE - UPDATE cache_calc - SET - last_refresh = NULL, - expires = NULL, - connection_id = CONNECTION_ID() - WHERE id = v_calc; - END IF; - - -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador. - - SET v_refresh = TRUE; +proc: BEGIN + DECLARE v_valid BOOL; + DECLARE v_lock_id VARCHAR(100); + DECLARE v_cache_id INT; + DECLARE v_expires DATETIME; + DECLARE v_clean_time DATETIME; + DECLARE vLastRefresh DATETIME; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + IF v_lock_id IS NOT NULL THEN + DO RELEASE_LOCK(v_lock_id); + END IF; + + RESIGNAL; + END; + + SET v_params = IFNULL(v_params, ''); + + -- Si el servidor se ha reiniciado invalida todos los calculos. + + SELECT COUNT(*) > 0 INTO v_valid FROM cache_valid; + + IF !v_valid + THEN + DELETE FROM cache_calc; + INSERT INTO cache_valid (valid) VALUES (TRUE); + END IF; + + -- Obtiene un bloqueo exclusivo para que no haya problemas de concurrencia. + + SET v_lock_id = CONCAT_WS('/', v_cache_name, v_params); + + IF !GET_LOCK(v_lock_id, 30) + THEN + SET v_calc = NULL; + SET v_refresh = FALSE; + LEAVE proc; + END IF; + + -- Comprueba si el calculo solicitado existe y esta actualizado. + + SELECT c.id, ca.id, ca.expires, ca.last_refresh + INTO v_cache_id, v_calc, v_expires, vLastRefresh + FROM cache c + LEFT JOIN cache_calc ca + ON ca.cache_id = c.id AND ca.params = v_params COLLATE 'utf8_general_ci' + WHERE c.name = v_cache_name COLLATE 'utf8_general_ci'; + + -- Si existe una calculo valido libera el bloqueo y devuelve su identificador. + + IF !v_refresh AND NOW() < v_expires AND vLastRefresh >= CURDATE() + THEN + DO RELEASE_LOCK(v_lock_id); + SET v_refresh = FALSE; + LEAVE proc; + END IF; + + -- Si el calculo no existe le crea una entrada en la tabla de calculos. + + IF v_calc IS NULL + THEN + INSERT INTO cache_calc SET + cache_id = v_cache_id, + cacheName = v_cache_name, + params = v_params, + last_refresh = NULL, + expires = NULL, + connection_id = CONNECTION_ID(); + + SET v_calc = LAST_INSERT_ID(); + ELSE + UPDATE cache_calc + SET + last_refresh = NULL, + expires = NULL, + connection_id = CONNECTION_ID() + WHERE id = v_calc; + END IF; + + -- Si se debe recalcular mantiene el bloqueo y devuelve su identificador. + + SET v_refresh = TRUE; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -10429,28 +10429,28 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`root`@`localhost` PROCEDURE `contact_request`( - vName VARCHAR(100), - vPhone VARCHAR(15), - vEmail VARCHAR(100), +CREATE DEFINER=`root`@`localhost` PROCEDURE `contact_request`( + vName VARCHAR(100), + vPhone VARCHAR(15), + vEmail VARCHAR(100), vMessage TEXT) READS SQL DATA -BEGIN -/** - * Set actions for contact request - * - * @param vName Name - * @param vPhone Phone number - * @param vEmail e-mail - * @param vMessage text of the message - */ - - CALL vn.mail_insert( - 'floranet@verdnatura.es', - vEmail, - 'Contact request', - CONCAT('Phone: ',vPhone, ' Message: ', vMessage) - ); +BEGIN +/** + * Set actions for contact request + * + * @param vName Name + * @param vPhone Phone number + * @param vEmail e-mail + * @param vMessage text of the message + */ + + CALL vn.mail_insert( + 'floranet@verdnatura.es', + vEmail, + 'Contact request', + CONCAT('Phone: ',vPhone, ' Message: ', vMessage) + ); END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -10469,27 +10469,27 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`root`@`localhost` PROCEDURE `deliveryDate_get`(vPostalCode VARCHAR(15)) READS SQL DATA -BEGIN -/** - * Returns available dates for this postalCode, in the next seven days. - * - * @param vPostalCode Delivery address postal code - */ - DECLARE vCurrentDayOfWeek INT; - - SET vCurrentDayOfWeek = DAYOFWEEK(NOW()); - - SELECT DISTINCT nextDay - FROM ( - SELECT CURDATE() + INTERVAL IF( - apc.dayOfWeek >= vCurrentDayOfWeek, - apc.dayOfWeek - vCurrentDayOfWeek, - 7 - apc.dayOfWeek - ) DAY nextDay, - NOW() + INTERVAL apc.hoursInAdvance HOUR minDeliveryTime - FROM addressPostCode apc - WHERE apc.postCode = vPostalCode - HAVING nextDay > minDeliveryTime) sub; +BEGIN +/** + * Returns available dates for this postalCode, in the next seven days. + * + * @param vPostalCode Delivery address postal code + */ + DECLARE vCurrentDayOfWeek INT; + + SET vCurrentDayOfWeek = DAYOFWEEK(NOW()); + + SELECT DISTINCT nextDay + FROM ( + SELECT CURDATE() + INTERVAL IF( + apc.dayOfWeek >= vCurrentDayOfWeek, + apc.dayOfWeek - vCurrentDayOfWeek, + 7 - apc.dayOfWeek + ) DAY nextDay, + NOW() + INTERVAL apc.hoursInAdvance HOUR minDeliveryTime + FROM addressPostCode apc + WHERE apc.postCode = vPostalCode + HAVING nextDay > minDeliveryTime) sub; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -42397,37 +42397,37 @@ DELIMITER ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` FUNCTION `client_getDebt`(`vClient` INT, `vDate` DATE) RETURNS decimal(10,2) READS SQL DATA -BEGIN -/** - * Returns the risk of a customer. - * - * @param vClient client id - * @param vDate date to check the risk - * @return Client risk - */ - DECLARE vDebt DECIMAL(10,2); - DECLARE vHasDebt BOOLEAN; - - SELECT COUNT(*) INTO vHasDebt - FROM `client` c - WHERE c.id = vClient AND c.typeFk = 'normal'; - - IF NOT vHasDebt THEN - RETURN 0; - END IF; - - CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt (clientFk INT); - INSERT INTO tmp.clientGetDebt SET clientFk = vClient; - - CALL vn.client_getDebt(vDate); - - SELECT risk INTO vDebt FROM tmp.risk; - - DROP TEMPORARY TABLE - tmp.clientGetDebt, - tmp.risk; - - RETURN vDebt; +BEGIN +/** + * Returns the risk of a customer. + * + * @param vClient client id + * @param vDate date to check the risk + * @return Client risk + */ + DECLARE vDebt DECIMAL(10,2); + DECLARE vHasDebt BOOLEAN; + + SELECT COUNT(*) INTO vHasDebt + FROM `client` c + WHERE c.id = vClient AND c.typeFk = 'normal'; + + IF NOT vHasDebt THEN + RETURN 0; + END IF; + + CREATE OR REPLACE TEMPORARY TABLE tmp.clientGetDebt (clientFk INT); + INSERT INTO tmp.clientGetDebt SET clientFk = vClient; + + CALL vn.client_getDebt(vDate); + + SELECT risk INTO vDebt FROM tmp.risk; + + DROP TEMPORARY TABLE + tmp.clientGetDebt, + tmp.risk; + + RETURN vDebt; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -51221,93 +51221,93 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_addWithReservation`( - vItemFk INT, - vQuantity INT, - vTicketFk INT, - vSaleGroupFk INT, - vSectorFk INT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_addWithReservation`( + vItemFk INT, + vQuantity INT, + vTicketFk INT, + vSaleGroupFk INT, + vSectorFk INT ) -BEGIN -/** - * En el ámbito de las colecciones se añade una línea de sale a un ticket - * de una colección en caso de tener disponible y se realiza la reserva. - * - * @param vItemFk id of item - * @param vQuantity quantity to be added to the ticket - * @param vTicketFk ticket to which the sales line is added - * @param vSaleGroupFk saleGroupFk id to add saleGroupDetail - */ - - DECLARE vWarehouseFk INT; - DECLARE vCacheAvailableFk INT; - DECLARE vAvailable INT; - DECLARE vSaleFk INT; - DECLARE vConcept VARCHAR(50); - DECLARE vItemName VARCHAR(50); - DECLARE vHasThrow BOOLEAN DEFAULT FALSE; - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - SELECT t.warehouseFk INTO vWarehouseFk - FROM ticket t - JOIN ticketCollection tc ON tc.ticketFk = t.id - WHERE t.id = vTicketFk; - - CALL cache.available_refresh( - vCacheAvailableFk, - FALSE, - vWarehouseFk, - util.VN_CURDATE()); - - SELECT available INTO vAvailable - FROM cache.available - WHERE calc_id = vCacheAvailableFk - AND item_id = vItemFk; - - IF vAvailable < vQuantity THEN - SET vHasThrow = TRUE; - ELSE - SELECT `name`, - CONCAT(getUser(), ' ', DATE_FORMAT(util.VN_NOW(), '%H:%i'), ' ', name) - INTO vItemName, vConcept - FROM item - WHERE id = vItemFk; - - START TRANSACTION; - - INSERT INTO sale - SET itemFk = vItemFk, - ticketFk = vTicketFk, - concept = vConcept, - quantity = vQuantity, - isAdded = TRUE; - - SELECT LAST_INSERT_ID() INTO vSaleFk; - - CALL sale_calculateComponent(vSaleFk, NULL); - CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk); - - IF NOT EXISTS (SELECT TRUE FROM itemShelvingSale WHERE saleFk = vSaleFk LIMIT 1) THEN - SET vHasThrow = TRUE; - END IF; - END IF; - - IF vHasThrow THEN - CALL util.throw("There is no available for the selected item"); - END IF; - - IF vSaleGroupFk THEN - INSERT INTO saleGroupDetail - SET saleFk = vSaleFk, - saleGroupFk = vSaleGroupFk; - END IF; - - COMMIT; +BEGIN +/** + * En el ámbito de las colecciones se añade una línea de sale a un ticket + * de una colección en caso de tener disponible y se realiza la reserva. + * + * @param vItemFk id of item + * @param vQuantity quantity to be added to the ticket + * @param vTicketFk ticket to which the sales line is added + * @param vSaleGroupFk saleGroupFk id to add saleGroupDetail + */ + + DECLARE vWarehouseFk INT; + DECLARE vCacheAvailableFk INT; + DECLARE vAvailable INT; + DECLARE vSaleFk INT; + DECLARE vConcept VARCHAR(50); + DECLARE vItemName VARCHAR(50); + DECLARE vHasThrow BOOLEAN DEFAULT FALSE; + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + SELECT t.warehouseFk INTO vWarehouseFk + FROM ticket t + JOIN ticketCollection tc ON tc.ticketFk = t.id + WHERE t.id = vTicketFk; + + CALL cache.available_refresh( + vCacheAvailableFk, + FALSE, + vWarehouseFk, + util.VN_CURDATE()); + + SELECT available INTO vAvailable + FROM cache.available + WHERE calc_id = vCacheAvailableFk + AND item_id = vItemFk; + + IF vAvailable < vQuantity THEN + SET vHasThrow = TRUE; + ELSE + SELECT `name`, + CONCAT(getUser(), ' ', DATE_FORMAT(util.VN_NOW(), '%H:%i'), ' ', name) + INTO vItemName, vConcept + FROM item + WHERE id = vItemFk; + + START TRANSACTION; + + INSERT INTO sale + SET itemFk = vItemFk, + ticketFk = vTicketFk, + concept = vConcept, + quantity = vQuantity, + isAdded = TRUE; + + SELECT LAST_INSERT_ID() INTO vSaleFk; + + CALL sale_calculateComponent(vSaleFk, NULL); + CALL itemShelvingSale_addBySale(vSaleFk, vSectorFk); + + IF NOT EXISTS (SELECT TRUE FROM itemShelvingSale WHERE saleFk = vSaleFk LIMIT 1) THEN + SET vHasThrow = TRUE; + END IF; + END IF; + + IF vHasThrow THEN + CALL util.throw("There is no available for the selected item"); + END IF; + + IF vSaleGroupFk THEN + INSERT INTO saleGroupDetail + SET saleFk = vSaleFk, + saleGroupFk = vSaleGroupFk; + END IF; + + COMMIT; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -51324,145 +51324,145 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_assign`( - vUserFk INT, - OUT vCollectionFk INT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_assign`( + vUserFk INT, + OUT vCollectionFk INT ) -BEGIN -/** - * Comprueba si existen colecciones libres que se ajustan - * al perfil del usuario y le asigna la más antigua. - * Añade un registro al semillero de colecciones. - * - * @param vUserFk Id de usuario - * @param vCollectionFk Id de colección - */ - DECLARE vHasTooMuchCollections BOOL; - DECLARE vDone BOOL DEFAULT FALSE; - DECLARE vCollectionWorker INT; - DECLARE vMaxNotAssignedCollectionLifeTime TIME; - - DECLARE vCollections CURSOR FOR - WITH collections AS ( - SELECT tc.collectionFk, - SUM(sv.volume) volume, - c.saleTotalCount, - c.itemPackingTypeFk, - c.trainFk, - c.warehouseFk, - c.wagons - FROM vn.ticketCollection tc - JOIN vn.collection c ON c.id = tc.collectionFk - JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk - WHERE c.workerFk IS NULL - AND sv.shipped >= util.VN_CURDATE() - GROUP BY tc.collectionFk - ) SELECT c.collectionFk - FROM collections c - JOIN vn.operator o - WHERE o.workerFk = vUserFk - AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL) - AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL) - AND o.numberOfWagons = c.wagons - AND o.trainFk = c.trainFk - AND o.warehouseFk = c.warehouseFk; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - -- Si hay colecciones sin terminar, sale del proceso - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - CALL collection_get(vUserFk); - - SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime - INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime - FROM productionConfig pc - LEFT JOIN tmp.collection ON TRUE; - - DROP TEMPORARY TABLE tmp.collection; - - IF vHasTooMuchCollections THEN - CALL util.throw('Hay colecciones pendientes'); - END IF; - - -- Se eliminan las colecciones sin asignar que estan obsoletas - - INSERT INTO ticketTracking(stateFk, ticketFk) - SELECT s.id, tc.ticketFk - FROM `collection` c - JOIN ticketCollection tc ON tc.collectionFk = c.id - JOIN `state` s ON s.code = 'PRINTED_AUTO' - WHERE c.workerFk IS NULL - AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime; - - DELETE FROM `collection` - WHERE workerFk IS NULL - AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime; - - -- Se añade registro al semillero - - INSERT INTO collectionHotbed(userFk) VALUES(vUserFk); - - -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion - - OPEN vCollections; - l: LOOP - SET vDone = FALSE; - FETCH vCollections INTO vCollectionFk; - - IF vDone THEN - LEAVE l; - END IF; - - BEGIN - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - SET vCollectionFk = NULL; - RESIGNAL; - END; - - START TRANSACTION; - - SELECT workerFk INTO vCollectionWorker - FROM `collection` - WHERE id = vCollectionFk FOR UPDATE; - - IF vCollectionWorker IS NULL THEN - UPDATE `collection` - SET workerFk = vUserFk - WHERE id = vCollectionFk; - - COMMIT; - LEAVE l; - END IF; - - ROLLBACK; - END; - END LOOP; - CLOSE vCollections; - - IF vCollectionFk IS NULL THEN - CALL collection_new(vUserFk, vCollectionFk); - - START TRANSACTION; - - SELECT workerFk INTO vCollectionWorker - FROM `collection` - WHERE id = vCollectionFk FOR UPDATE; - - IF vCollectionWorker IS NULL THEN - UPDATE `collection` - SET workerFk = vUserFk - WHERE id = vCollectionFk; - END IF; - - COMMIT; - END IF; +BEGIN +/** + * Comprueba si existen colecciones libres que se ajustan + * al perfil del usuario y le asigna la más antigua. + * Añade un registro al semillero de colecciones. + * + * @param vUserFk Id de usuario + * @param vCollectionFk Id de colección + */ + DECLARE vHasTooMuchCollections BOOL; + DECLARE vDone BOOL DEFAULT FALSE; + DECLARE vCollectionWorker INT; + DECLARE vMaxNotAssignedCollectionLifeTime TIME; + + DECLARE vCollections CURSOR FOR + WITH collections AS ( + SELECT tc.collectionFk, + SUM(sv.volume) volume, + c.saleTotalCount, + c.itemPackingTypeFk, + c.trainFk, + c.warehouseFk, + c.wagons + FROM vn.ticketCollection tc + JOIN vn.collection c ON c.id = tc.collectionFk + JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk + WHERE c.workerFk IS NULL + AND sv.shipped >= util.VN_CURDATE() + GROUP BY tc.collectionFk + ) SELECT c.collectionFk + FROM collections c + JOIN vn.operator o + WHERE o.workerFk = vUserFk + AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL) + AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL) + AND o.numberOfWagons = c.wagons + AND o.trainFk = c.trainFk + AND o.warehouseFk = c.warehouseFk; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + -- Si hay colecciones sin terminar, sale del proceso + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + CALL collection_get(vUserFk); + + SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime + INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime + FROM productionConfig pc + LEFT JOIN tmp.collection ON TRUE; + + DROP TEMPORARY TABLE tmp.collection; + + IF vHasTooMuchCollections THEN + CALL util.throw('Hay colecciones pendientes'); + END IF; + + -- Se eliminan las colecciones sin asignar que estan obsoletas + + INSERT INTO ticketTracking(stateFk, ticketFk) + SELECT s.id, tc.ticketFk + FROM `collection` c + JOIN ticketCollection tc ON tc.collectionFk = c.id + JOIN `state` s ON s.code = 'PRINTED_AUTO' + WHERE c.workerFk IS NULL + AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime; + + DELETE FROM `collection` + WHERE workerFk IS NULL + AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime; + + -- Se añade registro al semillero + + INSERT INTO collectionHotbed(userFk) VALUES(vUserFk); + + -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion + + OPEN vCollections; + l: LOOP + SET vDone = FALSE; + FETCH vCollections INTO vCollectionFk; + + IF vDone THEN + LEAVE l; + END IF; + + BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + SET vCollectionFk = NULL; + RESIGNAL; + END; + + START TRANSACTION; + + SELECT workerFk INTO vCollectionWorker + FROM `collection` + WHERE id = vCollectionFk FOR UPDATE; + + IF vCollectionWorker IS NULL THEN + UPDATE `collection` + SET workerFk = vUserFk + WHERE id = vCollectionFk; + + COMMIT; + LEAVE l; + END IF; + + ROLLBACK; + END; + END LOOP; + CLOSE vCollections; + + IF vCollectionFk IS NULL THEN + CALL collection_new(vUserFk, vCollectionFk); + + START TRANSACTION; + + SELECT workerFk INTO vCollectionWorker + FROM `collection` + WHERE id = vCollectionFk FOR UPDATE; + + IF vCollectionWorker IS NULL THEN + UPDATE `collection` + SET workerFk = vUserFk + WHERE id = vCollectionFk; + END IF; + + COMMIT; + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -51530,146 +51530,146 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_getAssigned`( - vUserFk INT, - OUT vCollectionFk INT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `collection_getAssigned`( + vUserFk INT, + OUT vCollectionFk INT ) -BEGIN -/** - * Comprueba si existen colecciones libres que se ajustan - * al perfil del usuario y le asigna la más antigua. - * Añade un registro al semillero de colecciones. - * - * @param vUserFk Id de usuario - * @param vCollectionFk Id de colección - */ - DECLARE vHasTooMuchCollections BOOL; - DECLARE vDone BOOL DEFAULT FALSE; - DECLARE vCollectionWorker INT; - DECLARE vMaxNotAssignedCollectionLifeTime TIME; - - DECLARE vCollections CURSOR FOR - WITH collections AS ( - SELECT tc.collectionFk, - SUM(sv.volume) volume, - c.saleTotalCount, - c.itemPackingTypeFk, - c.trainFk, - c.warehouseFk, - c.wagons - FROM vn.ticketCollection tc - JOIN vn.collection c ON c.id = tc.collectionFk - JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk - WHERE c.workerFk IS NULL - AND sv.shipped >= util.VN_CURDATE() - GROUP BY tc.collectionFk - ) SELECT c.collectionFk - FROM collections c - JOIN vn.operator o - WHERE o.workerFk = vUserFk - AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL) - AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL) - AND o.numberOfWagons = c.wagons - AND o.trainFk = c.trainFk - AND o.warehouseFk = c.warehouseFk; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - -- Si hay colecciones sin terminar, sale del proceso - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - CALL collection_get(vUserFk); - - SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime - INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime - FROM productionConfig pc - LEFT JOIN tmp.collection ON TRUE; - - DROP TEMPORARY TABLE tmp.collection; - - IF vHasTooMuchCollections THEN - CALL util.throw('Hay colecciones pendientes'); - END IF; - - -- Se eliminan las colecciones sin asignar que estan obsoletas - - INSERT INTO ticketTracking(stateFk, ticketFk) - SELECT s.id, tc.ticketFk - FROM `collection` c - JOIN ticketCollection tc ON tc.collectionFk = c.id - JOIN `state` s ON s.code = 'PRINTED_AUTO' - WHERE c.workerFk IS NULL - AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime; - - DELETE FROM `collection` - WHERE workerFk IS NULL - AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime; - - -- Se añade registro al semillero - - INSERT INTO collectionHotbed(userFk) VALUES(vUserFk); - - -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion - - OPEN vCollections; - l: LOOP - SET vDone = FALSE; - FETCH vCollections INTO vCollectionFk; - - IF vDone THEN - LEAVE l; - END IF; - - BEGIN - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - SET vCollectionFk = NULL; - RESIGNAL; - END; - - START TRANSACTION; - - SELECT workerFk INTO vCollectionWorker - FROM `collection` - WHERE id = vCollectionFk FOR UPDATE; - - IF vCollectionWorker IS NULL THEN - UPDATE `collection` - SET workerFk = vUserFk - WHERE id = vCollectionFk; - - COMMIT; - LEAVE l; - END IF; - - ROLLBACK; - END; - END LOOP; - CLOSE vCollections; - - IF vCollectionFk IS NULL THEN - CALL collection_new(vUserFk, vCollectionFk); - - START TRANSACTION; - - SELECT workerFk INTO vCollectionWorker - FROM `collection` - WHERE id = vCollectionFk FOR UPDATE; - - IF vCollectionWorker IS NULL THEN - UPDATE `collection` - SET workerFk = vUserFk - WHERE id = vCollectionFk; - END IF; - - COMMIT; - END IF; - CALL itemShelvingSale_addByCollection(vCollectionFk); +BEGIN +/** + * Comprueba si existen colecciones libres que se ajustan + * al perfil del usuario y le asigna la más antigua. + * Añade un registro al semillero de colecciones. + * + * @param vUserFk Id de usuario + * @param vCollectionFk Id de colección + */ + DECLARE vHasTooMuchCollections BOOL; + DECLARE vDone BOOL DEFAULT FALSE; + DECLARE vCollectionWorker INT; + DECLARE vMaxNotAssignedCollectionLifeTime TIME; + + DECLARE vCollections CURSOR FOR + WITH collections AS ( + SELECT tc.collectionFk, + SUM(sv.volume) volume, + c.saleTotalCount, + c.itemPackingTypeFk, + c.trainFk, + c.warehouseFk, + c.wagons + FROM vn.ticketCollection tc + JOIN vn.collection c ON c.id = tc.collectionFk + JOIN vn.saleVolume sv ON sv.ticketFk = tc.ticketFk + WHERE c.workerFk IS NULL + AND sv.shipped >= util.VN_CURDATE() + GROUP BY tc.collectionFk + ) SELECT c.collectionFk + FROM collections c + JOIN vn.operator o + WHERE o.workerFk = vUserFk + AND (c.saleTotalCount <= o.linesLimit OR o.linesLimit IS NULL) + AND (c.itemPackingTypeFk = o.itemPackingTypeFk OR o.itemPackingTypeFk IS NULL) + AND o.numberOfWagons = c.wagons + AND o.trainFk = c.trainFk + AND o.warehouseFk = c.warehouseFk; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + -- Si hay colecciones sin terminar, sale del proceso + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + CALL collection_get(vUserFk); + + SELECT (pc.maxNotReadyCollections - COUNT(*)) <= 0, pc.maxNotAssignedCollectionLifeTime + INTO vHasTooMuchCollections, vMaxNotAssignedCollectionLifeTime + FROM productionConfig pc + LEFT JOIN tmp.collection ON TRUE; + + DROP TEMPORARY TABLE tmp.collection; + + IF vHasTooMuchCollections THEN + CALL util.throw('Hay colecciones pendientes'); + END IF; + + -- Se eliminan las colecciones sin asignar que estan obsoletas + + INSERT INTO ticketTracking(stateFk, ticketFk) + SELECT s.id, tc.ticketFk + FROM `collection` c + JOIN ticketCollection tc ON tc.collectionFk = c.id + JOIN `state` s ON s.code = 'PRINTED_AUTO' + WHERE c.workerFk IS NULL + AND TIMEDIFF(util.VN_NOW(), c.created) > vMaxNotAssignedCollectionLifeTime; + + DELETE FROM `collection` + WHERE workerFk IS NULL + AND TIMEDIFF(util.VN_NOW(), created) > vMaxNotAssignedCollectionLifeTime; + + -- Se añade registro al semillero + + INSERT INTO collectionHotbed(userFk) VALUES(vUserFk); + + -- Comprueba si hay colecciones disponibles que se ajustan a su configuracion + + OPEN vCollections; + l: LOOP + SET vDone = FALSE; + FETCH vCollections INTO vCollectionFk; + + IF vDone THEN + LEAVE l; + END IF; + + BEGIN + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + SET vCollectionFk = NULL; + RESIGNAL; + END; + + START TRANSACTION; + + SELECT workerFk INTO vCollectionWorker + FROM `collection` + WHERE id = vCollectionFk FOR UPDATE; + + IF vCollectionWorker IS NULL THEN + UPDATE `collection` + SET workerFk = vUserFk + WHERE id = vCollectionFk; + + COMMIT; + LEAVE l; + END IF; + + ROLLBACK; + END; + END LOOP; + CLOSE vCollections; + + IF vCollectionFk IS NULL THEN + CALL collection_new(vUserFk, vCollectionFk); + + START TRANSACTION; + + SELECT workerFk INTO vCollectionWorker + FROM `collection` + WHERE id = vCollectionFk FOR UPDATE; + + IF vCollectionWorker IS NULL THEN + UPDATE `collection` + SET workerFk = vUserFk + WHERE id = vCollectionFk; + END IF; + + COMMIT; + END IF; + CALL itemShelvingSale_addByCollection(vCollectionFk); END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -60050,53 +60050,53 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_addByCollection`( - vCollectionFk INT(11) +CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_addByCollection`( + vCollectionFk INT(11) ) -BEGIN -/** - * Reserva cantidades con ubicaciones para el contenido de una colección - * - * @param vCollectionFk Identificador de collection - */ - DECLARE vDone BOOL DEFAULT FALSE; - DECLARE vSaleFk INT; - DECLARE vSales CURSOR FOR - WITH sales AS ( - SELECT s.id saleFk, s.quantity, SUM(IFNULL(iss.quantity, 0)) quantityReserved - FROM vn.ticketCollection tc - JOIN vn.sale s ON s.ticketFk = tc.ticketFk - LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id - WHERE tc.collectionFk = vCollectionFk - GROUP BY s.id - HAVING quantity <> quantityReserved - ), trackedSales AS ( - SELECT sa.saleFk - FROM sales sa - JOIN vn.saleTracking st ON st.saleFk = sa.saleFk - JOIN vn.`state` s ON s.id = st.stateFk - WHERE st.isChecked - AND s.`code` IN ('PREVIOUS_PREPARATION', 'OK PREVIOUS', 'OK STOWAWAY') - GROUP BY sa.saleFk - ) SELECT s.saleFk - FROM sales s - LEFT JOIN trackedSales ts ON ts.saleFk = s.saleFk - WHERE ts.saleFk IS NULL; - - DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; - - OPEN vSales; - l: LOOP - SET vDone = FALSE; - FETCH vSales INTO vSaleFk; - - IF vDone THEN - LEAVE l; - END IF; - - CALL itemShelvingSale_addBySale(vSaleFk, NULL); - END LOOP; - CLOSE vSales; +BEGIN +/** + * Reserva cantidades con ubicaciones para el contenido de una colección + * + * @param vCollectionFk Identificador de collection + */ + DECLARE vDone BOOL DEFAULT FALSE; + DECLARE vSaleFk INT; + DECLARE vSales CURSOR FOR + WITH sales AS ( + SELECT s.id saleFk, s.quantity, SUM(IFNULL(iss.quantity, 0)) quantityReserved + FROM vn.ticketCollection tc + JOIN vn.sale s ON s.ticketFk = tc.ticketFk + LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id + WHERE tc.collectionFk = vCollectionFk + GROUP BY s.id + HAVING quantity <> quantityReserved + ), trackedSales AS ( + SELECT sa.saleFk + FROM sales sa + JOIN vn.saleTracking st ON st.saleFk = sa.saleFk + JOIN vn.`state` s ON s.id = st.stateFk + WHERE st.isChecked + AND s.`code` IN ('PREVIOUS_PREPARATION', 'OK PREVIOUS', 'OK STOWAWAY') + GROUP BY sa.saleFk + ) SELECT s.saleFk + FROM sales s + LEFT JOIN trackedSales ts ON ts.saleFk = s.saleFk + WHERE ts.saleFk IS NULL; + + DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; + + OPEN vSales; + l: LOOP + SET vDone = FALSE; + FETCH vSales INTO vSaleFk; + + IF vDone THEN + LEAVE l; + END IF; + + CALL itemShelvingSale_addBySale(vSaleFk, NULL); + END LOOP; + CLOSE vSales; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -60437,56 +60437,56 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_doReserve`() -proc: BEGIN -/** - * Genera reservas de la tabla vn.itemShelvingSaleReserve - */ - DECLARE vDone BOOL; - DECLARE vSaleFk INT; - DECLARE vSectorFk INT; - - DECLARE vSales CURSOR FOR - SELECT DISTINCT saleFk, sectorFk FROM tSale; - - DECLARE CONTINUE HANDLER FOR NOT FOUND - SET vDone = TRUE; - - DECLARE CONTINUE HANDLER FOR SQLEXCEPTION - BEGIN - DO RELEASE_LOCK('vn.itemShelvingSale_doReserve'); - ROLLBACK; - RESIGNAL; - END; - - IF !GET_LOCK('vn.itemShelvingSale_doReserve', 0) THEN - LEAVE proc; - END IF; - - CREATE OR REPLACE TEMPORARY TABLE tSale - ENGINE = MEMORY - SELECT id, saleFk, sectorFk FROM itemShelvingSaleReserve; - - OPEN vSales; - - myLoop: LOOP - SET vDone = FALSE; - FETCH vSales INTO vSaleFk, vSectorFk; - - IF vDone THEN - LEAVE myLoop; - END IF; - - CALL itemShelvingSale_addBySale (vSaleFk, vSectorFk); - END LOOP; - - CLOSE vSales; - - DELETE iss FROM itemShelvingSaleReserve iss - JOIN tSale s ON s.id = iss.id AND s.sectorFk = iss.sectorFk; - - DROP TEMPORARY TABLE tSale; - - DO RELEASE_LOCK('vn.itemShelvingSale_doReserve'); +proc: BEGIN +/** + * Genera reservas de la tabla vn.itemShelvingSaleReserve + */ + DECLARE vDone BOOL; + DECLARE vSaleFk INT; + DECLARE vSectorFk INT; + + DECLARE vSales CURSOR FOR + SELECT DISTINCT saleFk, sectorFk FROM tSale; + + DECLARE CONTINUE HANDLER FOR NOT FOUND + SET vDone = TRUE; + + DECLARE CONTINUE HANDLER FOR SQLEXCEPTION + BEGIN + DO RELEASE_LOCK('vn.itemShelvingSale_doReserve'); + ROLLBACK; + RESIGNAL; + END; + + IF !GET_LOCK('vn.itemShelvingSale_doReserve', 0) THEN + LEAVE proc; + END IF; + + CREATE OR REPLACE TEMPORARY TABLE tSale + ENGINE = MEMORY + SELECT id, saleFk, sectorFk FROM itemShelvingSaleReserve; + + OPEN vSales; + + myLoop: LOOP + SET vDone = FALSE; + FETCH vSales INTO vSaleFk, vSectorFk; + + IF vDone THEN + LEAVE myLoop; + END IF; + + CALL itemShelvingSale_addBySale (vSaleFk, vSectorFk); + END LOOP; + + CLOSE vSales; + + DELETE iss FROM itemShelvingSaleReserve iss + JOIN tSale s ON s.id = iss.id AND s.sectorFk = iss.sectorFk; + + DROP TEMPORARY TABLE tSale; + + DO RELEASE_LOCK('vn.itemShelvingSale_doReserve'); END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -60571,37 +60571,37 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setPicked`( - vSaleGroupFk INT(10) +CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setPicked`( + vSaleGroupFk INT(10) ) -BEGIN -/** - * Gestiona la reserva de un vn.saleGroup actualizando vn.itemShelvingSale.isPicked - * y cambiando el estado de la vn.sale - * - * @param vSaleGroupFk Id saleGroupFk - */ - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - IF NOT (SELECT COUNT(*) FROM saleGroup WHERE id = vSaleGroupFk) THEN - CALL util.throw('Sale group not exists'); - END IF; - - START TRANSACTION; - - UPDATE itemShelvingSale iss - JOIN sale s ON s.id = iss.saleFk - JOIN saleGroupDetail sg ON sg.saleFk = s.id - SET iss.isPicked = TRUE - WHERE sg.saleGroupFk = vSaleGroupFk; - - CALL saleTracking_addPreparedSaleGroup(vSaleGroupFk); - - COMMIT; +BEGIN +/** + * Gestiona la reserva de un vn.saleGroup actualizando vn.itemShelvingSale.isPicked + * y cambiando el estado de la vn.sale + * + * @param vSaleGroupFk Id saleGroupFk + */ + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + IF NOT (SELECT COUNT(*) FROM saleGroup WHERE id = vSaleGroupFk) THEN + CALL util.throw('Sale group not exists'); + END IF; + + START TRANSACTION; + + UPDATE itemShelvingSale iss + JOIN sale s ON s.id = iss.saleFk + JOIN saleGroupDetail sg ON sg.saleFk = s.id + SET iss.isPicked = TRUE + WHERE sg.saleGroupFk = vSaleGroupFk; + + CALL saleTracking_addPreparedSaleGroup(vSaleGroupFk); + + COMMIT; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -60618,114 +60618,114 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setQuantity`( - vItemShelvingSaleFk INT(10), - vQuantity DECIMAL(10,0), - vIsItemShelvingSaleEmpty BOOLEAN, - vSectorFk INT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_setQuantity`( + vItemShelvingSaleFk INT(10), + vQuantity DECIMAL(10,0), + vIsItemShelvingSaleEmpty BOOLEAN, + vSectorFk INT ) -BEGIN -/** - * Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity - * en itemShelvingSale y sale.isPicked en caso necesario. - * Si la reserva de la ubicación es fallida, se regulariza la situación - * - * @param vItemShelvingSaleFk Id itemShelvingSaleFK - * @param vQuantity Cantidad real que se ha cogido de la ubicación - * @param vIsItemShelvingSaleEmpty determina si la ubicación itemShelvingSale se ha - * quedado vacio tras el movimiento - * @param vSectorFk Id del sector - */ - DECLARE vSaleFk INT; - DECLARE vItemShelvingFk INT; - DECLARE vReservedQuantity INT; - DECLARE vRemainingQuantity INT; - DECLARE vItemFk INT; - DECLARE vTotalQuantity INT; - DECLARE vStateCode VARCHAR(45); - - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - IF vQuantity > vReservedQuantity - OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty) - OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN - CALL util.throw('The quantity cannot be different from the reserved'); - END IF; - - IF (SELECT isPicked FROM itemShelvingSale WHERE id = vItemShelvingSaleFk) THEN - CALL util.throw('Reservation completed'); - END IF; - - SELECT s.itemFk, - iss.saleFk, - iss.itemShelvingFk, - SUM(IFNULL(iss.quantity,0)), - IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED') - INTO vItemFk, - vSaleFk, - vItemShelvingFk, - vReservedQuantity, - vStateCode - FROM itemShelvingSale iss - JOIN sale s ON s.id = iss.saleFk - LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk - WHERE iss.id = vItemShelvingSaleFk - AND NOT iss.isPicked; - - IF vQuantity > vReservedQuantity - OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty) - OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN - CALL util.throw('The quantity cannot be different from the reserved'); - END IF; - - START TRANSACTION; - - UPDATE itemShelvingSale - SET isPicked = TRUE, - quantity = vQuantity - WHERE id = vItemShelvingSaleFk; - - SELECT id INTO vItemShelvingFk - FROM itemShelving - WHERE id = vItemShelvingFk - FOR UPDATE; - - UPDATE itemShelving - SET visible = GREATEST(0, visible - vQuantity) - WHERE id = vItemShelvingFk; - - SELECT SUM(IF(isPicked OR id = vItemShelvingSaleFk, 0, quantity)), SUM(quantity) - INTO vRemainingQuantity, vTotalQuantity - FROM itemShelvingSale - WHERE saleFk = vSaleFk; - - IF vRemainingQuantity = 0 AND NOT vIsItemShelvingSaleEmpty THEN - CALL saleTracking_new( - vSaleFk, - TRUE, - vTotalQuantity, - `account`.`myUser_getId`(), - NULL, - vStateCode, - TRUE); - - UPDATE sale s - SET s.quantity = vTotalQuantity, - isPicked = TRUE - WHERE s.id = vSaleFk; - END IF; - - COMMIT; - - IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN - INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk) - SELECT vSaleFk, vSectorFk; - CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk); - END IF; +BEGIN +/** + * Gestiona la reserva de un itemShelvingFk, actualizando isPicked y quantity + * en itemShelvingSale y sale.isPicked en caso necesario. + * Si la reserva de la ubicación es fallida, se regulariza la situación + * + * @param vItemShelvingSaleFk Id itemShelvingSaleFK + * @param vQuantity Cantidad real que se ha cogido de la ubicación + * @param vIsItemShelvingSaleEmpty determina si la ubicación itemShelvingSale se ha + * quedado vacio tras el movimiento + * @param vSectorFk Id del sector + */ + DECLARE vSaleFk INT; + DECLARE vItemShelvingFk INT; + DECLARE vReservedQuantity INT; + DECLARE vRemainingQuantity INT; + DECLARE vItemFk INT; + DECLARE vTotalQuantity INT; + DECLARE vStateCode VARCHAR(45); + + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + IF vQuantity > vReservedQuantity + OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty) + OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN + CALL util.throw('The quantity cannot be different from the reserved'); + END IF; + + IF (SELECT isPicked FROM itemShelvingSale WHERE id = vItemShelvingSaleFk) THEN + CALL util.throw('Reservation completed'); + END IF; + + SELECT s.itemFk, + iss.saleFk, + iss.itemShelvingFk, + SUM(IFNULL(iss.quantity,0)), + IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED') + INTO vItemFk, + vSaleFk, + vItemShelvingFk, + vReservedQuantity, + vStateCode + FROM itemShelvingSale iss + JOIN sale s ON s.id = iss.saleFk + LEFT JOIN vn.saleGroupDetail sgd ON sgd.saleFk = iss.saleFk + WHERE iss.id = vItemShelvingSaleFk + AND NOT iss.isPicked; + + IF vQuantity > vReservedQuantity + OR (vQuantity < vReservedQuantity AND NOT vIsItemShelvingSaleEmpty) + OR (vQuantity = vReservedQuantity AND vIsItemShelvingSaleEmpty) THEN + CALL util.throw('The quantity cannot be different from the reserved'); + END IF; + + START TRANSACTION; + + UPDATE itemShelvingSale + SET isPicked = TRUE, + quantity = vQuantity + WHERE id = vItemShelvingSaleFk; + + SELECT id INTO vItemShelvingFk + FROM itemShelving + WHERE id = vItemShelvingFk + FOR UPDATE; + + UPDATE itemShelving + SET visible = GREATEST(0, visible - vQuantity) + WHERE id = vItemShelvingFk; + + SELECT SUM(IF(isPicked OR id = vItemShelvingSaleFk, 0, quantity)), SUM(quantity) + INTO vRemainingQuantity, vTotalQuantity + FROM itemShelvingSale + WHERE saleFk = vSaleFk; + + IF vRemainingQuantity = 0 AND NOT vIsItemShelvingSaleEmpty THEN + CALL saleTracking_new( + vSaleFk, + TRUE, + vTotalQuantity, + `account`.`myUser_getId`(), + NULL, + vStateCode, + TRUE); + + UPDATE sale s + SET s.quantity = vTotalQuantity, + isPicked = TRUE + WHERE s.id = vSaleFk; + END IF; + + COMMIT; + + IF vIsItemShelvingSaleEmpty AND vQuantity <> vReservedQuantity THEN + INSERT INTO itemShelvingSaleReserve (saleFk, sectorFk) + SELECT vSaleFk, vSectorFk; + CALL itemShelvingSale_reallocate(vItemShelvingFk, vItemFk, vSectorFk); + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -60742,63 +60742,63 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_unpicked`( - vSelf INT(11) +CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelvingSale_unpicked`( + vSelf INT(11) ) -BEGIN -/** - * Desmarca una línea que ya estaba sacada, devolviendo la cantidad al itemShelving - * - * @param vSelf Identificador del itemShelvingSale - */ - DECLARE vSaleFk INT; - DECLARE vReservedQuantity INT; - DECLARE vIsSaleGroup BOOL; - DECLARE EXIT HANDLER FOR SQLEXCEPTION - BEGIN - ROLLBACK; - RESIGNAL; - END; - - IF (SELECT NOT isPicked FROM itemShelvingSale WHERE id = vSelf) THEN - CALL util.throw('Reserva no completada'); - END IF; - - SELECT ish.saleFk, ish.quantity, IF(sg.id, TRUE, FALSE) - INTO vSaleFk, vReservedQuantity, vIsSaleGroup - FROM itemShelvingSale ish - LEFT JOIN saleGroupDetail sg ON sg.saleFk = ish.saleFk - WHERE ish.id = vSelf; - - /*IF vIsSaleGroup THEN - CALL util.throw('Can not unpicked a sale group'); - END IF;*/ - - START TRANSACTION; - - UPDATE itemShelvingSale - SET isPicked = FALSE - WHERE id = vSelf; - - UPDATE sale s - JOIN itemShelvingSale ish ON ish.saleFk = s.id - SET s.isPicked = FALSE - WHERE ish.id = vSelf; - - UPDATE itemShelvingSale iss - JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - SET ish.visible = ish.visible + iss.quantity - WHERE iss.id = vSelf; - - CALL saleTracking_new( - vSaleFk, - FALSE, - vReservedQuantity, - `account`.`myUser_getId`(), - NULL, - 'ON_PREPARATION', - TRUE); - COMMIT; +BEGIN +/** + * Desmarca una línea que ya estaba sacada, devolviendo la cantidad al itemShelving + * + * @param vSelf Identificador del itemShelvingSale + */ + DECLARE vSaleFk INT; + DECLARE vReservedQuantity INT; + DECLARE vIsSaleGroup BOOL; + DECLARE EXIT HANDLER FOR SQLEXCEPTION + BEGIN + ROLLBACK; + RESIGNAL; + END; + + IF (SELECT NOT isPicked FROM itemShelvingSale WHERE id = vSelf) THEN + CALL util.throw('Reserva no completada'); + END IF; + + SELECT ish.saleFk, ish.quantity, IF(sg.id, TRUE, FALSE) + INTO vSaleFk, vReservedQuantity, vIsSaleGroup + FROM itemShelvingSale ish + LEFT JOIN saleGroupDetail sg ON sg.saleFk = ish.saleFk + WHERE ish.id = vSelf; + + /*IF vIsSaleGroup THEN + CALL util.throw('Can not unpicked a sale group'); + END IF;*/ + + START TRANSACTION; + + UPDATE itemShelvingSale + SET isPicked = FALSE + WHERE id = vSelf; + + UPDATE sale s + JOIN itemShelvingSale ish ON ish.saleFk = s.id + SET s.isPicked = FALSE + WHERE ish.id = vSelf; + + UPDATE itemShelvingSale iss + JOIN itemShelving ish ON ish.id = iss.itemShelvingFk + SET ish.visible = ish.visible + iss.quantity + WHERE iss.id = vSelf; + + CALL saleTracking_new( + vSaleFk, + FALSE, + vReservedQuantity, + `account`.`myUser_getId`(), + NULL, + 'ON_PREPARATION', + TRUE); + COMMIT; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -61293,167 +61293,167 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `itemShelving_getSaleDate`(vShelvingFk VARCHAR(3)) -BEGIN - - /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula. - * - * @param vShelvingFk Matrícula del carro o pallet - */ - - DECLARE vWarehouseFk INT; - DECLARE vStockScopeDays INT; - - SELECT s.warehouseFk, stockScopeDays - INTO vWarehouseFk, vStockScopeDays - FROM sector s - JOIN operator o ON s.id = o.sectorFk - JOIN productionConfig pc - WHERE o.workerFk = account.myUser_getId(); - - IF vWarehouseFk IS NULL - THEN CALL util.throw('WarehouseFk not setted'); - END IF; - - IF vStockScopeDays IS NULL - THEN CALL util.throw('StockScopeDays not setted'); - END IF; - - CREATE OR REPLACE TEMPORARY TABLE tmp.tItems - (PRIMARY KEY (itemFk)) - ENGINE = MEMORY - SELECT itemFk, SUM(visible) visible - FROM itemShelving - WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci - GROUP BY itemFk; - - CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay - (INDEX (itemFk, dated)) - ENGINE = MEMORY - SELECT dated, - SUM(t3.amount) OVER (PARTITION BY t3.itemFk ORDER BY dated) stock, - t3.itemFk - FROM ( - SELECT t.itemFk, dated, SUM(amount) amount - FROM ( - SELECT t2.itemFk, t2.amount, t2.dated - FROM ( - SELECT item_id itemFk, amount, util.VN_CURDATE() dated - FROM cache.stock s - JOIN tmp.tItems i ON i.itemFk = s.item_id - WHERE s.warehouse_id = vWarehouseFk - UNION ALL - SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE() - FROM itemShelving ish - JOIN tmp.tItems i ON i.itemFk = ish.itemFk - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON sh.parkingFk = p.id - JOIN sector s ON s.id = p.sectorFk - WHERE s.isReserve - GROUP BY ish.itemFk - UNION ALL - SELECT iei.itemFk, SUM(quantity), landed - FROM itemEntryIn iei - JOIN tmp.tItems i ON i.itemFk = iei.itemFk - WHERE iei.landed BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY - AND iei.warehouseInFk = vWarehouseFk - AND NOT isVirtualStock - GROUP BY iei.itemFk, iei.landed - UNION ALL - SELECT ieo.itemFk, SUM(quantity), shipped - FROM itemEntryOut ieo - JOIN tmp.tItems i ON i.itemFk = ieo.itemFk - WHERE ieo.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY - AND ieo.warehouseOutFk = vWarehouseFk - GROUP BY ieo.itemFk, ieo.shipped - UNION ALL - SELECT i.itemFk, SUM(ito.quantity), DATE(ito.shipped) - FROM itemTicketOut ito - JOIN tmp.tItems i ON i.itemFk = ito.itemFk - WHERE ito.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY - AND ito.warehouseFk = vWarehouseFk - GROUP BY ito.itemFk, ito.shipped - ) t2 - JOIN tmp.tItems i ON i.itemFk = t2.itemFk)t - GROUP BY t.itemFk, dated - ) t3; - - -- Se restan las entradas de hoy - UPDATE tmp.tStockByDay sbd - JOIN (SELECT iei.itemFk, SUM(quantity) todayEntry - FROM itemEntryIn iei - JOIN tmp.tItems i ON i.itemFk = iei.itemFk - WHERE iei.landed = util.VN_CURDATE() - AND iei.warehouseInFk = vWarehouseFk - AND NOT iei.isVirtualStock) sub ON sub.itemFk = sbd.itemFk - SET sbd.stock = sbd.stock - sub.todayEntry - WHERE sbd.dated = util.VN_CURDATE(); - - -- Se añaden las lineas de venta servidas - UPDATE tmp.tStockByDay sbd - JOIN (SELECT s.itemFK, SUM(quantity) amount - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - WHERE t.warehouseFk = vWarehouseFk - AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight() - AND s.isPicked - GROUP BY s.itemFk) sub ON sub.itemFk = sbd.itemFk - SET sbd.stock = sbd.stock + sub.amount; - - -- Se añaden los items ubicados hoy - UPDATE tmp.tStockByDay sbd - JOIN (SELECT ish.itemFK, SUM(ish.visible) amount - FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON p.id = sh.parkingFk - JOIN sector s ON s.id = p.sectorFk - WHERE s.warehouseFk = vWarehouseFk - AND NOT s.isReserve - AND ish.created BETWEEN util.VN_CURDATE() AND util.midnight() - GROUP BY ish.itemFk) sub ON sub.itemFk = sbd.itemFk - SET sbd.stock = sbd.stock + sub.amount; - - SELECT ts.itemFk, - i.longName, - IF(ts.stock<=0, ts.dated, NULL) dated, - ts.stock, - sub4.visible, - sub4.shelvingFk - FROM( - SELECT IFNULL(sub2.minDated, sub.minDated) dated, - IFNULL(sub2.itemFk, sub.itemFk) itemFk - FROM(SELECT sbd.itemFk, - MIN(dated) minDated, - sbd.stock - FROM tmp.tItems ti - LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk - GROUP BY itemFk)sub - LEFT JOIN ( - SELECT sbd.itemFk, - MIN(dated) minDated, - sbd.stock - FROM tmp.tItems ti - LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk - WHERE sbd.stock <= 0 - GROUP BY itemFk)sub2 ON sub2.itemFk =sub.itemFk - WHERE sub2.itemFk IS NOT NULL - OR (sub2.itemFk IS NULL AND sub.itemFk IS NOT NULL)) sub3 - LEFT JOIN tmp.tStockByDay ts ON ts.itemFk = sub3.itemFk AND ts.dated = sub3.dated - JOIN (SELECT ish.itemFk, - ish.visible, - p.sectorFk, - ish.shelvingFk - FROM itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk - LEFT JOIN parking p ON p.id = parkingFk - LEFT JOIN vn.sector s ON s.id = p.sectorFk - WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci - ) sub4 ON sub4.itemFk = ts.itemFk - LEFT JOIN sector s ON s.id = sub4.sectorFk - LEFT JOIN item i ON i.id = ts.itemFk - WHERE NOT s.isReserve; - - DROP TEMPORARY TABLE tmp.tStockByDay, tmp.tItems; - +BEGIN + + /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula. + * + * @param vShelvingFk Matrícula del carro o pallet + */ + + DECLARE vWarehouseFk INT; + DECLARE vStockScopeDays INT; + + SELECT s.warehouseFk, stockScopeDays + INTO vWarehouseFk, vStockScopeDays + FROM sector s + JOIN operator o ON s.id = o.sectorFk + JOIN productionConfig pc + WHERE o.workerFk = account.myUser_getId(); + + IF vWarehouseFk IS NULL + THEN CALL util.throw('WarehouseFk not setted'); + END IF; + + IF vStockScopeDays IS NULL + THEN CALL util.throw('StockScopeDays not setted'); + END IF; + + CREATE OR REPLACE TEMPORARY TABLE tmp.tItems + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT itemFk, SUM(visible) visible + FROM itemShelving + WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci + GROUP BY itemFk; + + CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay + (INDEX (itemFk, dated)) + ENGINE = MEMORY + SELECT dated, + SUM(t3.amount) OVER (PARTITION BY t3.itemFk ORDER BY dated) stock, + t3.itemFk + FROM ( + SELECT t.itemFk, dated, SUM(amount) amount + FROM ( + SELECT t2.itemFk, t2.amount, t2.dated + FROM ( + SELECT item_id itemFk, amount, util.VN_CURDATE() dated + FROM cache.stock s + JOIN tmp.tItems i ON i.itemFk = s.item_id + WHERE s.warehouse_id = vWarehouseFk + UNION ALL + SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE() + FROM itemShelving ish + JOIN tmp.tItems i ON i.itemFk = ish.itemFk + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON sh.parkingFk = p.id + JOIN sector s ON s.id = p.sectorFk + WHERE s.isReserve + GROUP BY ish.itemFk + UNION ALL + SELECT iei.itemFk, SUM(quantity), landed + FROM itemEntryIn iei + JOIN tmp.tItems i ON i.itemFk = iei.itemFk + WHERE iei.landed BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY + AND iei.warehouseInFk = vWarehouseFk + AND NOT isVirtualStock + GROUP BY iei.itemFk, iei.landed + UNION ALL + SELECT ieo.itemFk, SUM(quantity), shipped + FROM itemEntryOut ieo + JOIN tmp.tItems i ON i.itemFk = ieo.itemFk + WHERE ieo.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY + AND ieo.warehouseOutFk = vWarehouseFk + GROUP BY ieo.itemFk, ieo.shipped + UNION ALL + SELECT i.itemFk, SUM(ito.quantity), DATE(ito.shipped) + FROM itemTicketOut ito + JOIN tmp.tItems i ON i.itemFk = ito.itemFk + WHERE ito.shipped BETWEEN util.VN_CURDATE() AND util.VN_CURDATE() + INTERVAL vStockScopeDays DAY + AND ito.warehouseFk = vWarehouseFk + GROUP BY ito.itemFk, ito.shipped + ) t2 + JOIN tmp.tItems i ON i.itemFk = t2.itemFk)t + GROUP BY t.itemFk, dated + ) t3; + + -- Se restan las entradas de hoy + UPDATE tmp.tStockByDay sbd + JOIN (SELECT iei.itemFk, SUM(quantity) todayEntry + FROM itemEntryIn iei + JOIN tmp.tItems i ON i.itemFk = iei.itemFk + WHERE iei.landed = util.VN_CURDATE() + AND iei.warehouseInFk = vWarehouseFk + AND NOT iei.isVirtualStock) sub ON sub.itemFk = sbd.itemFk + SET sbd.stock = sbd.stock - sub.todayEntry + WHERE sbd.dated = util.VN_CURDATE(); + + -- Se añaden las lineas de venta servidas + UPDATE tmp.tStockByDay sbd + JOIN (SELECT s.itemFK, SUM(quantity) amount + FROM sale s + JOIN ticket t ON t.id = s.ticketFk + WHERE t.warehouseFk = vWarehouseFk + AND t.shipped BETWEEN util.VN_CURDATE() AND util.midnight() + AND s.isPicked + GROUP BY s.itemFk) sub ON sub.itemFk = sbd.itemFk + SET sbd.stock = sbd.stock + sub.amount; + + -- Se añaden los items ubicados hoy + UPDATE tmp.tStockByDay sbd + JOIN (SELECT ish.itemFK, SUM(ish.visible) amount + FROM itemShelving ish + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector s ON s.id = p.sectorFk + WHERE s.warehouseFk = vWarehouseFk + AND NOT s.isReserve + AND ish.created BETWEEN util.VN_CURDATE() AND util.midnight() + GROUP BY ish.itemFk) sub ON sub.itemFk = sbd.itemFk + SET sbd.stock = sbd.stock + sub.amount; + + SELECT ts.itemFk, + i.longName, + IF(ts.stock<=0, ts.dated, NULL) dated, + ts.stock, + sub4.visible, + sub4.shelvingFk + FROM( + SELECT IFNULL(sub2.minDated, sub.minDated) dated, + IFNULL(sub2.itemFk, sub.itemFk) itemFk + FROM(SELECT sbd.itemFk, + MIN(dated) minDated, + sbd.stock + FROM tmp.tItems ti + LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk + GROUP BY itemFk)sub + LEFT JOIN ( + SELECT sbd.itemFk, + MIN(dated) minDated, + sbd.stock + FROM tmp.tItems ti + LEFT JOIN tmp.tStockByDay sbd ON sbd.itemFk = ti.itemFk + WHERE sbd.stock <= 0 + GROUP BY itemFk)sub2 ON sub2.itemFk =sub.itemFk + WHERE sub2.itemFk IS NOT NULL + OR (sub2.itemFk IS NULL AND sub.itemFk IS NOT NULL)) sub3 + LEFT JOIN tmp.tStockByDay ts ON ts.itemFk = sub3.itemFk AND ts.dated = sub3.dated + JOIN (SELECT ish.itemFk, + ish.visible, + p.sectorFk, + ish.shelvingFk + FROM itemShelving ish + JOIN vn.shelving sh ON sh.code = ish.shelvingFk + LEFT JOIN parking p ON p.id = parkingFk + LEFT JOIN vn.sector s ON s.id = p.sectorFk + WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci + ) sub4 ON sub4.itemFk = ts.itemFk + LEFT JOIN sector s ON s.id = sub4.sectorFk + LEFT JOIN item i ON i.id = ts.itemFk + WHERE NOT s.isReserve; + + DROP TEMPORARY TABLE tmp.tStockByDay, tmp.tItems; + END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -63193,50 +63193,50 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `item_getAtp`(vDated DATE) -BEGIN -/** - * Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y - * almacén. - * - * @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0 - * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity) - * @return tmp.itemAtp(itemFk, warehouseFk, quantity) - */ - CREATE OR REPLACE TEMPORARY TABLE tItemOrdered - (UNIQUE(itemFk, warehouseFk, dated)) - ENGINE = MEMORY - SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity - FROM ( - SELECT itemFk, warehouseFk, dated, quantity - FROM tmp.itemCalc - UNION ALL - SELECT itemFk, warehouseFk, vDated, 0 - FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2 - ) t1 - GROUP BY itemFk, warehouseFk, dated - ORDER BY itemFk, warehouseFk, dated; - - SET @lastItemFk := 0; - SET @lastWareHouseFk := 0; - SET @lastQuantity := 0; - - CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp - (INDEX (itemFk, wareHouseFk)) - SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity - FROM ( - SELECT - itemFk, - IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk, - @lastQuantity := quantity, - @lastQuantity := @lastQuantity + quantity) quantityAccumulated, - wareHouseFk, - @lastItemFk := itemFk, - @lastWareHouseFk := wareHouseFk - FROM tItemOrdered - )sub - GROUP BY itemFk, wareHouseFk; - - DROP TEMPORARY TABLE tItemOrdered; +BEGIN +/** + * Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y + * almacén. + * + * @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0 + * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity) + * @return tmp.itemAtp(itemFk, warehouseFk, quantity) + */ + CREATE OR REPLACE TEMPORARY TABLE tItemOrdered + (UNIQUE(itemFk, warehouseFk, dated)) + ENGINE = MEMORY + SELECT itemFk, warehouseFk, dated, SUM(quantity) quantity + FROM ( + SELECT itemFk, warehouseFk, dated, quantity + FROM tmp.itemCalc + UNION ALL + SELECT itemFk, warehouseFk, vDated, 0 + FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2 + ) t1 + GROUP BY itemFk, warehouseFk, dated + ORDER BY itemFk, warehouseFk, dated; + + SET @lastItemFk := 0; + SET @lastWareHouseFk := 0; + SET @lastQuantity := 0; + + CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp + (INDEX (itemFk, wareHouseFk)) + SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity + FROM ( + SELECT + itemFk, + IF(itemFk <> @lastItemFk OR wareHouseFk <> @lastWareHouseFk, + @lastQuantity := quantity, + @lastQuantity := @lastQuantity + quantity) quantityAccumulated, + wareHouseFk, + @lastItemFk := itemFk, + @lastWareHouseFk := wareHouseFk + FROM tItemOrdered + )sub + GROUP BY itemFk, wareHouseFk; + + DROP TEMPORARY TABLE tItemOrdered; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -65424,176 +65424,176 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `multipleInventory`( - vDate DATE, - vWarehouseFk TINYINT, - vMaxDays TINYINT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `multipleInventory`( + vDate DATE, + vWarehouseFk TINYINT, + vMaxDays TINYINT ) -proc: BEGIN - DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY; - DECLARE vDateFrom DATE DEFAULT vDate; - DECLARE vDateTo DATETIME; - DECLARE vDateToTomorrow DATETIME; - DECLARE vDefaultDayRange INT; - DECLARE vCalcFk INT; - - IF vDate < util.VN_CURDATE() THEN - LEAVE proc; - END IF; - - IF vDate = util.VN_CURDATE() THEN - SELECT inventoried INTO vDateFrom - FROM config; - END IF; - - SELECT defaultDayRange INTO vDefaultDayRange - FROM comparativeConfig; - - SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY; - SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY; - - ALTER TABLE tmp.itemInventory - ADD `avalaible` INT NOT NULL, - ADD `sd` INT NOT NULL, - ADD `rest` INT NOT NULL, - ADD `expected` INT NOT NULL, - ADD `inventory` INT NOT NULL, - ADD `visible` INT NOT NULL, - ADD `life` TINYINT NOT NULL DEFAULT '0'; - - -- Calculo del inventario - CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc - (PRIMARY KEY (itemFk)) - ENGINE = MEMORY - SELECT itemFk, - SUM(quantity) quantity - FROM ( - SELECT s.itemFk, - s.quantity quantity - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - JOIN warehouse w ON w.id = t.warehouseFk - WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk - AND w.isComparative - UNION ALL - SELECT b.itemFk, b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseInFk - WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - UNION ALL - SELECT b.itemFk, - b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseOutFk - WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) - AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - ) sub - GROUP BY itemFk; - - -- Cálculo del visible - CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk); - - CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc - (PRIMARY KEY (item_id)) - ENGINE = MEMORY - SELECT item_id, visible - FROM cache.visible - WHERE calc_id = vCalcFk; - - UPDATE tmp.itemInventory it - LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id - LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id - SET it.inventory = iic.quantity, - it.visible = ivc.visible, - it.avalaible = iic.quantity, - it.sd = iic.quantity; - - -- Calculo del disponible - CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc - (INDEX (itemFk, warehouseFk)) - ENGINE = MEMORY - SELECT sub.itemFk, - vWarehouseFk warehouseFk, - sub.dated, - SUM(sub.quantity) quantity - FROM ( - SELECT s.itemFk, - DATE(t.shipped) dated, - - s.quantity quantity - FROM sale s - JOIN ticket t ON t.id = s.ticketFk - JOIN warehouse w ON w.id = t.warehouseFk - WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk - AND w.isComparative - UNION ALL - SELECT b.itemFk, t.landed, b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseInFk - WHERE t.landed BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - UNION ALL - SELECT b.itemFk, t.shipped, - b.quantity - FROM buy b - JOIN entry e ON e.id = b.entryFk - JOIN travel t ON t.id = e.travelFk - JOIN warehouse w ON w.id = t.warehouseOutFk - WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo - AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk - AND w.isComparative - AND NOT e.isExcludedFromAvailable - AND NOT e.isRaid - ) sub - GROUP BY sub.itemFk, sub.dated; - - CALL item_getAtp(vDate); - CALL travel_upcomingArrivals(vWarehouseFk, vDate); - - CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc - (PRIMARY KEY (itemFk)) - ENGINE = MEMORY - SELECT it.itemFk, - SUM(it.quantity) quantity, - im.quantity minQuantity - FROM tmp.itemCalc it - JOIN tmp.itemAtp im ON im.itemFk = it.itemFk - JOIN item i ON i.id = it.itemFk - LEFT JOIN origin o ON o.id = i.originFk - LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk - WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL, - t.landing, - vDateToTomorrow) - GROUP BY it.itemFk; - - UPDATE tmp.itemInventory it - JOIN tItemAvailableCalc iac ON iac.itemFk = it.id - SET it.avalaible = IF(iac.minQuantity > 0, - it.avalaible, - it.avalaible + iac.minQuantity), - it.sd = it.inventory + iac.quantity; - - DROP TEMPORARY TABLE - tmp.itemTravel, - tmp.itemCalc, - tmp.itemAtp, - tItemInventoryCalc, - tItemVisibleCalc, - tItemAvailableCalc; +proc: BEGIN + DECLARE vDateTomorrow DATE DEFAULT vDate + INTERVAL 1 DAY; + DECLARE vDateFrom DATE DEFAULT vDate; + DECLARE vDateTo DATETIME; + DECLARE vDateToTomorrow DATETIME; + DECLARE vDefaultDayRange INT; + DECLARE vCalcFk INT; + + IF vDate < util.VN_CURDATE() THEN + LEAVE proc; + END IF; + + IF vDate = util.VN_CURDATE() THEN + SELECT inventoried INTO vDateFrom + FROM config; + END IF; + + SELECT defaultDayRange INTO vDefaultDayRange + FROM comparativeConfig; + + SET vDateTo = vDate + INTERVAL IFNULL(vMaxDays, vDefaultDayRange) DAY; + SET vDateToTomorrow = vDateTo + INTERVAL 1 DAY; + + ALTER TABLE tmp.itemInventory + ADD `avalaible` INT NOT NULL, + ADD `sd` INT NOT NULL, + ADD `rest` INT NOT NULL, + ADD `expected` INT NOT NULL, + ADD `inventory` INT NOT NULL, + ADD `visible` INT NOT NULL, + ADD `life` TINYINT NOT NULL DEFAULT '0'; + + -- Calculo del inventario + CREATE OR REPLACE TEMPORARY TABLE tItemInventoryCalc + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT itemFk, + SUM(quantity) quantity + FROM ( + SELECT s.itemFk, - s.quantity quantity + FROM sale s + JOIN ticket t ON t.id = s.ticketFk + JOIN warehouse w ON w.id = t.warehouseFk + WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk + AND w.isComparative + UNION ALL + SELECT b.itemFk, b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseInFk + WHERE t.landed BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid + UNION ALL + SELECT b.itemFk, - b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseOutFk + WHERE t.shipped BETWEEN vDateFrom AND util.dayEnd(vDate) + AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid + ) sub + GROUP BY itemFk; + + -- Cálculo del visible + CALL cache.visible_refresh(vCalcFk, FALSE, vWarehouseFk); + + CREATE OR REPLACE TEMPORARY TABLE tItemVisibleCalc + (PRIMARY KEY (item_id)) + ENGINE = MEMORY + SELECT item_id, visible + FROM cache.visible + WHERE calc_id = vCalcFk; + + UPDATE tmp.itemInventory it + LEFT JOIN tItemInventoryCalc iic ON iic.itemFk = it.id + LEFT JOIN tItemVisibleCalc ivc ON ivc.item_id = it.id + SET it.inventory = iic.quantity, + it.visible = ivc.visible, + it.avalaible = iic.quantity, + it.sd = iic.quantity; + + -- Calculo del disponible + CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc + (INDEX (itemFk, warehouseFk)) + ENGINE = MEMORY + SELECT sub.itemFk, + vWarehouseFk warehouseFk, + sub.dated, + SUM(sub.quantity) quantity + FROM ( + SELECT s.itemFk, + DATE(t.shipped) dated, + - s.quantity quantity + FROM sale s + JOIN ticket t ON t.id = s.ticketFk + JOIN warehouse w ON w.id = t.warehouseFk + WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseFk) = t.warehouseFk + AND w.isComparative + UNION ALL + SELECT b.itemFk, t.landed, b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseInFk + WHERE t.landed BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseInFk) = t.warehouseInFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid + UNION ALL + SELECT b.itemFk, t.shipped, - b.quantity + FROM buy b + JOIN entry e ON e.id = b.entryFk + JOIN travel t ON t.id = e.travelFk + JOIN warehouse w ON w.id = t.warehouseOutFk + WHERE t.shipped BETWEEN vDateTomorrow AND vDateTo + AND IFNULL(vWarehouseFk, t.warehouseOutFk) = t.warehouseOutFk + AND w.isComparative + AND NOT e.isExcludedFromAvailable + AND NOT e.isRaid + ) sub + GROUP BY sub.itemFk, sub.dated; + + CALL item_getAtp(vDate); + CALL travel_upcomingArrivals(vWarehouseFk, vDate); + + CREATE OR REPLACE TEMPORARY TABLE tItemAvailableCalc + (PRIMARY KEY (itemFk)) + ENGINE = MEMORY + SELECT it.itemFk, + SUM(it.quantity) quantity, + im.quantity minQuantity + FROM tmp.itemCalc it + JOIN tmp.itemAtp im ON im.itemFk = it.itemFk + JOIN item i ON i.id = it.itemFk + LEFT JOIN origin o ON o.id = i.originFk + LEFT JOIN tmp.itemTravel t ON t.wh = o.warehouseFk + WHERE it.dated < IF(vMaxDays < 0 AND t.landing IS NOT NULL, + t.landing, + vDateToTomorrow) + GROUP BY it.itemFk; + + UPDATE tmp.itemInventory it + JOIN tItemAvailableCalc iac ON iac.itemFk = it.id + SET it.avalaible = IF(iac.minQuantity > 0, + it.avalaible, + it.avalaible + iac.minQuantity), + it.sd = it.inventory + iac.quantity; + + DROP TEMPORARY TABLE + tmp.itemTravel, + tmp.itemCalc, + tmp.itemAtp, + tItemInventoryCalc, + tItemVisibleCalc, + tItemAvailableCalc; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -70251,30 +70251,30 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `sectorCollection_new`(vSectorFk INT) -BEGIN -/** - * Inserta una nueva colección, si el usuario no tiene ninguna vacia. - * Esto se hace para evitar que por error se generen colecciones sin sentido. - * - * @param vSectorFk Identificador de #vn.sector - */ - DECLARE hasEmptyCollections BOOL; - DECLARE vUserFk INT; - - SET vUserFk = account.myUser_getId(); - - SELECT (COUNT(sc.id) > 0) INTO hasEmptyCollections - FROM vn.sectorCollection sc - LEFT JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id - WHERE ISNULL(scsg.id) - AND sc.userFk = vUserFk - AND sc.sectorFk = vSectorFk - AND sc.created >= util.VN_CURDATE(); - - IF NOT hasEmptyCollections THEN - INSERT INTO vn.sectorCollection(userFk, sectorFk) - VALUES(vUserFk, vSectorFk); - END IF; +BEGIN +/** + * Inserta una nueva colección, si el usuario no tiene ninguna vacia. + * Esto se hace para evitar que por error se generen colecciones sin sentido. + * + * @param vSectorFk Identificador de #vn.sector + */ + DECLARE hasEmptyCollections BOOL; + DECLARE vUserFk INT; + + SET vUserFk = account.myUser_getId(); + + SELECT (COUNT(sc.id) > 0) INTO hasEmptyCollections + FROM vn.sectorCollection sc + LEFT JOIN vn.sectorCollectionSaleGroup scsg ON scsg.sectorCollectionFk = sc.id + WHERE ISNULL(scsg.id) + AND sc.userFk = vUserFk + AND sc.sectorFk = vSectorFk + AND sc.created >= util.VN_CURDATE(); + + IF NOT hasEmptyCollections THEN + INSERT INTO vn.sectorCollection(userFk, sectorFk) + VALUES(vUserFk, vSectorFk); + END IF; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -74173,62 +74173,62 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_DelayTruckSplit`( - vTicketFk INT +CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_DelayTruckSplit`( + vTicketFk INT ) -BEGIN -/** - * Splita las lineas de ticket que no estan ubicadas - * - * @param vTicketFk Id ticket - */ - DECLARE vNewTicketFk INT; - DECLARE vTotalLines INT; - DECLARE vLinesToSplit INT; - - DROP TEMPORARY TABLE IF EXISTS tmp.SalesToSplit; - - SELECT COUNT(*) INTO vTotalLines - FROM sale - WHERE ticketFk = vTicketFk; - - CREATE TEMPORARY TABLE tmp.SalesToSplit - SELECT s.id saleFk - FROM ticket t - JOIN sale s ON t.id = s.ticketFk - LEFT JOIN ( - SELECT ish.itemFk itemFk, - SUM(ish.visible) visible, - s.warehouseFk warehouseFk - FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk - JOIN parking p ON p.id = sh.parkingFk - JOIN sector s ON s.id = p.sectorFk - GROUP BY ish.itemFk, - s.warehouseFk - ) issw ON issw.itemFk = s.itemFk - AND issw.warehouseFk = t.warehouseFk - WHERE s.quantity > IFNULL(issw.visible, 0) - AND s.quantity > 0 - AND NOT s.isPicked - AND NOT s.reserved - AND t.id = vTicketFk; - - SELECT COUNT(*) INTO vLinesToSplit - FROM tmp.SalesToSplit; - - IF vLinesToSplit = vTotalLines AND vLinesToSplit > 0 THEN - SET vNewTicketFk = vTicketFk; - ELSE - CALL ticket_Clone(vTicketFk, vNewTicketFk); - UPDATE sale s - JOIN tmp.SalesToSplit sts ON sts.saleFk = s.id - SET s.ticketFk = vNewTicketFk; - END IF; - - CALL ticket_setState(vNewTicketFk, 'FIXING'); - - DROP TEMPORARY TABLE tmp.SalesToSplit; +BEGIN +/** + * Splita las lineas de ticket que no estan ubicadas + * + * @param vTicketFk Id ticket + */ + DECLARE vNewTicketFk INT; + DECLARE vTotalLines INT; + DECLARE vLinesToSplit INT; + + DROP TEMPORARY TABLE IF EXISTS tmp.SalesToSplit; + + SELECT COUNT(*) INTO vTotalLines + FROM sale + WHERE ticketFk = vTicketFk; + + CREATE TEMPORARY TABLE tmp.SalesToSplit + SELECT s.id saleFk + FROM ticket t + JOIN sale s ON t.id = s.ticketFk + LEFT JOIN ( + SELECT ish.itemFk itemFk, + SUM(ish.visible) visible, + s.warehouseFk warehouseFk + FROM itemShelving ish + JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector s ON s.id = p.sectorFk + GROUP BY ish.itemFk, + s.warehouseFk + ) issw ON issw.itemFk = s.itemFk + AND issw.warehouseFk = t.warehouseFk + WHERE s.quantity > IFNULL(issw.visible, 0) + AND s.quantity > 0 + AND NOT s.isPicked + AND NOT s.reserved + AND t.id = vTicketFk; + + SELECT COUNT(*) INTO vLinesToSplit + FROM tmp.SalesToSplit; + + IF vLinesToSplit = vTotalLines AND vLinesToSplit > 0 THEN + SET vNewTicketFk = vTicketFk; + ELSE + CALL ticket_Clone(vTicketFk, vNewTicketFk); + UPDATE sale s + JOIN tmp.SalesToSplit sts ON sts.saleFk = s.id + SET s.ticketFk = vNewTicketFk; + END IF; + + CALL ticket_setState(vNewTicketFk, 'FIXING'); + + DROP TEMPORARY TABLE tmp.SalesToSplit; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -74246,84 +74246,84 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `ticket_doCmr`(vSelf INT) -BEGIN -/** -* Crea u actualiza la información del CMR asociado con -* un ticket específico en caso de que sea necesario. -* -* @param vSelf El id del ticket -*/ - DECLARE vCmrFk INT; - SELECT cmrFk INTO vCmrFk - FROM ticket - WHERE id = vSelf; - - CREATE OR REPLACE TEMPORARY TABLE tTicket - SELECT wo.firstName, - v.numberPlate, - com.id companyFk, - a.id addressFk, - c2.defaultAddressFk, - IFNULL(sat.supplierFk, su.id) supplierFk, - t.landed - FROM ticket t - JOIN ticketState ts ON ts.ticketFk = t.id - JOIN `state` s ON s.id = ts.stateFk - JOIN alertLevel al ON al.id = s.alertLevel - JOIN client c ON c.id = t.clientFk - JOIN `address` a ON a.id = t.addressFk - JOIN province p ON p.id = a.provinceFk - JOIN country co ON co.id = p.countryFk - JOIN warehouse w ON w.id = t.warehouseFk - JOIN company com ON com.id = t.companyFk - JOIN client c2 ON c2.id = com.clientFk - JOIN supplierAccount sa ON sa.id = com.supplierAccountFk - JOIN supplier su ON su.id = sa.supplierFk - LEFT JOIN route r ON r.id = t.routeFk - LEFT JOIN worker wo ON wo.id = r.workerFk - LEFT JOIN vehicle v ON v.id = r.vehicleFk - LEFT JOIN agencyMode am ON am.id = r.agencyModeFk - LEFT JOIN agency ag ON ag.id = am.agencyFk - LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id - AND wo.isFreelance - WHERE al.code IN ('PACKED', 'DELIVERED') - AND co.code <> 'ES' - AND am.name <> 'ABONO' - AND w.code = 'ALG' - AND t.id = vSelf - GROUP BY t.id; - - IF vCmrFk THEN - UPDATE cmr c - JOIN tTicket t - SET c.senderInstruccions = t.firstName, - c.truckPlate = t.numberPlate, - c.companyFk = t.companyFk, - c.addressToFk = t.addressFk, - c.addressFromFk = t.defaultAddressFk, - c.supplierFk = t.supplierFk, - c.ead = t.landed - WHERE id = vCmrFk; - ELSE - INSERT INTO cmr ( - senderInstruccions, - truckPlate, - companyFk, - addressToFk, - addressFromFk, - supplierFk, - ead - ) - SELECT * FROM tTicket; - - IF (SELECT EXISTS(SELECT * FROM tTicket)) THEN - UPDATE ticket - SET cmrFk = LAST_INSERT_ID() - WHERE id = vSelf; - END IF; - END IF; - - DROP TEMPORARY TABLE tTicket; +BEGIN +/** +* Crea u actualiza la información del CMR asociado con +* un ticket específico en caso de que sea necesario. +* +* @param vSelf El id del ticket +*/ + DECLARE vCmrFk INT; + SELECT cmrFk INTO vCmrFk + FROM ticket + WHERE id = vSelf; + + CREATE OR REPLACE TEMPORARY TABLE tTicket + SELECT wo.firstName, + v.numberPlate, + com.id companyFk, + a.id addressFk, + c2.defaultAddressFk, + IFNULL(sat.supplierFk, su.id) supplierFk, + t.landed + FROM ticket t + JOIN ticketState ts ON ts.ticketFk = t.id + JOIN `state` s ON s.id = ts.stateFk + JOIN alertLevel al ON al.id = s.alertLevel + JOIN client c ON c.id = t.clientFk + JOIN `address` a ON a.id = t.addressFk + JOIN province p ON p.id = a.provinceFk + JOIN country co ON co.id = p.countryFk + JOIN warehouse w ON w.id = t.warehouseFk + JOIN company com ON com.id = t.companyFk + JOIN client c2 ON c2.id = com.clientFk + JOIN supplierAccount sa ON sa.id = com.supplierAccountFk + JOIN supplier su ON su.id = sa.supplierFk + LEFT JOIN route r ON r.id = t.routeFk + LEFT JOIN worker wo ON wo.id = r.workerFk + LEFT JOIN vehicle v ON v.id = r.vehicleFk + LEFT JOIN agencyMode am ON am.id = r.agencyModeFk + LEFT JOIN agency ag ON ag.id = am.agencyFk + LEFT JOIN supplierAgencyTerm sat ON sat.agencyFk = ag.id + AND wo.isFreelance + WHERE al.code IN ('PACKED', 'DELIVERED') + AND co.code <> 'ES' + AND am.name <> 'ABONO' + AND w.code = 'ALG' + AND t.id = vSelf + GROUP BY t.id; + + IF vCmrFk THEN + UPDATE cmr c + JOIN tTicket t + SET c.senderInstruccions = t.firstName, + c.truckPlate = t.numberPlate, + c.companyFk = t.companyFk, + c.addressToFk = t.addressFk, + c.addressFromFk = t.defaultAddressFk, + c.supplierFk = t.supplierFk, + c.ead = t.landed + WHERE id = vCmrFk; + ELSE + INSERT INTO cmr ( + senderInstruccions, + truckPlate, + companyFk, + addressToFk, + addressFromFk, + supplierFk, + ead + ) + SELECT * FROM tTicket; + + IF (SELECT EXISTS(SELECT * FROM tTicket)) THEN + UPDATE ticket + SET cmrFk = LAST_INSERT_ID() + WHERE id = vSelf; + END IF; + END IF; + + DROP TEMPORARY TABLE tTicket; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -81979,126 +81979,126 @@ DELIMITER ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; -CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getLeaves`( - vSelf INT, - vParentFk INT, - vSearch VARCHAR(255), - vHasInsert BOOL +CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getLeaves`( + vSelf INT, + vParentFk INT, + vSearch VARCHAR(255), + vHasInsert BOOL ) -BEGIN -/** - * Devuelve las ubicaciones incluidas en la ruta y que sean hijos de parentFk. - * @param vSelf Id de la zona - * @param vParentFk Id del geo a calcular - * @param vSearch Cadena a buscar - * @param vHasInsert Indica si inserta en tmp.zoneNodes - * Optional @table tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk) - */ - DECLARE vIsNumber BOOL; - DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch <> ''; - - CREATE OR REPLACE TEMPORARY TABLE tNodes - (UNIQUE (id)) - ENGINE = MEMORY - SELECT id - FROM zoneGeo - LIMIT 0; - - IF vIsSearch THEN - SET vIsNumber = vSearch REGEXP '^[0-9]+$'; - - INSERT INTO tNodes - SELECT id - FROM zoneGeo - WHERE (vIsNumber AND `name` = vSearch) - OR (!vIsNumber AND `name` LIKE CONCAT('%', vSearch, '%')) - LIMIT 1000; - - ELSEIF vParentFk IS NULL THEN - INSERT INTO tNodes - SELECT geoFk - FROM zoneIncluded - WHERE zoneFk = vSelf; - END IF; - - IF vParentFk IS NULL THEN - CREATE OR REPLACE TEMPORARY TABLE tChilds - (INDEX(id)) - ENGINE = MEMORY - SELECT id FROM tNodes; - - CREATE OR REPLACE TEMPORARY TABLE tParents - (INDEX(id)) - ENGINE = MEMORY - SELECT id FROM zoneGeo LIMIT 0; - - myLoop: LOOP - DELETE FROM tParents; - INSERT INTO tParents - SELECT parentFk id - FROM zoneGeo g - JOIN tChilds c ON c.id = g.id - WHERE g.parentFk IS NOT NULL; - - INSERT IGNORE INTO tNodes - SELECT id FROM tParents; - - IF NOT ROW_COUNT() THEN - LEAVE myLoop; - END IF; - - DELETE FROM tChilds; - INSERT INTO tChilds - SELECT id FROM tParents; - END LOOP; - - DROP TEMPORARY TABLE tChilds, tParents; - END IF; - - IF NOT vIsSearch THEN - INSERT IGNORE INTO tNodes - SELECT id - FROM zoneGeo - WHERE parentFk <=> vParentFk; - END IF; - - CREATE OR REPLACE TEMPORARY TABLE tZones - SELECT g.id, - g.name, - g.parentFk, - g.sons, - NOT g.sons OR `type` = 'country' isChecked, - i.isIncluded selected, - g.`depth`, - vSelf - FROM zoneGeo g - JOIN tNodes n ON n.id = g.id - LEFT JOIN zoneIncluded i ON i.geoFk = g.id - AND i.zoneFk = vSelf - ORDER BY g.`depth`, selected DESC, g.name; - - IF vHasInsert THEN - INSERT IGNORE INTO tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk) - SELECT id, - name, - parentFk, - sons, - isChecked, - vSelf - FROM tZones - WHERE selected - OR (selected IS NULL AND vParentFk IS NOT NULL); - ELSE - SELECT id, - name, - parentFk, - sons, - selected - FROM tZones - ORDER BY `depth`, selected DESC, name; - END IF; - - DROP TEMPORARY TABLE tNodes, tZones; +BEGIN +/** + * Devuelve las ubicaciones incluidas en la ruta y que sean hijos de parentFk. + * @param vSelf Id de la zona + * @param vParentFk Id del geo a calcular + * @param vSearch Cadena a buscar + * @param vHasInsert Indica si inserta en tmp.zoneNodes + * Optional @table tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk) + */ + DECLARE vIsNumber BOOL; + DECLARE vIsSearch BOOL DEFAULT vSearch IS NOT NULL AND vSearch <> ''; + + CREATE OR REPLACE TEMPORARY TABLE tNodes + (UNIQUE (id)) + ENGINE = MEMORY + SELECT id + FROM zoneGeo + LIMIT 0; + + IF vIsSearch THEN + SET vIsNumber = vSearch REGEXP '^[0-9]+$'; + + INSERT INTO tNodes + SELECT id + FROM zoneGeo + WHERE (vIsNumber AND `name` = vSearch) + OR (!vIsNumber AND `name` LIKE CONCAT('%', vSearch, '%')) + LIMIT 1000; + + ELSEIF vParentFk IS NULL THEN + INSERT INTO tNodes + SELECT geoFk + FROM zoneIncluded + WHERE zoneFk = vSelf; + END IF; + + IF vParentFk IS NULL THEN + CREATE OR REPLACE TEMPORARY TABLE tChilds + (INDEX(id)) + ENGINE = MEMORY + SELECT id FROM tNodes; + + CREATE OR REPLACE TEMPORARY TABLE tParents + (INDEX(id)) + ENGINE = MEMORY + SELECT id FROM zoneGeo LIMIT 0; + + myLoop: LOOP + DELETE FROM tParents; + INSERT INTO tParents + SELECT parentFk id + FROM zoneGeo g + JOIN tChilds c ON c.id = g.id + WHERE g.parentFk IS NOT NULL; + + INSERT IGNORE INTO tNodes + SELECT id FROM tParents; + + IF NOT ROW_COUNT() THEN + LEAVE myLoop; + END IF; + + DELETE FROM tChilds; + INSERT INTO tChilds + SELECT id FROM tParents; + END LOOP; + + DROP TEMPORARY TABLE tChilds, tParents; + END IF; + + IF NOT vIsSearch THEN + INSERT IGNORE INTO tNodes + SELECT id + FROM zoneGeo + WHERE parentFk <=> vParentFk; + END IF; + + CREATE OR REPLACE TEMPORARY TABLE tZones + SELECT g.id, + g.name, + g.parentFk, + g.sons, + NOT g.sons OR `type` = 'country' isChecked, + i.isIncluded selected, + g.`depth`, + vSelf + FROM zoneGeo g + JOIN tNodes n ON n.id = g.id + LEFT JOIN zoneIncluded i ON i.geoFk = g.id + AND i.zoneFk = vSelf + ORDER BY g.`depth`, selected DESC, g.name; + + IF vHasInsert THEN + INSERT IGNORE INTO tmp.zoneNodes(geoFk, name, parentFk, sons, isChecked, zoneFk) + SELECT id, + name, + parentFk, + sons, + isChecked, + vSelf + FROM tZones + WHERE selected + OR (selected IS NULL AND vParentFk IS NOT NULL); + ELSE + SELECT id, + name, + parentFk, + sons, + selected + FROM tZones + ORDER BY `depth`, selected DESC, name; + END IF; + + DROP TEMPORARY TABLE tNodes, tZones; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; @@ -82281,48 +82281,48 @@ DELIMITER ; /*!50003 SET collation_connection = utf8mb4_unicode_ci */ ; DELIMITER ;; CREATE DEFINER=`vn`@`localhost` PROCEDURE `zone_getPostalCode`(vSelf INT) -BEGIN -/** - * Devuelve los códigos postales incluidos en una zona - */ - DECLARE vGeoFk INT DEFAULT NULL; - - CREATE OR REPLACE TEMPORARY TABLE tmp.zoneNodes ( - geoFk INT, - name VARCHAR(100), - parentFk INT, - sons INT, - isChecked BOOL DEFAULT 0, - zoneFk INT, - PRIMARY KEY zoneNodesPk (zoneFk, geoFk), - INDEX(geoFk)) - ENGINE = MEMORY; - - CALL zone_getLeaves(vSelf, NULL , NULL, TRUE); - - UPDATE tmp.zoneNodes - SET isChecked = 0 - WHERE parentFk IS NULL; - - myLoop: LOOP - SET vGeoFk = NULL; - SELECT geoFk INTO vGeoFk - FROM tmp.zoneNodes - WHERE NOT isChecked - LIMIT 1; - - CALL zone_getLeaves(vSelf, vGeoFk, NULL, TRUE); - UPDATE tmp.zoneNodes - SET isChecked = TRUE - WHERE geoFk = vGeoFk; - - IF vGeoFk IS NULL THEN - LEAVE myLoop; - END IF; - END LOOP; - - DELETE FROM tmp.zoneNodes - WHERE sons > 0; +BEGIN +/** + * Devuelve los códigos postales incluidos en una zona + */ + DECLARE vGeoFk INT DEFAULT NULL; + + CREATE OR REPLACE TEMPORARY TABLE tmp.zoneNodes ( + geoFk INT, + name VARCHAR(100), + parentFk INT, + sons INT, + isChecked BOOL DEFAULT 0, + zoneFk INT, + PRIMARY KEY zoneNodesPk (zoneFk, geoFk), + INDEX(geoFk)) + ENGINE = MEMORY; + + CALL zone_getLeaves(vSelf, NULL , NULL, TRUE); + + UPDATE tmp.zoneNodes + SET isChecked = 0 + WHERE parentFk IS NULL; + + myLoop: LOOP + SET vGeoFk = NULL; + SELECT geoFk INTO vGeoFk + FROM tmp.zoneNodes + WHERE NOT isChecked + LIMIT 1; + + CALL zone_getLeaves(vSelf, vGeoFk, NULL, TRUE); + UPDATE tmp.zoneNodes + SET isChecked = TRUE + WHERE geoFk = vGeoFk; + + IF vGeoFk IS NULL THEN + LEAVE myLoop; + END IF; + END LOOP; + + DELETE FROM tmp.zoneNodes + WHERE sons > 0; END ;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; diff --git a/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql b/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql index 8630053734..b698f0e3ea 100644 --- a/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql +++ b/db/routines/bs/procedures/inventoryDiscrepancyDetail_replace.sql @@ -32,7 +32,7 @@ BEGIN CREATE OR REPLACE TEMPORARY TABLE tVisible SELECT itemFk, SUM(visible) totalVisible FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector sc ON sc.id = p.sectorFk WHERE sc.warehouseFk = vWarehouseFk diff --git a/db/routines/vn/functions/hasItemsInSector.sql b/db/routines/vn/functions/hasItemsInSector.sql index 7a5c4cf609..faf9e8a90a 100644 --- a/db/routines/vn/functions/hasItemsInSector.sql +++ b/db/routines/vn/functions/hasItemsInSector.sql @@ -9,7 +9,7 @@ BEGIN SELECT count(*) INTO vItemCount FROM vn.sale s JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk WHERE s.ticketFk = vTicketFk AND p.sectorFk = vSectorFk; diff --git a/db/routines/vn/functions/itemsInSector_get.sql b/db/routines/vn/functions/itemsInSector_get.sql index 254ebe1b57..9043e55cb5 100644 --- a/db/routines/vn/functions/itemsInSector_get.sql +++ b/db/routines/vn/functions/itemsInSector_get.sql @@ -10,7 +10,7 @@ BEGIN SELECT count(*) INTO vItemCount FROM vn.sale s JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk WHERE s.ticketFk = vTicketFk AND p.sectorFk = vSectorFk; diff --git a/db/routines/vn/procedures/collectionPlacement_get.sql b/db/routines/vn/procedures/collectionPlacement_get.sql index 239dbd3a22..8d2301e1e1 100644 --- a/db/routines/vn/procedures/collectionPlacement_get.sql +++ b/db/routines/vn/procedures/collectionPlacement_get.sql @@ -83,7 +83,7 @@ BEGIN AND s.semaphore = 1 GROUP BY st.saleFk) st ON st.saleFk = ts.saleFk JOIN itemShelving ish ON ish.itemFk = ts.itemFk - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector sc ON sc.id = p.sectorFk JOIN sectorType st ON st.id = sc.typeFk diff --git a/db/routines/vn/procedures/entry_splitByShelving.sql b/db/routines/vn/procedures/entry_splitByShelving.sql index fbf0cef907..026c47daab 100644 --- a/db/routines/vn/procedures/entry_splitByShelving.sql +++ b/db/routines/vn/procedures/entry_splitByShelving.sql @@ -1,10 +1,15 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_splitByShelving`(vShelvingFk VARCHAR(3), vFromEntryFk INT, vToEntryFk INT) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_splitByShelving`( + vShelvingCode VARCHAR(3), + vFromEntryFk INT, + vToEntryFk INT +) BEGIN /** - * Divide las compras entre dos entradas de acuerdo con lo ubicado en una matr�cula + * Divide las compras entre dos entradas de + * acuerdo con lo ubicado en una matricula. * - * @param vShelvingFk Identificador de vn.shelving + * @param vShelvingCode Código de vn.shelving * @param vFromEntryFk Entrada origen * @param vToEntryFk Entrada destino */ @@ -23,7 +28,7 @@ BEGIN WHERE b.entryFk = vFromEntryFk ORDER BY b.stickers DESC LIMIT 10000000000000000000) bb ON bb.itemFk = ish.itemFk - WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_general_ci + WHERE ish.shelvingFk = vShelvingCode COLLATE utf8_general_ci AND NOT ish.isSplit GROUP BY ish.id; @@ -107,9 +112,10 @@ BEGIN UPDATE buy SET printedStickers = vIshStickers WHERE id = LAST_INSERT_ID(); END IF; - UPDATE itemShelving - SET isSplit = TRUE - WHERE shelvingFk = vShelvingFk COLLATE utf8_general_ci; + UPDATE itemShelving ish + JOIN shelving sh ON sh.id = ish.shelvingFk + SET ish.isSplit = TRUE + WHERE sh.code = vShelvingCode COLLATE utf8_general_ci; END LOOP; CLOSE cur; END$$ diff --git a/db/routines/vn/procedures/itemPlacementSupplyAiming.sql b/db/routines/vn/procedures/itemPlacementSupplyAiming.sql index b96860623e..ae0890564b 100644 --- a/db/routines/vn/procedures/itemPlacementSupplyAiming.sql +++ b/db/routines/vn/procedures/itemPlacementSupplyAiming.sql @@ -1,5 +1,9 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyAiming`(vShelvingFk VARCHAR(10), quantity INT, vItemFk INT) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyAiming`( + vShelvingCode VARCHAR(10), + vQuantity INT, + vItemFk INT +) BEGIN SELECT ish.itemFk, @@ -9,21 +13,21 @@ BEGIN ish.itemShelvingFk, ish.shelving, ish.stock, - LEAST(ish.stock,quantity) as total, + LEAST(ish.stock,vQuantity) total, CONCAT( - CAST(FLOOR(LEAST(ish.stock,quantity) / ish.packing) AS DECIMAL(10,0)), + CAST(FLOOR(LEAST(ish.stock, vQuantity) / ish.packing) AS DECIMAL(10,0)), ' x ', ish.packing, IF ( - LEAST(ish.stock,quantity) MOD ish.packing, - CONCAT(' + ',CAST(LEAST(ish.stock,quantity) MOD ish.packing AS DECIMAL(10,0))), + LEAST(ish.stock, vQuantity) MOD ish.packing, + CONCAT(' + ',CAST(LEAST(ish.stock, vQuantity) MOD ish.packing AS DECIMAL(10,0))), '' ), ' = ', - LEAST(ish.stock,quantity) - ) as proposal - FROM vn.itemShelvingPlacementSupplyStock ish - WHERE ish.shelving = vShelvingFk COLLATE utf8_general_ci + LEAST(ish.stock, vQuantity) + ) proposal + FROM itemShelvingPlacementSupplyStock ish + WHERE ish.shelving = vShelvingCode COLLATE utf8_general_ci AND ish.itemFk = vItemFk; END$$ diff --git a/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql b/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql index 958dc7e781..d2648ca6ca 100644 --- a/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql +++ b/db/routines/vn/procedures/itemPlacementSupplyGetOrder.sql @@ -1,5 +1,7 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyGetOrder`(vSector INT ) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyGetOrder`( + vSectorFk INT +) BEGIN DECLARE vId INT; @@ -7,31 +9,35 @@ BEGIN DECLARE vNextParkingFk INT; SELECT sh.parkingFk INTO vLastParkingFk - FROM vn.itemShelvingPlacementSupply isps - JOIN vn.itemShelving ish ON ish.id = isps.itemShelvingFk - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + FROM itemShelvingPlacementSupply isps + JOIN itemShelving ish ON ish.id = isps.itemShelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk WHERE isps.userFk = getUser() ORDER BY isps.created DESC LIMIT 1; - SET vNextParkingFk = vn.itemShelvingPlacementSupply_ClosestGet(vLastParkingFk); + SET vNextParkingFk = itemShelvingPlacementSupply_ClosestGet(vLastParkingFk); SELECT ipsl.id INTO vId - FROM vn.itemPlacementSupplyList ipsl - JOIN vn.itemShelvingPlacementSupplyStock ispss ON ispss.itemFk = ipsl.itemFk + FROM itemPlacementSupplyList ipsl + JOIN itemShelvingPlacementSupplyStock ispss ON ispss.itemFk = ipsl.itemFk WHERE ipsl.saldo > 0 AND (ipsl.repoUserFk is NULL OR ipsl.repoUserFk = getUser()) - AND ipsl.sectorFk = vSector - ORDER BY ipsl.repoUserFk DESC, ipsl.priority DESC, (ispss.parkingFk = vNextParkingFk) DESC, ispss.parking DESC, ipsl.created + AND ipsl.sectorFk = vSectorFk + ORDER BY ipsl.repoUserFk DESC, + ipsl.priority DESC, + (ispss.parkingFk = vNextParkingFk) DESC, + ispss.parking DESC, + ipsl.created LIMIT 1; - UPDATE vn.itemPlacementSupply + UPDATE itemPlacementSupply SET repoUserFk = getUser() WHERE id = vId; - SELECT * FROM vn.itemPlacementSupplyList + SELECT * FROM itemPlacementSupplyList WHERE id = vId - AND sectorFk = vSector; + AND sectorFk = vSectorFk; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql index cefa64d13e..92c17b82f4 100644 --- a/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql +++ b/db/routines/vn/procedures/itemPlacementSupplyStockGetTargetList.sql @@ -1,5 +1,8 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyStockGetTargetList`(vItemFk INT,vSectorFk INT) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemPlacementSupplyStockGetTargetList`( + vItemFk INT, + vSectorFk INT +) BEGIN /** * Devuelve la lista de ubicaciones para itemFk en ese sector. Se utiliza en la preparación previa. @@ -13,11 +16,11 @@ BEGIN SUM(ish.visible) stockTotal, ish.created, p.pickingOrder - FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk - JOIN vn.parking p ON p.id = sh.parkingFk - JOIN vn.sector sc ON sc.id = p.sectorFk - JOIN vn.warehouse w ON w.id = sc.warehouseFk + FROM itemShelving ish + JOIN shelving sh ON sh.id = ish.shelvingFk + JOIN parking p ON p.id = sh.parkingFk + JOIN sector sc ON sc.id = p.sectorFk + JOIN warehouse w ON w.id = sc.warehouseFk WHERE ish.visible > 0 AND ish.itemFk = vItemFk GROUP BY ish.id diff --git a/db/routines/vn/procedures/itemShelvingMatch.sql b/db/routines/vn/procedures/itemShelvingMatch.sql index 850c7907b4..4ffa66fcb3 100644 --- a/db/routines/vn/procedures/itemShelvingMatch.sql +++ b/db/routines/vn/procedures/itemShelvingMatch.sql @@ -20,7 +20,7 @@ BEGIN LEFT JOIN ( SELECT itemFk, sum(cast(visible / packing AS DECIMAL(10,0))) AS etiquetas FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk LEFT JOIN parking pk ON pk.id = sh.parkingFk WHERE ish.created BETWEEN vFromTimed AND vToTimed GROUP BY itemFk diff --git a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql index 06736732a6..eeec60248d 100644 --- a/db/routines/vn/procedures/itemShelvingSale_addBySale.sql +++ b/db/routines/vn/procedures/itemShelvingSale_addBySale.sql @@ -27,7 +27,7 @@ proc: BEGIN ish.available FROM sale s JOIN itemShelving ish ON ish.itemFk = s.itemFk - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector sc ON sc.id = p.sectorFk JOIN productionConfig pc @@ -61,7 +61,7 @@ proc: BEGIN FROM sale s LEFT JOIN itemShelvingSale iss ON iss.saleFk = s.id LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - LEFT JOIN shelving sh ON sh.code = ish.shelvingFk + LEFT JOIN shelving sh ON sh.id = ish.shelvingFk LEFT JOIN parking p ON p.id = sh.parkingFk WHERE s.id = vSaleFk; diff --git a/db/routines/vn/procedures/itemShelving_add.sql b/db/routines/vn/procedures/itemShelving_add.sql index 92d1609e48..a8f0b52507 100644 --- a/db/routines/vn/procedures/itemShelving_add.sql +++ b/db/routines/vn/procedures/itemShelving_add.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_add`( - vShelvingFk VARCHAR(8), + vShelvingCode VARCHAR(10), vBarcode VARCHAR(22), vQuantity INT, vPackagingFk VARCHAR(10), @@ -12,7 +12,7 @@ BEGIN /** * Añade registro o lo actualiza si ya existe. * - * @param vShelvingFk matrícula del carro + * @param vShelvingCode matrícula del carro * @param vBarcode el id del registro * @param vQuantity indica la cantidad del producto * @param vPackagingFk el packaging del producto en itemShelving, NULL para coger el de la ultima compra @@ -23,10 +23,15 @@ BEGIN **/ DECLARE vItemFk INT; DECLARE vBuyFk INT; + DECLARE vShelvingFk INT; SELECT id INTO vBuyFk FROM buy WHERE id = vBarcode; + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; + SELECT barcodeToItem(vBarcode) INTO vItemFk; IF vBuyFk IS NULL THEN @@ -40,7 +45,7 @@ BEGIN END IF; IF (SELECT COUNT(*) FROM itemShelving - WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk + WHERE shelvingFk = vShelvingFk AND itemFk = vItemFk AND packing = vPacking AND buyFk = vBuyFk) THEN @@ -48,7 +53,9 @@ BEGIN UPDATE itemShelving SET visible = visible + vQuantity, available = available + vQuantity - WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk AND itemFk = vItemFk AND packing = vPacking; + WHERE shelvingFk = vShelvingFk + AND itemFk = vItemFk + AND packing = vPacking; ELSE diff --git a/db/routines/vn/procedures/itemShelving_addByClaim.sql b/db/routines/vn/procedures/itemShelving_addByClaim.sql index 5e7cdf3fce..55ac3e337e 100644 --- a/db/routines/vn/procedures/itemShelving_addByClaim.sql +++ b/db/routines/vn/procedures/itemShelving_addByClaim.sql @@ -1,29 +1,38 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addByClaim`(vClaimFk INT, vShelvingFk VARCHAR(3)) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addByClaim`( + vClaimFk INT, + vShelvingCode VARCHAR(10) +) BEGIN /** * Insert items of claim into itemShelving. * * @param vClaimFk The claim - * @param vShelvingFk The shelving + * @param vShelvingCode The shelving code * @table tmp.buyUltimate */ DECLARE vWarehouseFk INT; + DECLARE vShelvingFk INT; SELECT t.warehouseFk INTO vWarehouseFk FROM claim c JOIN ticket t ON t.id = c.ticketFk WHERE c.id = vClaimFk; + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; + CALL buy_getUltimate(NULL, vWarehouseFk, util.VN_CURDATE()); INSERT INTO itemShelving (itemFk, shelvingFk, packing, `grouping`, visible) - SELECT s.itemFk, vShelvingFk, b.packing, b.`grouping`, cb.quantity AS visible + SELECT s.itemFk, vShelvingFk, b.packing, b.`grouping`, cb.quantity visible FROM claim c JOIN claimBeginning cb ON c.id = cb.claimFk JOIN sale s ON s.id = cb.saleFk JOIN ticket t ON t.id = s.ticketFk - JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk AND bu.warehouseFk = t.warehouseFk + JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk + AND bu.warehouseFk = t.warehouseFk JOIN buy b ON b.id = bu.buyFk WHERE c.id = vClaimFk; END$$ diff --git a/db/routines/vn/procedures/itemShelving_addList.sql b/db/routines/vn/procedures/itemShelving_addList.sql index ade92b9fdc..04fa1e10c4 100644 --- a/db/routines/vn/procedures/itemShelving_addList.sql +++ b/db/routines/vn/procedures/itemShelving_addList.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_addList`( - vShelvingFk VARCHAR(3), + vShelvingCode VARCHAR(10), vList TEXT, vIsChecking BOOL, vWarehouseFk INT @@ -13,7 +13,7 @@ BEGIN * Cuando es TRUE sólo inserta los elementos de la colección que no están ya en * ese shelving, actualizando los valores del campo itemShelving.isChecked * - * @param vShelvingFk Identificador de shelving + * @param vShelvingCode Código de shelving * @param vList JSON array con esta estructura: '[value1, value2, ...]' * @param vIsChecking Define si hay que añadir o comprobar los items * @param vWarehouseFk Identificador de warehouse @@ -24,6 +24,11 @@ BEGIN DECLARE vPath VARCHAR(6); DECLARE vItemFk INT; DECLARE vIsChecked BOOL; + DECLARE vShelvingFk INT; + + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; WHILE vCounter < vListLength DO SET vPath = CONCAT('$[', vCounter, ']'); @@ -34,17 +39,17 @@ BEGIN SELECT IF(COUNT(*), TRUE, FALSE) INTO vIsChecked FROM itemShelving - WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk + WHERE shelvingFk = vShelvingFk AND itemFk = vItemFk; END IF; IF NOT vIsChecking OR NOT vIsChecked THEN - CALL itemShelving_add(vShelvingFk, vBarcode, 1, NULL, NULL, NULL, vWarehouseFk); + CALL itemShelving_add(vShelvingCode, vBarcode, 1, NULL, NULL, NULL, vWarehouseFk); END IF; UPDATE itemShelving SET isChecked = vIsChecked - WHERE shelvingFk COLLATE utf8_unicode_ci = vShelvingFk + WHERE shelvingFk = vShelvingFk AND itemFk = vItemFk AND isChecked IS NULL; diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql index 07384b7216..93022c2aff 100644 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -1,10 +1,12 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_get`(IN vSelf VARCHAR(8)) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_get`( + vShelvingCode VARCHAR(10) +) BEGIN /** -* Lista artículos de itemshelving +* Lista artículos de itemShelving. * -* @param vSelf matrícula del carro +* @param vShelvingCode Matrícula del carro **/ SELECT ish.itemFk item, i.name, @@ -22,9 +24,9 @@ BEGIN 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 shelving s ON s.id = ish.shelvingFk + LEFT JOIN parking p ON p.id = s.parkingFk JOIN hedera.imageConfig ic - WHERE ish.shelvingFk COLLATE utf8_unicode_ci = vSelf; + WHERE s.code COLLATE utf8_unicode_ci = vShelvingCode; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/itemShelving_getAlternatives.sql b/db/routines/vn/procedures/itemShelving_getAlternatives.sql index 89176c4f53..3eff3254bf 100644 --- a/db/routines/vn/procedures/itemShelving_getAlternatives.sql +++ b/db/routines/vn/procedures/itemShelving_getAlternatives.sql @@ -1,21 +1,31 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getAlternatives`(vShelvingFk VARCHAR(10)) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getAlternatives`( + vShelvingCode VARCHAR(10) +) BEGIN /** - * Devuelve un listado de posibles ubicaciones alternativas a ubicar los item de la matricula - * del carro que se le ha pasado. + * Devuelve un listado de posibles ubicaciones alternativas a ubicar + * los item de la matricula del carro que se le ha pasado. * - * @param vShelvingFk matricula del carro + * @param vShelvingCode Matricula del carro */ - SELECT is2.id,is2.shelvingFk , p.code, is2.itemFk , is2.visible, p.pickingOrder + DECLARE vShelvingFk INT; + + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; + + SELECT is2.id,is2.shelvingFk, p.code, is2.itemFk , is2.visible, p.pickingOrder FROM itemShelving is2 - JOIN shelving sh ON sh.code = is2.shelvingFk + JOIN shelving sh ON sh.id = is2.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk - LEFT JOIN operator o ON o.sectorFk = s.id AND o.workerFk = account.myUser_getId() + LEFT JOIN operator o ON o.sectorFk = s.id + AND o.workerFk = account.myUser_getId() JOIN warehouse wh ON wh.id = s.warehouseFk - JOIN itemShelving is3 ON is3.itemFk = is2.itemFk AND is3.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci - WHERE is2.shelvingFk <> vShelvingFk COLLATE utf8_unicode_ci + JOIN itemShelving is3 ON is3.itemFk = is2.itemFk + AND is3.shelvingFk = vShelvingFk + WHERE is2.shelvingFk <> vShelvingFk GROUP BY is2.id ORDER BY p.pickingOrder DESC; END$$ diff --git a/db/routines/vn/procedures/itemShelving_getInfo.sql b/db/routines/vn/procedures/itemShelving_getInfo.sql index f02100e8be..f4c8c5b357 100644 --- a/db/routines/vn/procedures/itemShelving_getInfo.sql +++ b/db/routines/vn/procedures/itemShelving_getInfo.sql @@ -16,7 +16,7 @@ BEGIN ish.itemFk itemFk, sh.priority FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.`code` = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking pk ON pk.id = sh.parkingFk WHERE ish.itemFk = vItemFk ORDER BY sh.priority DESC, created ASC; diff --git a/db/routines/vn/procedures/itemShelving_getItemDetails.sql b/db/routines/vn/procedures/itemShelving_getItemDetails.sql index 4e641ca72f..36f9830f00 100644 --- a/db/routines/vn/procedures/itemShelving_getItemDetails.sql +++ b/db/routines/vn/procedures/itemShelving_getItemDetails.sql @@ -1,14 +1,14 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getItemDetails`( vBarcodeItem INT, - vShelvingFK VARCHAR(10) + vShelvingCode VARCHAR(10) ) BEGIN /** * Obtiene el precio y visible de un item * * @param vBarcodeItem barcode de artículo - * @param vShelvingFK Ubicación actual del artículo + * @param vShelvingCode Ubicación actual del artículo */ DECLARE vIsItem BOOL; DECLARE vBuyFk INT; @@ -38,18 +38,19 @@ BEGIN WITH visible AS( SELECT itemFk, IFNULL(buyingValue, 0) + - IFNULL(freightValue, 0) + - IFNULL(comissionValue, 0) + - IFNULL(packageValue, 0) itemCost - FROM vn.buy b + IFNULL(freightValue, 0) + + IFNULL(comissionValue, 0) + + IFNULL(packageValue, 0) itemCost + FROM vn.buy b WHERE b.id = vBuyFk ) SELECT v.itemFk, - vShelvingFK, + vShelvingCode, v.itemCost, SUM(ish.visible) visible FROM vn.itemShelving ish + JOIN vn.shelving sh ON sh.id = ish.shelvingFK JOIN visible v - WHERE ish.shelvingFK = vShelvingFK COLLATE utf8mb3_general_ci - AND ish.itemFk = v.itemFk; + WHERE sh.code = vShelvingCode COLLATE utf8mb3_general_ci + AND ish.itemFk = v.itemFk; END$$ DELIMITER ; \ No newline at end of file diff --git a/db/routines/vn/procedures/itemShelving_getSaleDate.sql b/db/routines/vn/procedures/itemShelving_getSaleDate.sql index d8ab6ed0c5..fad4d5abcf 100644 --- a/db/routines/vn/procedures/itemShelving_getSaleDate.sql +++ b/db/routines/vn/procedures/itemShelving_getSaleDate.sql @@ -1,14 +1,20 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getSaleDate`(vShelvingFk VARCHAR(3)) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_getSaleDate`( + vShelvingCode VARCHAR(10) +) BEGIN - - /* Devuelve la mínima fecha en que se necesita cada producto en esa matrícula. - * - * @param vShelvingFk Matrícula del carro o pallet - */ - +/** + * Devuelve la mínima fecha en que se necesita cada producto en esa matrícula. + * + * @param vShelvingCode Matrícula del carro o pallet + */ DECLARE vWarehouseFk INT; DECLARE vStockScopeDays INT; + DECLARE vShelvingFk INT; + + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; SELECT s.warehouseFk, stockScopeDays INTO vWarehouseFk, vStockScopeDays @@ -30,7 +36,7 @@ BEGIN ENGINE = MEMORY SELECT itemFk, SUM(visible) visible FROM itemShelving - WHERE shelvingFk = vShelvingFk COLLATE utf8_unicode_ci + WHERE shelvingFk = vShelvingFk GROUP BY itemFk; CREATE OR REPLACE TEMPORARY TABLE tmp.tStockByDay @@ -52,7 +58,7 @@ BEGIN SELECT ish.itemFk, - SUM(ish.visible), util.VN_CURDATE() FROM itemShelving ish JOIN tmp.tItems i ON i.itemFk = ish.itemFk - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON sh.parkingFk = p.id JOIN sector s ON s.id = p.sectorFk WHERE s.isReserve @@ -110,7 +116,7 @@ BEGIN UPDATE tmp.tStockByDay sbd JOIN (SELECT ish.itemFK, SUM(ish.visible) amount FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk WHERE s.warehouseFk = vWarehouseFk @@ -150,10 +156,10 @@ BEGIN p.sectorFk, ish.shelvingFk FROM itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk LEFT JOIN parking p ON p.id = parkingFk LEFT JOIN vn.sector s ON s.id = p.sectorFk - WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci + WHERE ish.shelvingFk = vShelvingFk ) sub4 ON sub4.itemFk = ts.itemFk LEFT JOIN sector s ON s.id = sub4.sectorFk LEFT JOIN item i ON i.id = ts.itemFk diff --git a/db/routines/vn/procedures/itemShelving_inventory.sql b/db/routines/vn/procedures/itemShelving_inventory.sql index b57df02e01..9ae96c7a89 100644 --- a/db/routines/vn/procedures/itemShelving_inventory.sql +++ b/db/routines/vn/procedures/itemShelving_inventory.sql @@ -42,7 +42,7 @@ BEGIN JOIN item i ON i.id = ish.itemFk JOIN itemType it ON it.id = i.typeFk JOIN tmp.stockMisfit sm ON sm.itemFk = ish.itemFk - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk LEFT JOIN ( SELECT s.itemFk, sum(s.quantity) notPrepared diff --git a/db/routines/vn/procedures/itemShelving_selfConsumption.sql b/db/routines/vn/procedures/itemShelving_selfConsumption.sql index 083d8d74ce..5820b9d286 100644 --- a/db/routines/vn/procedures/itemShelving_selfConsumption.sql +++ b/db/routines/vn/procedures/itemShelving_selfConsumption.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_selfConsumption`( - vShelvingFk VARCHAR(10) COLLATE utf8_general_ci, + vShelvingCode VARCHAR(10) COLLATE utf8_general_ci, vItemFk INT, vQuantity INT ) @@ -9,9 +9,9 @@ BEGIN * Leave the indicated amount on the shelve * and create a ticket with the difference. * - * @param vShelvingFk id of the shelve where the item is located. - * @param vItemFk article of which the self-consumption ticket is to be created. - * @param vQuantity amount that will stay on the shelve + * @param vShelvingCode Code of the shelve where the item is located + * @param vItemFk Item of which the self-consumption ticket is to be created + * @param vQuantity Amount that will stay on the shelve */ DECLARE vVisible INT; DECLARE vClientFk INT; @@ -21,6 +21,11 @@ BEGIN DECLARE vAgencyModeFk INT; DECLARE vItemShelvingFk INT; DECLARE vAddressFk INT; + DECLARE vShelvingFk INT; + + SELECT id INTO vShelvingFk + FROM shelving + WHERE code = vShelvingCode; SELECT c.id, pc.clientSelfConsumptionFk, @@ -37,7 +42,7 @@ BEGIN JOIN parking p ON p.sectorFk = s.id JOIN shelving s2 ON s2.parkingFk = p.id JOIN productionConfig pc - WHERE s2.code = vShelvingFk; + WHERE s2.id = vShelvingFk; IF vClientFk IS NULL THEN CALL util.throw('The company does not have a customer assigned'); @@ -47,7 +52,7 @@ BEGIN CALL util.throw('The shelf cannot have NULL or negative quantities'); END IF; - IF vShelvingFk IS NULL THEN + IF vShelvingCode IS NULL THEN CALL util.throw('The shelf is necessary'); END IF; diff --git a/db/routines/vn/procedures/itemShelving_transfer.sql b/db/routines/vn/procedures/itemShelving_transfer.sql index 95d70227f8..e0e6af1102 100644 --- a/db/routines/vn/procedures/itemShelving_transfer.sql +++ b/db/routines/vn/procedures/itemShelving_transfer.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelving_transfer`( vItemShelvingFk INT, - vShelvingFk VARCHAR(10) + vShelvingCode VARCHAR(10) ) BEGIN /** @@ -9,9 +9,14 @@ BEGIN * fusionando si coincide el packing y la fecha. * * @param vItemShelvingFk Identificador de itemShelving - * @param vShelvingFk Identificador de shelving + * @param vShelvingCode Código de shelving */ DECLARE vNewItemShelvingFk INT; + DECLARE vShelvingFk INT; + + SELECT id INTO vShelvingFk + FROM shelving + WHERE code COLLATE utf8_unicode_ci = vShelvingCode; SELECT MAX(ish.id) INTO vNewItemShelvingFk FROM itemShelving ish @@ -26,7 +31,7 @@ BEGIN AND ish2.packing = ish.packing AND DATE(ish2.created) = DATE(ish.created) AND ish2.buyFk = ish.buyFk - WHERE ish.shelvingFk = vShelvingFk COLLATE utf8_unicode_ci; + WHERE ish.shelvingFk = vShelvingFk; IF vNewItemShelvingFk THEN UPDATE itemShelving ish @@ -38,9 +43,7 @@ BEGIN DELETE FROM itemShelving WHERE id = vItemShelvingFk; ELSE - IF (SELECT EXISTS(SELECT id FROM shelving - WHERE code = vShelvingFk COLLATE utf8_unicode_ci)) THEN - + IF (SELECT EXISTS(SELECT id FROM shelving WHERE id = vShelvingFk)) THEN UPDATE itemShelving SET shelvingFk = vShelvingFk WHERE id = vItemShelvingFk; diff --git a/db/routines/vn/procedures/item_devalueA2.sql b/db/routines/vn/procedures/item_devalueA2.sql index d0178f6a75..282f6e01e3 100644 --- a/db/routines/vn/procedures/item_devalueA2.sql +++ b/db/routines/vn/procedures/item_devalueA2.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_devalueA2`( vSelf INT, - vShelvingFK VARCHAR(10), + vShelvingCode VARCHAR(10), vBuyingValue DECIMAL(10,4), vQuantity INT ) @@ -12,7 +12,7 @@ BEGIN * de almacén y shelvings correspondientes * * @param vSelf Id de artículo a devaluar - * @param vShelvingFK Ubicación actual del artículo + * @param vShelvingCode Código de shelving / ubicación * @param vBuyingValue Nuevo precio de coste * @param vQuantity Cantidad del ítem a pasar a A2 */ @@ -109,10 +109,11 @@ BEGIN CALL util.throw ('The item has not a buy'); END IF; - SELECT id,visible INTO vTargetItemShelvingFk, vCurrentVisible - FROM itemShelving - WHERE shelvingFk = vShelvingFK COLLATE utf8mb3_general_ci - AND itemFk = vSelf + SELECT ish.id, ish.visible INTO vTargetItemShelvingFk, vCurrentVisible + FROM itemShelving ish + JOIN shelving sh ON sh.id = ish.shelvingFk + WHERE sh.code = vShelvingCode COLLATE utf8mb3_general_ci + AND ish.itemFk = vSelf LIMIT 1; IF vCurrentVisible IS NULL THEN @@ -388,16 +389,17 @@ BEGIN userFk, isChecked) SELECT vItemA2Fk, - shelvingFk, + ish.shelvingFk, vQuantity , - `grouping`, - packing, - packagingFk, + ish.`grouping`, + ish.packing, + ish.packagingFk, account.myUser_getId(), - isChecked - FROM itemShelving - WHERE itemFK = vSelf - AND shelvingFk = vShelvingFK COLLATE utf8mb3_general_ci + ish.isChecked + FROM itemShelving ish + JOIN shelving sh ON sh.id = ish.shelvingFk + WHERE ish.itemFK = vSelf + AND sh.code = vShelvingCode COLLATE utf8mb3_general_ci ON DUPLICATE KEY UPDATE visible = vQuantity + VALUES(visible); diff --git a/db/routines/vn/procedures/productionControl.sql b/db/routines/vn/procedures/productionControl.sql index 1d206e20db..813c65ab2c 100644 --- a/db/routines/vn/procedures/productionControl.sql +++ b/db/routines/vn/procedures/productionControl.sql @@ -217,7 +217,7 @@ proc: BEGIN st.code = 'previousPrepared' isPreviousPrepared, sc.itemPackingTypeFk FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector sc ON sc.id = p.sectorFk JOIN sectorType st ON st.id = sc.typeFk diff --git a/db/routines/vn/procedures/sale_boxPickingPrint.sql b/db/routines/vn/procedures/sale_boxPickingPrint.sql index 6bb954a783..aa4a14acd9 100644 --- a/db/routines/vn/procedures/sale_boxPickingPrint.sql +++ b/db/routines/vn/procedures/sale_boxPickingPrint.sql @@ -74,7 +74,7 @@ w1: WHILE vQuantity >= vPacking DO p.pickingOrder, ish.created FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk LEFT JOIN itemShelvingSale iss ON iss.itemShelvingFk = ish.id @@ -264,7 +264,7 @@ w1: WHILE vQuantity >= vPacking DO SELECT shelvingFk, p.code INTO vShelving, vParkingCode FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk WHERE ish.id = vItemShelvingFk; diff --git a/db/routines/vn/procedures/sale_getBoxPickingList.sql b/db/routines/vn/procedures/sale_getBoxPickingList.sql index f343ab3757..4f6a080837 100644 --- a/db/routines/vn/procedures/sale_getBoxPickingList.sql +++ b/db/routines/vn/procedures/sale_getBoxPickingList.sql @@ -41,7 +41,7 @@ BEGIN AND iss.created >= vDated GROUP BY iss.itemShelvingFk, s.itemFk) tISS ON tISS.itemFk = ish.itemFk AND tISS.itemShelvingFk = ish.id - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN tmp.productionBuffer pb ON pb.ticketFk = s.ticketFk JOIN agencyMode am ON am.id = pb.agencyModeFk diff --git a/db/routines/vn/procedures/sale_getProblems.sql b/db/routines/vn/procedures/sale_getProblems.sql index b50b4784da..f074b2a4a9 100644 --- a/db/routines/vn/procedures/sale_getProblems.sql +++ b/db/routines/vn/procedures/sale_getProblems.sql @@ -87,7 +87,7 @@ BEGIN SUM(ish.visible) visible, s.warehouseFk warehouseFk FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk GROUP BY ish.itemFk, s.warehouseFk; diff --git a/db/routines/vn/procedures/shelving_clean.sql b/db/routines/vn/procedures/shelving_clean.sql index 0b29968bc1..1553388271 100644 --- a/db/routines/vn/procedures/shelving_clean.sql +++ b/db/routines/vn/procedures/shelving_clean.sql @@ -12,12 +12,12 @@ BEGIN DELETE ish.* FROM itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk WHERE sh.parkingFk IS NULL AND ish.created < TIMESTAMPADD(WEEK,-1,util.VN_CURDATE()); UPDATE shelving sh - LEFT JOIN itemShelving its ON its.shelvingFk = sh.`code` + LEFT JOIN itemShelving its ON its.shelvingFk = sh.id SET isPrinted = 0, parkingFk = NULL WHERE its.id IS NULL @@ -27,11 +27,11 @@ UPDATE shelving sh OR sh.parked < util.VN_CURDATE() - INTERVAL 2 WEEK ) - AND IF(code REGEXP '^[A-Za-z]{2}[0-9]', LEFT (code, 2) NOT IN ( - SELECT DISTINCT LEFT(its.shelvingFk, 2) + SELECT DISTINCT LEFT(sh.code, 2) FROM itemShelving its - WHERE its.shelvingFk REGEXP '^[A-Za-z]{2}[0-9]' + JOIN shelving sh ON sh.id = its.shelvingFk + WHERE sh.code REGEXP '^[A-Za-z]{2}[0-9]' ), TRUE); END$$ From 5d908fd5f9e3ff6d553ab90ce24a1698f6e12979 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 13 Nov 2024 09:33:28 +0100 Subject: [PATCH 075/135] feat: refs #7641 improve style --- .../reports/entry-order/assets/css/style.css | 5 ++++ .../reports/entry-order/entry-order.html | 25 ++++++++++++------- .../reports/entry-order/locale/es.yml | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/print/templates/reports/entry-order/assets/css/style.css b/print/templates/reports/entry-order/assets/css/style.css index 1a5ea3eb6f..858ae704e2 100644 --- a/print/templates/reports/entry-order/assets/css/style.css +++ b/print/templates/reports/entry-order/assets/css/style.css @@ -22,4 +22,9 @@ h3 { .column-oriented th, .column-oriented td{ padding: 5px +} + +[row] { + display: flex; + column-gap: 5px; } \ No newline at end of file diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index 5ce306827c..cbdfa631f7 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -41,12 +41,13 @@
{{$t('reference')}} {{$t('boxes')}} {{$t('packing')}}{{$t('concept')}}{{$t('reference')}}{{$t('tags')}}{{$t('quantity')}}{{$t('price')}}{{$t('amount')}}{{$t('concept')}}{{$t('tags')}}{{$t('quantity')}}{{$t('price')}}{{$t('amount')}}
{{buy.comment}} {{buy.stickers}}x{{buy.packing}}{{buy.name}}{{buy.comment}} - {{buy.tag5}} → {{buy.value5}} - {{buy.tag6}} → {{buy.value6}} - {{buy.tag7}} → {{buy.value7}} + x{{buy.packing}}{{buy.name}} + {{buy.tag5}} → {{buy.value5}} + {{buy.tag6}} → {{buy.value6}} + {{buy.tag7}} → {{buy.value7}} {{buy.quantity | number($i18n.locale)}}x{{buy.buyingValue | currency('EUR', $i18n.locale)}}= + {{buy.quantity | number($i18n.locale)}}x{{buy.buyingValue | currency('EUR', $i18n.locale)}}= {{buy.buyingValue * buy.quantity | currency('EUR', $i18n.locale)}}
{{getTotalBy('stickers')}} {{getTotalBy('stickers')}}
- + - - + + + @@ -56,15 +57,20 @@ - + - - + + @@ -83,6 +89,7 @@ + diff --git a/print/templates/reports/entry-order/locale/es.yml b/print/templates/reports/entry-order/locale/es.yml index 5a6716ba13..9ec3578021 100644 --- a/print/templates/reports/entry-order/locale/es.yml +++ b/print/templates/reports/entry-order/locale/es.yml @@ -16,4 +16,5 @@ entry: Entrada {0} supplierData: Datos del proveedor notes: Notas reference: Referencia -tags: Tags \ No newline at end of file +tags: Etiquetas +code: Código \ No newline at end of file From 2273dc636e4652900fd816301d2baba335483bff Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 09:56:38 +0100 Subject: [PATCH 076/135] refactor: refs #7920 Major changes --- db/routines/vn/procedures/shelvingChange.sql | 11 +++++------ .../vn/procedures/shelvingParking_get.sql | 19 +++++++++++-------- .../vn/procedures/shelving_getSpam.sql | 4 ++-- .../ticketDown_PrintableSelection.sql | 2 +- .../vn/procedures/ticket_DelayTruckSplit.sql | 2 +- .../vn/procedures/ticket_getSplitList.sql | 2 +- db/routines/vn/views/itemShelvingList.sql | 2 +- .../itemShelvingPlacementSupplyStock.sql | 2 +- db/routines/vn/views/itemShelvingSaleSum.sql | 2 +- db/routines/vn/views/itemShelvingStock.sql | 2 +- .../vn/views/itemShelvingStockFull.sql | 2 +- 11 files changed, 26 insertions(+), 24 deletions(-) diff --git a/db/routines/vn/procedures/shelvingChange.sql b/db/routines/vn/procedures/shelvingChange.sql index 2e7e920822..f0756b385d 100644 --- a/db/routines/vn/procedures/shelvingChange.sql +++ b/db/routines/vn/procedures/shelvingChange.sql @@ -1,11 +1,10 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingChange`(IN `vShelvingO` VARCHAR(8), IN `vShelvingD` VARCHAR(8)) BEGIN - - UPDATE vn.itemShelving - SET shelvingFk = vShelvingD COLLATE utf8_unicode_ci - WHERE shelvingFk = vShelvingO COLLATE utf8_unicode_ci; - - + UPDATE itemShelving ish + JOIN shelving sh1 ON sh1.code = vShelvingD COLLATE utf8_unicode_ci + JOIN shelving sh2 ON sh2.code = vShelvingO COLLATE utf8_unicode_ci + SET ish.shelvingFk = sh1.id + WHERE ish.shelvingFk = sh2.id; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/shelvingParking_get.sql b/db/routines/vn/procedures/shelvingParking_get.sql index a9ed9f74ae..c05e8afc33 100644 --- a/db/routines/vn/procedures/shelvingParking_get.sql +++ b/db/routines/vn/procedures/shelvingParking_get.sql @@ -1,8 +1,10 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingParking_get`(vShelvingFk VARCHAR(10), vWarehouseFk INT, vDayRange INT) -BEGIN - - +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingParking_get`( + vShelvingCode VARCHAR(10), + vWarehouseFk INT, + vDayRange INT +) +BEGIN SELECT s.itemFk, s.concept, CAST(SUM(s.quantity) AS DECIMAL(10,0)) as sinServir, @@ -10,14 +12,15 @@ SELECT s.itemFk, FROM vn.sale s LEFT JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id JOIN vn.ticket t ON t.id = s.ticketFk - LEFT JOIN vn.itemShelvingStock ist ON ist.itemFk = s.itemFk AND ist.warehouseFk = vWarehouseFk - JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk AND ish.shelvingFk = vShelvingFk COLLATE utf8_general_ci + LEFT JOIN vn.itemShelvingStock ist ON ist.itemFk = s.itemFk + AND ist.warehouseFk = vWarehouseFk + JOIN vn.itemShelving ish ON ish.itemFk = s.itemFk + JOIN shelving sh ON sh.id = ish.shelvingFk + AND sh.code = vShelvingCode COLLATE utf8_general_ci WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(TIMESTAMPADD(DAY, GREATEST(0,vDayRange), util.VN_CURDATE())) AND iss.saleFk IS NULL AND t.warehouseFk = vWarehouseFk GROUP BY s.itemFk HAVING sinServir > aparcado; - - END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/shelving_getSpam.sql b/db/routines/vn/procedures/shelving_getSpam.sql index cef4072852..a80021cdfb 100644 --- a/db/routines/vn/procedures/shelving_getSpam.sql +++ b/db/routines/vn/procedures/shelving_getSpam.sql @@ -25,7 +25,7 @@ BEGIN LEFT JOIN ( SELECT ish.itemFk, CAST(SUM(ish.visible) AS DECIMAL(10,0)) AS reserva FROM vn.itemShelving ish - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk WHERE s.code = 'FUENTES_PICASSE' @@ -68,7 +68,7 @@ BEGIN sh.isSpam FROM vn.itemShelving ish JOIN vn.item i ON i.id = ish.itemFk - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk JOIN vn.warehouse w ON w.id = s.warehouseFk diff --git a/db/routines/vn/procedures/ticketDown_PrintableSelection.sql b/db/routines/vn/procedures/ticketDown_PrintableSelection.sql index 082a890a61..8f448d647a 100644 --- a/db/routines/vn/procedures/ticketDown_PrintableSelection.sql +++ b/db/routines/vn/procedures/ticketDown_PrintableSelection.sql @@ -9,7 +9,7 @@ BEGIN JOIN vn.sale s ON s.ticketFk = t.id JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id JOIN vn.itemShelving ish ON ish.id = iss.itemShelvingFk - JOIN vn.shelving sh ON sh.code = ish.shelvingFk + JOIN vn.shelving sh ON sh.id = ish.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk WHERE p.sectorFk = vSectorFk ) sub ON sub.id = td.ticketFk diff --git a/db/routines/vn/procedures/ticket_DelayTruckSplit.sql b/db/routines/vn/procedures/ticket_DelayTruckSplit.sql index 1dc45d065e..3d22207f3c 100644 --- a/db/routines/vn/procedures/ticket_DelayTruckSplit.sql +++ b/db/routines/vn/procedures/ticket_DelayTruckSplit.sql @@ -27,7 +27,7 @@ BEGIN SUM(ish.visible) visible, s.warehouseFk warehouseFk FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk GROUP BY ish.itemFk, diff --git a/db/routines/vn/procedures/ticket_getSplitList.sql b/db/routines/vn/procedures/ticket_getSplitList.sql index 988bc2931c..66e9bdb575 100644 --- a/db/routines/vn/procedures/ticket_getSplitList.sql +++ b/db/routines/vn/procedures/ticket_getSplitList.sql @@ -28,7 +28,7 @@ BEGIN SUM(ish.visible) visible, s.warehouseFk warehouseFk FROM itemShelving ish - JOIN shelving sh ON sh.code = ish.shelvingFk + JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk GROUP BY ish.itemFk, diff --git a/db/routines/vn/views/itemShelvingList.sql b/db/routines/vn/views/itemShelvingList.sql index 457d6f28a4..f2cfeda580 100644 --- a/db/routines/vn/views/itemShelvingList.sql +++ b/db/routines/vn/views/itemShelvingList.sql @@ -15,7 +15,7 @@ FROM ( ( ( `vn`.`itemShelving` `ish` - JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`) + JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`) ) JOIN `vn`.`item` `i` ON(`i`.`id` = `ish`.`itemFk`) ) diff --git a/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql b/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql index fa1c11314b..1ebb6410c0 100644 --- a/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql +++ b/db/routines/vn/views/itemShelvingPlacementSupplyStock.sql @@ -18,7 +18,7 @@ FROM ( ( ( `vn`.`itemShelving` `ish` - JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`) + JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`) ) LEFT JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`) ) diff --git a/db/routines/vn/views/itemShelvingSaleSum.sql b/db/routines/vn/views/itemShelvingSaleSum.sql index 9a402d6f4b..60581faa91 100644 --- a/db/routines/vn/views/itemShelvingSaleSum.sql +++ b/db/routines/vn/views/itemShelvingSaleSum.sql @@ -13,7 +13,7 @@ FROM ( `vn`.`itemShelvingSale` `iss` JOIN `vn`.`itemShelving` `ish` ON(`ish`.`id` = `iss`.`itemShelvingFk`) ) - JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`) + JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`) ) JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`) ) diff --git a/db/routines/vn/views/itemShelvingStock.sql b/db/routines/vn/views/itemShelvingStock.sql index 41777eaecc..725a06f886 100644 --- a/db/routines/vn/views/itemShelvingStock.sql +++ b/db/routines/vn/views/itemShelvingStock.sql @@ -21,7 +21,7 @@ FROM ( ( ( `vn`.`itemShelving` `ish` - LEFT JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`) + LEFT JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`) ) LEFT JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`) ) diff --git a/db/routines/vn/views/itemShelvingStockFull.sql b/db/routines/vn/views/itemShelvingStockFull.sql index c767823d6c..c8a82685c5 100644 --- a/db/routines/vn/views/itemShelvingStockFull.sql +++ b/db/routines/vn/views/itemShelvingStockFull.sql @@ -19,7 +19,7 @@ FROM ( ( ( `vn`.`itemShelving` `ish` - JOIN `vn`.`shelving` `sh` ON(`sh`.`code` = `ish`.`shelvingFk`) + JOIN `vn`.`shelving` `sh` ON(`sh`.`id` = `ish`.`shelvingFk`) ) JOIN `vn`.`parking` `p` ON(`p`.`id` = `sh`.`parkingFk`) ) From b3bf0024e30a73d43c0633e0d0780adc2cf8b6c7 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 11:15:31 +0100 Subject: [PATCH 077/135] refactor: refs #7920 Major changes --- back/methods/collection/getTickets.js | 4 ++-- db/routines/vn/procedures/entry_splitByShelving.sql | 4 ++-- db/routines/vn/procedures/itemShelvingLog_get.sql | 13 +++++++------ .../item/back/methods/item-shelving-sale/filter.js | 2 +- .../back/methods/item-shelving/getListItemNewer.js | 8 ++++---- modules/item/back/models/item-shelving.json | 3 +-- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/back/methods/collection/getTickets.js b/back/methods/collection/getTickets.js index 48301a3660..693358fb01 100644 --- a/back/methods/collection/getTickets.js +++ b/back/methods/collection/getTickets.js @@ -73,7 +73,7 @@ module.exports = Self => { JOIN item i ON i.id = s.itemFk JOIN itemShelvingSale iss ON iss.saleFk = s.id LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - LEFT JOIN shelving sh ON sh.code = ish.shelvingFk + LEFT JOIN shelving sh ON sh.id = ish.shelvingFk LEFT JOIN parking p ON p.id = sh.parkingFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN origin o ON o.id = i.originFk @@ -114,7 +114,7 @@ module.exports = Self => { JOIN item i ON i.id = s.itemFk JOIN itemShelvingSale iss ON iss.saleFk = s.id LEFT JOIN itemShelving ish ON ish.id = iss.itemShelvingFk - LEFT JOIN shelving sh ON sh.code = ish.shelvingFk + LEFT JOIN shelving sh ON sh.id = ish.shelvingFk LEFT JOIN parking p ON p.id = sh.parkingFk LEFT JOIN itemColor ic ON ic.itemFk = s.itemFk LEFT JOIN origin o ON o.id = i.originFk diff --git a/db/routines/vn/procedures/entry_splitByShelving.sql b/db/routines/vn/procedures/entry_splitByShelving.sql index 026c47daab..3201900e65 100644 --- a/db/routines/vn/procedures/entry_splitByShelving.sql +++ b/db/routines/vn/procedures/entry_splitByShelving.sql @@ -1,6 +1,6 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`entry_splitByShelving`( - vShelvingCode VARCHAR(3), + vShelvingCode VARCHAR(10), vFromEntryFk INT, vToEntryFk INT ) @@ -19,7 +19,7 @@ BEGIN DECLARE vDone BOOLEAN DEFAULT FALSE; DECLARE cur CURSOR FOR - SELECT bb.id buyFk, + SELECT bb.id buyFk, LEAST(bb.stickers, FLOOR(ish.visible / ish.packing)) ishStickers, bb.stickers buyStickers FROM itemShelving ish diff --git a/db/routines/vn/procedures/itemShelvingLog_get.sql b/db/routines/vn/procedures/itemShelvingLog_get.sql index 52e7a273fa..de4211e415 100644 --- a/db/routines/vn/procedures/itemShelvingLog_get.sql +++ b/db/routines/vn/procedures/itemShelvingLog_get.sql @@ -1,14 +1,14 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingLog_get`(vShelvingFk VARCHAR(10) ) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingLog_get`( + vShelvingFk VARCHAR(10) +) BEGIN - /** * Devuelve el log de los item en cada carro * * @param vShelvingFk Matrícula del carro * */ - SELECT isl.itemShelvingFk, isl.created, isl.accion, @@ -28,8 +28,9 @@ BEGIN FROM item JOIN itemShelvingLog isl ON item.id = isl.itemFk JOIN worker ON isl.workerFk = worker.id - WHERE shelvingFk = vShelvingFk OR isl.itemFk = vShelvingFk - ORDER BY isl.created DESC; - + JOIN shelving sh ON sh.id = isl.shelvingFk + WHERE sh.code = vShelvingFk COLLATE utf8mb3_unicode_ci + OR isl.itemFk = vShelvingFk -- ?? Respeto porque ya estaba + ORDER BY isl.created DESC; END$$ DELIMITER ; diff --git a/modules/item/back/methods/item-shelving-sale/filter.js b/modules/item/back/methods/item-shelving-sale/filter.js index 01a9f18566..edd04b61f4 100644 --- a/modules/item/back/methods/item-shelving-sale/filter.js +++ b/modules/item/back/methods/item-shelving-sale/filter.js @@ -41,7 +41,7 @@ module.exports = Self => { u.name FROM itemShelvingSale iss LEFT JOIN itemShelving ish ON iss.itemShelvingFk = ish.id - LEFT JOIN shelving s ON ish.shelvingFk = s.code + LEFT JOIN shelving s ON ish.shelvingFk = s.id LEFT JOIN parking p ON s.parkingFk = p.id LEFT JOIN account.user u ON u.id = iss.userFk` ); diff --git a/modules/item/back/methods/item-shelving/getListItemNewer.js b/modules/item/back/methods/item-shelving/getListItemNewer.js index 74c73532ab..5c4ca277d5 100644 --- a/modules/item/back/methods/item-shelving/getListItemNewer.js +++ b/modules/item/back/methods/item-shelving/getListItemNewer.js @@ -45,19 +45,19 @@ module.exports = Self => { WITH tItemShelving AS( SELECT is2.itemFk, is2.created, p.sectorFK, is2.id FROM vn.itemShelving is2 - JOIN vn.shelving sh ON sh.code = is2.shelvingFk + JOIN vn.shelving sh ON sh.id = is2.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk JOIN vn.productionConfig pc - WHERE is2.shelvingFk = ? AND s.code = pc.sectorFromCode + WHERE sh.code = ? AND s.code = pc.sectorFromCode ), tItemInSector AS ( SELECT is2.itemFk, is2.created, is2.shelvingFk FROM vn.itemShelving is2 - JOIN vn.shelving sh ON sh.code = is2.shelvingFk + JOIN vn.shelving sh ON sh.id = is2.shelvingFk JOIN vn.parking p ON p.id = sh.parkingFk JOIN vn.sector s ON s.id = p.sectorFk JOIN vn.productionConfig pc - WHERE is2.shelvingFk <> ? + WHERE sh.code <> ? AND s.code = pc.sectorFromCode) SELECT ti.itemFK, tis.shelvingFk FROM tItemShelving ti diff --git a/modules/item/back/models/item-shelving.json b/modules/item/back/models/item-shelving.json index 5df3b07039..9a0ebc61d6 100644 --- a/modules/item/back/models/item-shelving.json +++ b/modules/item/back/models/item-shelving.json @@ -57,8 +57,7 @@ "shelving": { "type": "belongsTo", "model": "Shelving", - "foreignKey": "shelvingFk", - "primaryKey": "code" + "foreignKey": "shelvingFk" } } } \ No newline at end of file From 755312b981fd89a6fb60b6d155d6d6792cec3fbb Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 11:51:23 +0100 Subject: [PATCH 078/135] refactor: refs #7920 Fix tests --- .../methods/item-shelving/getAlternative.js | 14 +++++++++++--- .../specs/updateFromSale.spec.js | 2 +- .../item-shelving/specs/upsertItem.spec.js | 19 ++++++++++++++----- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/modules/item/back/methods/item-shelving/getAlternative.js b/modules/item/back/methods/item-shelving/getAlternative.js index 8108bfa6ed..de34739bc0 100644 --- a/modules/item/back/methods/item-shelving/getAlternative.js +++ b/modules/item/back/methods/item-shelving/getAlternative.js @@ -3,7 +3,7 @@ module.exports = Self => { description: 'Returns a list of items and possible alternative locations', accessType: 'READ', accepts: [{ - arg: 'shelvingFk', + arg: 'shelvingCode', type: 'string', required: true, }], @@ -17,13 +17,21 @@ module.exports = Self => { } }); - Self.getAlternative = async(shelvingFk, options) => { + Self.getAlternative = async(shelvingCode, options) => { const models = Self.app.models; const myOptions = {}; if (typeof options == 'object') Object.assign(myOptions, options); + const shelving = await models.Shelving.findOne({ + where: { + code: shelvingCode + } + }); + + if (!shelving) return []; + const {id: shelvingFk} = shelving; const filterItemShelvings = { fields: ['id', 'visible', 'itemFk', 'shelvingFk'], where: {shelvingFk}, @@ -42,7 +50,7 @@ module.exports = Self => { if (itemShelvings) { const [alternatives] = await models.ItemShelving.rawSql('CALL vn.itemShelving_getAlternatives(?)', - [shelvingFk], myOptions + [shelvingCode], myOptions ); return itemShelvings.map(itemShelving => { const item = itemShelving.item(); diff --git a/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js index dfa2940006..2cdb5994b1 100644 --- a/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js +++ b/modules/item/back/methods/item-shelving/specs/updateFromSale.spec.js @@ -5,7 +5,7 @@ describe('itemShelving updateFromSale()', () => { const tx = await models.ItemBarcode.beginTransaction({}); const options = {transaction: tx}; const saleFk = 2; - const filter = {where: {itemFk: 4, shelvingFk: 'HEJ'} + const filter = {where: {itemFk: 4, shelvingFk: 12} }; try { const {visible: visibleBefore} = await models.ItemShelving.findOne(filter, options); diff --git a/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js b/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js index f01cb985df..edc8502114 100644 --- a/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js +++ b/modules/item/back/methods/item-shelving/specs/upsertItem.spec.js @@ -18,22 +18,31 @@ describe('ItemShelving upsertItem()', () => { }); it('should add two new records', async() => { - const shelvingFk = 'GVC'; + const shelvingCode = 'GVC'; const items = [1, 1, 1, 2]; - - await models.ItemShelving.upsertItem(ctx, shelvingFk, items, warehouseFk, options); + const {id: shelvingFk} = await models.Shelving.findOne({ + where: { + code: shelvingCode + } + }); + await models.ItemShelving.upsertItem(ctx, shelvingCode, items, warehouseFk, options); const itemShelvings = await models.ItemShelving.find({where: {shelvingFk}}, options); expect(itemShelvings.length).toEqual(2); }); it('should update the visible items', async() => { - const shelvingFk = 'GVC'; + const shelvingCode = 'GVC'; const items = [2, 2]; + const {id: shelvingFk} = await models.Shelving.findOne({ + where: { + code: shelvingCode + } + }); const {visible: visibleItemsBefore} = await models.ItemShelving.findOne({ where: {shelvingFk, itemFk: items[0]} }, options); - await models.ItemShelving.upsertItem(ctx, shelvingFk, items, warehouseFk, options); + await models.ItemShelving.upsertItem(ctx, shelvingCode, items, warehouseFk, options); const {visible: visibleItemsAfter} = await models.ItemShelving.findOne({ where: {shelvingFk, itemFk: items[0]} From 5a134668da73d8a7205856248d2b40b2e14de8fa Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 12:04:47 +0100 Subject: [PATCH 079/135] refactor: refs #7920 itemShelvingLog --- .../{00-firstScript.sql => 00-itemShelving.sql} | 6 +++--- .../11342-crimsonDendro/01-itemShelvingLog.sql | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) rename db/versions/11342-crimsonDendro/{00-firstScript.sql => 00-itemShelving.sql} (73%) create mode 100644 db/versions/11342-crimsonDendro/01-itemShelvingLog.sql diff --git a/db/versions/11342-crimsonDendro/00-firstScript.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql similarity index 73% rename from db/versions/11342-crimsonDendro/00-firstScript.sql rename to db/versions/11342-crimsonDendro/00-itemShelving.sql index 56bea2c032..7a173e2039 100644 --- a/db/versions/11342-crimsonDendro/00-firstScript.sql +++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql @@ -3,14 +3,14 @@ CREATE OR REPLACE TEMPORARY TABLE tItemShelving ENGINE = MEMORY SELECT ish.id, s.id shelvingFk FROM shelving s - JOIN itemShelving ish ON ish.shelvingFk = s.code; + JOIN itemShelving ish ON ish.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, MODIFY COLUMN shelvingFk int(11) NOT NULL; UPDATE itemShelving ish - JOIN tItemShelving tis ON tis.id = ish.id - SET ish.shelvingFk = tis.shelvingFk; + JOIN tItemShelving tish ON tish.id = ish.id + SET ish.shelvingFk = tish.shelvingFk; DROP TEMPORARY TABLE tItemShelving; diff --git a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql new file mode 100644 index 0000000000..05f04b5ffd --- /dev/null +++ b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql @@ -0,0 +1,14 @@ +CREATE OR REPLACE TEMPORARY TABLE tItemShelvingLog + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT ishl.id, s.id shelvingFk + FROM shelving s + JOIN itemShelvingLog ishl ON ishl.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; + +ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; + +UPDATE itemShelvingLog ishl + JOIN tItemShelvingLog tishl ON tishl.id = ishl.id + SET ishl.shelvingFk = tishl.shelvingFk; + +DROP TEMPORARY TABLE tItemShelvingLog; From 72e067ff81a589db4849b19c4eddd73c675ca780 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 12:53:18 +0100 Subject: [PATCH 080/135] fix: refs #7244 Added collection ACL --- db/versions/11343-silverAsparagus/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11343-silverAsparagus/00-firstScript.sql diff --git a/db/versions/11343-silverAsparagus/00-firstScript.sql b/db/versions/11343-silverAsparagus/00-firstScript.sql new file mode 100644 index 0000000000..3ca29e8b43 --- /dev/null +++ b/db/versions/11343-silverAsparagus/00-firstScript.sql @@ -0,0 +1,2 @@ +INSERT INTO salix.ACL (model,property,accessType,principalId) + VALUES ('Collection','*','WRITE','productionBoss'); From 344427da458857a3896dad0853d55a2d4c96dfd2 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 13:46:40 +0100 Subject: [PATCH 081/135] feat: refs #8151 moveExpeditions --- .../back/methods/expedition/moveExpeditions.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/ticket/back/methods/expedition/moveExpeditions.js b/modules/ticket/back/methods/expedition/moveExpeditions.js index 1c6689912f..3e9c95ec63 100644 --- a/modules/ticket/back/methods/expedition/moveExpeditions.js +++ b/modules/ticket/back/methods/expedition/moveExpeditions.js @@ -80,11 +80,19 @@ module.exports = Self => { const expeditionUpdated = expeditionToUpdate.updateAttribute('ticketFk', ticket.id, myOptions); promises.push(expeditionUpdated); } - await Promise.all(promises); + await models.Ticket.updateAll({id: ticket.id}, {packages: promises.length}, myOptions); + const state = await models.State.findOne({ + where: {code: 'PACKED'} + }, myOptions); + + await models.Ticket.state(ctx, { + ticketFk: ticket.id, + stateFk: state.id, + userFk: ctx.req.accessToken.userId + }, myOptions); if (tx) await tx.commit(); - return ticket; } catch (e) { if (tx) await tx.rollback(); From 018393fa93fec4d0642521852eb31686b569ac70 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 14:04:02 +0100 Subject: [PATCH 082/135] feat: refs #8151 Added test --- .../methods/expedition/moveExpeditions.js | 4 +- .../expedition/specs/moveExpeditions.spec.js | 44 ++++++++++++++++++- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/modules/ticket/back/methods/expedition/moveExpeditions.js b/modules/ticket/back/methods/expedition/moveExpeditions.js index 3e9c95ec63..3ad41897f2 100644 --- a/modules/ticket/back/methods/expedition/moveExpeditions.js +++ b/modules/ticket/back/methods/expedition/moveExpeditions.js @@ -82,9 +82,7 @@ module.exports = Self => { } await Promise.all(promises); await models.Ticket.updateAll({id: ticket.id}, {packages: promises.length}, myOptions); - const state = await models.State.findOne({ - where: {code: 'PACKED'} - }, myOptions); + const state = await models.State.findOne({where: {code: 'PACKED'}}); await models.Ticket.state(ctx, { ticketFk: ticket.id, diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js index c1c7c2c128..4c4971a0da 100644 --- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('ticket moveExpeditions()', () => { +fdescribe('ticket moveExpeditions()', () => { const ctx = beforeAll.getCtx(); it('should move the selected expeditions to new ticket', async() => { @@ -32,5 +32,45 @@ describe('ticket moveExpeditions()', () => { throw e; } }); -}); + it('should move expeditions to a new ticket, set state to PACKED, and update packages count correctly', async() => { + const tx = await models.Expedition.beginTransaction({}); + const myCtx = ctx; + + try { + const options = {transaction: tx}; + myCtx.args = { + clientId: 1101, + landed: Date.vnNew(), + warehouseId: 1, + addressId: 121, + agencyModeId: 1, + routeId: null, + expeditionIds: [1, 2] + }; + + const ticket = await models.Expedition.moveExpeditions(myCtx, options); + + const newestTicketIdInFixtures = 27; + + expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures); + + const updatedTicket = await models.Ticket.findById(ticket.id, null, options); + const packedState = await models.State.findOne({where: {code: 'PACKED'}}, options); + + const state = await models.TicketState.findOne({where: {ticketFk: ticket.id}}, options); + + expect(state.stateFk).toBe(packedState.id); + expect(state.userFk).toBe(myCtx.req.accessToken.userId); + + const expectedPackagesCount = myCtx.args.expeditionIds.length; + + expect(updatedTicket.$packages).toBe(expectedPackagesCount); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); +}); From d4a60f63c9125798d1a58474832542d11e80cc04 Mon Sep 17 00:00:00 2001 From: guillermo Date: Wed, 13 Nov 2024 14:05:03 +0100 Subject: [PATCH 083/135] feat: refs #8151 Added test --- .../back/methods/expedition/specs/moveExpeditions.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js index 4c4971a0da..2f0fd673cc 100644 --- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -fdescribe('ticket moveExpeditions()', () => { +describe('ticket moveExpeditions()', () => { const ctx = beforeAll.getCtx(); it('should move the selected expeditions to new ticket', async() => { From e1b0fc298cadabeb9e13cbc21fe3367e3728716b Mon Sep 17 00:00:00 2001 From: ivanm Date: Wed, 13 Nov 2024 20:26:54 +0100 Subject: [PATCH 084/135] feat: refs #8143 deprecate recoverPass and sync from account.user --- db/routines/account/views/myUser.sql | 3 +-- db/versions/11345-salmonEucalyptus/00-firstScript.sql | 2 ++ modules/account/back/locale/vn-user/en.yml | 2 -- modules/account/back/locale/vn-user/es.yml | 2 -- 4 files changed, 3 insertions(+), 6 deletions(-) create mode 100644 db/versions/11345-salmonEucalyptus/00-firstScript.sql diff --git a/db/routines/account/views/myUser.sql b/db/routines/account/views/myUser.sql index f520d893b7..8d927dc0f3 100644 --- a/db/routines/account/views/myUser.sql +++ b/db/routines/account/views/myUser.sql @@ -7,8 +7,7 @@ AS SELECT `u`.`id` AS `id`, `u`.`email` AS `email`, `u`.`nickname` AS `nickname`, `u`.`lang` AS `lang`, - `u`.`role` AS `role`, - `u`.`recoverPass` AS `recoverPass` + `u`.`role` AS `role` FROM `account`.`user` `u` WHERE `u`.`name` = `myUser_getName`() WITH CASCADED CHECK OPTION diff --git a/db/versions/11345-salmonEucalyptus/00-firstScript.sql b/db/versions/11345-salmonEucalyptus/00-firstScript.sql new file mode 100644 index 0000000000..ecbc36c40c --- /dev/null +++ b/db/versions/11345-salmonEucalyptus/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE account.user CHANGE recoverPass recoverPass__ tinyint(3) unsigned NOT NULL DEFAULT 1 COMMENT '@deprecated 2024-11-13'; +ALTER TABLE account.user CHANGE sync sync__ tinyint(4) NOT NULL DEFAULT 0 COMMENT '@deprecated 2024-11-13'; \ No newline at end of file diff --git a/modules/account/back/locale/vn-user/en.yml b/modules/account/back/locale/vn-user/en.yml index 51de7c40dd..f911ee1ebb 100644 --- a/modules/account/back/locale/vn-user/en.yml +++ b/modules/account/back/locale/vn-user/en.yml @@ -15,7 +15,5 @@ columns: image: image hasGrant: has grant userFk: user - recoverPass: recover password role: role - sync: pending sync lastPassChange: password changed diff --git a/modules/account/back/locale/vn-user/es.yml b/modules/account/back/locale/vn-user/es.yml index 85e8bc0dc2..c05dd872cc 100644 --- a/modules/account/back/locale/vn-user/es.yml +++ b/modules/account/back/locale/vn-user/es.yml @@ -15,7 +15,5 @@ columns: image: imagen hasGrant: puede delegar userFk: usuario - recoverPass: recuperar contraseña role: rol - sync: Pendiente de sincronizar lastPassChange: contraseña modificada From 9c0af7f7c6be825edcb1f04359c5d7f911d17df1 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 07:57:13 +0100 Subject: [PATCH 085/135] refactor: refs #7950 Requested changes --- loopback/common/methods/vn-model/printService.js | 2 +- modules/ticket/back/methods/ticket/saveCmr.js | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/loopback/common/methods/vn-model/printService.js b/loopback/common/methods/vn-model/printService.js index 12a6a67cc0..ed784229b3 100644 --- a/loopback/common/methods/vn-model/printService.js +++ b/loopback/common/methods/vn-model/printService.js @@ -2,7 +2,7 @@ const {Report, Email} = require('vn-print'); module.exports = Self => { Self.printReport = async function(ctx, id, reportName) { - const args = Object.assign({}, ctx.args); + const args = Object.assign({id}, ctx.args); const params = {lang: ctx.req.getLocale()}; delete args.ctx; diff --git a/modules/ticket/back/methods/ticket/saveCmr.js b/modules/ticket/back/methods/ticket/saveCmr.js index a96bb6a272..5ac7487512 100644 --- a/modules/ticket/back/methods/ticket/saveCmr.js +++ b/modules/ticket/back/methods/ticket/saveCmr.js @@ -53,8 +53,7 @@ module.exports = Self => { if (hasDmsCmr.length) throw new UserError('This ticket already has a cmr saved'); - Object.assign(ctx.args, {id: ticket.$cmrFk}); - const response = await models.Cmr.print(ctx, myOptions); + const response = await models.Cmr.print(ctx, ticket.$cmrFk, myOptions); const pdfStream = Readable.from(Buffer.from(response[0])); const data = { workerFk: ctx.req.accessToken.userId, From b7655b4f9208a807d217f1934f76806c5b740a6d Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 08:24:42 +0100 Subject: [PATCH 086/135] feat: refs #8057 Added geoFk columns --- db/versions/11346-yellowPhormium/00-address.sql | 4 ++++ db/versions/11346-yellowPhormium/01-client.sql | 7 +++++++ db/versions/11346-yellowPhormium/02-supplier.sql | 6 ++++++ 3 files changed, 17 insertions(+) create mode 100644 db/versions/11346-yellowPhormium/00-address.sql create mode 100644 db/versions/11346-yellowPhormium/01-client.sql create mode 100644 db/versions/11346-yellowPhormium/02-supplier.sql diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql new file mode 100644 index 0000000000..02e09bd00d --- /dev/null +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -0,0 +1,4 @@ +ALTER TABLE vn.address + ADD geoFk int(11) DEFAULT NULL NULL AFTER isLogifloraAllowed, + ADD CONSTRAINT address_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql new file mode 100644 index 0000000000..c58810fb10 --- /dev/null +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -0,0 +1,7 @@ +ALTER TABLE vn.client + CHANGE hasDailyInvoice hasDailyInvoice tinyint(1) DEFAULT 0 NOT NULL + COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice' + AFTER recommendedCredit, + ADD geoFk int(11) DEFAULT NULL NULL AFTER hasDailyInvoice, + ADD CONSTRAINT client_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql new file mode 100644 index 0000000000..f38202d5ef --- /dev/null +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -0,0 +1,6 @@ +ALTER TABLE vn.supplier + CHANGE companySize companySize enum('small','medium','big') CHARACTER SET utf8mb3 + COLLATE utf8mb3_general_ci DEFAULT NULL NULL AFTER stamp, + ADD geoFk int(11) DEFAULT NULL NULL AFTER companySize, + ADD CONSTRAINT supplier_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; From d4b0da50d0a60cab3e1da5c02358c2cdf060a190 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:00:19 +0100 Subject: [PATCH 087/135] feat: refs #8057 Added data updates --- .../11346-yellowPhormium/00-address.sql | 23 +++++++++++++-- .../11346-yellowPhormium/01-client.sql | 29 +++++++++++++++---- .../11346-yellowPhormium/02-supplier.sql | 27 +++++++++++++---- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index 02e09bd00d..8e13150723 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -1,4 +1,21 @@ ALTER TABLE vn.address - ADD geoFk int(11) DEFAULT NULL NULL AFTER isLogifloraAllowed, - ADD CONSTRAINT address_zoneGeo_FK FOREIGN KEY (geoFk) - REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + ADD geoFk int(11) DEFAULT NULL NULL AFTER isLogifloraAllowed, + ADD CONSTRAINT address_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + +CREATE OR REPLACE TEMPORARY TABLE tAddressGeo + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT a.id, p.geoFk + FROM address a + JOIN town t ON t.provinceFk = a.provinceFk + JOIN postCode p ON p.townFk = t.id + AND p.`code` = a.postalCode + GROUP BY a.id + ORDER BY (a.city SOUNDS LIKE t.`name`) DESC; + +UPDATE address a + JOIN tAddressGeo tag ON tag.id = a.id + SET a.geoFk = tag.geoFk; + +DROP TEMPORARY TABLE tAddressGeo; diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index c58810fb10..932b28ef57 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -1,7 +1,24 @@ ALTER TABLE vn.client - CHANGE hasDailyInvoice hasDailyInvoice tinyint(1) DEFAULT 0 NOT NULL - COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice' - AFTER recommendedCredit, - ADD geoFk int(11) DEFAULT NULL NULL AFTER hasDailyInvoice, - ADD CONSTRAINT client_zoneGeo_FK FOREIGN KEY (geoFk) - REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + CHANGE hasDailyInvoice hasDailyInvoice tinyint(1) DEFAULT 0 NOT NULL + COMMENT 'Indica si el cliente requiere facturación diaria por defecto se copiará lo que tenga country.hasDailyInvoice' + AFTER recommendedCredit, + ADD geoFk int(11) DEFAULT NULL NULL AFTER hasDailyInvoice, + ADD CONSTRAINT client_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + +CREATE OR REPLACE TEMPORARY TABLE tClientGeo + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT c.id, p.geoFk + FROM client c + JOIN town t ON t.provinceFk = c.provinceFk + JOIN postCode p ON p.townFk = t.id + AND p.`code` = c.postcode + GROUP BY c.id + ORDER BY (c.city SOUNDS LIKE t.`name`) DESC; + +UPDATE client c + JOIN tClientGeo tcg ON tcg.id = c.id + SET c.geoFk = tcg.geoFk; + +DROP TEMPORARY TABLE tClientGeo; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index f38202d5ef..ef5e04a43d 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -1,6 +1,23 @@ ALTER TABLE vn.supplier - CHANGE companySize companySize enum('small','medium','big') CHARACTER SET utf8mb3 - COLLATE utf8mb3_general_ci DEFAULT NULL NULL AFTER stamp, - ADD geoFk int(11) DEFAULT NULL NULL AFTER companySize, - ADD CONSTRAINT supplier_zoneGeo_FK FOREIGN KEY (geoFk) - REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + CHANGE companySize companySize enum('small','medium','big') CHARACTER SET utf8mb3 + COLLATE utf8mb3_general_ci DEFAULT NULL NULL AFTER stamp, + ADD geoFk int(11) DEFAULT NULL NULL AFTER companySize, + ADD CONSTRAINT supplier_zoneGeo_FK FOREIGN KEY (geoFk) + REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; + +CREATE OR REPLACE TEMPORARY TABLE tSupplierGeo + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT sa.supplierFk id, p.geoFk + FROM supplierAddress sa + JOIN town t ON t.provinceFk = sa.provinceFk + JOIN postCode p ON p.townFk = t.id + AND p.`code` = sa.postalCode + GROUP BY sa.supplierFk + ORDER BY (sa.city SOUNDS LIKE t.`name`) DESC; + +UPDATE supplier s + JOIN tSupplierGeo tsg ON tsg.id = s.id + SET s.geoFk = tsg.geoFk; + +DROP TEMPORARY TABLE tSupplierGeo; From cba1abad68cb90b238c3f0a7f7f4d158d247488c Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:27:38 +0100 Subject: [PATCH 088/135] feat: refs #8057 Added data updates --- db/routines/vn/functions/client_getGeo.sql | 25 +++++++++++++++++++ db/routines/vn/functions/supplier_getGeo.sql | 25 +++++++++++++++++++ .../vn/triggers/address_beforeInsert.sql | 1 + .../vn/triggers/address_beforeUpdate.sql | 6 ++++- .../vn/triggers/client_beforeInsert.sql | 8 +++--- .../vn/triggers/client_beforeUpdate.sql | 6 +++++ .../vn/triggers/supplier_beforeInsert.sql | 1 + .../vn/triggers/supplier_beforeUpdate.sql | 5 ++++ .../11346-yellowPhormium/02-supplier.sql | 12 ++++----- 9 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 db/routines/vn/functions/client_getGeo.sql create mode 100644 db/routines/vn/functions/supplier_getGeo.sql diff --git a/db/routines/vn/functions/client_getGeo.sql b/db/routines/vn/functions/client_getGeo.sql new file mode 100644 index 0000000000..067eb84bcb --- /dev/null +++ b/db/routines/vn/functions/client_getGeo.sql @@ -0,0 +1,25 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getGeo`(vSelf INT) + RETURNS int(11) + DETERMINISTIC +BEGIN +/** + * Returns the geo for the passed client. + * + * @param vSelf The address id + * @return The geo id + */ + DECLARE vGeoFk INT; + + SELECT p.geoFk INTO vGeoFk + FROM client c + JOIN town t ON t.provinceFk = c.provinceFk + JOIN postCode p ON p.townFk = t.id + AND p.`code` = c.postcode + WHERE c.id = vSelf + ORDER BY (c.city SOUNDS LIKE t.`name`) DESC + LIMIT 1; + + RETURN vGeoFk; +END$$ +DELIMITER ; diff --git a/db/routines/vn/functions/supplier_getGeo.sql b/db/routines/vn/functions/supplier_getGeo.sql new file mode 100644 index 0000000000..93115d712a --- /dev/null +++ b/db/routines/vn/functions/supplier_getGeo.sql @@ -0,0 +1,25 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`supplier_getGeo`(vSelf INT) + RETURNS int(11) + DETERMINISTIC +BEGIN +/** + * Returns the geo for the passed supplier. + * + * @param vSelf The address id + * @return The geo id + */ + DECLARE vGeoFk INT; + + SELECT p.geoFk INTO vGeoFk + FROM supplier s + JOIN town t ON t.provinceFk = s.provinceFk + JOIN postCode p ON p.townFk = t.id + AND p.`code` = s.postCode + WHERE s.id = vSelf + ORDER BY (s.city SOUNDS LIKE t.`name`) DESC + LIMIT 1; + + RETURN vGeoFk; +END$$ +DELIMITER ; diff --git a/db/routines/vn/triggers/address_beforeInsert.sql b/db/routines/vn/triggers/address_beforeInsert.sql index 56ef7aa515..a4f384f143 100644 --- a/db/routines/vn/triggers/address_beforeInsert.sql +++ b/db/routines/vn/triggers/address_beforeInsert.sql @@ -6,6 +6,7 @@ BEGIN DECLARE vIsEqualizated BOOL; SET NEW.editorFk = account.myUser_getId(); + SET NEW.geoFk = address_getGeo(NEW.id); IF (NEW.phone <> '') THEN CALL pbx.phone_isValid(NEW.phone); diff --git a/db/routines/vn/triggers/address_beforeUpdate.sql b/db/routines/vn/triggers/address_beforeUpdate.sql index 35887912c4..0b19a62664 100644 --- a/db/routines/vn/triggers/address_beforeUpdate.sql +++ b/db/routines/vn/triggers/address_beforeUpdate.sql @@ -3,7 +3,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`address_beforeUpdate` BEFORE UPDATE ON `address` FOR EACH ROW BEGIN - SET NEW.editorFk = account.myUser_getId(); IF !(NEW.phone <=> OLD.phone) AND (NEW.phone <> '') THEN @@ -14,5 +13,10 @@ BEGIN CALL pbx.phone_isValid(NEW.mobile); END IF; + IF NOT (NEW.provinceFk <=> OLD.provinceFk) + OR (NEW.postalCode <=> OLD.postalCode) THEN + + SET NEW.geoFk = address_getGeo(NEW.id); + END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/client_beforeInsert.sql b/db/routines/vn/triggers/client_beforeInsert.sql index 45de107f1e..b4038a2baa 100644 --- a/db/routines/vn/triggers/client_beforeInsert.sql +++ b/db/routines/vn/triggers/client_beforeInsert.sql @@ -3,8 +3,10 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`client_beforeInsert` BEFORE INSERT ON `client` FOR EACH ROW BEGIN - SET NEW.editorFk = account.myUser_getId(); + SET NEW.accountingAccount = 4300000000 + NEW.id; + SET NEW.lastSalesPersonFk = NEW.salesPersonFk; + SET NEW.geoFk = client_getGeo(NEW.id); IF (NEW.phone <> '') THEN CALL pbx.phone_isValid(NEW.phone); @@ -13,9 +15,5 @@ BEGIN IF (NEW.mobile <> '') THEN CALL pbx.phone_isValid(NEW.mobile); END IF; - - SET NEW.accountingAccount = 4300000000 + NEW.id; - - SET NEW.lastSalesPersonFk = NEW.salesPersonFk; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/client_beforeUpdate.sql b/db/routines/vn/triggers/client_beforeUpdate.sql index 7142d6604c..00418a9e7d 100644 --- a/db/routines/vn/triggers/client_beforeUpdate.sql +++ b/db/routines/vn/triggers/client_beforeUpdate.sql @@ -72,5 +72,11 @@ BEGIN IF NOT (NEW.businessTypeFk <=> OLD.businessTypeFk) AND (NEW.businessTypeFk = 'individual' OR OLD.businessTypeFk = 'individual') THEN SET NEW.isTaxDataChecked = 0; END IF; + + IF NOT (NEW.provinceFk <=> OLD.provinceFk) + OR (NEW.postcode <=> OLD.postcode) THEN + + SET NEW.geoFk = client_getGeo(NEW.id); + END IF; END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/supplier_beforeInsert.sql b/db/routines/vn/triggers/supplier_beforeInsert.sql index b141ec8fb7..5bbfc79a1a 100644 --- a/db/routines/vn/triggers/supplier_beforeInsert.sql +++ b/db/routines/vn/triggers/supplier_beforeInsert.sql @@ -4,5 +4,6 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`supplier_beforeInsert` FOR EACH ROW BEGIN SET NEW.editorFk = account.myUser_getId(); + SET NEW.geoFk = supplier_getGeo(NEW.id); END$$ DELIMITER ; diff --git a/db/routines/vn/triggers/supplier_beforeUpdate.sql b/db/routines/vn/triggers/supplier_beforeUpdate.sql index af730b49d9..10b63ee72a 100644 --- a/db/routines/vn/triggers/supplier_beforeUpdate.sql +++ b/db/routines/vn/triggers/supplier_beforeUpdate.sql @@ -40,5 +40,10 @@ BEGIN SET NEW.isPayMethodChecked = FALSE; END IF; + IF NOT (NEW.provinceFk <=> OLD.provinceFk) + OR (NEW.postcode <=> OLD.postcode) THEN + + SET NEW.geoFk = client_getGeo(NEW.id); + END IF; END$$ DELIMITER ; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index ef5e04a43d..b3e25bd7e3 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -8,13 +8,13 @@ ALTER TABLE vn.supplier CREATE OR REPLACE TEMPORARY TABLE tSupplierGeo (PRIMARY KEY (id)) ENGINE = MEMORY - SELECT sa.supplierFk id, p.geoFk - FROM supplierAddress sa - JOIN town t ON t.provinceFk = sa.provinceFk + SELECT s.id, p.geoFk + FROM supplier s + JOIN town t ON t.provinceFk = s.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = sa.postalCode - GROUP BY sa.supplierFk - ORDER BY (sa.city SOUNDS LIKE t.`name`) DESC; + AND p.`code` = s.postCode + GROUP BY s.id + ORDER BY (s.city SOUNDS LIKE t.`name`) DESC; UPDATE supplier s JOIN tSupplierGeo tsg ON tsg.id = s.id From bde192966e00803c883aa7a418ae7431ea018775 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:30:36 +0100 Subject: [PATCH 089/135] feat: refs #8057 Added data updates --- db/routines/vn/triggers/supplier_beforeUpdate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/supplier_beforeUpdate.sql b/db/routines/vn/triggers/supplier_beforeUpdate.sql index 10b63ee72a..55c6711854 100644 --- a/db/routines/vn/triggers/supplier_beforeUpdate.sql +++ b/db/routines/vn/triggers/supplier_beforeUpdate.sql @@ -43,7 +43,7 @@ BEGIN IF NOT (NEW.provinceFk <=> OLD.provinceFk) OR (NEW.postcode <=> OLD.postcode) THEN - SET NEW.geoFk = client_getGeo(NEW.id); + SET NEW.geoFk = supplier_getGeo(NEW.id); END IF; END$$ DELIMITER ; From b9397c527ddbaffc660b30005729bba3b6d44a3c Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:32:02 +0100 Subject: [PATCH 090/135] feat: refs #8057 Added data updates --- db/routines/vn/triggers/supplier_beforeUpdate.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/triggers/supplier_beforeUpdate.sql b/db/routines/vn/triggers/supplier_beforeUpdate.sql index 55c6711854..b502340a37 100644 --- a/db/routines/vn/triggers/supplier_beforeUpdate.sql +++ b/db/routines/vn/triggers/supplier_beforeUpdate.sql @@ -41,7 +41,7 @@ BEGIN END IF; IF NOT (NEW.provinceFk <=> OLD.provinceFk) - OR (NEW.postcode <=> OLD.postcode) THEN + OR (NEW.postCode <=> OLD.postCode) THEN SET NEW.geoFk = supplier_getGeo(NEW.id); END IF; From 5f50d842133451d5f6453d5f318aa57efa5bb9af Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:42:49 +0100 Subject: [PATCH 091/135] feat: refs #7244 Requested changes --- db/versions/11343-silverAsparagus/00-firstScript.sql | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/db/versions/11343-silverAsparagus/00-firstScript.sql b/db/versions/11343-silverAsparagus/00-firstScript.sql index 3ca29e8b43..4e69a532dc 100644 --- a/db/versions/11343-silverAsparagus/00-firstScript.sql +++ b/db/versions/11343-silverAsparagus/00-firstScript.sql @@ -1,2 +1,9 @@ -INSERT INTO salix.ACL (model,property,accessType,principalId) - VALUES ('Collection','*','WRITE','productionBoss'); +INSERT INTO salix.ACL (model, property, accessType, principalId) + VALUES ('Collection', 'create', 'WRITE', 'productionBoss'), + ('Collection', 'upsert', 'WRITE', 'productionBoss'), + ('Collection', 'replaceById', 'WRITE', 'productionBoss'), + ('Collection', 'updateAll', 'WRITE', 'productionBoss'), + ('Collection', 'updateAttributes', 'WRITE', 'productionBoss'), + ('Collection', 'deleteById', 'WRITE', 'productionBoss'), + ('Collection', 'destroyAll', 'WRITE', 'productionBoss'), + ('Collection', 'destroyById', 'WRITE', 'productionBoss'); \ No newline at end of file From 8449a6c6d337477b86564d34e7f6cccc93fca630 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:42:59 +0100 Subject: [PATCH 092/135] feat: refs #7244 Requested changes --- db/versions/11343-silverAsparagus/00-firstScript.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/versions/11343-silverAsparagus/00-firstScript.sql b/db/versions/11343-silverAsparagus/00-firstScript.sql index 4e69a532dc..bcee42eeac 100644 --- a/db/versions/11343-silverAsparagus/00-firstScript.sql +++ b/db/versions/11343-silverAsparagus/00-firstScript.sql @@ -6,4 +6,4 @@ INSERT INTO salix.ACL (model, property, accessType, principalId) ('Collection', 'updateAttributes', 'WRITE', 'productionBoss'), ('Collection', 'deleteById', 'WRITE', 'productionBoss'), ('Collection', 'destroyAll', 'WRITE', 'productionBoss'), - ('Collection', 'destroyById', 'WRITE', 'productionBoss'); \ No newline at end of file + ('Collection', 'destroyById', 'WRITE', 'productionBoss'); From d387486ea861154b88ae30a18a184c02f506209b Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 09:59:01 +0100 Subject: [PATCH 093/135] refactor: refs #7920 Requested changes --- db/routines/vn/procedures/itemShelvingLog_get.sql | 8 ++++---- db/routines/vn/procedures/item_devalueA2.sql | 6 +++--- .../vn/procedures/sale_boxPickingPrint.sql | 6 +++--- db/routines/vn/procedures/shelvingChange.sql | 15 +++++++++------ 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/db/routines/vn/procedures/itemShelvingLog_get.sql b/db/routines/vn/procedures/itemShelvingLog_get.sql index de4211e415..5a943e867b 100644 --- a/db/routines/vn/procedures/itemShelvingLog_get.sql +++ b/db/routines/vn/procedures/itemShelvingLog_get.sql @@ -1,12 +1,12 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`itemShelvingLog_get`( - vShelvingFk VARCHAR(10) + vShelvingCode VARCHAR(10) ) BEGIN /** * Devuelve el log de los item en cada carro * - * @param vShelvingFk Matrícula del carro + * @param vShelvingCode Matrícula del carro * */ SELECT isl.itemShelvingFk, @@ -29,8 +29,8 @@ BEGIN JOIN itemShelvingLog isl ON item.id = isl.itemFk JOIN worker ON isl.workerFk = worker.id JOIN shelving sh ON sh.id = isl.shelvingFk - WHERE sh.code = vShelvingFk COLLATE utf8mb3_unicode_ci - OR isl.itemFk = vShelvingFk -- ?? Respeto porque ya estaba + WHERE sh.code = vShelvingCode COLLATE utf8mb3_unicode_ci + OR isl.itemFk = vShelvingCode -- ?? Respeto porque ya estaba ORDER BY isl.created DESC; END$$ DELIMITER ; diff --git a/db/routines/vn/procedures/item_devalueA2.sql b/db/routines/vn/procedures/item_devalueA2.sql index 282f6e01e3..3264165a65 100644 --- a/db/routines/vn/procedures/item_devalueA2.sql +++ b/db/routines/vn/procedures/item_devalueA2.sql @@ -1,7 +1,7 @@ DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_devalueA2`( vSelf INT, - vShelvingCode VARCHAR(10), + vShelvingCode VARCHAR(10) COLLATE utf8mb3_general_ci, vBuyingValue DECIMAL(10,4), vQuantity INT ) @@ -112,7 +112,7 @@ BEGIN SELECT ish.id, ish.visible INTO vTargetItemShelvingFk, vCurrentVisible FROM itemShelving ish JOIN shelving sh ON sh.id = ish.shelvingFk - WHERE sh.code = vShelvingCode COLLATE utf8mb3_general_ci + WHERE sh.code = vShelvingCode AND ish.itemFk = vSelf LIMIT 1; @@ -399,7 +399,7 @@ BEGIN FROM itemShelving ish JOIN shelving sh ON sh.id = ish.shelvingFk WHERE ish.itemFK = vSelf - AND sh.code = vShelvingCode COLLATE utf8mb3_general_ci + AND sh.code = vShelvingCode ON DUPLICATE KEY UPDATE visible = vQuantity + VALUES(visible); diff --git a/db/routines/vn/procedures/sale_boxPickingPrint.sql b/db/routines/vn/procedures/sale_boxPickingPrint.sql index aa4a14acd9..f156ff8f81 100644 --- a/db/routines/vn/procedures/sale_boxPickingPrint.sql +++ b/db/routines/vn/procedures/sale_boxPickingPrint.sql @@ -27,7 +27,7 @@ BEGIN DECLARE vQuantity INT; DECLARE vRemainder INT DEFAULT 0; DECLARE vRemainderSaleFk INT; - DECLARE vShelving VARCHAR(10); + DECLARE vShelvingFk VARCHAR(10); DECLARE vTicketFk INT; SELECT s.quantity, @@ -262,7 +262,7 @@ w1: WHILE vQuantity >= vPacking DO CALL dipole.expedition_Add(vExpeditionFk,vPrinterFk, TRUE); SELECT shelvingFk, p.code - INTO vShelving, vParkingCode + INTO vShelvingFk, vParkingCode FROM itemShelving ish JOIN shelving sh ON sh.id = ish.shelvingFk JOIN parking p ON p.id = sh.parkingFk @@ -273,7 +273,7 @@ w1: WHILE vQuantity >= vPacking DO itemFk = vItemFk, quantity = vPacking, longName = vConcept, - shelvingFk = vShelving, + shelvingFk = vShelvingFk, parkingCode = vParkingCode, phone = RIGHT(phone,vMaxPhoneLength), street = RIGHT(street, vMAxStreetLength) diff --git a/db/routines/vn/procedures/shelvingChange.sql b/db/routines/vn/procedures/shelvingChange.sql index f0756b385d..901b1cf959 100644 --- a/db/routines/vn/procedures/shelvingChange.sql +++ b/db/routines/vn/procedures/shelvingChange.sql @@ -1,10 +1,13 @@ DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingChange`(IN `vShelvingO` VARCHAR(8), IN `vShelvingD` VARCHAR(8)) +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`shelvingChange`( + `vShelvingO` VARCHAR(10), + `vShelvingD` VARCHAR(10) +) BEGIN - UPDATE itemShelving ish - JOIN shelving sh1 ON sh1.code = vShelvingD COLLATE utf8_unicode_ci - JOIN shelving sh2 ON sh2.code = vShelvingO COLLATE utf8_unicode_ci - SET ish.shelvingFk = sh1.id - WHERE ish.shelvingFk = sh2.id; + UPDATE itemShelving ish + JOIN shelving sh1 ON sh1.code = vShelvingD COLLATE utf8_unicode_ci + JOIN shelving sh2 ON sh2.code = vShelvingO COLLATE utf8_unicode_ci + SET ish.shelvingFk = sh1.id + WHERE ish.shelvingFk = sh2.id; END$$ DELIMITER ; From 534b50f51a65ccea3d282aee57041c9c3641c6ac Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 10:45:28 +0100 Subject: [PATCH 094/135] feat: refs #8151 Requested changes --- .../expedition/specs/moveExpeditions.spec.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js index 2f0fd673cc..9c91df5d61 100644 --- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -describe('ticket moveExpeditions()', () => { +fdescribe('ticket moveExpeditions()', () => { const ctx = beforeAll.getCtx(); it('should move the selected expeditions to new ticket', async() => { @@ -17,14 +17,13 @@ describe('ticket moveExpeditions()', () => { agencyModeId: 1, routeId: null, expeditionIds: [1, 2] - }; - + const newestTicketIdInFixtures = await models.Ticket.findOne({ + order: 'id DESC' + }, options); const ticket = await models.Expedition.moveExpeditions(ctx, options); - const newestTicketIdInFixtures = 27; - - expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures); + expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures.id); await tx.rollback(); } catch (e) { @@ -49,11 +48,12 @@ describe('ticket moveExpeditions()', () => { expeditionIds: [1, 2] }; + const newestTicketIdInFixtures = await models.Ticket.findOne({ + order: 'id DESC' + }, options); const ticket = await models.Expedition.moveExpeditions(myCtx, options); - const newestTicketIdInFixtures = 27; - - expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures); + expect(ticket.id).toBeGreaterThan(newestTicketIdInFixtures.id); const updatedTicket = await models.Ticket.findById(ticket.id, null, options); const packedState = await models.State.findOne({where: {code: 'PACKED'}}, options); From b3dcaf4cf549fc9cdbf0f99ca1611c49e816ccd7 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 14 Nov 2024 10:53:13 +0100 Subject: [PATCH 095/135] feat: refs #8151 Requested changes --- .../back/methods/expedition/specs/moveExpeditions.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js index 9c91df5d61..0edae9c6a4 100644 --- a/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js +++ b/modules/ticket/back/methods/expedition/specs/moveExpeditions.spec.js @@ -1,6 +1,6 @@ const models = require('vn-loopback/server/server').models; -fdescribe('ticket moveExpeditions()', () => { +describe('ticket moveExpeditions()', () => { const ctx = beforeAll.getCtx(); it('should move the selected expeditions to new ticket', async() => { From c8ab5d434496dc14d53210546fd96e11d20f8796 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 11:16:45 +0100 Subject: [PATCH 096/135] fix: refs #6818 add defaultChannel --- back/models/say-simple-config.json | 3 +++ db/dump/fixtures.before.sql | 9 +++++---- db/versions/11347-redErica/00-firstScript.sql | 7 +++++++ 3 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 db/versions/11347-redErica/00-firstScript.sql diff --git a/back/models/say-simple-config.json b/back/models/say-simple-config.json index edc4caa43b..d5d4f8a6f3 100644 --- a/back/models/say-simple-config.json +++ b/back/models/say-simple-config.json @@ -13,6 +13,9 @@ }, "url": { "type": "string" + }, + "defaultChannel": { + "type": "number" } }, "acls": [ diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 68d8be097a..2af9e3c23c 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4024,8 +4024,9 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, 1169), - (8, 1183), - (NULL, 1320); + (8, 1183); -INSERT IGNORE INTO vn.saySimpleConfig (url) - VALUES ('saysimle-url-mock'); \ No newline at end of file +ALTER TABLE vn.saySimpleConfig ADD COLUMN defaultChannel TINYINT(4); + +INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) + VALUES ('saysimle-url-mock', 1320); \ No newline at end of file diff --git a/db/versions/11347-redErica/00-firstScript.sql b/db/versions/11347-redErica/00-firstScript.sql new file mode 100644 index 0000000000..dcd4c92488 --- /dev/null +++ b/db/versions/11347-redErica/00-firstScript.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS vn.saySimpleConfig; + +CREATE TABLE vn.saySimpleConfig( + id INT AUTO_INCREMENT PRIMARY KEY, + url VARCHAR(255) NOT NULL, + defaultChannel INT(4) +); \ No newline at end of file From a37332f7be6c7d2ab4b8aecfa61b7c91c14ff536 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 11:18:38 +0100 Subject: [PATCH 097/135] fix: refs #6818 add defaultChannel --- db/dump/fixtures.before.sql | 2 -- 1 file changed, 2 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 2af9e3c23c..eafd8c7217 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4026,7 +4026,5 @@ INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, 1169), (8, 1183); -ALTER TABLE vn.saySimpleConfig ADD COLUMN defaultChannel TINYINT(4); - INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) VALUES ('saysimle-url-mock', 1320); \ No newline at end of file From c4375b2505efee560cd0c710dc130368118a7422 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 15:29:18 +0100 Subject: [PATCH 098/135] feat: refs #7641 fine tunning --- print/templates/reports/entry-order/entry-order.html | 7 ++++++- print/templates/reports/entry-order/sql/buys.sql | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index cbdfa631f7..a4e153fa90 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -67,9 +67,14 @@
Color→ Lavanda
Altura→ 100cm
+
{{buy.tag5}}→ {{buy.value5}}
+
{{buy.tag6}}→ {{buy.value6}}
- label→ valor +
Color→ Lavanda
+
Altura→ 100cm
+
{{buy.tag7}}→ {{buy.value7}}
+
{{buy.tag8}}→ {{buy.value8}}
diff --git a/print/templates/reports/entry-order/sql/buys.sql b/print/templates/reports/entry-order/sql/buys.sql index 92c055483c..545849908a 100644 --- a/print/templates/reports/entry-order/sql/buys.sql +++ b/print/templates/reports/entry-order/sql/buys.sql @@ -10,7 +10,9 @@ SELECT b.itemFk, i.tag6, i.value6, i.tag7, - i.value7 + i.value7, + i.tag8, + i.value8 FROM buy b JOIN item i ON i.id = b.itemFk LEFT JOIN item i2 ON i2.id = b.itemOriginalFk From ab2e88806e70f748e23800662b3cb40a3bdd8a5c Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 15:29:54 +0100 Subject: [PATCH 099/135] fix: refs #7641 drop boilerplate code --- print/templates/reports/entry-order/entry-order.html | 4 ---- 1 file changed, 4 deletions(-) diff --git a/print/templates/reports/entry-order/entry-order.html b/print/templates/reports/entry-order/entry-order.html index a4e153fa90..90a95481f1 100644 --- a/print/templates/reports/entry-order/entry-order.html +++ b/print/templates/reports/entry-order/entry-order.html @@ -65,14 +65,10 @@
{{$t('reference')}}{{$t('code')}} {{$t('boxes')}} {{$t('packing')}}{{$t('concept')}}{{$t('tags')}}{{$t('concept')}}{{$t('reference')}}{{$t('tags')}} {{$t('quantity')}} {{$t('price')}}
{{buy.comment}}{{buy.itemFk}} {{buy.stickers}} x {{buy.packing}}{{buy.name}} - {{buy.tag5}} → {{buy.value5}} - {{buy.tag6}} → {{buy.value6}} - {{buy.tag7}} → {{buy.value7}} + {{buy.name}}referencia de prueba +
+
Color→ Lavanda
+
Altura→ 100cm
+
+
+ label→ valor +
{{buy.quantity | number($i18n.locale)}} x {{getTotalBy('quantity') | number($i18n.locale)}} {{buy.quantity | number($i18n.locale)}}referencia de prueba
-
Color→ Lavanda
-
Altura→ 100cm
{{buy.tag5}}→ {{buy.value5}}
{{buy.tag6}}→ {{buy.value6}}
-
Color→ Lavanda
-
Altura→ 100cm
{{buy.tag7}}→ {{buy.value7}}
{{buy.tag8}}→ {{buy.value8}}
From eff251fbb5d002e446ef0093f87aa8d7be3459d7 Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 15:46:51 +0100 Subject: [PATCH 100/135] feat: refs #7874 add default type --- db/versions/11348-bronzeCamellia/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11348-bronzeCamellia/00-firstScript.sql diff --git a/db/versions/11348-bronzeCamellia/00-firstScript.sql b/db/versions/11348-bronzeCamellia/00-firstScript.sql new file mode 100644 index 0000000000..fa466f1a4e --- /dev/null +++ b/db/versions/11348-bronzeCamellia/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.clientObservation MODIFY COLUMN observationTypeFk tinyint(3) unsigned DEFAULT 4 NOT NULL; +UPDATE vn.clientObservation SET observationTypeFk=4 WHERE observationTypeFk=0; From 9ac54f463a9a714e092f2da8006905f5c580e2cc Mon Sep 17 00:00:00 2001 From: pablone Date: Thu, 14 Nov 2024 15:48:11 +0100 Subject: [PATCH 101/135] fix: refs #7457 add with on select to reduce --- modules/order/back/methods/order/filter.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/order/back/methods/order/filter.js b/modules/order/back/methods/order/filter.js index eff2eecb60..307843d46d 100644 --- a/modules/order/back/methods/order/filter.js +++ b/modules/order/back/methods/order/filter.js @@ -23,7 +23,6 @@ module.exports = Self => { arg: 'from', type: 'date', description: 'The from date', - required: true }, { arg: 'to', type: 'date', @@ -153,7 +152,12 @@ module.exports = Self => { CREATE OR REPLACE TEMPORARY TABLE tmp.filter (INDEX (id)) ENGINE = MEMORY - SELECT o.id, + WITH wOrderTicket AS( + SELECT orderFk, + ticketFk + FROM orderTicket + GROUP BY orderFk + )SELECT o.id, o.total, o.date_send landed, o.date_make created, From 4766d25ddaddf7a551e4a9b5af88cc775f758e0c Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 15:54:53 +0100 Subject: [PATCH 102/135] feat: refs #7874 use name --- modules/client/back/models/client-observation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/client/back/models/client-observation.json b/modules/client/back/models/client-observation.json index 86351862d3..1d906420a3 100644 --- a/modules/client/back/models/client-observation.json +++ b/modules/client/back/models/client-observation.json @@ -55,7 +55,7 @@ "relation": "user", "scope": { "fields": [ - "nickname" + "name" ] } } From f96b9146494749f4e44ad6a3ce9d1844ecefdded Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 16:39:26 +0100 Subject: [PATCH 103/135] fix: refs #6818 use right col type --- db/dump/fixtures.before.sql | 4 ++-- db/versions/11347-redErica/00-firstScript.sql | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index eafd8c7217..c99f523b51 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4023,8 +4023,8 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) - VALUES (19, 1169), - (8, 1183); + VALUES (19, `1169`), + (8, `1183`); INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) VALUES ('saysimle-url-mock', 1320); \ No newline at end of file diff --git a/db/versions/11347-redErica/00-firstScript.sql b/db/versions/11347-redErica/00-firstScript.sql index dcd4c92488..5da1d6096c 100644 --- a/db/versions/11347-redErica/00-firstScript.sql +++ b/db/versions/11347-redErica/00-firstScript.sql @@ -3,5 +3,7 @@ DROP TABLE IF EXISTS vn.saySimpleConfig; CREATE TABLE vn.saySimpleConfig( id INT AUTO_INCREMENT PRIMARY KEY, url VARCHAR(255) NOT NULL, - defaultChannel INT(4) -); \ No newline at end of file + defaultChannel VARCHAR(128) +); + +ALTER TABLE vn.saySimpleCountry MODIFY COLUMN channel VARCHAR(128); \ No newline at end of file From 4b659c0b4822ac9db5ff0ac9652da72b57976c7f Mon Sep 17 00:00:00 2001 From: jorgep Date: Thu, 14 Nov 2024 16:39:35 +0100 Subject: [PATCH 104/135] fix: refs #6818 use right col type --- db/dump/fixtures.before.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index c99f523b51..cc258e2e38 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4023,8 +4023,8 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) - VALUES (19, `1169`), - (8, `1183`); + VALUES (19, '1169'), + (8, '1183'); INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) VALUES ('saysimle-url-mock', 1320); \ No newline at end of file From e344ae3bf2d1c109cf327477a6e7c12a2ec1bc6a Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 07:48:17 +0100 Subject: [PATCH 105/135] refactor: refs #7920 Fix version --- db/versions/11342-crimsonDendro/00-itemShelving.sql | 6 +++--- db/versions/11342-crimsonDendro/01-itemShelvingLog.sql | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/db/versions/11342-crimsonDendro/00-itemShelving.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql index 7a173e2039..90739c08aa 100644 --- a/db/versions/11342-crimsonDendro/00-itemShelving.sql +++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql @@ -2,13 +2,13 @@ CREATE OR REPLACE TEMPORARY TABLE tItemShelving (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ish.id, s.id shelvingFk - FROM shelving s - JOIN itemShelving ish ON ish.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; + FROM vn.shelving s + JOIN vn.itemShelving ish ON ish.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, MODIFY COLUMN shelvingFk int(11) NOT NULL; -UPDATE itemShelving ish +UPDATE vn.itemShelving ish JOIN tItemShelving tish ON tish.id = ish.id SET ish.shelvingFk = tish.shelvingFk; diff --git a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql index 05f04b5ffd..4289e4bca3 100644 --- a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql @@ -2,12 +2,12 @@ CREATE OR REPLACE TEMPORARY TABLE tItemShelvingLog (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ishl.id, s.id shelvingFk - FROM shelving s - JOIN itemShelvingLog ishl ON ishl.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; + FROM vn.shelving s + JOIN vn.itemShelvingLog ishl ON ishl.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; -UPDATE itemShelvingLog ishl +UPDATE vn.itemShelvingLog ishl JOIN tItemShelvingLog tishl ON tishl.id = ishl.id SET ishl.shelvingFk = tishl.shelvingFk; From e49285ace8eadae94c6601e7f2d015e9731e754e Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 07:51:37 +0100 Subject: [PATCH 106/135] refactor: refs #7920 Fix version --- db/versions/11342-crimsonDendro/00-itemShelving.sql | 4 ++-- db/versions/11342-crimsonDendro/01-itemShelvingLog.sql | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/db/versions/11342-crimsonDendro/00-itemShelving.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql index 90739c08aa..706affb2fa 100644 --- a/db/versions/11342-crimsonDendro/00-itemShelving.sql +++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql @@ -1,4 +1,4 @@ -CREATE OR REPLACE TEMPORARY TABLE tItemShelving +CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelving (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ish.id, s.id shelvingFk @@ -12,7 +12,7 @@ UPDATE vn.itemShelving ish JOIN tItemShelving tish ON tish.id = ish.id SET ish.shelvingFk = tish.shelvingFk; -DROP TEMPORARY TABLE tItemShelving; +DROP TEMPORARY TABLE tmp.tItemShelving; ALTER TABLE vn.itemShelving ADD CONSTRAINT itemShelving_shelving_FK FOREIGN KEY (shelvingFk) REFERENCES vn.shelving(id) diff --git a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql index 4289e4bca3..f9ae025a69 100644 --- a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql @@ -1,4 +1,4 @@ -CREATE OR REPLACE TEMPORARY TABLE tItemShelvingLog +CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ishl.id, s.id shelvingFk @@ -11,4 +11,4 @@ UPDATE vn.itemShelvingLog ishl JOIN tItemShelvingLog tishl ON tishl.id = ishl.id SET ishl.shelvingFk = tishl.shelvingFk; -DROP TEMPORARY TABLE tItemShelvingLog; +DROP TEMPORARY TABLE tmp.tItemShelvingLog; From b5463e5560ad91c3a20acb52895cc1d830cf6ecf Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 07:54:33 +0100 Subject: [PATCH 107/135] refactor: refs #7920 Fix version --- db/versions/11342-crimsonDendro/00-itemShelving.sql | 2 +- db/versions/11342-crimsonDendro/01-itemShelvingLog.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/db/versions/11342-crimsonDendro/00-itemShelving.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql index 706affb2fa..a7b137ca51 100644 --- a/db/versions/11342-crimsonDendro/00-itemShelving.sql +++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql @@ -9,7 +9,7 @@ ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, MODIFY COLUMN shelvingFk int(11) NOT NULL; UPDATE vn.itemShelving ish - JOIN tItemShelving tish ON tish.id = ish.id + JOIN tmp.tItemShelving tish ON tish.id = ish.id SET ish.shelvingFk = tish.shelvingFk; DROP TEMPORARY TABLE tmp.tItemShelving; diff --git a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql index f9ae025a69..bcf217cfc9 100644 --- a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql @@ -8,7 +8,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; UPDATE vn.itemShelvingLog ishl - JOIN tItemShelvingLog tishl ON tishl.id = ishl.id + JOIN tmp.tItemShelvingLog tishl ON tishl.id = ishl.id SET ishl.shelvingFk = tishl.shelvingFk; DROP TEMPORARY TABLE tmp.tItemShelvingLog; From 7a4455d6d01d2fe4a3157f94889e4b928edc807c Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 15 Nov 2024 08:12:16 +0100 Subject: [PATCH 108/135] feat: refs #6869 refs#6869 itemShelving_get --- .../vn/procedures/itemShelving_get.sql | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 db/routines/vn/procedures/itemShelving_get.sql diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql new file mode 100644 index 0000000000..07384b7216 --- /dev/null +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -0,0 +1,30 @@ +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 ; From e1a091535e454838f5a2409860c4d8172d7c9699 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 08:45:28 +0100 Subject: [PATCH 109/135] refactor: refs #7920 Fix version --- .../11342-crimsonDendro/00-itemShelving.sql | 18 ++---------------- .../11342-crimsonDendro/01-itemShelving.sql | 2 ++ .../11342-crimsonDendro/01-itemShelvingLog.sql | 14 -------------- .../11342-crimsonDendro/02-itemShelving.sql | 3 +++ .../11342-crimsonDendro/03-itemShelving.sql | 4 ++++ .../11342-crimsonDendro/04-itemShelvingLog.sql | 6 ++++++ .../11342-crimsonDendro/05-itemShelvingLog.sql | 1 + .../11342-crimsonDendro/06-itemShelvingLog.sql | 5 +++++ 8 files changed, 23 insertions(+), 30 deletions(-) create mode 100644 db/versions/11342-crimsonDendro/01-itemShelving.sql delete mode 100644 db/versions/11342-crimsonDendro/01-itemShelvingLog.sql create mode 100644 db/versions/11342-crimsonDendro/02-itemShelving.sql create mode 100644 db/versions/11342-crimsonDendro/03-itemShelving.sql create mode 100644 db/versions/11342-crimsonDendro/04-itemShelvingLog.sql create mode 100644 db/versions/11342-crimsonDendro/05-itemShelvingLog.sql create mode 100644 db/versions/11342-crimsonDendro/06-itemShelvingLog.sql diff --git a/db/versions/11342-crimsonDendro/00-itemShelving.sql b/db/versions/11342-crimsonDendro/00-itemShelving.sql index a7b137ca51..4d083bf973 100644 --- a/db/versions/11342-crimsonDendro/00-itemShelving.sql +++ b/db/versions/11342-crimsonDendro/00-itemShelving.sql @@ -2,19 +2,5 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelving (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ish.id, s.id shelvingFk - FROM vn.shelving s - JOIN vn.itemShelving ish ON ish.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; - -ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, - MODIFY COLUMN shelvingFk int(11) NOT NULL; - -UPDATE vn.itemShelving ish - JOIN tmp.tItemShelving tish ON tish.id = ish.id - SET ish.shelvingFk = tish.shelvingFk; - -DROP TEMPORARY TABLE tmp.tItemShelving; - -ALTER TABLE vn.itemShelving - ADD CONSTRAINT itemShelving_shelving_FK FOREIGN KEY (shelvingFk) REFERENCES vn.shelving(id) - ON DELETE RESTRICT - ON UPDATE CASCADE; + FROM vn.itemShelving ish + JOIN vn.shelving s ON s.code = ish.shelvingFk COLLATE utf8mb3_unicode_ci; diff --git a/db/versions/11342-crimsonDendro/01-itemShelving.sql b/db/versions/11342-crimsonDendro/01-itemShelving.sql new file mode 100644 index 0000000000..23099ac6b1 --- /dev/null +++ b/db/versions/11342-crimsonDendro/01-itemShelving.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.itemShelving DROP FOREIGN KEY itemShelving_fk2, + MODIFY COLUMN shelvingFk int(11) NOT NULL; diff --git a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql deleted file mode 100644 index bcf217cfc9..0000000000 --- a/db/versions/11342-crimsonDendro/01-itemShelvingLog.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog - (PRIMARY KEY (id)) - ENGINE = MEMORY - SELECT ishl.id, s.id shelvingFk - FROM vn.shelving s - JOIN vn.itemShelvingLog ishl ON ishl.shelvingFk = s.code COLLATE utf8mb3_unicode_ci; - -ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; - -UPDATE vn.itemShelvingLog ishl - JOIN tmp.tItemShelvingLog tishl ON tishl.id = ishl.id - SET ishl.shelvingFk = tishl.shelvingFk; - -DROP TEMPORARY TABLE tmp.tItemShelvingLog; diff --git a/db/versions/11342-crimsonDendro/02-itemShelving.sql b/db/versions/11342-crimsonDendro/02-itemShelving.sql new file mode 100644 index 0000000000..9d0e65d0bf --- /dev/null +++ b/db/versions/11342-crimsonDendro/02-itemShelving.sql @@ -0,0 +1,3 @@ +UPDATE vn.itemShelving ish + JOIN tmp.tItemShelving tish ON tish.id = ish.id + SET ish.shelvingFk = tish.shelvingFk; \ No newline at end of file diff --git a/db/versions/11342-crimsonDendro/03-itemShelving.sql b/db/versions/11342-crimsonDendro/03-itemShelving.sql new file mode 100644 index 0000000000..cb9825bfc6 --- /dev/null +++ b/db/versions/11342-crimsonDendro/03-itemShelving.sql @@ -0,0 +1,4 @@ +ALTER TABLE vn.itemShelving + ADD CONSTRAINT itemShelving_shelving_FK FOREIGN KEY (shelvingFk) REFERENCES vn.shelving(id) + ON DELETE RESTRICT + ON UPDATE CASCADE; diff --git a/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql new file mode 100644 index 0000000000..fbf9978252 --- /dev/null +++ b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql @@ -0,0 +1,6 @@ +CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog + (PRIMARY KEY (id)) + ENGINE = MEMORY + SELECT ishl.id, s.id shelvingFk + FROM vn.itemShelvingLog ishl + JOIN vn.shelving s ON s.code = ishl.shelvingFk COLLATE utf8mb3_unicode_ci; diff --git a/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql new file mode 100644 index 0000000000..88daedc364 --- /dev/null +++ b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql @@ -0,0 +1 @@ +ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; diff --git a/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql new file mode 100644 index 0000000000..3ebe32d7f0 --- /dev/null +++ b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql @@ -0,0 +1,5 @@ +UPDATE vn.itemShelvingLog ishl + JOIN tmp.tItemShelvingLog tishl ON tishl.id = ishl.id + SET ishl.shelvingFk = tishl.shelvingFk; + +DROP TEMPORARY TABLE tmp.tItemShelvingLog; From 07318656b78ebde742ad48a9b36bff327a7755d8 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Fri, 15 Nov 2024 08:47:30 +0100 Subject: [PATCH 110/135] feat: refs #8135 refs#8135 updateTicketACL --- db/versions/11349-azureBamboo/00-firstScript.sql | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 db/versions/11349-azureBamboo/00-firstScript.sql diff --git a/db/versions/11349-azureBamboo/00-firstScript.sql b/db/versions/11349-azureBamboo/00-firstScript.sql new file mode 100644 index 0000000000..09c919b795 --- /dev/null +++ b/db/versions/11349-azureBamboo/00-firstScript.sql @@ -0,0 +1,7 @@ + + +UPDATE salix.ACL + SET principalId = 'deliveryAssistant' +WHERE model = 'Ticket' + AND property = 'updateAttributes' + AND principalId = "delivery"; From c5f1b05671c6fefaa22df376af105589dd60b402 Mon Sep 17 00:00:00 2001 From: robert Date: Fri, 15 Nov 2024 11:32:20 +0100 Subject: [PATCH 111/135] feat: refs #8127 quitar esquemas --- db/routines/vn/functions/entry_getCommission.sql | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/functions/entry_getCommission.sql b/db/routines/vn/functions/entry_getCommission.sql index 898ac85210..a4afdabd48 100644 --- a/db/routines/vn/functions/entry_getCommission.sql +++ b/db/routines/vn/functions/entry_getCommission.sql @@ -25,18 +25,17 @@ BEGIN LIMIT 1; RETURN IFNULL(vCommission, 0); - ELSE SELECT e.id INTO vLastEntryFk - FROM vn.entry e - JOIN vn.travel tr ON tr.id = e.travelFk + FROM `entry` e + JOIN 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 + FROM `entry` WHERE id = vLastEntryFk; ELSE @@ -47,8 +46,6 @@ BEGIN END IF; RETURN vCurrentCommission; - END IF; - END$$ DELIMITER ; From a3945070f2faf7fc83a8a7d5f099d0113fdf3965 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 11:34:18 +0100 Subject: [PATCH 112/135] refactor: refs #7920 No changes in itemShelvingLog table --- db/versions/11342-crimsonDendro/04-itemShelvingLog.sql | 2 ++ db/versions/11342-crimsonDendro/05-itemShelvingLog.sql | 2 +- db/versions/11342-crimsonDendro/06-itemShelvingLog.sql | 2 ++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql index fbf9978252..1135b9d091 100644 --- a/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/04-itemShelvingLog.sql @@ -1,6 +1,8 @@ +/* CREATE OR REPLACE TEMPORARY TABLE tmp.tItemShelvingLog (PRIMARY KEY (id)) ENGINE = MEMORY SELECT ishl.id, s.id shelvingFk FROM vn.itemShelvingLog ishl JOIN vn.shelving s ON s.code = ishl.shelvingFk COLLATE utf8mb3_unicode_ci; +*/ diff --git a/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql index 88daedc364..b0e3b55cca 100644 --- a/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/05-itemShelvingLog.sql @@ -1 +1 @@ -ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; +-- ALTER TABLE vn.itemShelvingLog MODIFY COLUMN shelvingFk int(11) NOT NULL; diff --git a/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql index 3ebe32d7f0..f97f61e42e 100644 --- a/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql +++ b/db/versions/11342-crimsonDendro/06-itemShelvingLog.sql @@ -1,5 +1,7 @@ +/* UPDATE vn.itemShelvingLog ishl JOIN tmp.tItemShelvingLog tishl ON tishl.id = ishl.id SET ishl.shelvingFk = tishl.shelvingFk; DROP TEMPORARY TABLE tmp.tItemShelvingLog; +*/ \ No newline at end of file From b529ccfe2919102c548e3401ee45f94073164600 Mon Sep 17 00:00:00 2001 From: guillermo Date: Fri, 15 Nov 2024 12:43:15 +0100 Subject: [PATCH 113/135] feat: refs #7920 Added ItemShelving in shelvingLog --- db/versions/11350-silverArborvitae/00-firstScript.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 db/versions/11350-silverArborvitae/00-firstScript.sql diff --git a/db/versions/11350-silverArborvitae/00-firstScript.sql b/db/versions/11350-silverArborvitae/00-firstScript.sql new file mode 100644 index 0000000000..b5e87133e4 --- /dev/null +++ b/db/versions/11350-silverArborvitae/00-firstScript.sql @@ -0,0 +1,2 @@ +ALTER TABLE vn.shelvingLog + MODIFY COLUMN changedModel enum('Shelving', 'ItemShelving') CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci DEFAULT 'Shelving' NOT NULL; From 6c00efae895790e83d0541bf6212215c3c0b3e30 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Sun, 17 Nov 2024 17:57:54 +0100 Subject: [PATCH 114/135] feat: refs #7289 #7289 apply option 1 --- loopback/locale/en.json | 4 +++- loopback/locale/es.json | 6 ++++-- modules/ticket/back/methods/ticket/transferSales.js | 3 +++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 95f6ff3260..86ebebc896 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -244,5 +244,7 @@ "Invalid or expired verification code": "Invalid or expired verification code", "There are tickets for this area, delete them first": "There are tickets for this area, delete them first", "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}", - "Payment method is required": "Payment method is required" + "Payment method is required": "Payment method is required", + "Sales already moved": "Sales already moved" + } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 37976c0eae..a68fcc4e45 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -387,5 +387,7 @@ "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", "ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}", - "The web user's email already exists": "El correo del usuario web ya existe" -} \ No newline at end of file + "The web user's email already exists": "El correo del usuario web ya existe", + "Sales already moved": "Ya han sido transferidas", + "Línea ya ha sido transferida": "Línea ya ha sido transferida" +} diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js index 5f5fdde674..bc3c467d7a 100644 --- a/modules/ticket/back/methods/ticket/transferSales.js +++ b/modules/ticket/back/methods/ticket/transferSales.js @@ -80,6 +80,9 @@ module.exports = Self => { const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}}); if (ticketId != id && hasClaimedSales) throw new UserError(`Can't transfer claimed sales`); + const missingSales = sales.some(({id}) => !map.has(id)); + if (missingSales) + throw new UserError($t('Sales already moved')); for (const sale of sales) { const originalSale = map.get(sale.id); From 353ca659cd98d133632c5a0e90ef332d9d1438b7 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 08:58:38 +0100 Subject: [PATCH 115/135] feat: refs #8057 Requested changes --- db/routines/vn/functions/address_getGeo.sql | 5 +++-- db/routines/vn/functions/client_getGeo.sql | 4 ++-- db/routines/vn/functions/supplier_getGeo.sql | 6 ++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/db/routines/vn/functions/address_getGeo.sql b/db/routines/vn/functions/address_getGeo.sql index 04155c30cc..248e8c787e 100644 --- a/db/routines/vn/functions/address_getGeo.sql +++ b/db/routines/vn/functions/address_getGeo.sql @@ -14,9 +14,10 @@ BEGIN SELECT p.geoFk INTO vGeoFk FROM address a JOIN town t ON t.provinceFk = a.provinceFk - JOIN postCode p ON p.townFk = t.id AND p.`code` = a.postalCode + JOIN postCode p ON p.townFk = t.id WHERE a.id = vSelf - ORDER BY (a.city SOUNDS LIKE t.`name`) DESC + ORDER BY (a.city SOUNDS LIKE t.name) DESC, + (p.code = a.postalCode) DESC LIMIT 1; RETURN vGeoFk; diff --git a/db/routines/vn/functions/client_getGeo.sql b/db/routines/vn/functions/client_getGeo.sql index 067eb84bcb..624becf1ef 100644 --- a/db/routines/vn/functions/client_getGeo.sql +++ b/db/routines/vn/functions/client_getGeo.sql @@ -15,9 +15,9 @@ BEGIN FROM client c JOIN town t ON t.provinceFk = c.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = c.postcode WHERE c.id = vSelf - ORDER BY (c.city SOUNDS LIKE t.`name`) DESC + ORDER BY (c.city SOUNDS LIKE t.name) DESC, + (p.code = c.postcode) DESC LIMIT 1; RETURN vGeoFk; diff --git a/db/routines/vn/functions/supplier_getGeo.sql b/db/routines/vn/functions/supplier_getGeo.sql index 93115d712a..29b6736f36 100644 --- a/db/routines/vn/functions/supplier_getGeo.sql +++ b/db/routines/vn/functions/supplier_getGeo.sql @@ -15,9 +15,11 @@ BEGIN FROM supplier s JOIN town t ON t.provinceFk = s.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = s.postCode + LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id WHERE s.id = vSelf - ORDER BY (s.city SOUNDS LIKE t.`name`) DESC + ORDER BY (s.city SOUNDS LIKE t.name) DESC, + (p.code = s.postCode) DESC, + (p.code = sad.postalCode) DESC LIMIT 1; RETURN vGeoFk; From 9558d030ff8baa3b1d2a81af61f5b5e692fc4199 Mon Sep 17 00:00:00 2001 From: Javier Segarra Date: Mon, 18 Nov 2024 10:10:30 +0100 Subject: [PATCH 116/135] feat: refs #7289 #7289 remove bad translation --- loopback/locale/es.json | 3 +-- modules/ticket/back/methods/ticket/transferSales.js | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/loopback/locale/es.json b/loopback/locale/es.json index a68fcc4e45..8bf9f31c4c 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -388,6 +388,5 @@ "There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén", "ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}", "The web user's email already exists": "El correo del usuario web ya existe", - "Sales already moved": "Ya han sido transferidas", - "Línea ya ha sido transferida": "Línea ya ha sido transferida" + "Sales already moved": "Ya han sido transferidas" } diff --git a/modules/ticket/back/methods/ticket/transferSales.js b/modules/ticket/back/methods/ticket/transferSales.js index bc3c467d7a..580a8e1f7c 100644 --- a/modules/ticket/back/methods/ticket/transferSales.js +++ b/modules/ticket/back/methods/ticket/transferSales.js @@ -80,6 +80,7 @@ module.exports = Self => { const hasClaimedSales = await models.ClaimBeginning.findOne({where: {saleFk: {inq: saleIds}}}); if (ticketId != id && hasClaimedSales) throw new UserError(`Can't transfer claimed sales`); + const missingSales = sales.some(({id}) => !map.has(id)); if (missingSales) throw new UserError($t('Sales already moved')); From dd637b9333ea75f966f8efb8e1823bae39de960a Mon Sep 17 00:00:00 2001 From: jorgep Date: Mon, 18 Nov 2024 10:34:23 +0100 Subject: [PATCH 117/135] fix: refs #6869 use id as primaryKey --- modules/shelving/back/models/shelving.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/shelving/back/models/shelving.json b/modules/shelving/back/models/shelving.json index f6df57d43e..84e260b9e0 100644 --- a/modules/shelving/back/models/shelving.json +++ b/modules/shelving/back/models/shelving.json @@ -48,8 +48,7 @@ "itemShelving": { "type": "hasMany", "model": "ItemShelving", - "foreignKey": "shelvingFk", - "primaryKey": "code" + "foreignKey": "shelvingFk" } } } \ No newline at end of file From a64f9b74ec9d6d69231d62caa7dfbfa642890764 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 10:52:41 +0100 Subject: [PATCH 118/135] feat: refs #8057 Requested changes --- db/versions/11346-yellowPhormium/00-address.sql | 4 ++-- db/versions/11346-yellowPhormium/01-client.sql | 4 ++-- db/versions/11346-yellowPhormium/02-supplier.sql | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index 8e13150723..a8ee88b94b 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -10,9 +10,9 @@ CREATE OR REPLACE TEMPORARY TABLE tAddressGeo FROM address a JOIN town t ON t.provinceFk = a.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = a.postalCode GROUP BY a.id - ORDER BY (a.city SOUNDS LIKE t.`name`) DESC; + ORDER BY (a.city SOUNDS LIKE t.`name`) DESC, + (p.code = a.postalCode) DESC; UPDATE address a JOIN tAddressGeo tag ON tag.id = a.id diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index 932b28ef57..e1294c30e2 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -13,9 +13,9 @@ CREATE OR REPLACE TEMPORARY TABLE tClientGeo FROM client c JOIN town t ON t.provinceFk = c.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = c.postcode GROUP BY c.id - ORDER BY (c.city SOUNDS LIKE t.`name`) DESC; + ORDER BY (c.city SOUNDS LIKE t.`name`) DESC, + (p.code = c.postcode) DESC; UPDATE client c JOIN tClientGeo tcg ON tcg.id = c.id diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index b3e25bd7e3..57cdefaeac 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -12,9 +12,11 @@ CREATE OR REPLACE TEMPORARY TABLE tSupplierGeo FROM supplier s JOIN town t ON t.provinceFk = s.provinceFk JOIN postCode p ON p.townFk = t.id - AND p.`code` = s.postCode + LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id GROUP BY s.id - ORDER BY (s.city SOUNDS LIKE t.`name`) DESC; + ORDER BY (s.city SOUNDS LIKE t.`name`) DESC, + (p.code = s.postCode) DESC, + (p.code = sad.postalCode) DESC; UPDATE supplier s JOIN tSupplierGeo tsg ON tsg.id = s.id From aed4bc89c7eb09f808778804fa5ee94d93909e0a Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 12:53:36 +0100 Subject: [PATCH 119/135] feat: refs #8057 Fix version --- db/versions/11346-yellowPhormium/00-address.sql | 6 +++--- db/versions/11346-yellowPhormium/01-client.sql | 6 +++--- db/versions/11346-yellowPhormium/02-supplier.sql | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index a8ee88b94b..70683fc8fc 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -3,7 +3,7 @@ ALTER TABLE vn.address ADD CONSTRAINT address_zoneGeo_FK FOREIGN KEY (geoFk) REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; -CREATE OR REPLACE TEMPORARY TABLE tAddressGeo +CREATE OR REPLACE TEMPORARY TABLE tmp.tAddressGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT a.id, p.geoFk @@ -15,7 +15,7 @@ CREATE OR REPLACE TEMPORARY TABLE tAddressGeo (p.code = a.postalCode) DESC; UPDATE address a - JOIN tAddressGeo tag ON tag.id = a.id + JOIN tmp.tAddressGeo tag ON tag.id = a.id SET a.geoFk = tag.geoFk; -DROP TEMPORARY TABLE tAddressGeo; +DROP TEMPORARY TABLE tmp.tAddressGeo; diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index e1294c30e2..a8bd169212 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -6,7 +6,7 @@ ALTER TABLE vn.client ADD CONSTRAINT client_zoneGeo_FK FOREIGN KEY (geoFk) REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; -CREATE OR REPLACE TEMPORARY TABLE tClientGeo +CREATE OR REPLACE TEMPORARY TABLE tmp.tClientGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT c.id, p.geoFk @@ -18,7 +18,7 @@ CREATE OR REPLACE TEMPORARY TABLE tClientGeo (p.code = c.postcode) DESC; UPDATE client c - JOIN tClientGeo tcg ON tcg.id = c.id + JOIN tmp.tClientGeo tcg ON tcg.id = c.id SET c.geoFk = tcg.geoFk; -DROP TEMPORARY TABLE tClientGeo; +DROP TEMPORARY TABLE tmp.tClientGeo; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index 57cdefaeac..5f902d0393 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -5,7 +5,7 @@ ALTER TABLE vn.supplier ADD CONSTRAINT supplier_zoneGeo_FK FOREIGN KEY (geoFk) REFERENCES vn.zoneGeo(id) ON DELETE RESTRICT ON UPDATE CASCADE; -CREATE OR REPLACE TEMPORARY TABLE tSupplierGeo +CREATE OR REPLACE TEMPORARY TABLE tmp.tSupplierGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT s.id, p.geoFk @@ -19,7 +19,7 @@ CREATE OR REPLACE TEMPORARY TABLE tSupplierGeo (p.code = sad.postalCode) DESC; UPDATE supplier s - JOIN tSupplierGeo tsg ON tsg.id = s.id + JOIN tmp.tSupplierGeo tsg ON tsg.id = s.id SET s.geoFk = tsg.geoFk; -DROP TEMPORARY TABLE tSupplierGeo; +DROP TEMPORARY TABLE tmp.tSupplierGeo; From 2b770c020141d637de644d2e40251f9eefc54e19 Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 12:56:37 +0100 Subject: [PATCH 120/135] feat: refs #8057 Fix version --- db/versions/11346-yellowPhormium/00-address.sql | 8 ++++---- db/versions/11346-yellowPhormium/01-client.sql | 8 ++++---- db/versions/11346-yellowPhormium/02-supplier.sql | 10 +++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index 70683fc8fc..2f8033b0a6 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -7,14 +7,14 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tAddressGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT a.id, p.geoFk - FROM address a - JOIN town t ON t.provinceFk = a.provinceFk - JOIN postCode p ON p.townFk = t.id + FROM vn.address a + JOIN vn.town t ON t.provinceFk = a.provinceFk + JOIN vn.postCode p ON p.townFk = t.id GROUP BY a.id ORDER BY (a.city SOUNDS LIKE t.`name`) DESC, (p.code = a.postalCode) DESC; -UPDATE address a +UPDATE vn.address a JOIN tmp.tAddressGeo tag ON tag.id = a.id SET a.geoFk = tag.geoFk; diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index a8bd169212..855d873f9a 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -10,14 +10,14 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tClientGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT c.id, p.geoFk - FROM client c - JOIN town t ON t.provinceFk = c.provinceFk - JOIN postCode p ON p.townFk = t.id + FROM vn.client c + JOIN vn.town t ON t.provinceFk = c.provinceFk + JOIN vn.postCode p ON p.townFk = t.id GROUP BY c.id ORDER BY (c.city SOUNDS LIKE t.`name`) DESC, (p.code = c.postcode) DESC; -UPDATE client c +UPDATE vn.client c JOIN tmp.tClientGeo tcg ON tcg.id = c.id SET c.geoFk = tcg.geoFk; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index 5f902d0393..9a0cd5b42e 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -9,16 +9,16 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tSupplierGeo (PRIMARY KEY (id)) ENGINE = MEMORY SELECT s.id, p.geoFk - FROM supplier s - JOIN town t ON t.provinceFk = s.provinceFk - JOIN postCode p ON p.townFk = t.id - LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id + FROM vn.supplier s + JOIN vn.town t ON t.provinceFk = s.provinceFk + JOIN vn.postCode p ON p.townFk = t.id + LEFT JOIN vn.supplierAddress sad ON sad.supplierFk = s.id GROUP BY s.id ORDER BY (s.city SOUNDS LIKE t.`name`) DESC, (p.code = s.postCode) DESC, (p.code = sad.postalCode) DESC; -UPDATE supplier s +UPDATE vn.supplier s JOIN tmp.tSupplierGeo tsg ON tsg.id = s.id SET s.geoFk = tsg.geoFk; From cdcc5051d2ba4619f140e9938a55f59941bcf85a Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 13:09:33 +0100 Subject: [PATCH 121/135] feat: refs #8057 Fix version --- db/routines/vn/functions/address_getGeo.sql | 1 + db/routines/vn/functions/client_getGeo.sql | 1 + db/routines/vn/functions/supplier_getGeo.sql | 1 + db/versions/11346-yellowPhormium/00-address.sql | 1 + db/versions/11346-yellowPhormium/01-client.sql | 1 + db/versions/11346-yellowPhormium/02-supplier.sql | 1 + 6 files changed, 6 insertions(+) diff --git a/db/routines/vn/functions/address_getGeo.sql b/db/routines/vn/functions/address_getGeo.sql index 248e8c787e..0800d226ad 100644 --- a/db/routines/vn/functions/address_getGeo.sql +++ b/db/routines/vn/functions/address_getGeo.sql @@ -15,6 +15,7 @@ BEGIN FROM address a JOIN town t ON t.provinceFk = a.provinceFk JOIN postCode p ON p.townFk = t.id + JOIN zoneGeo zg ON zg.id = p.geoFk WHERE a.id = vSelf ORDER BY (a.city SOUNDS LIKE t.name) DESC, (p.code = a.postalCode) DESC diff --git a/db/routines/vn/functions/client_getGeo.sql b/db/routines/vn/functions/client_getGeo.sql index 624becf1ef..e16653ee50 100644 --- a/db/routines/vn/functions/client_getGeo.sql +++ b/db/routines/vn/functions/client_getGeo.sql @@ -15,6 +15,7 @@ BEGIN FROM client c JOIN town t ON t.provinceFk = c.provinceFk JOIN postCode p ON p.townFk = t.id + JOIN zoneGeo zg ON zg.id = p.geoFk WHERE c.id = vSelf ORDER BY (c.city SOUNDS LIKE t.name) DESC, (p.code = c.postcode) DESC diff --git a/db/routines/vn/functions/supplier_getGeo.sql b/db/routines/vn/functions/supplier_getGeo.sql index 29b6736f36..10ca5b8b89 100644 --- a/db/routines/vn/functions/supplier_getGeo.sql +++ b/db/routines/vn/functions/supplier_getGeo.sql @@ -16,6 +16,7 @@ BEGIN JOIN town t ON t.provinceFk = s.provinceFk JOIN postCode p ON p.townFk = t.id LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id + JOIN zoneGeo zg ON zg.id = p.geoFk WHERE s.id = vSelf ORDER BY (s.city SOUNDS LIKE t.name) DESC, (p.code = s.postCode) DESC, diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index 2f8033b0a6..6837e0d86f 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -10,6 +10,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tAddressGeo FROM vn.address a JOIN vn.town t ON t.provinceFk = a.provinceFk JOIN vn.postCode p ON p.townFk = t.id + JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY a.id ORDER BY (a.city SOUNDS LIKE t.`name`) DESC, (p.code = a.postalCode) DESC; diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index 855d873f9a..a95d21efaf 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -13,6 +13,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tClientGeo FROM vn.client c JOIN vn.town t ON t.provinceFk = c.provinceFk JOIN vn.postCode p ON p.townFk = t.id + JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY c.id ORDER BY (c.city SOUNDS LIKE t.`name`) DESC, (p.code = c.postcode) DESC; diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index 9a0cd5b42e..a28e7d6807 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -13,6 +13,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tSupplierGeo JOIN vn.town t ON t.provinceFk = s.provinceFk JOIN vn.postCode p ON p.townFk = t.id LEFT JOIN vn.supplierAddress sad ON sad.supplierFk = s.id + JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY s.id ORDER BY (s.city SOUNDS LIKE t.`name`) DESC, (p.code = s.postCode) DESC, From 8d4769d74d45e4f0ec430c0273479cddea173c2e Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 18 Nov 2024 13:34:20 +0100 Subject: [PATCH 122/135] feat: refs #8057 More precision in getGeo --- db/routines/vn/functions/address_getGeo.sql | 1 + db/routines/vn/functions/client_getGeo.sql | 1 + db/routines/vn/functions/supplier_getGeo.sql | 1 + db/versions/11346-yellowPhormium/00-address.sql | 1 + db/versions/11346-yellowPhormium/01-client.sql | 1 + db/versions/11346-yellowPhormium/02-supplier.sql | 1 + 6 files changed, 6 insertions(+) diff --git a/db/routines/vn/functions/address_getGeo.sql b/db/routines/vn/functions/address_getGeo.sql index 0800d226ad..213eb91c3e 100644 --- a/db/routines/vn/functions/address_getGeo.sql +++ b/db/routines/vn/functions/address_getGeo.sql @@ -15,6 +15,7 @@ BEGIN FROM address a JOIN town t ON t.provinceFk = a.provinceFk JOIN postCode p ON p.townFk = t.id + AND (p.code = a.postalCode OR a.postalCode IS NULL) JOIN zoneGeo zg ON zg.id = p.geoFk WHERE a.id = vSelf ORDER BY (a.city SOUNDS LIKE t.name) DESC, diff --git a/db/routines/vn/functions/client_getGeo.sql b/db/routines/vn/functions/client_getGeo.sql index e16653ee50..9c2e3212e0 100644 --- a/db/routines/vn/functions/client_getGeo.sql +++ b/db/routines/vn/functions/client_getGeo.sql @@ -15,6 +15,7 @@ BEGIN FROM client c JOIN town t ON t.provinceFk = c.provinceFk JOIN postCode p ON p.townFk = t.id + AND (p.code = c.postcode OR c.postcode IS NULL) JOIN zoneGeo zg ON zg.id = p.geoFk WHERE c.id = vSelf ORDER BY (c.city SOUNDS LIKE t.name) DESC, diff --git a/db/routines/vn/functions/supplier_getGeo.sql b/db/routines/vn/functions/supplier_getGeo.sql index 10ca5b8b89..86984272cc 100644 --- a/db/routines/vn/functions/supplier_getGeo.sql +++ b/db/routines/vn/functions/supplier_getGeo.sql @@ -15,6 +15,7 @@ BEGIN FROM supplier s JOIN town t ON t.provinceFk = s.provinceFk JOIN postCode p ON p.townFk = t.id + AND (p.code = s.postCode OR s.postCode IS NULL) LEFT JOIN supplierAddress sad ON sad.supplierFk = s.id JOIN zoneGeo zg ON zg.id = p.geoFk WHERE s.id = vSelf diff --git a/db/versions/11346-yellowPhormium/00-address.sql b/db/versions/11346-yellowPhormium/00-address.sql index 6837e0d86f..f91d0ae9f4 100644 --- a/db/versions/11346-yellowPhormium/00-address.sql +++ b/db/versions/11346-yellowPhormium/00-address.sql @@ -10,6 +10,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tAddressGeo FROM vn.address a JOIN vn.town t ON t.provinceFk = a.provinceFk JOIN vn.postCode p ON p.townFk = t.id + AND (p.code = a.postalCode OR a.postalCode IS NULL) JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY a.id ORDER BY (a.city SOUNDS LIKE t.`name`) DESC, diff --git a/db/versions/11346-yellowPhormium/01-client.sql b/db/versions/11346-yellowPhormium/01-client.sql index a95d21efaf..cb6fe41e85 100644 --- a/db/versions/11346-yellowPhormium/01-client.sql +++ b/db/versions/11346-yellowPhormium/01-client.sql @@ -13,6 +13,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tClientGeo FROM vn.client c JOIN vn.town t ON t.provinceFk = c.provinceFk JOIN vn.postCode p ON p.townFk = t.id + AND (p.code = c.postcode OR c.postcode IS NULL) JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY c.id ORDER BY (c.city SOUNDS LIKE t.`name`) DESC, diff --git a/db/versions/11346-yellowPhormium/02-supplier.sql b/db/versions/11346-yellowPhormium/02-supplier.sql index a28e7d6807..4e866525eb 100644 --- a/db/versions/11346-yellowPhormium/02-supplier.sql +++ b/db/versions/11346-yellowPhormium/02-supplier.sql @@ -12,6 +12,7 @@ CREATE OR REPLACE TEMPORARY TABLE tmp.tSupplierGeo FROM vn.supplier s JOIN vn.town t ON t.provinceFk = s.provinceFk JOIN vn.postCode p ON p.townFk = t.id + AND (p.code = s.postCode OR s.postCode IS NULL) LEFT JOIN vn.supplierAddress sad ON sad.supplierFk = s.id JOIN vn.zoneGeo zg ON zg.id = p.geoFk GROUP BY s.id From 413e9e1e9f02ae2ac0b9b01c00231f5c63f9462c Mon Sep 17 00:00:00 2001 From: alexm Date: Tue, 19 Nov 2024 07:59:27 +0100 Subject: [PATCH 124/135] build: refs #8144 change package version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 767ec231e9..d363604981 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "salix-back", - "version": "24.44.0", + "version": "24.48.0", "author": "Verdnatura Levante SL", "description": "Salix backend", "license": "GPL-3.0", From d21b42a5670cb092616c814943f01ab54edcaeb6 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 19 Nov 2024 11:24:00 +0100 Subject: [PATCH 125/135] feat: refs #8099 refs#8099 addComplmentSalary --- db/dump/fixtures.before.sql | 4 ++ .../11353-wheatCymbidium/00-firstScript.sql | 9 +++++ modules/route/back/model-config.json | 8 +++- modules/route/back/models/routeAction.json | 30 +++++++++++++++ .../route/back/models/routeComplement.json | 37 +++++++++++++++++++ 5 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 db/versions/11353-wheatCymbidium/00-firstScript.sql create mode 100644 modules/route/back/models/routeAction.json create mode 100644 modules/route/back/models/routeComplement.json diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index eb376b6c6a..48e886ac9c 100644 --- a/db/dump/fixtures.before.sql +++ b/db/dump/fixtures.before.sql @@ -4008,6 +4008,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.routeAction (id, name, price, isMainlineDelivered) VALUES(1, 'Pintar traje', 50.00, 0); +INSERT INTO vn.routeComplement (id, dated, workerFk, price, routeActionFk) VALUES(1, util.VN_CURDATE(), 9, 50.00, 1); + + INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, code, stratus, hasWorkerWaiting, reserve, routeFk, dayMinute, lastUnloaded, hasStrapper, typeDefaultFk, motors, editorFk) VALUES (0, 0, 0, 0, NULL, 3, 1, 0, 'ENT', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), (1, 0, 9900, 0, NULL, 1, 0, 0, 'NOK', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), diff --git a/db/versions/11353-wheatCymbidium/00-firstScript.sql b/db/versions/11353-wheatCymbidium/00-firstScript.sql new file mode 100644 index 0000000000..f29ae2f0ed --- /dev/null +++ b/db/versions/11353-wheatCymbidium/00-firstScript.sql @@ -0,0 +1,9 @@ + + +USE vn; + +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) +VALUES('RouteAction', '*', 'READ', 'ALLOW', 'ROLE', 'delivery'); + +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) +VALUES('RouteComplement', '*', '*', 'ALLOW', 'ROLE', 'delivery'); diff --git a/modules/route/back/model-config.json b/modules/route/back/model-config.json index be5aa07ca4..fb1c5d7fdd 100644 --- a/modules/route/back/model-config.json +++ b/modules/route/back/model-config.json @@ -23,6 +23,12 @@ "Route": { "dataSource": "vn" }, + "RouteAction": { + "dataSource": "vn" + }, + "RouteComplement": { + "dataSource": "vn" + }, "RouteLog": { "dataSource": "vn" }, @@ -32,4 +38,4 @@ "RoutesMonitor": { "dataSource": "vn" } -} +} \ No newline at end of file diff --git a/modules/route/back/models/routeAction.json b/modules/route/back/models/routeAction.json new file mode 100644 index 0000000000..88f7a8226b --- /dev/null +++ b/modules/route/back/models/routeAction.json @@ -0,0 +1,30 @@ +{ + "name": "RouteAction", + "base": "VnModel", + "mixins": { + "Loggable": true + }, + "options": { + "mysql": { + "table": "routeAction" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "name": { + "type": "string", + "required": true + }, + "price": { + "type": "number" + }, + "isMainlineDelivered": { + "type": "boolean", + "required": true + } + } +} \ No newline at end of file diff --git a/modules/route/back/models/routeComplement.json b/modules/route/back/models/routeComplement.json new file mode 100644 index 0000000000..e2086f78d1 --- /dev/null +++ b/modules/route/back/models/routeComplement.json @@ -0,0 +1,37 @@ +{ + "name": "RouteComplement", + "base": "VnModel", + "mixins": { + "Loggable": true + }, + "options": { + "mysql": { + "table": "routeComplement" + } + }, + "properties": { + "id": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "dated": { + "type": "date" + }, + "price": { + "type": "number" + } + }, + "relations": { + "worker": { + "type": "belongsTo", + "model": "Worker", + "foreignKey": "workerFk" + }, + "routeAction": { + "type": "belongsTo", + "model": "RouteAction", + "foreignKey": "routeActionFk" + } + } +} \ No newline at end of file From feb11c123e50c3896c5b1bec0e860d0be5af8963 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Tue, 19 Nov 2024 11:45:40 +0100 Subject: [PATCH 126/135] feat: refs #8099 refs#8099 addComplmentSalary --- db/versions/11353-wheatCymbidium/00-firstScript.sql | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/db/versions/11353-wheatCymbidium/00-firstScript.sql b/db/versions/11353-wheatCymbidium/00-firstScript.sql index f29ae2f0ed..557ffab9e7 100644 --- a/db/versions/11353-wheatCymbidium/00-firstScript.sql +++ b/db/versions/11353-wheatCymbidium/00-firstScript.sql @@ -3,7 +3,13 @@ USE vn; INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) -VALUES('RouteAction', '*', 'READ', 'ALLOW', 'ROLE', 'delivery'); +VALUES('RouteAction', 'find', 'READ', 'ALLOW', 'ROLE', 'delivery'); INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) -VALUES('RouteComplement', '*', '*', 'ALLOW', 'ROLE', 'delivery'); +VALUES('RouteComplement', 'find', 'READ', 'ALLOW', 'ROLE', 'delivery'); + +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) +VALUES('RouteComplement', 'create', 'WRITE', 'ALLOW', 'ROLE', 'delivery'); + +INSERT INTO salix.ACL (model, property, accessType, permission, principalType, principalId) +VALUES('RouteComplement', 'deleteById', 'WRITE', 'ALLOW', 'ROLE', 'delivery'); \ No newline at end of file From f89080d3735cee92827131211224de7b36e728f1 Mon Sep 17 00:00:00 2001 From: jorgep Date: Tue, 19 Nov 2024 11:53:12 +0100 Subject: [PATCH 127/135] fix: refs #7323 add remaining fields --- modules/worker/back/models/worker.json | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/worker/back/models/worker.json b/modules/worker/back/models/worker.json index 937df98c0d..5c3b95fe61 100644 --- a/modules/worker/back/models/worker.json +++ b/modules/worker/back/models/worker.json @@ -301,7 +301,19 @@ "birth", "educationLevelFk", "originCountryFk", - "maritalStatus" + "maritalStatus", + "SSN" + ], + "include": [ + { + "relation": "client", + "scope": { + "fields": [ + "id", + "phone" + ] + } + } ] } } From 3cce342d9dcf4b2f2e6612889ced0a2e1a10aba5 Mon Sep 17 00:00:00 2001 From: jorgep Date: Wed, 20 Nov 2024 09:52:42 +0100 Subject: [PATCH 128/135] fix: refs #6818 add config --- db/versions/11355-pinkMedeola/00-firstScript.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 db/versions/11355-pinkMedeola/00-firstScript.sql diff --git a/db/versions/11355-pinkMedeola/00-firstScript.sql b/db/versions/11355-pinkMedeola/00-firstScript.sql new file mode 100644 index 0000000000..fc89b386cf --- /dev/null +++ b/db/versions/11355-pinkMedeola/00-firstScript.sql @@ -0,0 +1,3 @@ +-- Place your SQL code here +INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) + VALUES ('https://verdnatura.saysimple.io/start-conversation', 1320); \ No newline at end of file From 9fbffe8a6bfaf06e593320b1c4da7d22b0196fa0 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Wed, 20 Nov 2024 14:03:23 +0100 Subject: [PATCH 129/135] fix: refs #7920 refs#7920 itemShelvingLog --- db/routines/vn/procedures/itemShelvingSale_setQuantity.sql | 5 +++-- db/routines/vn/procedures/itemShelving_get.sql | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql index f141762b5b..1975180d1c 100644 --- a/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql +++ b/db/routines/vn/procedures/itemShelvingSale_setQuantity.sql @@ -48,7 +48,7 @@ BEGIN iss.itemShelvingFk, SUM(IFNULL(iss.quantity,0)), IF(sgd.id, 'PREVIOUS_PREPARATION', 'PREPARED'), - ish.shelvingFk + sh.code INTO vItemFk, vSaleFk, vItemShelvingFk, @@ -58,7 +58,8 @@ BEGIN 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 + LEFT JOIN saleGroupDetail sgd ON sgd.saleFk = iss.saleFk + LEFT JOIN shelving sh ON sh.id = ish.shelvingFk WHERE iss.id = vItemShelvingSaleFk AND NOT iss.isPicked; diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql index 93022c2aff..7e59a5cfca 100644 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -21,7 +21,8 @@ BEGIN ish.isChecked, ic.url, ish.available, - ish.buyFk + ish.buyFk, + sh.shelvingFk FROM itemShelving ish JOIN item i ON i.id = ish.itemFk JOIN shelving s ON s.id = ish.shelvingFk From 512b4a54df001787eb100aeb2f3c7f29be3d9389 Mon Sep 17 00:00:00 2001 From: sergiodt Date: Thu, 21 Nov 2024 11:28:25 +0100 Subject: [PATCH 130/135] fix: refs #7920 refs#7920 itemShelvingLog --- db/routines/vn/procedures/itemShelving_get.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/routines/vn/procedures/itemShelving_get.sql b/db/routines/vn/procedures/itemShelving_get.sql index 7e59a5cfca..0038257c2d 100644 --- a/db/routines/vn/procedures/itemShelving_get.sql +++ b/db/routines/vn/procedures/itemShelving_get.sql @@ -22,7 +22,7 @@ BEGIN ic.url, ish.available, ish.buyFk, - sh.shelvingFk + ish.shelvingFk FROM itemShelving ish JOIN item i ON i.id = ish.itemFk JOIN shelving s ON s.id = ish.shelvingFk From 0870a1c3d612f31424754dbabd0f40409378e250 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Thu, 21 Nov 2024 15:09:58 +0100 Subject: [PATCH 131/135] refs#8087 Redadas en travel test --- db/dump/fixtures.before.sql | 34 +++++++++---------- .../procedures/availableNoRaids_refresh.sql | 2 +- .../triggers/supplyResponse_afterUpdate.sql | 2 +- .../hedera/procedures/item_getVisible.sql | 4 +-- .../stock/procedures/log_refreshBuy.sql | 6 ++-- .../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_checkRaid.sql | 17 ++++++++++ .../vn/procedures/travel_moveRaids.sql | 17 +++++----- .../vn/triggers/entry_beforeUpdate.sql | 6 ++-- db/routines/vn/triggers/town_beforeUpdate.sql | 10 ------ .../vn/triggers/travel_beforeInsert.sql | 6 +++- .../vn/triggers/travel_beforeUpdate.sql | 20 ++++++----- 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 +- .../11357-whiteGerbera/00-firstScript.sql | 4 +++ loopback/locale/en.json | 1 + loopback/locale/es.json | 3 +- modules/entry/back/locale/entry/en.yml | 1 + modules/entry/back/locale/entry/es.yml | 1 + modules/entry/back/methods/entry/filter.js | 1 + modules/entry/back/methods/entry/getEntry.js | 4 +-- 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 ++ 38 files changed, 114 insertions(+), 83 deletions(-) create mode 100644 db/routines/vn/procedures/travel_checkRaid.sql delete mode 100644 db/routines/vn/triggers/town_beforeUpdate.sql create mode 100644 db/versions/11357-whiteGerbera/00-firstScript.sql diff --git a/db/dump/fixtures.before.sql b/db/dump/fixtures.before.sql index 48e886ac9c..878f146d1a 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 @@ -4012,10 +4012,10 @@ INSERT INTO vn.routeAction (id, name, price, isMainlineDelivered) VALUES(1, 'Pin INSERT INTO vn.routeComplement (id, dated, workerFk, price, routeActionFk) VALUES(1, util.VN_CURDATE(), 9, 50.00, 1); -INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, code, stratus, hasWorkerWaiting, reserve, routeFk, dayMinute, lastUnloaded, hasStrapper, typeDefaultFk, motors, editorFk) +INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, code, stratus, hasWorkerWaiting, reserve, routeFk, dayMinute, lastUnloaded, hasStrapper, typeDefaultFk, motors, editorFk) VALUES (0, 0, 0, 0, NULL, 3, 1, 0, 'ENT', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), (1, 0, 9900, 0, NULL, 1, 0, 0, 'NOK', 0, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), - (2, 0, 0, 450, 13000, 1, 0, 1, '01A', 1, 1, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), + (2, 0, 0, 450, 13000, 1, 0, 1, '01A', 1, 1, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), (3, 1400, 0, 450, 13000, 1, 0, 1, '01B', 1, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL), (4, 0, 500, 500, 13000, 1, 4, 1, '02A', 2, 1, NULL, NULL, NULL, NULL, 1, 4, 13, NULL), (5, 1400, 500, 500, 13000, 1, 4, 1, '02B', 2, 1, NULL, NULL, NULL, NULL, 1, 4, 13, NULL), @@ -4026,9 +4026,9 @@ INSERT INTO srt.buffer (id, x, y, `size`, `length`, stateFk, typeFk, isActive, c (10, 0, 2000, 500, 13000, 1, 1, 1, '05A', 5, 0, NULL, NULL, NULL, NULL, 0, 1, 1, NULL); -INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) +INSERT IGNORE INTO vn.saySimpleCountry (countryFk, channel) VALUES (19, '1169'), (8, '1183'); -INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) - VALUES ('saysimle-url-mock', 1320); \ No newline at end of file +INSERT IGNORE INTO vn.saySimpleConfig (url, defaultChannel) + VALUES ('saysimle-url-mock', 1320); diff --git a/db/routines/cache/procedures/availableNoRaids_refresh.sql b/db/routines/cache/procedures/availableNoRaids_refresh.sql index efbbf6a132..447300305c 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 28a8c9466c..f3e5aaefdb 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 365161bdfe..d5bbe9d76c 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 d8e727f174..c21de9c080 100644 --- a/db/routines/stock/procedures/log_refreshBuy.sql +++ b/db/routines/stock/procedures/log_refreshBuy.sql @@ -11,7 +11,7 @@ BEGIN 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 +50,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 +65,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 3ea8cf4deb..d0d9ffac2b 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 513f58e369..bfd5b34c83 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 9527e0bf26..873827db23 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 65dceef3da..316083db00 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 260f0a527b..c4974491cc 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 8a42bd737e..e3c9158200 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 7bd8093120..04d3f1855a 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 b6d6879601..7e420be272 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 6b26e456f0..ee18bbe96f 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 bb98cacdf2..ab24a6395e 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_checkRaid.sql b/db/routines/vn/procedures/travel_checkRaid.sql new file mode 100644 index 0000000000..64f3355e2d --- /dev/null +++ b/db/routines/vn/procedures/travel_checkRaid.sql @@ -0,0 +1,17 @@ +DELIMITER $$ +CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`travel_checkRaid`( + vIsRaid BOOL, + vDaysInForward INT +) +BEGIN +/** + * Check if the values of isRaid and daysInforward are correct + * + * @param vIsRaid idRaid value + * @param vDaysInForward daysInForward value + */ + IF (NOT vIsRaid AND vDaysInForward IS NOT NULL) OR (vIsRaid AND vDaysInForward IS NULL) THEN + CALL util.throw('The raid information is not correct'); + END IF; +END$$ +DELIMITER ; diff --git a/db/routines/vn/procedures/travel_moveRaids.sql b/db/routines/vn/procedures/travel_moveRaids.sql index aa554a1a06..cf0fce23c3 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 3b999012fd..1d0c26fc1a 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/triggers/town_beforeUpdate.sql b/db/routines/vn/triggers/town_beforeUpdate.sql deleted file mode 100644 index fc1410d5c3..0000000000 --- a/db/routines/vn/triggers/town_beforeUpdate.sql +++ /dev/null @@ -1,10 +0,0 @@ -DELIMITER $$ -CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`town_beforeUpdate` - BEFORE UPDATE ON `town` - FOR EACH ROW -BEGIN - -- IF !(OLD.geoFk <=> NEW.geoFk) THEN - -- CALL zoneGeo_throwNotEditable; - -- END IF; -END$$ -DELIMITER ; diff --git a/db/routines/vn/triggers/travel_beforeInsert.sql b/db/routines/vn/triggers/travel_beforeInsert.sql index 4563c9a816..5356ed5377 100644 --- a/db/routines/vn/triggers/travel_beforeInsert.sql +++ b/db/routines/vn/triggers/travel_beforeInsert.sql @@ -8,7 +8,11 @@ BEGIN CALL travel_checkDates(NEW.shipped, NEW.landed); CALL travel_checkWarehouseIsFeedStock(NEW.warehouseInFk); - + + IF NEW.isRaid IS NOT NULL OR NEW.daysInForward IS NOT NULL THEN + CALL travel_checkRaid(NEW.isRaid, NEW.daysInForward); + END IF; + IF NEW.awbFk IS NOT NULL THEN CALL travel_throwAwb(NEW.id); END IF; diff --git a/db/routines/vn/triggers/travel_beforeUpdate.sql b/db/routines/vn/triggers/travel_beforeUpdate.sql index 33578fea14..5a27b43b42 100644 --- a/db/routines/vn/triggers/travel_beforeUpdate.sql +++ b/db/routines/vn/triggers/travel_beforeUpdate.sql @@ -7,7 +7,7 @@ BEGIN SET NEW.editorFk = account.myUser_getId(); - IF NOT (NEW.landed <=> OLD.landed) + IF NOT (NEW.landed <=> OLD.landed) OR NOT (NEW.shipped <=> OLD.shipped) THEN CALL travel_checkDates(NEW.shipped, NEW.landed); END IF; @@ -20,19 +20,23 @@ BEGIN CALL travel_checkWarehouseIsFeedStock(NEW.warehouseInFk); END IF; + IF NOT (NEW.isRaid <=> OLD.isRaid) OR NOT (NEW.daysInForward <=> OLD.daysInForward) THEN + CALL travel_checkRaid(NEW.isRaid, NEW.daysInForward); + END IF; + IF NOT (NEW.awbFk <=> OLD.awbFk)THEN - SELECT COUNT(*) INTO vHasAnyInvoiceBooked + SELECT COUNT(*) INTO vHasAnyInvoiceBooked FROM travel t - JOIN entry e ON e.travelFk = t.id - JOIN invoiceIn ii ON ii.id = e.invoiceInFk + JOIN entry e ON e.travelFk = t.id + JOIN invoiceIn ii ON ii.id = e.invoiceInFk WHERE t.id = NEW.id - AND ii.isBooked; - + AND ii.isBooked; + IF vHasAnyInvoiceBooked THEN CALL util.throw('The travel has entries with booked invoices'); END IF; - END IF; - + END IF; + IF (NOT(NEW.awbFk <=> OLD.awbFk)) AND NEW.awbFk IS NOT NULL THEN CALL travel_throwAwb(NEW.id); END IF; diff --git a/db/routines/vn/views/itemEntryIn.sql b/db/routines/vn/views/itemEntryIn.sql index 6196e9396f..60af585f25 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 f18116e619..4793ddbb83 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 9dc5ec8986..3dcaf8c1db 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 9c0c0f6ed4..7326036177 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 0e1f5acb2a..38dfd40eaf 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 324e459f6c..633feb4717 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/11357-whiteGerbera/00-firstScript.sql b/db/versions/11357-whiteGerbera/00-firstScript.sql new file mode 100644 index 0000000000..c10ec4d262 --- /dev/null +++ b/db/versions/11357-whiteGerbera/00-firstScript.sql @@ -0,0 +1,4 @@ +ALTER TABLE vn.travel ADD IF NOT EXISTS 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. NULL si no es una redada'; diff --git a/loopback/locale/en.json b/loopback/locale/en.json index 2471d3170a..15f69d05fc 100644 --- a/loopback/locale/en.json +++ b/loopback/locale/en.json @@ -244,6 +244,7 @@ "There are tickets for this area, delete them first": "There are tickets for this area, delete them first", "ticketLostExpedition": "The ticket [{{ticketId}}]({{{ticketUrl}}}) has the following lost expedition:{{ expeditionId }}", "Payment method is required": "Payment method is required", + "The raid information is not correct": "The raid information is not correct", "Sales already moved": "Sales already moved" } diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 160a81c564..4e691f3754 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -387,5 +387,6 @@ "There is no company associated with that warehouse": "No hay ninguna empresa asociada a ese almacén", "ticketLostExpedition": "El ticket [{{ticketId}}]({{{ticketUrl}}}) tiene la siguiente expedición perdida:{{ expeditionId }}", "The web user's email already exists": "El correo del usuario web ya existe", - "Sales already moved": "Ya han sido transferidas" + "Sales already moved": "Ya han sido transferidas", + "The raid information is not correct": "La información de la redada no es correcta" } diff --git a/modules/entry/back/locale/entry/en.yml b/modules/entry/back/locale/entry/en.yml index ab8c0fd1cb..6bc2333e6b 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 18bf1ca331..a892b05d28 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 a5c236fe4f..d7740dd4ee 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -194,6 +194,7 @@ module.exports = Self => { e.evaNotes observation, e.isConfirmed, e.isOrdered, + t.isRaid, t.daysInForward, e.commission, e.created, diff --git a/modules/entry/back/methods/entry/getEntry.js b/modules/entry/back/methods/entry/getEntry.js index 4612de9a56..92be9a9dda 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/front/descriptor/index.html b/modules/entry/front/descriptor/index.html index 40625a4d5b..eae9cb0346 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">