diff --git a/modules/item/back/methods/item/getSummary.js b/modules/item/back/methods/item/getSummary.js index 4fb9d9ed1..fd52951d7 100644 --- a/modules/item/back/methods/item/getSummary.js +++ b/modules/item/back/methods/item/getSummary.js @@ -22,6 +22,7 @@ module.exports = Self => { Self.getSummary = async id => { let promises = []; let summary = {}; + const models = Self.app.models; // Item basic data and taxes let filter = { @@ -66,7 +67,7 @@ module.exports = Self => { } ] }; - promises.push(Self.app.models.Item.find(filter)); + promises.push(models.Item.find(filter)); // Tags filter = { @@ -78,21 +79,21 @@ module.exports = Self => { relation: 'tag' } }; - promises.push(Self.app.models.ItemTag.find(filter)); + promises.push(models.ItemTag.find(filter)); // Botanical filter = { where: {itemFk: id}, include: [{relation: 'genus'}, {relation: 'specie'}] }; - promises.push(Self.app.models.ItemBotanical.find(filter)); + promises.push(models.ItemBotanical.find(filter)); // Niches filter = { where: {itemFk: id}, include: {relation: 'warehouse'} }; - promises.push(Self.app.models.ItemNiche.find(filter)); + promises.push(models.ItemNiche.find(filter)); let res = await Promise.all(promises); @@ -101,15 +102,10 @@ module.exports = Self => { [summary.botanical] = res[2]; summary.niches = res[3]; - // Visible Avaible - let query = ` - CALL vn.item_getVisibleAvailable(?,curdate(),?,?)`; + res = await models.Item.getVisibleAvailable(summary.item.id, summary.item.itemType().warehouseFk); - let options = [summary.item.id, summary.item.itemType().warehouseFk, false]; - [res] = await Self.rawSql(query, options); - - summary.available = res[0].available ? res[0].available : '-'; - summary.visible = res[0].visible ? res[0].visible : '-'; + summary.available = res.available; + summary.visible = res.visible; return summary; }; }; diff --git a/modules/item/back/methods/item/getVisibleAvailable.js b/modules/item/back/methods/item/getVisibleAvailable.js index 7f0855740..0dd578733 100644 --- a/modules/item/back/methods/item/getVisibleAvailable.js +++ b/modules/item/back/methods/item/getVisibleAvailable.js @@ -1,3 +1,4 @@ +const ParameterizedSQL = require('loopback-connector').ParameterizedSQL; module.exports = Self => { Self.remoteMethod('getVisibleAvailable', { description: 'Returns visible and available for params', @@ -11,6 +12,11 @@ module.exports = Self => { arg: 'warehouseFk', type: 'Number', required: true, + }, + { + arg: 'dated', + type: 'Date', + required: false, }], returns: { type: ['object'], @@ -22,15 +28,35 @@ module.exports = Self => { } }); - Self.getVisibleAvailable = async(id, warehouseFk) => { - let query = ` - CALL vn.item_getVisibleAvailable(?,curdate(),?,?)`; + Self.getVisibleAvailable = async(id, warehouseFk, dated = new Date()) => { + let stmts = []; - let options = [id, warehouseFk, false]; - [res] = await Self.rawSql(query, options); + stmts.push(new ParameterizedSQL( + 'CALL cache.available_refresh(@availableCalc, FALSE, ?, ?)', [ + warehouseFk, + dated + ] + )); + stmts.push(new ParameterizedSQL( + 'CALL cache.visible_refresh(@visibleCalc, FALSE,?)', [ + warehouseFk + ] + )); + const visibleIndex = stmts.push(new ParameterizedSQL( + 'SELECT visible FROM cache.visible WHERE calc_id = @visibleCalc AND item_id = ?', [ + id + ] + )) - 1; + const availableIndex = stmts.push(new ParameterizedSQL( + 'SELECT available FROM cache.available WHERE calc_id = @availableCalc AND item_id = ?', [ + id + ] + )) - 1; + const sql = ParameterizedSQL.join(stmts, ';'); + let res = await Self.rawStmt(sql); return { - available: res[0].available, - visible: res[0].visible}; + available: res[availableIndex][0] ? res[availableIndex][0].available : 0, + visible: res[visibleIndex][0] ? res[visibleIndex][0].visible : 0}; }; }; diff --git a/modules/item/back/methods/item/regularize.js b/modules/item/back/methods/item/regularize.js index bfbc1e28c..bd908c2b7 100644 --- a/modules/item/back/methods/item/regularize.js +++ b/modules/item/back/methods/item/regularize.js @@ -61,13 +61,9 @@ module.exports = Self => { }, options); } - let query = ` - CALL vn.item_getVisibleAvailable(?,curdate(),?,?)`; + res = await models.Item.getVisibleAvailable(itemFk, warehouseFk); - let params = [itemFk, warehouseFk, true]; - let [res] = await Self.rawSql(query, params, options); - - let newQuantity = res[0].visible - quantity; + let newQuantity = res.visible - quantity; await models.Sale.create({ ticketFk: ticketFk, diff --git a/modules/item/back/methods/item/specs/getVisibleAvailable.spec.js b/modules/item/back/methods/item/specs/getVisibleAvailable.spec.js new file mode 100644 index 000000000..77e6cea8f --- /dev/null +++ b/modules/item/back/methods/item/specs/getVisibleAvailable.spec.js @@ -0,0 +1,33 @@ +const app = require('vn-loopback/server/server'); + +describe('item getVisibleAvailable()', () => { + it('should check available visible for today', async() => { + const itemFk = 1; + const warehouseFk = 1; + const dated = new Date(); + let result = await app.models.Item.getVisibleAvailable(itemFk, warehouseFk, dated); + + expect(result.available).toEqual(187); + expect(result.visible).toEqual(92); + }); + + it('should check available visible for no dated', async() => { + const itemFk = 1; + const warehouseFk = 1; + let result = await app.models.Item.getVisibleAvailable(itemFk, warehouseFk); + + expect(result.available).toEqual(187); + expect(result.visible).toEqual(92); + }); + + it('should check available visible for yesterday', async() => { + const itemFk = 1; + const warehouseFk = 1; + let dated = new Date(); + dated.setDate(dated.getDate() - 1); + let result = await app.models.Item.getVisibleAvailable(itemFk, warehouseFk, dated); + + expect(result.available).toEqual(0); + expect(result.visible).toEqual(92); + }); +}); diff --git a/modules/item/back/methods/item/specs/regularize.spec.js b/modules/item/back/methods/item/specs/regularize.spec.js index b285c15e1..d34dca25f 100644 --- a/modules/item/back/methods/item/specs/regularize.spec.js +++ b/modules/item/back/methods/item/specs/regularize.spec.js @@ -14,13 +14,8 @@ describe('regularize()', () => { it('should create a new ticket and add a line', async() => { let ctx = {req: {accessToken: {userId: 18}}}; - - let query = `CALL vn.item_getVisibleAvailable(?,curdate(),?,?)`; - - let options = [itemFk, warehouseFk, true]; - - let [res] = await app.models.Item.rawSql(query, options); - let visible = res[0].visible; + let res = await app.models.Item.getVisibleAvailable(itemFk, warehouseFk); + let visible = res.visible; let saleQuantity = visible - 11; let ticketFk = await app.models.Item.regularize(ctx, itemFk, 11, warehouseFk); diff --git a/modules/item/front/descriptor-popover/index.html b/modules/item/front/descriptor-popover/index.html index d4d8035b9..7a401a076 100644 --- a/modules/item/front/descriptor-popover/index.html +++ b/modules/item/front/descriptor-popover/index.html @@ -1,5 +1,5 @@ - + { expect(controller.item).toEqual(item); }); }); + + describe('updateStock()', () => { + it(`should perform a get query to store the item data into the controller`, () => { + $httpBackend.expectGET(`Items/${item.id}/getCard`).respond(item); + controller.id = item.id; + $httpBackend.flush(); + + expect(controller.item).toEqual(item); + }); + }); }); diff --git a/modules/ticket/back/methods/ticket-request/confirm.js b/modules/ticket/back/methods/ticket-request/confirm.js index fe08794f1..15050ba00 100644 --- a/modules/ticket/back/methods/ticket-request/confirm.js +++ b/modules/ticket/back/methods/ticket-request/confirm.js @@ -47,14 +47,9 @@ module.exports = Self => { include: {relation: 'ticket'} }, options); - let [[stock]] = await Self.rawSql(`CALL vn.item_getVisibleAvailable(?,?,?,?)`, [ - ctx.args.itemFk, - request.ticket().shipped, - request.ticket().warehouseFk, - false - ], options); + const res = await models.Item.getVisibleAvailable(ctx.args.itemFk, request.ticket().warehouseFk, request.ticket().shipped); - if (stock.available < 0) + if (res.available < 0) throw new UserError(`This item is not available`); if (request.saleFk) { diff --git a/modules/ticket/back/methods/ticket/addSale.js b/modules/ticket/back/methods/ticket/addSale.js index c1081c4be..c48b04e92 100644 --- a/modules/ticket/back/methods/ticket/addSale.js +++ b/modules/ticket/back/methods/ticket/addSale.js @@ -42,15 +42,9 @@ module.exports = Self => { const item = await models.Item.findById(itemId); const ticket = await models.Ticket.findById(id); - const shouldRefresh = false; - const [[stock]] = await Self.rawSql(`CALL vn.item_getVisibleAvailable(?, ?, ?, ?)`, [ - itemId, - ticket.shipped, - ticket.warehouseFk, - shouldRefresh - ]); + const res = await models.Item.getVisibleAvailable(itemId, ticket.warehouseFk, ticket.shipped); - if (stock.available < quantity) + if (res.available < quantity) throw new UserError(`This item is not available`); const newSale = await models.Sale.create({ diff --git a/modules/ticket/front/summary/index.html b/modules/ticket/front/summary/index.html index 3ea2b7234..901e089db 100644 --- a/modules/ticket/front/summary/index.html +++ b/modules/ticket/front/summary/index.html @@ -121,7 +121,7 @@ {{sale.itemFk | zeroFill:6}} diff --git a/modules/zone/front/delivery-days/index.spec.js b/modules/zone/front/delivery-days/index.spec.js index 156407420..db99add2c 100644 --- a/modules/zone/front/delivery-days/index.spec.js +++ b/modules/zone/front/delivery-days/index.spec.js @@ -61,8 +61,8 @@ describe('Zone Component vnZoneDeliveryDays', () => { expect(controller.$.data).toEqual(expectedData); }); }); - // PeticiĆ³n #2259 cread - xdescribe('onSelection()', () => { + + describe('onSelection()', () => { it('should not call the show popover method if events array is empty', () => { jest.spyOn(controller.$.zoneEvents, 'show'); diff --git a/package-lock.json b/package-lock.json index b46d40dcc..4a597175a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3244,7 +3244,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -4060,7 +4060,7 @@ "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "integrity": "sha1-e95c7RRbbVUakNuH+DxVi060io8=", "dev": true, "requires": { "cache-base": "^1.0.1", @@ -4577,7 +4577,7 @@ "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "integrity": "sha1-Cn9GQWgxyLZi7jb+TnxZ129marI=", "dev": true, "requires": { "collection-visit": "^1.0.0", @@ -4754,7 +4754,7 @@ "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "integrity": "sha1-+TNprouafOAv1B+q0MqDAzGQxGM=", "dev": true, "requires": { "arr-union": "^3.1.0", @@ -5816,7 +5816,7 @@ "dot-prop": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "integrity": "sha1-HxngwuGqDjJ5fEl5nyg3rGr2nFc=", "requires": { "is-obj": "^1.0.0" } @@ -6751,7 +6751,7 @@ }, "file-loader": { "version": "1.1.11", - "resolved": "http://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz", "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==", "dev": true, "requires": { @@ -7918,7 +7918,7 @@ "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "integrity": "sha1-bXcPDrUjrHgWTXK15xqIdyZcw+o=", "dev": true, "requires": { "global-prefix": "^1.0.1", @@ -8500,7 +8500,7 @@ "dependencies": { "es6-promise": { "version": "3.3.1", - "resolved": "http://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, @@ -9579,7 +9579,7 @@ "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -9935,7 +9935,7 @@ "jasmine-spec-reporter": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", - "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "integrity": "sha1-HWMq7ANBZwrTJPkrqEtLMrNeniI=", "dev": true, "requires": { "colors": "1.1.2" @@ -11932,7 +11932,7 @@ }, "minimist": { "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" }, "mississippi": { @@ -12972,7 +12972,7 @@ "dependencies": { "minimist": { "version": "0.0.10", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, @@ -14180,7 +14180,7 @@ "dependencies": { "jsesc": { "version": "0.5.0", - "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "dev": true } @@ -14558,7 +14558,7 @@ }, "safe-regex": { "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { @@ -14648,7 +14648,7 @@ "dependencies": { "source-map": { "version": "0.4.4", - "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { @@ -15006,7 +15006,7 @@ "snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "integrity": "sha1-bBdfhv8UvbByRWPo88GwIaKGhTs=", "dev": true, "requires": { "define-property": "^1.0.0", @@ -15057,7 +15057,7 @@ "snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "integrity": "sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI=", "dev": true, "requires": { "kind-of": "^3.2.0" @@ -15332,7 +15332,7 @@ "split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "integrity": "sha1-fLCd2jqGWFcFxks5pkZgOGguj+I=", "dev": true, "requires": { "extend-shallow": "^3.0.0" @@ -16409,7 +16409,7 @@ "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "integrity": "sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds=", "dev": true, "requires": { "nopt": "~1.0.10"