From ff71e6f2c7e3596db04a51d79e828f365864d142 Mon Sep 17 00:00:00 2001 From: joan Date: Wed, 14 Jul 2021 11:14:53 +0200 Subject: [PATCH 1/7] 2879 - Autocomplete item field from imported buys --- .../10340-summer/00-buy_importReference.sql | 14 +++++++ .../entry/back/methods/entry/importBuys.js | 7 ++++ .../back/methods/entry/importBuysPreview.js | 16 ++++++- modules/entry/back/model-config.json | 3 ++ .../back/models/buy-import-reference.json | 32 ++++++++++++++ modules/entry/front/buy/import/index.html | 42 +++++++------------ modules/entry/front/buy/import/index.js | 4 +- 7 files changed, 90 insertions(+), 28 deletions(-) create mode 100644 db/changes/10340-summer/00-buy_importReference.sql create mode 100644 modules/entry/back/models/buy-import-reference.json diff --git a/db/changes/10340-summer/00-buy_importReference.sql b/db/changes/10340-summer/00-buy_importReference.sql new file mode 100644 index 0000000000..4046b498be --- /dev/null +++ b/db/changes/10340-summer/00-buy_importReference.sql @@ -0,0 +1,14 @@ +create table `vn`.`buyImportReference` +( + itemFk int not null, + name varchar(80) not null, + company varchar(80) not null, + size int not null, + constraint buyImportReference_pk + primary key (itemFk, name, company, size), + constraint itemFk___fk + foreign key (itemFk) references item (id) + on update cascade on delete cascade +) +comment 'Referencias de compras importadas'; + diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js index 325fe4d22d..d8db328a30 100644 --- a/modules/entry/back/methods/entry/importBuys.js +++ b/modules/entry/back/methods/entry/importBuys.js @@ -71,6 +71,13 @@ module.exports = Self => { buyingValue: buy.buyingValue, packageFk: buy.packageFk }); + + await models.BuyImportReference.upsert({ + itemFk: buy.itemFk, + name: buy.description, + company: buy.companyName, + size: buy.size + }, options); } const createdBuys = await models.Buy.create(buys, options); diff --git a/modules/entry/back/methods/entry/importBuysPreview.js b/modules/entry/back/methods/entry/importBuysPreview.js index 9ba2b58ed8..6b03579c7a 100644 --- a/modules/entry/back/methods/entry/importBuysPreview.js +++ b/modules/entry/back/methods/entry/importBuysPreview.js @@ -37,7 +37,21 @@ module.exports = Self => { where: {volume: {gte: buy.volume}}, order: 'volume ASC' }, myOptions); - buy.packageFk = packaging.id; + + if (packaging) + buy.packageFk = packaging.id; + + const reference = await models.BuyImportReference.findOne({ + fields: ['itemFk'], + where: { + name: buy.description, + company: buy.companyName, + size: buy.size + } + }, myOptions); + + if (reference) + buy.itemFk = reference.itemFk; } return buys; diff --git a/modules/entry/back/model-config.json b/modules/entry/back/model-config.json index eddef9c410..b4c50c3aaf 100644 --- a/modules/entry/back/model-config.json +++ b/modules/entry/back/model-config.json @@ -5,6 +5,9 @@ "Buy": { "dataSource": "vn" }, + "BuyImportReference": { + "dataSource": "vn" + }, "EntryLog": { "dataSource": "vn" }, diff --git a/modules/entry/back/models/buy-import-reference.json b/modules/entry/back/models/buy-import-reference.json new file mode 100644 index 0000000000..ffe5248588 --- /dev/null +++ b/modules/entry/back/models/buy-import-reference.json @@ -0,0 +1,32 @@ +{ + "name": "BuyImportReference", + "base": "VnModel", + "options": { + "mysql": { + "table": "buyImportReference" + } + }, + "properties": { + "itemFk": { + "type": "number", + "id": true, + "description": "Identifier" + }, + "name": { + "type": "string" + }, + "company": { + "type": "string" + }, + "size": { + "type": "string" + } + }, + "relations": { + "item": { + "type": "belongsTo", + "model": "Item", + "foreignKey": "itemFk" + } + } +} \ No newline at end of file diff --git a/modules/entry/front/buy/import/index.html b/modules/entry/front/buy/import/index.html index 74b6c708ad..742c156be2 100644 --- a/modules/entry/front/buy/import/index.html +++ b/modules/entry/front/buy/import/index.html @@ -9,20 +9,6 @@ class="vn-ma-md">
- - - - - - - - + + + + + + + + @@ -51,7 +51,6 @@ - @@ -74,16 +73,8 @@ - - + -
Grouping Buying value BoxVolume
{{::buy.description | dashIfEmpty}} {{::buy.size | dashIfEmpty}} - - {{::buy.packing | dashIfEmpty}} - - - - {{::buy.grouping | dashIfEmpty}} - - + {{::buy.packing | dashIfEmpty}}{{::buy.grouping | dashIfEmpty}} {{::buy.buyingValue | currency: 'EUR':2}} {{::buy.volume | number}}
diff --git a/modules/entry/front/buy/import/index.js b/modules/entry/front/buy/import/index.js index b5ff92a893..b802f36c4e 100644 --- a/modules/entry/front/buy/import/index.js +++ b/modules/entry/front/buy/import/index.js @@ -29,6 +29,7 @@ class Controller extends Section { this.$.$applyAsync(() => { this.import.observation = invoice.tx_awb; + const companyName = invoice.tx_company; const boxes = invoice.boxes; const buys = []; for (let box of boxes) { @@ -37,11 +38,12 @@ class Controller extends Section { const packing = product.nu_stems_bunch * product.nu_bunches; buys.push({ description: product.nm_product, + companyName: companyName, size: product.nu_length, packing: packing, grouping: product.nu_stems_bunch, buyingValue: parseFloat(product.mny_rate_stem), - volume: boxVolume + volume: boxVolume, }); } } From 94b668c01e84f4a5064ed4224ca6aa11d88597e5 Mon Sep 17 00:00:00 2001 From: joan Date: Thu, 15 Jul 2021 13:41:29 +0200 Subject: [PATCH 2/7] Filter item from a dialog --- modules/entry/front/buy/import/index.html | 97 ++++++++++++++++++- modules/entry/front/buy/import/index.js | 53 ++++++++++ modules/entry/front/buy/import/style.scss | 6 ++ modules/entry/front/buy/locale/es.yml | 4 +- modules/item/front/search-panel/locale/es.yml | 2 +- 5 files changed, 159 insertions(+), 3 deletions(-) diff --git a/modules/entry/front/buy/import/index.html b/modules/entry/front/buy/import/index.html index 742c156be2..179657dae5 100644 --- a/modules/entry/front/buy/import/index.html +++ b/modules/entry/front/buy/import/index.html @@ -69,6 +69,13 @@ {{::id}} - {{::name}} + + + + {{::buy.description | dashIfEmpty}} @@ -100,7 +107,95 @@ label="Cancel" ui-sref="entry.card.buy.index"> -
+ + + + + + + + + + + + + + + + + + + + + + + + + + ID + Item + Size + Producer + Color + + + + + + + {{::item.id}} + + + {{::item.name}} + {{::item.size}} + {{::item.producer.name}} + {{::item.ink.name}} + + + + + + + + \ No newline at end of file diff --git a/modules/entry/front/buy/import/index.js b/modules/entry/front/buy/import/index.js index b802f36c4e..2f13b27460 100644 --- a/modules/entry/front/buy/import/index.js +++ b/modules/entry/front/buy/import/index.js @@ -88,6 +88,59 @@ class Controller extends Section { ? {id: $search} : {name: {like: '%' + $search + '%'}}; } + + showFilterDialog(buy) { + this.activeBuy = buy; + this.itemFilterParams = {}; + this.itemFilter = { + include: [ + { + relation: 'producer', + scope: { + fields: ['name'] + } + }, + { + relation: 'ink', + scope: { + fields: ['name'] + } + } + ] + }; + + this.$.filterDialog.show(); + } + + selectItem(id) { + this.activeBuy['itemFk'] = 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 'ink': + where[key] = value; + } + } + + filter.where = where; + this.$.itemsModel.applyFilter(filter); + } } Controller.$inject = ['$element', '$scope']; diff --git a/modules/entry/front/buy/import/style.scss b/modules/entry/front/buy/import/style.scss index dba0696164..8426d41699 100644 --- a/modules/entry/front/buy/import/style.scss +++ b/modules/entry/front/buy/import/style.scss @@ -2,4 +2,10 @@ vn-entry-buy-import { .vn-table > tbody td:nth-child(1) { width: 250px } +} + +.itemFilter { + vn-table.scrollable { + height: 500px + } } \ No newline at end of file diff --git a/modules/entry/front/buy/locale/es.yml b/modules/entry/front/buy/locale/es.yml index c775877581..55828a3c6a 100644 --- a/modules/entry/front/buy/locale/es.yml +++ b/modules/entry/front/buy/locale/es.yml @@ -3,4 +3,6 @@ Observation: Observación Box: Embalaje Import buys: Importar compras Some of the imported buys doesn't have an item: Algunas de las compras importadas no tienen un artículo -JSON files only: Solo ficheros JSON \ No newline at end of file +JSON files only: Solo ficheros JSON +Filter item: Filtrar artículo +Filter...: Filtrar... \ No newline at end of file diff --git a/modules/item/front/search-panel/locale/es.yml b/modules/item/front/search-panel/locale/es.yml index 197da0695c..67a5200d7e 100644 --- a/modules/item/front/search-panel/locale/es.yml +++ b/modules/item/front/search-panel/locale/es.yml @@ -1,6 +1,6 @@ Ink: Tinta Origin: Origen -Producer: Productor. +Producer: Productor With visible: Con visible Field: Campo More fields: Más campos From 1b9ca1339108a5725f2aac9cb63c6efdb13dc5b3 Mon Sep 17 00:00:00 2001 From: joan Date: Thu, 5 Aug 2021 13:42:19 +0200 Subject: [PATCH 3/7] Ammends --- db/changes/10340-summer/00-buy_importReference.sql | 10 +++++----- modules/entry/back/methods/entry/importBuys.js | 2 +- modules/entry/back/methods/entry/importBuysPreview.js | 2 +- modules/entry/back/model-config.json | 2 +- modules/entry/back/models/buy-import-reference.json | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/db/changes/10340-summer/00-buy_importReference.sql b/db/changes/10340-summer/00-buy_importReference.sql index 4046b498be..f6bdc059c8 100644 --- a/db/changes/10340-summer/00-buy_importReference.sql +++ b/db/changes/10340-summer/00-buy_importReference.sql @@ -1,14 +1,14 @@ -create table `vn`.`buyImportReference` +create table `vn`.`itemMatchProperties` ( itemFk int not null, name varchar(80) not null, - company varchar(80) not null, + producer varchar(80) not null, size int not null, - constraint buyImportReference_pk - primary key (itemFk, name, company, size), + constraint itemMatchProperties_pk + primary key (itemFk, name, producer, size), constraint itemFk___fk foreign key (itemFk) references item (id) on update cascade on delete cascade ) -comment 'Referencias de compras importadas'; +comment 'Propiedades para encontrar articulos equivalentes en verdnatura'; diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js index d8db328a30..5425bdd5d8 100644 --- a/modules/entry/back/methods/entry/importBuys.js +++ b/modules/entry/back/methods/entry/importBuys.js @@ -72,7 +72,7 @@ module.exports = Self => { packageFk: buy.packageFk }); - await models.BuyImportReference.upsert({ + await models.ItemMatchProperties.upsert({ itemFk: buy.itemFk, name: buy.description, company: buy.companyName, diff --git a/modules/entry/back/methods/entry/importBuysPreview.js b/modules/entry/back/methods/entry/importBuysPreview.js index 6b03579c7a..b3ef92ee5d 100644 --- a/modules/entry/back/methods/entry/importBuysPreview.js +++ b/modules/entry/back/methods/entry/importBuysPreview.js @@ -41,7 +41,7 @@ module.exports = Self => { if (packaging) buy.packageFk = packaging.id; - const reference = await models.BuyImportReference.findOne({ + const reference = await models.ItemMatchProperties.findOne({ fields: ['itemFk'], where: { name: buy.description, diff --git a/modules/entry/back/model-config.json b/modules/entry/back/model-config.json index b4c50c3aaf..ad5a9063ec 100644 --- a/modules/entry/back/model-config.json +++ b/modules/entry/back/model-config.json @@ -5,7 +5,7 @@ "Buy": { "dataSource": "vn" }, - "BuyImportReference": { + "ItemMatchProperties": { "dataSource": "vn" }, "EntryLog": { diff --git a/modules/entry/back/models/buy-import-reference.json b/modules/entry/back/models/buy-import-reference.json index ffe5248588..bb9c559a2d 100644 --- a/modules/entry/back/models/buy-import-reference.json +++ b/modules/entry/back/models/buy-import-reference.json @@ -1,9 +1,9 @@ { - "name": "BuyImportReference", + "name": "ItemMatchProperties", "base": "VnModel", "options": { "mysql": { - "table": "buyImportReference" + "table": "itemMatchProperties" } }, "properties": { From eba39cc706f8f9897bedab9804e6475ac670d58c Mon Sep 17 00:00:00 2001 From: joan Date: Thu, 5 Aug 2021 13:44:31 +0200 Subject: [PATCH 4/7] Ammends --- modules/entry/back/methods/entry/importBuys.js | 2 +- modules/entry/back/methods/entry/importBuysPreview.js | 2 +- modules/entry/back/models/buy-import-reference.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js index 5425bdd5d8..febddc9e7b 100644 --- a/modules/entry/back/methods/entry/importBuys.js +++ b/modules/entry/back/methods/entry/importBuys.js @@ -75,7 +75,7 @@ module.exports = Self => { await models.ItemMatchProperties.upsert({ itemFk: buy.itemFk, name: buy.description, - company: buy.companyName, + producer: buy.companyName, size: buy.size }, options); } diff --git a/modules/entry/back/methods/entry/importBuysPreview.js b/modules/entry/back/methods/entry/importBuysPreview.js index b3ef92ee5d..790d33364c 100644 --- a/modules/entry/back/methods/entry/importBuysPreview.js +++ b/modules/entry/back/methods/entry/importBuysPreview.js @@ -45,7 +45,7 @@ module.exports = Self => { fields: ['itemFk'], where: { name: buy.description, - company: buy.companyName, + producer: buy.companyName, size: buy.size } }, myOptions); diff --git a/modules/entry/back/models/buy-import-reference.json b/modules/entry/back/models/buy-import-reference.json index bb9c559a2d..ab64dad73e 100644 --- a/modules/entry/back/models/buy-import-reference.json +++ b/modules/entry/back/models/buy-import-reference.json @@ -15,7 +15,7 @@ "name": { "type": "string" }, - "company": { + "producer": { "type": "string" }, "size": { From 0c45aa64990c24d4b08296668f07454ddd32d6e2 Mon Sep 17 00:00:00 2001 From: joan Date: Thu, 5 Aug 2021 15:08:53 +0200 Subject: [PATCH 5/7] Updated e2e --- e2e/paths/12-entry/07_buys.spec.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/e2e/paths/12-entry/07_buys.spec.js b/e2e/paths/12-entry/07_buys.spec.js index e5617b8bd4..17a3dd8d60 100644 --- a/e2e/paths/12-entry/07_buys.spec.js +++ b/e2e/paths/12-entry/07_buys.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -describe('Entry import, create and edit buys path', () => { +fdescribe('Entry import, create and edit buys path', () => { let browser; let page; @@ -29,9 +29,6 @@ describe('Entry import, create and edit buys path', () => { }); it('should fill the form, import the designated JSON file and select items for each import and confirm import', async() => { - await page.write(selectors.entryBuys.ref, 'a reference'); - await page.write(selectors.entryBuys.observation, 'an observation'); - let currentDir = process.cwd(); let filePath = `${currentDir}/e2e/assets/07_import_buys.json`; @@ -41,6 +38,9 @@ describe('Entry import, create and edit buys path', () => { ]); await fileChooser.accept([filePath]); + await page.waitForTextInField(selectors.entryBuys.ref, '200573095, 200573106, 200573117, 200573506'); + await page.waitForTextInField(selectors.entryBuys.observation, '729-6340 2846'); + await page.autocompleteSearch(selectors.entryBuys.firstImportedItem, 'Ranged Reinforced weapon pistol 9mm'); await page.autocompleteSearch(selectors.entryBuys.secondImportedItem, 'Melee Reinforced weapon heavy shield 1x0.5m'); await page.autocompleteSearch(selectors.entryBuys.thirdImportedItem, 'Container medical box 1m'); From ce37f982c4d3c16f4c6e47bd7459016fd592f438 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 6 Aug 2021 12:03:39 +0200 Subject: [PATCH 6/7] Removed focus --- e2e/paths/12-entry/07_buys.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/paths/12-entry/07_buys.spec.js b/e2e/paths/12-entry/07_buys.spec.js index 17a3dd8d60..4042c99b6c 100644 --- a/e2e/paths/12-entry/07_buys.spec.js +++ b/e2e/paths/12-entry/07_buys.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors.js'; import getBrowser from '../../helpers/puppeteer'; -fdescribe('Entry import, create and edit buys path', () => { +describe('Entry import, create and edit buys path', () => { let browser; let page; From 9dc1168ad2a7e399879904c501b664bd597b9ba6 Mon Sep 17 00:00:00 2001 From: joan Date: Fri, 6 Aug 2021 12:24:36 +0200 Subject: [PATCH 7/7] Transaction refactor --- .../entry/back/methods/entry/importBuys.js | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/modules/entry/back/methods/entry/importBuys.js b/modules/entry/back/methods/entry/importBuys.js index febddc9e7b..3ed8ac1c7d 100644 --- a/modules/entry/back/methods/entry/importBuys.js +++ b/modules/entry/back/methods/entry/importBuys.js @@ -11,11 +11,6 @@ module.exports = Self => { description: 'The entry id', http: {source: 'path'} }, - { - arg: 'options', - type: 'object', - description: 'Callback options', - }, { arg: 'ref', type: 'string', @@ -28,11 +23,11 @@ module.exports = Self => { }, { arg: 'buys', - type: ['Object'], + type: ['object'], description: 'The buys', }], returns: { - type: ['Object'], + type: ['object'], root: true }, http: { @@ -41,23 +36,27 @@ module.exports = Self => { } }); - Self.importBuys = async(ctx, id, options = {}) => { + Self.importBuys = async(ctx, id, options) => { const conn = Self.dataSource.connector; const args = ctx.args; const models = Self.app.models; let tx; + const myOptions = {}; - if (!options.transaction) { + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { tx = await Self.beginTransaction({}); - options.transaction = tx; + myOptions.transaction = tx; } try { - const entry = await models.Entry.findById(id, null, options); + const entry = await models.Entry.findById(id, null, myOptions); await entry.updateAttributes({ observation: args.observation, ref: args.ref - }, options); + }, myOptions); const buys = []; for (let buy of args.buys) { @@ -77,10 +76,10 @@ module.exports = Self => { name: buy.description, producer: buy.companyName, size: buy.size - }, options); + }, myOptions); } - const createdBuys = await models.Buy.create(buys, options); + const createdBuys = await models.Buy.create(buys, myOptions); const buyIds = createdBuys.map(buy => buy.id); const stmts = []; @@ -97,7 +96,7 @@ module.exports = Self => { stmts.push('CALL buy_recalcPrices()'); const sql = ParameterizedSQL.join(stmts, ';'); - await conn.executeStmt(sql, options); + await conn.executeStmt(sql, myOptions); if (tx) await tx.commit(); } catch (e) { if (tx) await tx.rollback();