From 1c6a5164d49acb04f8845b661ea8eb11b5c264db Mon Sep 17 00:00:00 2001 From: vicent Date: Wed, 23 Nov 2022 14:04:43 +0100 Subject: [PATCH 1/9] feat: buscar por itemFk y claimResponsibleFk --- modules/claim/back/methods/claim/filter.js | 42 +++++++++++++++------ modules/claim/front/search-panel/index.html | 22 ++++++++++- modules/claim/front/search-panel/index.js | 9 ++++- 3 files changed, 59 insertions(+), 14 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index e868302002..730fa9ec0b 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -23,7 +23,7 @@ module.exports = Self => { { arg: 'search', type: 'string', - description: `If it's and integer searchs by id, otherwise it searchs by client name`, + description: `If it's and number searchs by id, otherwise it searchs by client name`, http: {source: 'query'} }, { @@ -34,31 +34,31 @@ module.exports = Self => { }, { arg: 'id', - type: 'integer', + type: 'number', description: 'The claim id', http: {source: 'query'} }, { arg: 'clientFk', - type: 'integer', + type: 'number', description: 'The client id', http: {source: 'query'} }, { arg: 'claimStateFk', - type: 'integer', + type: 'number', description: 'The claim state id', http: {source: 'query'} }, { arg: 'salesPersonFk', - type: 'integer', + type: 'number', description: 'The salesPerson id', http: {source: 'query'} }, { arg: 'attenderFk', - type: 'integer', + type: 'number', description: 'The attender worker id', http: {source: 'query'} }, @@ -67,6 +67,18 @@ module.exports = Self => { type: 'date', description: 'The to date filter', http: {source: 'query'} + }, + { + arg: 'itemFk', + type: 'number', + description: 'The item id', + http: {source: 'query'} + }, + { + arg: 'claimResponsibleFk', + type: 'number', + description: 'The claimResponsible id', + http: {source: 'query'} } ], returns: { @@ -100,9 +112,10 @@ module.exports = Self => { case 'clientName': return {'cl.clientName': {like: `%${value}%`}}; case 'clientFk': - return {'cl.clientFk': value}; case 'id': case 'claimStateFk': + case 'itemFk': + case 'claimResponsibleFk': case 'priority': return {[`cl.${param}`]: value}; case 'salesPersonFk': @@ -123,9 +136,9 @@ module.exports = Self => { const stmts = []; const stmt = new ParameterizedSQL( - `SELECT * + `SELECT * FROM ( - SELECT + SELECT DISTINCT cl.id, cl.clientFk, c.name AS clientName, @@ -135,12 +148,17 @@ module.exports = Self => { cl.created, cs.priority, cl.claimStateFk, - c.salesPersonFk + c.salesPersonFk, + s.itemFk, + cd.claimResponsibleFk FROM claim cl LEFT JOIN client c ON c.id = cl.clientFk - LEFT JOIN worker w ON w.id = cl.workerFk + LEFT JOIN worker w ON w.id = cl.workerFk LEFT JOIN account.user u ON u.id = w.userFk - LEFT JOIN claimState cs ON cs.id = cl.claimStateFk ) cl` + LEFT JOIN claimState cs ON cs.id = cl.claimStateFk + LEFT JOIN claimBeginning cb ON cb.claimFk = cl.id + LEFT JOIN sale s ON s.id = cb.saleFk + LEFT JOIN claimDevelopment cd ON cd.claimFk = cl.id ) cl` ); stmt.merge(conn.makeSuffix(filter)); diff --git a/modules/claim/front/search-panel/index.html b/modules/claim/front/search-panel/index.html index eec8cd7271..151a06c8e6 100644 --- a/modules/claim/front/search-panel/index.html +++ b/modules/claim/front/search-panel/index.html @@ -58,8 +58,28 @@ ng-model="filter.created"> + + + {{::id}} - {{::name}} + + + + - \ No newline at end of file + diff --git a/modules/claim/front/search-panel/index.js b/modules/claim/front/search-panel/index.js index a7e8fb046f..2400b8ede5 100644 --- a/modules/claim/front/search-panel/index.js +++ b/modules/claim/front/search-panel/index.js @@ -1,7 +1,14 @@ import ngModule from '../module'; import SearchPanel from 'core/components/searchbar/search-panel'; +class Controller extends SearchPanel { + itemSearchFunc($search) { + return /^\d+$/.test($search) + ? {id: $search} + : {name: {like: '%' + $search + '%'}}; + } +} ngModule.vnComponent('vnClaimSearchPanel', { template: require('./index.html'), - controller: SearchPanel + controller: Controller }); From 14eba75a8e5311b38a1fd9e6d1614f61064b54ad Mon Sep 17 00:00:00 2001 From: vicent Date: Wed, 23 Nov 2022 14:08:43 +0100 Subject: [PATCH 2/9] feat: backTest --- .../back/methods/claim/specs/filter.spec.js | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/modules/claim/back/methods/claim/specs/filter.spec.js b/modules/claim/back/methods/claim/specs/filter.spec.js index b26afe8c4d..49e2585052 100644 --- a/modules/claim/back/methods/claim/specs/filter.spec.js +++ b/modules/claim/back/methods/claim/specs/filter.spec.js @@ -57,4 +57,44 @@ describe('claim filter()', () => { throw e; } }); + + it('should return 3 results filtering by item id', async() => { + const tx = await app.models.Claim.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const result = await app.models.Claim.filter({args: {filter: {}, itemFk: 2}}, null, options); + + expect(result.length).toEqual(3); + expect(result[0].id).toEqual(1); + expect(result[1].id).toEqual(2); + expect(result[2].id).toEqual(4); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); + + it('should return 3 results filtering by claimResponsible id', async() => { + const tx = await app.models.Claim.beginTransaction({}); + + try { + const options = {transaction: tx}; + + const result = await app.models.Claim.filter({args: {filter: {}, claimResponsibleFk: 7}}, null, options); + + expect(result.length).toEqual(3); + expect(result[0].id).toEqual(2); + expect(result[1].id).toEqual(3); + expect(result[2].id).toEqual(4); + + await tx.rollback(); + } catch (e) { + await tx.rollback(); + throw e; + } + }); }); From d023ec0a13fab813089a70c3004a690c69ae6692 Mon Sep 17 00:00:00 2001 From: vicent Date: Fri, 25 Nov 2022 08:24:25 +0100 Subject: [PATCH 3/9] update fixtures --- db/dump/fixtures.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 41cd846388..04adc5649c 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -1776,7 +1776,7 @@ INSERT INTO `vn`.`claimDestination`(`id`, `description`, `addressFk`) INSERT INTO `vn`.`claimDevelopment`(`id`, `claimFk`, `claimResponsibleFk`, `workerFk`, `claimReasonFk`, `claimResultFk`, `claimRedeliveryFk`, `claimDestinationFk`) VALUES (1, 1, 1, 21, 1, 1, 2, 5), - (2, 1, 1, 21, 7, 2, 2, 5), + (2, 1, 2, 21, 7, 2, 2, 5), (3, 2, 7, 21, 9, 3, 2, 5), (4, 3, 7, 21, 15, 8, 2, 5), (5, 4, 7, 21, 7, 8, 2, 5); From 4c0effc48aefdbb80702c045312dcdcfee0cab6a Mon Sep 17 00:00:00 2001 From: vicent Date: Thu, 1 Dec 2022 07:25:18 +0100 Subject: [PATCH 4/9] refacor: description actualizada --- modules/claim/back/methods/claim/filter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index 730fa9ec0b..c31ac3ebd5 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -23,7 +23,7 @@ module.exports = Self => { { arg: 'search', type: 'string', - description: `If it's and number searchs by id, otherwise it searchs by client name`, + description: `If it's a number searchs by id, otherwise it searchs by client name`, http: {source: 'query'} }, { From 9bcef08397f5495d0af5d78727ff7f8bbe21a2c5 Mon Sep 17 00:00:00 2001 From: vicent Date: Mon, 12 Dec 2022 12:08:30 +0100 Subject: [PATCH 5/9] feat: buscar por responsibleFk sin afectar a la consulta principal --- modules/claim/back/methods/claim/filter.js | 75 +++++++++++++--------- 1 file changed, 45 insertions(+), 30 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index c31ac3ebd5..8ff3288de2 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -93,33 +93,34 @@ module.exports = Self => { Self.filter = async(ctx, filter, options) => { const conn = Self.dataSource.connector; + const args = ctx.args; const myOptions = {}; let to; if (typeof options == 'object') Object.assign(myOptions, options); - const where = buildFilter(ctx.args, (param, value) => { + const where = buildFilter(args, (param, value) => { switch (param) { case 'search': return /^\d+$/.test(value) ? {'cl.id': value} : { or: [ - {'cl.clientName': {like: `%${value}%`}} + {'c.name': {like: `%${value}%`}} ] }; case 'clientName': - return {'cl.clientName': {like: `%${value}%`}}; + return {'c.name': {like: `%${value}%`}}; case 'clientFk': case 'id': case 'claimStateFk': - case 'itemFk': - case 'claimResponsibleFk': case 'priority': return {[`cl.${param}`]: value}; + case 'itemFk': + return {[`s.${param}`]: value}; case 'salesPersonFk': - return {'cl.salesPersonFk': value}; + return {'c.salesPersonFk': value}; case 'attenderFk': return {'cl.workerFk': value}; case 'created': @@ -131,36 +132,50 @@ module.exports = Self => { } }); - filter = mergeFilters(ctx.args.filter, {where}); + filter = mergeFilters(args.filter, {where}); const stmts = []; const stmt = new ParameterizedSQL( - `SELECT * - FROM ( - SELECT DISTINCT - cl.id, - cl.clientFk, - c.name AS clientName, - cl.workerFk, - u.name AS workerName, - cs.description, - cl.created, - cs.priority, - cl.claimStateFk, - c.salesPersonFk, - s.itemFk, - cd.claimResponsibleFk - FROM claim cl - LEFT JOIN client c ON c.id = cl.clientFk - LEFT JOIN worker w ON w.id = cl.workerFk - LEFT JOIN account.user u ON u.id = w.userFk - LEFT JOIN claimState cs ON cs.id = cl.claimStateFk - LEFT JOIN claimBeginning cb ON cb.claimFk = cl.id - LEFT JOIN sale s ON s.id = cb.saleFk - LEFT JOIN claimDevelopment cd ON cd.claimFk = cl.id ) cl` + `SELECT + cl.id, + cl.clientFk, + c.name AS clientName, + cl.workerFk, + u.name AS workerName, + cs.description, + cl.created, + cs.priority, + cl.claimStateFk, + c.salesPersonFk, + s.itemFk + FROM claim cl + LEFT JOIN client c ON c.id = cl.clientFk + LEFT JOIN worker w ON w.id = cl.workerFk + LEFT JOIN account.user u ON u.id = w.userFk + LEFT JOIN claimState cs ON cs.id = cl.claimStateFk + LEFT JOIN claimBeginning cb ON cb.claimFk = cl.id + LEFT JOIN sale s ON s.id = cb.saleFk` ); + if (args.claimResponsibleFk) { + query = `SELECT cd.claimFk + FROM claimDevelopment cd + WHERE cd.claimResponsibleFk = ?`; + const claimDevelopments = await Self.rawSql(query, [args.claimResponsibleFk], myOptions); + + const claimIds = claimDevelopments.map(claimDevelopment => { + return claimDevelopment.claimFk; + }); + + stmt.merge({ + sql: `LEFT JOIN claimDevelopment cd ON cd.claimFk = cl.id + WHERE cl.id IN (?) + GROUP BY cl.id`, + params: [claimIds], + }); + } + stmt.merge(conn.makeSuffix(filter)); const itemsIndex = stmts.push(stmt) - 1; From eb4cb318ed981c084d47ebedb8c54576e3f41bce Mon Sep 17 00:00:00 2001 From: vicent Date: Wed, 28 Dec 2022 08:43:02 +0100 Subject: [PATCH 6/9] refactor: evitar join innecesarios en el filter general --- modules/claim/back/methods/claim/filter.js | 53 +++++++++++----------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index 8ff3288de2..1ec641642b 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -100,6 +100,26 @@ module.exports = Self => { if (typeof options == 'object') Object.assign(myOptions, options); + let claimIdsByItemFk = []; + let claimIdsByClaimResponsibleFk = []; + + if (args.itemFk) { + query = `SELECT cb.claimFk + FROM claimBeginning cb + LEFT JOIN sale s ON s.id = cb.saleFk + WHERE s.itemFk = ?`; + const claims = await Self.rawSql(query, [args.itemFk], myOptions); + claimIdsByItemFk = claims.map(claim => claim.claimFk); + } + + if (args.claimResponsibleFk) { + query = `SELECT cd.claimFk + FROM claimDevelopment cd + WHERE cd.claimResponsibleFk = ?`; + const claims = await Self.rawSql(query, [args.claimResponsibleFk], myOptions); + claimIdsByClaimResponsibleFk = claims.map(claim => claim.claimFk); + } + const where = buildFilter(args, (param, value) => { switch (param) { case 'search': @@ -118,7 +138,9 @@ module.exports = Self => { case 'priority': return {[`cl.${param}`]: value}; case 'itemFk': - return {[`s.${param}`]: value}; + return {'cl.id': {inq: claimIdsByItemFk}}; + case 'claimResponsibleFk': + return {'cl.id': {inq: claimIdsByClaimResponsibleFk}}; case 'salesPersonFk': return {'c.salesPersonFk': value}; case 'attenderFk': @@ -144,42 +166,19 @@ module.exports = Self => { cl.workerFk, u.name AS workerName, cs.description, - cl.created, - cs.priority, - cl.claimStateFk, - c.salesPersonFk, - s.itemFk + cl.created FROM claim cl LEFT JOIN client c ON c.id = cl.clientFk LEFT JOIN worker w ON w.id = cl.workerFk LEFT JOIN account.user u ON u.id = w.userFk - LEFT JOIN claimState cs ON cs.id = cl.claimStateFk - LEFT JOIN claimBeginning cb ON cb.claimFk = cl.id - LEFT JOIN sale s ON s.id = cb.saleFk` + LEFT JOIN claimState cs ON cs.id = cl.claimStateFk` ); - if (args.claimResponsibleFk) { - query = `SELECT cd.claimFk - FROM claimDevelopment cd - WHERE cd.claimResponsibleFk = ?`; - const claimDevelopments = await Self.rawSql(query, [args.claimResponsibleFk], myOptions); - - const claimIds = claimDevelopments.map(claimDevelopment => { - return claimDevelopment.claimFk; - }); - - stmt.merge({ - sql: `LEFT JOIN claimDevelopment cd ON cd.claimFk = cl.id - WHERE cl.id IN (?) - GROUP BY cl.id`, - params: [claimIds], - }); - } - stmt.merge(conn.makeSuffix(filter)); const itemsIndex = stmts.push(stmt) - 1; const sql = ParameterizedSQL.join(stmts, ';'); + console.log(sql); const result = await conn.executeStmt(sql, myOptions); return itemsIndex === 0 ? result : result[itemsIndex]; From eed6d05e2370266ccec66fe97310376ad70c3ca9 Mon Sep 17 00:00:00 2001 From: vicent Date: Wed, 28 Dec 2022 08:51:39 +0100 Subject: [PATCH 7/9] delete console.log --- modules/claim/back/methods/claim/filter.js | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index 1ec641642b..ab6c255823 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -178,7 +178,6 @@ module.exports = Self => { const itemsIndex = stmts.push(stmt) - 1; const sql = ParameterizedSQL.join(stmts, ';'); - console.log(sql); const result = await conn.executeStmt(sql, myOptions); return itemsIndex === 0 ? result : result[itemsIndex]; From ba7e5d6a91015d7979402a2c4c61f6287ee820aa Mon Sep 17 00:00:00 2001 From: vicent Date: Wed, 28 Dec 2022 11:56:34 +0100 Subject: [PATCH 8/9] refator: se usa loopback cuando se puede --- modules/claim/back/methods/claim/filter.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index ab6c255823..965e48cca3 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -92,6 +92,7 @@ module.exports = Self => { }); Self.filter = async(ctx, filter, options) => { + const models = Self.app.models; const conn = Self.dataSource.connector; const args = ctx.args; const myOptions = {}; @@ -113,10 +114,10 @@ module.exports = Self => { } if (args.claimResponsibleFk) { - query = `SELECT cd.claimFk - FROM claimDevelopment cd - WHERE cd.claimResponsibleFk = ?`; - const claims = await Self.rawSql(query, [args.claimResponsibleFk], myOptions); + const claims = await models.ClaimDevelopment.find({ + fields: ['claimFk'], + where: {claimResponsibleFk: args.claimResponsibleFk} + }, myOptions); claimIdsByClaimResponsibleFk = claims.map(claim => claim.claimFk); } From 1aa21c16b52c440decb207c30bd8ffe0294fce34 Mon Sep 17 00:00:00 2001 From: vicent Date: Thu, 5 Jan 2023 11:42:21 +0100 Subject: [PATCH 9/9] refactor: borrado join a worker --- modules/claim/back/methods/claim/filter.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/claim/back/methods/claim/filter.js b/modules/claim/back/methods/claim/filter.js index 965e48cca3..d653229e5d 100644 --- a/modules/claim/back/methods/claim/filter.js +++ b/modules/claim/back/methods/claim/filter.js @@ -170,8 +170,7 @@ module.exports = Self => { cl.created FROM claim cl LEFT JOIN client c ON c.id = cl.clientFk - LEFT JOIN worker w ON w.id = cl.workerFk - LEFT JOIN account.user u ON u.id = w.userFk + LEFT JOIN account.user u ON u.id = cl.workerFk LEFT JOIN claimState cs ON cs.id = cl.claimStateFk` );