From 17542472da68d9373bd80025e560de6c1a267878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Thu, 27 Aug 2020 08:24:21 +0200 Subject: [PATCH 1/8] 2391 - Editable description --- back/model-config.json | 3 + back/models/accounting-type.json | 30 ++++++++ back/models/bank.json | 76 +++++++++++-------- db/changes/10210-summer/00-accountingType.sql | 2 + db/dump/fixtures.sql | 16 ++-- modules/client/back/methods/receipt/filter.js | 4 +- .../client/front/balance/create/index.html | 22 +++++- modules/client/front/balance/create/index.js | 13 ++++ modules/client/front/balance/index/index.html | 42 +++++----- modules/client/front/balance/index/index.js | 7 ++ 10 files changed, 153 insertions(+), 62 deletions(-) create mode 100644 back/models/accounting-type.json create mode 100644 db/changes/10210-summer/00-accountingType.sql diff --git a/back/model-config.json b/back/model-config.json index 323e5f2330..dc5cde2172 100644 --- a/back/model-config.json +++ b/back/model-config.json @@ -2,6 +2,9 @@ "Account": { "dataSource": "vn" }, + "AccountingType": { + "dataSource": "vn" + }, "Bank": { "dataSource": "vn" }, diff --git a/back/models/accounting-type.json b/back/models/accounting-type.json new file mode 100644 index 0000000000..7967933428 --- /dev/null +++ b/back/models/accounting-type.json @@ -0,0 +1,30 @@ +{ + "name": "AccountingType", + "base": "VnModel", + "options": { + "mysql": { + "table": "accountingType" + } + }, + "properties": { + "id": { + "type": "Number", + "id": true, + "description": "Identifier" + }, + "description": { + "type": "String", + "required": true + }, + "receiptDescription": { + "type": "String", + "required": true + } + }, + "acls": [{ + "accessType": "READ", + "principalType": "ROLE", + "principalId": "$everyone", + "permission": "ALLOW" + }] +} \ No newline at end of file diff --git a/back/models/bank.json b/back/models/bank.json index 119ea97437..33a2637d69 100644 --- a/back/models/bank.json +++ b/back/models/bank.json @@ -2,39 +2,49 @@ "name": "Bank", "base": "VnModel", "options": { - "mysql": { - "table": "bank" - } + "mysql": { + "table": "bank" + } }, "properties": { - "id": { - "type": "Number", - "id": true, - "description": "Identifier" - }, - "bank": { - "type": "string", - "required": true - }, - "account": { - "type": "string", - "required": true - }, - "cash": { - "type": "string", - "required": true - }, - "entityFk": { - "type": "string", - "required": true - }, - "isActive": { - "type": "string", - "required": true - }, - "currencyFk": { - "type": "string", - "required": true - } + "id": { + "type": "Number", + "id": true, + "description": "Identifier" + }, + "bank": { + "type": "String", + "required": true + }, + "account": { + "type": "String", + "required": true + }, + "accountingTypeFk": { + "type": "Number", + "required": true, + "mysql": { + "columnName": "cash" + } + }, + "entityFk": { + "type": "Number", + "required": true + }, + "isActive": { + "type": "Boolean", + "required": true + }, + "currencyFk": { + "type": "Number", + "required": true + } + }, + "relations": { + "accountingType": { + "type": "belongsTo", + "model": "AccountingType", + "foreignKey": "accountingTypeFk" + } } - } \ No newline at end of file +} \ No newline at end of file diff --git a/db/changes/10210-summer/00-accountingType.sql b/db/changes/10210-summer/00-accountingType.sql new file mode 100644 index 0000000000..1dbe29952a --- /dev/null +++ b/db/changes/10210-summer/00-accountingType.sql @@ -0,0 +1,2 @@ +ALTER TABLE `vn`.`accountingType` +ADD COLUMN `receiptDescription` VARCHAR(50) NULL AFTER `description`; diff --git a/db/dump/fixtures.sql b/db/dump/fixtures.sql index 2b70cf2bee..274d241399 100644 --- a/db/dump/fixtures.sql +++ b/db/dump/fixtures.sql @@ -116,13 +116,13 @@ INSERT INTO `vn`.`shelving` (`code`, `parkingFk`, `isPrinted`, `priority`, `park ('GVC', '1', '0', '1', '0', '106'), ('HEJ', '2', '0', '1', '0', '106'); -INSERT INTO `vn`.`accountingType`(`id`, `description`) +INSERT INTO `vn`.`accountingType`(`id`, `description`, `receiptDescription`) VALUES - (1, 'Digital money'), - (2, 'Cash'), - (3, 'Card'), - (4, 'Stolen Money'), - (5, 'Miscellaneous'); + (1, 'Digital money', ''), + (2, 'Cash', 'Cash'), + (3, 'Card', 'Pay on receipt'), + (4, 'Stolen Money', ''), + (5, 'Miscellaneous', ''); INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) VALUES @@ -133,8 +133,8 @@ INSERT INTO `vn`.`currency`(`id`, `code`, `name`, `ratio`) INSERT INTO `vn`.`bank`(`id`, `bank`, `account`, `cash`, `entityFk`, `isActive`, `currencyFk`) VALUES - (1, 'Pay on receipt', '0000000000', 4, 0, 1, 1), - (2, 'Cash', '1111111111', 1, 0, 1, 1); + (1, 'Pay on receipt', '0000000000', 3, 0, 1, 1), + (2, 'Cash', '1111111111', 2, 0, 1, 1); INSERT INTO `vn`.`deliveryMethod`(`id`, `code`, `description`) VALUES diff --git a/modules/client/back/methods/receipt/filter.js b/modules/client/back/methods/receipt/filter.js index 532d728119..b32249d4be 100644 --- a/modules/client/back/methods/receipt/filter.js +++ b/modules/client/back/methods/receipt/filter.js @@ -42,11 +42,11 @@ module.exports = Self => { r.workerFk, c.code company, r.created, - r.invoiceFk ref, + r.invoiceFk description, NULL debit, r.amountPaid credit, r.bankFk, - u.nickname userNickname, + u.name userName, r.clientFk, FALSE hasPdf, FALSE isInvoice diff --git a/modules/client/front/balance/create/index.html b/modules/client/front/balance/create/index.html index 506e86f4b0..5a75445fe4 100644 --- a/modules/client/front/balance/create/index.html +++ b/modules/client/front/balance/create/index.html @@ -2,6 +2,13 @@ New payment </tpl-title> <tpl-body> + <vn-crud-model + url="Banks" + include="{relation: 'accountingType'}" + data="banks" + order="id" + auto-load="true"> + </vn-crud-model> <vn-horizontal> <vn-date-picker label="Date" @@ -17,11 +24,15 @@ </vn-horizontal> <vn-horizontal> <vn-autocomplete - url="Banks" label="Bank" + data="banks" show-field="bank" value-field="id" - ng-model="$ctrl.receipt.bankFk"> + order="id" + ng-model="$ctrl.receipt.bankFk" + search-function="{or: [{id: $search}, {bank: {like: '%'+ $search +'%'}}]}" + selection="$ctrl.bankSelection"> + <tpl-item>{{id}}: {{bank}}</tpl-item> </vn-autocomplete> <vn-input-number vn-focus @@ -31,6 +42,13 @@ rule> </vn-input-number> </vn-horizontal> + <vn-horizontal> + <vn-textfield + label="Reference" + ng-model="$ctrl.receipt.description" + rule> + </vn-textfield> + </vn-horizontal> </tpl-body> <tpl-buttons> <input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/> diff --git a/modules/client/front/balance/create/index.js b/modules/client/front/balance/create/index.js index 880774f557..8b01cab4a7 100644 --- a/modules/client/front/balance/create/index.js +++ b/modules/client/front/balance/create/index.js @@ -50,6 +50,19 @@ class Controller extends Dialog { return this.receipt.description; } + get bankSelection() { + return this._bankSelection; + } + + set bankSelection(value) { + this._bankSelection = value; + + if (value) { + const accountingType = value.accountingType; + this.receipt.description = accountingType && accountingType.receiptDescription; + } + } + getAmountPaid() { const filter = { where: { diff --git a/modules/client/front/balance/index/index.html b/modules/client/front/balance/index/index.html index 1ad7efad99..da8c40315e 100644 --- a/modules/client/front/balance/index/index.html +++ b/modules/client/front/balance/index/index.html @@ -68,25 +68,33 @@ <span vn-click-stop="workerDescriptor.show($event, balance.workerFk)" class="link"> - {{::balance.userNickname}} + {{::balance.userName}} </span> </vn-td> - <vn-td expand> - <div ng-show="::balance.ref"> - <span - ng-if="balance.isInvoice" - title="{{'BILL' | translate: {ref: balance.ref} }}" - vn-click-stop="$ctrl.showInvoiceOutDescriptor($event, balance)" - class="link"> - {{'BILL' | translate: {ref: balance.ref} }} - </span> - <span - ng-if="!balance.isInvoice" - title="{{::balance.ref}}"> - {{::balance.ref}} - </span> - </div> - </vn-td> + <vn-td-editable disabled="balance.isInvoice" expand> + <text> + <div ng-show="::balance.description"> + <span + ng-if="balance.isInvoice" + title="{{'BILL' | translate: {ref: balance.description} }}" + vn-click-stop="$ctrl.showInvoiceOutDescriptor($event, balance)" + class="link"> + {{'BILL' | translate: {ref: balance.description} }} + </span> + <span + ng-if="!balance.isInvoice" + title="{{::balance.description}}"> + {{balance.description}} + </span> + </div> + </text> + <field> + <vn-textfield class="dense" vn-focus + ng-model="balance.description" + on-change="$ctrl.changeDescription(balance)"> + </vn-textfield> + </field> + </vn-td-editable> <vn-td number>{{::balance.bankFk}}</vn-td> <vn-td number expand>{{::balance.debit | currency: 'EUR':2}}</vn-td> <vn-td number expand>{{::balance.credit | currency: 'EUR':2}}</vn-td> diff --git a/modules/client/front/balance/index/index.js b/modules/client/front/balance/index/index.js index 8f52611765..40a6e49571 100644 --- a/modules/client/front/balance/index/index.js +++ b/modules/client/front/balance/index/index.js @@ -79,6 +79,13 @@ class Controller extends Section { this.$.invoiceOutDescriptor.show(event.target, balance.id); } + + changeDescription(balance) { + const params = {description: balance.description}; + const endpoint = `Receipts/${balance.id}`; + this.$http.patch(endpoint, params) + .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))); + } } Controller.$inject = ['$element', '$scope']; From ac181bb845b10519de74db1e9191be6305c83c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Thu, 27 Aug 2020 11:16:36 +0200 Subject: [PATCH 2/8] Updated unit tests --- .../client/front/balance/create/index.spec.js | 76 +++++++++++++++++++ modules/client/front/balance/index/index.js | 2 +- .../client/front/balance/index/index.spec.js | 20 ++++- 3 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 modules/client/front/balance/create/index.spec.js diff --git a/modules/client/front/balance/create/index.spec.js b/modules/client/front/balance/create/index.spec.js new file mode 100644 index 0000000000..11fdb1040c --- /dev/null +++ b/modules/client/front/balance/create/index.spec.js @@ -0,0 +1,76 @@ +import './index'; + +describe('Client', () => { + describe('Component vnClientBalancCreate', () => { + let controller; + let $httpBackend; + let $httpParamSerializer; + + beforeEach(ngModule('client')); + + beforeEach(inject(($componentController, $rootScope, _$httpBackend_, _$httpParamSerializer_) => { + $httpBackend = _$httpBackend_; + $httpParamSerializer = _$httpParamSerializer_; + let $scope = $rootScope.$new(); + const $element = angular.element('<vn-client-balance-create></vn-client-balance-create>'); + const $transclude = { + $$boundTransclude: { + $$slots: [] + } + }; + controller = $componentController('vnClientBalanceCreate', {$element, $scope, $transclude}); + controller.receipt = { + clientFk: 101, + companyFk: 442 + }; + })); + + describe('bankSelection() setter', () => { + it('should set the receipt description property', () => { + controller.bankSelection = { + id: 1, + bank: 'Cash', + accountingType: { + id: 2, + receiptDescription: 'Cash' + } + }; + + expect(controller.receipt.description).toEqual('Cash'); + }); + }); + + describe('getAmountPaid()', () => { + it('should make an http GET query and then set the receipt amountPaid property', () => { + controller.$params = {id: 101}; + const receipt = controller.receipt; + const filter = { + where: { + clientFk: 101, + companyFk: 442 + } + }; + const serializedParams = $httpParamSerializer({filter}); + $httpBackend.expect('GET', `ClientRisks?${serializedParams}`,).respond([{amount: 20}]); + controller.getAmountPaid(); + $httpBackend.flush(); + + expect(receipt.amountPaid).toEqual(20); + }); + }); + + describe('responseHandler()', () => { + it('should make an http POST query and then call to the parent responseHandler() method', () => { + jest.spyOn(controller.vnApp, 'showSuccess'); + + controller.$params = {id: 101}; + + $httpBackend.expect('POST', `Receipts`,).respond({id: 1}); + controller.responseHandler('accept'); + $httpBackend.flush(); + + expect(controller.vnApp.showSuccess).toHaveBeenCalled(); + }); + }); + }); +}); diff --git a/modules/client/front/balance/index/index.js b/modules/client/front/balance/index/index.js index 40a6e49571..3c76feabc4 100644 --- a/modules/client/front/balance/index/index.js +++ b/modules/client/front/balance/index/index.js @@ -58,7 +58,7 @@ class Controller extends Section { return balance.companyFk === selectedCompany; }); - return currentBalance.amount; + return currentBalance && currentBalance.amount; } getBalances() { diff --git a/modules/client/front/balance/index/index.spec.js b/modules/client/front/balance/index/index.spec.js index 496407847d..bdbea38460 100644 --- a/modules/client/front/balance/index/index.spec.js +++ b/modules/client/front/balance/index/index.spec.js @@ -3,10 +3,12 @@ import './index'; describe('Client', () => { describe('Component vnClientBalanceIndex', () => { let controller; + let $httpBackend; beforeEach(ngModule('client')); - beforeEach(inject(($componentController, $rootScope) => { + beforeEach(inject(($componentController, $rootScope, _$httpBackend_) => { + $httpBackend = _$httpBackend_; let $scope = $rootScope.$new(); const $element = angular.element('<vn-client-balance-index></vn-client-balance-index>'); controller = $componentController('vnClientBalanceIndex', {$element, $scope}); @@ -133,5 +135,21 @@ describe('Client', () => { expect(controller.getBalances).toHaveBeenCalledWith(); }); }); + + describe('changeDescription()', () => { + it('should make an http PATCH query', () => { + const expectedParams = {description: 'Web'}; + + $httpBackend.expect('PATCH', `Receipts/1`, expectedParams).respond(200); + controller.changeDescription({ + id: 1, + description: 'Web', + accountingType: { + description: 'Cash' + } + }); + $httpBackend.flush(); + }); + }); }); }); From f14b484faf69344322ec7bf642959557e49abdd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Thu, 27 Aug 2020 11:23:39 +0200 Subject: [PATCH 3/8] Added ACL to td-editable --- modules/client/front/balance/index/index.html | 4 ++-- modules/client/front/balance/index/index.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/client/front/balance/index/index.html b/modules/client/front/balance/index/index.html index da8c40315e..cf0c07cfcd 100644 --- a/modules/client/front/balance/index/index.html +++ b/modules/client/front/balance/index/index.html @@ -71,7 +71,7 @@ {{::balance.userName}} </span> </vn-td> - <vn-td-editable disabled="balance.isInvoice" expand> + <vn-td-editable disabled="balance.isInvoice || !$ctrl.isAdministrative" expand> <text> <div ng-show="::balance.description"> <span @@ -89,7 +89,7 @@ </div> </text> <field> - <vn-textfield class="dense" vn-focus + <vn-textfield vn-acl="administrative" class="dense" vn-focus ng-model="balance.description" on-change="$ctrl.changeDescription(balance)"> </vn-textfield> diff --git a/modules/client/front/balance/index/index.js b/modules/client/front/balance/index/index.js index 3c76feabc4..7e09e018cd 100644 --- a/modules/client/front/balance/index/index.js +++ b/modules/client/front/balance/index/index.js @@ -39,6 +39,10 @@ class Controller extends Section { this.getBalances(); } + get isAdministrative() { + return this.aclService.hasAny(['administrative']); + } + getData() { return this.$.model.applyFilter(null, { clientId: this.$params.id, From 914407012a0dabe006dd0a8cb92f5498e4b6096c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Thu, 27 Aug 2020 11:58:28 +0200 Subject: [PATCH 4/8] Fixed bank search expression --- e2e/paths/02-client/14_balance.spec.js | 2 +- modules/client/front/balance/create/index.html | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index 108f767108..6d9ab10c8c 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; -describe('Client balance path', () => { +fdescribe('Client balance path', () => { let browser; let page; beforeAll(async() => { diff --git a/modules/client/front/balance/create/index.html b/modules/client/front/balance/create/index.html index 5a75445fe4..6cfdc06669 100644 --- a/modules/client/front/balance/create/index.html +++ b/modules/client/front/balance/create/index.html @@ -2,13 +2,6 @@ New payment </tpl-title> <tpl-body> - <vn-crud-model - url="Banks" - include="{relation: 'accountingType'}" - data="banks" - order="id" - auto-load="true"> - </vn-crud-model> <vn-horizontal> <vn-date-picker label="Date" @@ -25,9 +18,11 @@ <vn-horizontal> <vn-autocomplete label="Bank" - data="banks" + url="Banks" show-field="bank" value-field="id" + fields="['accountingTypeFk']" + include="{relation: 'accountingType'}" order="id" ng-model="$ctrl.receipt.bankFk" search-function="{or: [{id: $search}, {bank: {like: '%'+ $search +'%'}}]}" From 32de0e1e6f0a85963fa908ee671538d4c1ba55e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Thu, 27 Aug 2020 12:43:57 +0200 Subject: [PATCH 5/8] Removed focus --- e2e/paths/02-client/14_balance.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index 6d9ab10c8c..108f767108 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -1,7 +1,7 @@ import selectors from '../../helpers/selectors'; import getBrowser from '../../helpers/puppeteer'; -fdescribe('Client balance path', () => { +describe('Client balance path', () => { let browser; let page; beforeAll(async() => { From baf9ec6e7052257702bfe8394fd5630964cfdd6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Mon, 31 Aug 2020 08:32:30 +0200 Subject: [PATCH 6/8] 2416 - Item request - Added state filter --- e2e/paths/04-item/13_request.spec.js | 4 +- front/core/components/contextmenu/index.js | 4 +- .../front/request-search-panel/index.html | 14 ++++--- .../item/front/request-search-panel/index.js | 14 ++++++- modules/item/front/request/index.html | 38 ++++++++++++++++--- modules/item/front/request/index.js | 34 +++++++++++++++-- modules/item/front/request/index.spec.js | 6 +-- modules/item/front/request/locale/es.yml | 5 ++- .../back/methods/ticket-request/filter.js | 10 +++-- .../ticket/front/search-panel/locale/es.yml | 2 +- 10 files changed, 102 insertions(+), 29 deletions(-) diff --git a/e2e/paths/04-item/13_request.spec.js b/e2e/paths/04-item/13_request.spec.js index ab48e0c375..66cd7a0f5a 100644 --- a/e2e/paths/04-item/13_request.spec.js +++ b/e2e/paths/04-item/13_request.spec.js @@ -31,7 +31,7 @@ describe('Item request path', () => { it('should the status of the request should now be accepted', async() => { let status = await page.waitToGetProperty(selectors.itemRequest.firstRequestStatus, 'innerText'); - expect(status).toContain('Aceptada'); + expect(status).toContain('Accepted'); }); it('should now click on the second declain request icon then type the reason', async() => { @@ -40,6 +40,6 @@ describe('Item request path', () => { await page.respondToDialog('accept'); let status = await page.waitToGetProperty(selectors.itemRequest.firstRequestStatus, 'innerText'); - expect(status).toContain('Denegada'); + expect(status).toContain('Denied'); }); }); diff --git a/front/core/components/contextmenu/index.js b/front/core/components/contextmenu/index.js index 90c14b7e3c..db74848a68 100755 --- a/front/core/components/contextmenu/index.js +++ b/front/core/components/contextmenu/index.js @@ -67,13 +67,13 @@ export default class Contextmenu { get cell() { if (!this.target) return null; - return this.target.closest('vn-td, .vn-td'); + return this.target.closest('vn-td, .vn-td, vn-td-editable'); } get cellIndex() { if (!this.row) return null; - const cells = this.row.querySelectorAll('vn-td, .vn-td'); + const cells = this.row.querySelectorAll('vn-td, .vn-td, vn-td-editable'); return Array.from(cells).findIndex( cellItem => cellItem == this.cell ); diff --git a/modules/item/front/request-search-panel/index.html b/modules/item/front/request-search-panel/index.html index 453f3105b5..10d5f97620 100644 --- a/modules/item/front/request-search-panel/index.html +++ b/modules/item/front/request-search-panel/index.html @@ -56,12 +56,14 @@ label="For me" ng-model="filter.mine"> </vn-check> - <vn-check - vn-one - triple-state="true" - label="Confirmed" - ng-model="filter.isOk"> - </vn-check> + <vn-autocomplete + vn-one + ng-model="filter.state" + data="$ctrl.states" + value-field="code" + label="State"> + <tpl-item>{{name}}</tpl-item> + </vn-autocomplete> </vn-horizontal> <vn-horizontal class="vn-mt-lg"> <vn-submit label="Search"></vn-submit> diff --git a/modules/item/front/request-search-panel/index.js b/modules/item/front/request-search-panel/index.js index 82639b6e29..823346e30e 100644 --- a/modules/item/front/request-search-panel/index.js +++ b/modules/item/front/request-search-panel/index.js @@ -1,7 +1,19 @@ 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')} + ]; + } +} + ngModule.vnComponent('vnRequestSearchPanel', { template: require('./index.html'), - controller: SearchPanel + controller: Controller }); diff --git a/modules/item/front/request/index.html b/modules/item/front/request/index.html index a677d0754d..29a103746c 100644 --- a/modules/item/front/request/index.html +++ b/modules/item/front/request/index.html @@ -24,14 +24,15 @@ <vn-tr> <vn-th field="ticketFk" number>Ticket ID</vn-th> <vn-th field="shipped" expand>Shipped</vn-th> - <vn-th field="description" expand>Description</vn-th> + <vn-th field="description" filter-enabled="false" expand>Description</vn-th> <vn-th field="quantity" number editable>Requested</vn-th> <vn-th field="price" number>Price</vn-th> - <vn-th field="atenderNickname">Atender</vn-th> - <vn-th field="itemFk">Item</vn-th> + <vn-th field="attenderName">Atender</vn-th> + <vn-th>Item</vn-th> <vn-th field="saleQuantity">Achieved</vn-th> - <vn-th field="description">Concept</vn-th> + <vn-th field="description" filter-enabled="false">Concept</vn-th> <vn-th field="isOk">State</vn-th> + <vn-th></vn-th> </vn-tr> </vn-thead> <vn-tbody> @@ -83,7 +84,7 @@ {{request.itemDescription}} </span> </vn-td> - <vn-td>{{$ctrl.getState(request.isOk)}}</vn-td> + <vn-td translate>{{$ctrl.getState(request.isOk)}}</vn-td> <vn-td> <vn-icon ng-if="request.response.length" @@ -128,4 +129,29 @@ <input type="button" response="cancel" translate-attr="{value: 'Cancel'}"/> <button response="accept" translate>Save</button> </tpl-buttons> -</vn-dialog> \ No newline at end of file +</vn-dialog> + +<vn-contextmenu vn-id="contextmenu" targets="['vn-data-viewer']" model="model" + expr-builder="$ctrl.exprBuilder(param, value)"> + <slot-menu> + <vn-item translate + ng-if="contextmenu.isFilterAllowed()" + ng-click="contextmenu.filterBySelection()"> + Filter by selection + </vn-item> + <vn-item translate + ng-if="contextmenu.isFilterAllowed()" + ng-click="contextmenu.excludeSelection()"> + Exclude selection + </vn-item> + <vn-item translate + ng-if="contextmenu.isFilterAllowed()" + ng-click="contextmenu.removeFilter()" > + Remove filter + </vn-item> + <vn-item translate + ng-click="contextmenu.removeAllFilters()" > + Remove all filters + </vn-item> + </slot-menu> +</vn-contextmenu> \ No newline at end of file diff --git a/modules/item/front/request/index.js b/modules/item/front/request/index.js index 3801c926fa..231d5eda74 100644 --- a/modules/item/front/request/index.js +++ b/modules/item/front/request/index.js @@ -17,18 +17,19 @@ export default class Controller extends Section { this.filterParams = { mine: true, from: today, - to: nextWeek + to: nextWeek, + state: 'pending' }; } } getState(isOk) { if (isOk === null) - return 'Nueva'; + return 'Pending'; else if (isOk) - return 'Aceptada'; + return 'Accepted'; else - return 'Denegada'; + return 'Denied'; } confirmRequest(request) { @@ -92,6 +93,31 @@ export default class Controller extends Section { 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', { diff --git a/modules/item/front/request/index.spec.js b/modules/item/front/request/index.spec.js index a33a21ec21..0fc0610236 100644 --- a/modules/item/front/request/index.spec.js +++ b/modules/item/front/request/index.spec.js @@ -24,17 +24,17 @@ describe('Item', () => { let isOk = null; let result = controller.getState(isOk); - expect(result).toEqual('Nueva'); + expect(result).toEqual('Pending'); isOk = 1; result = controller.getState(isOk); - expect(result).toEqual('Aceptada'); + expect(result).toEqual('Accepted'); isOk = 0; result = controller.getState(isOk); - expect(result).toEqual('Denegada'); + expect(result).toEqual('Denied'); }); }); diff --git a/modules/item/front/request/locale/es.yml b/modules/item/front/request/locale/es.yml index 33710a3275..c61a001302 100644 --- a/modules/item/front/request/locale/es.yml +++ b/modules/item/front/request/locale/es.yml @@ -3,4 +3,7 @@ Specify the reasons to deny this request: Especifica las razones para descartar Buy requests: Peticiones de compra Search request by id or alias: Buscar peticiones por identificador o alias Requested: Solicitado -Achieved: Conseguido \ No newline at end of file +Achieved: Conseguido +Pending: Pendiente +Accepted: Aceptada +Denied: Rechazada \ No newline at end of file diff --git a/modules/ticket/back/methods/ticket-request/filter.js b/modules/ticket/back/methods/ticket-request/filter.js index ecd88caeb4..f1cd08662e 100644 --- a/modules/ticket/back/methods/ticket-request/filter.js +++ b/modules/ticket/back/methods/ticket-request/filter.js @@ -44,8 +44,8 @@ module.exports = Self => { type: 'Date', description: `Date to` }, { - arg: 'isOk', - type: 'Boolean', + arg: 'state', + type: 'String', description: `Search request by request state` } ], @@ -77,7 +77,11 @@ module.exports = Self => { return {'t.id': value}; case 'attenderFk': return {'tr.attenderFk': value}; - case 'isOk': + case 'state': + switch (value) { + case 'pending': + return {'tr.isOk': null}; + } return {'tr.isOk': value}; case 'clientFk': return {'t.clientFk': value}; diff --git a/modules/ticket/front/search-panel/locale/es.yml b/modules/ticket/front/search-panel/locale/es.yml index d8cde5b2a2..0e338ab0b5 100644 --- a/modules/ticket/front/search-panel/locale/es.yml +++ b/modules/ticket/front/search-panel/locale/es.yml @@ -12,4 +12,4 @@ Order id: Id cesta Grouped States: Estado agrupado Days onward: Días adelante With problems: Con problemas -Pending: Pendientes \ No newline at end of file +Pending: Pendiente \ No newline at end of file From 6297d09de281efef3209e80a2a588e8541846b43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20S=C3=A1nchez?= <joan@verdnatura.es> Date: Mon, 31 Aug 2020 12:14:39 +0200 Subject: [PATCH 7/8] Updated syntax --- modules/ticket/back/methods/ticket-request/filter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ticket/back/methods/ticket-request/filter.js b/modules/ticket/back/methods/ticket-request/filter.js index f1cd08662e..4b7b088f4c 100644 --- a/modules/ticket/back/methods/ticket-request/filter.js +++ b/modules/ticket/back/methods/ticket-request/filter.js @@ -81,8 +81,9 @@ module.exports = Self => { switch (value) { case 'pending': return {'tr.isOk': null}; + default: + return {'tr.isOk': value}; } - return {'tr.isOk': value}; case 'clientFk': return {'t.clientFk': value}; case 'from': From a156a26e19328a43249b1e6b567405f08a3b11fb Mon Sep 17 00:00:00 2001 From: Carlos Jimenez Ruiz <jacarlosjimenezruiz@gmail.com> Date: Mon, 31 Aug 2020 15:00:11 +0200 Subject: [PATCH 8/8] e2e updated --- e2e/helpers/selectors.js | 5 +++-- e2e/paths/02-client/14_balance.spec.js | 21 +++++++++++++++++---- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/e2e/helpers/selectors.js b/e2e/helpers/selectors.js index 6eca623bd6..d93b724834 100644 --- a/e2e/helpers/selectors.js +++ b/e2e/helpers/selectors.js @@ -189,8 +189,9 @@ export default { newPaymentBank: '.vn-dialog.shown vn-autocomplete[ng-model="$ctrl.receipt.bankFk"]', newPaymentAmount: '.vn-dialog.shown vn-input-number[ng-model="$ctrl.receipt.amountPaid"]', saveButton: '.vn-dialog.shown [response="accept"]', - firstBalanceLine: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)' - + firstLineBalance: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td:nth-child(8)', + firstLineReference: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable', + firstLineReferenceInput: 'vn-client-balance-index vn-tbody > vn-tr:nth-child(1) > vn-td-editable > div > field > vn-textfield' }, webPayment: { confirmFirstPaymentButton: 'vn-client-web-payment vn-tr:nth-child(1) vn-icon-button[icon="done_all"]', diff --git a/e2e/paths/02-client/14_balance.spec.js b/e2e/paths/02-client/14_balance.spec.js index 108f767108..6c16d455d7 100644 --- a/e2e/paths/02-client/14_balance.spec.js +++ b/e2e/paths/02-client/14_balance.spec.js @@ -53,15 +53,28 @@ describe('Client balance path', () => { expect(message.type).toBe('success'); }); - it('should check balance is now 0 and the company is now VNL becouse the user local settings were removed', async() => { + it('should edit the 1st line reference', async() => { + await page.waitToClick(selectors.clientBalance.firstLineReference); + await page.write(selectors.clientBalance.firstLineReferenceInput, 'Miscellaneous payment'); + await page.keyboard.press('Enter'); + const message = await page.waitForSnackbar(); + + expect(message.type).toBe('success'); + }); + + it('should check balance is now 0, the reference was saved and the company is now VNL becouse the user local settings were removed', async() => { await page.waitForSpinnerLoad(); let company = await page .waitToGetProperty(selectors.clientBalance.company, 'value'); + let reference = await page + .waitToGetProperty(selectors.clientBalance.firstLineReference, 'innerText'); + let firstBalanceLine = await page - .waitToGetProperty(selectors.clientBalance.firstBalanceLine, 'innerText'); + .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); expect(company).toEqual('VNL'); + expect(reference).toEqual('Miscellaneous payment'); expect(firstBalanceLine).toContain('0.00'); }); @@ -76,7 +89,7 @@ describe('Client balance path', () => { it('should check balance is now -100', async() => { let result = await page - .waitToGetProperty(selectors.clientBalance.firstBalanceLine, 'innerText'); + .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); expect(result).toContain('-€100.00'); }); @@ -92,7 +105,7 @@ describe('Client balance path', () => { it('should check balance is now 50', async() => { let result = await page - .waitToGetProperty(selectors.clientBalance.firstBalanceLine, 'innerText'); + .waitToGetProperty(selectors.clientBalance.firstLineBalance, 'innerText'); expect(result).toEqual('€50.00'); });