diff --git a/modules/claim/back/methods/claim/getSummary.js b/modules/claim/back/methods/claim/getSummary.js index fce4caecf..9b04d29a9 100644 --- a/modules/claim/back/methods/claim/getSummary.js +++ b/modules/claim/back/methods/claim/getSummary.js @@ -1,12 +1,12 @@ module.exports = Self => { Self.remoteMethod('getSummary', { - description: 'Updates the item taxes', + description: 'Return the claim summary', accessType: 'READ', accepts: [{ arg: 'id', type: 'number', required: true, - description: 'The item id', + description: 'The claim id', http: {source: 'path'} }], returns: { diff --git a/modules/client/back/models/pay-method.json b/modules/client/back/models/pay-method.json index ceb08bfbe..152544c01 100644 --- a/modules/client/back/models/pay-method.json +++ b/modules/client/back/models/pay-method.json @@ -1,29 +1,29 @@ { - "name": "PayMethod", - "base": "VnModel", - "options": { - "mysql": { - "table": "payMethod" + "name": "PayMethod", + "base": "VnModel", + "options": { + "mysql": { + "table": "payMethod" + } + }, + "properties": { + "id": { + "type": "Number", + "id": true, + "description": "Identifier" + }, + "name": { + "type": "string", + "required": true + }, + "graceDays": { + "type": "string" + }, + "outstandingDebt": { + "type": "Number" + }, + "ibanRequired": { + "type": "boolean" + } } - }, - "properties": { - "id": { - "type": "Number", - "id": true, - "description": "Identifier" - }, - "name": { - "type": "string", - "required": true - }, - "graceDays": { - "type": "string" - }, - "outstandingDebt": { - "type": "Number" - }, - "ibanRequired": { - "type": "boolean" - } - } } diff --git a/modules/supplier/back/methods/supplier/getSummary.js b/modules/supplier/back/methods/supplier/getSummary.js new file mode 100644 index 000000000..fb1fa9f01 --- /dev/null +++ b/modules/supplier/back/methods/supplier/getSummary.js @@ -0,0 +1,74 @@ +module.exports = Self => { + Self.remoteMethod('getSummary', { + description: 'Returns the supplier summary', + accessType: 'READ', + accepts: { + arg: 'id', + type: 'number', + required: true, + description: 'The supplier id', + http: {source: 'path'} + }, + returns: { + type: 'object', + root: true + }, + http: { + path: `/:id/getSummary`, + verb: 'GET' + } + }); + Self.getSummary = async id => { + let filter = { + where: {id: id}, + fields: [ + 'id', + 'name', + 'nickname', + 'isOfficial', + 'isActive', + 'note', + 'nif', + 'street', + 'city', + 'postCode', + 'provinceFk', + 'countryFk', + 'payMethodFk', + 'payDemFk', + 'payDay', + 'account', + 'isFarmer', + ], + include: [ + { + relation: 'province', + scope: { + fields: ['id', 'name'] + } + }, + { + relation: 'country', + scope: { + fields: ['id', 'name', 'code'] + } + }, + { + relation: 'payMethod', + scope: { + fields: ['id', 'name'] + } + }, + { + relation: 'payDem', + scope: { + fields: ['id', 'payDem'] + } + } + ] + }; + + let supplier = await Self.app.models.Supplier.findOne(filter); + return supplier; + }; +}; diff --git a/modules/supplier/back/model-config.json b/modules/supplier/back/model-config.json index 899e3c38a..9c2f8f391 100644 --- a/modules/supplier/back/model-config.json +++ b/modules/supplier/back/model-config.json @@ -1,5 +1,8 @@ { "Supplier": { "dataSource": "vn" + }, + "PayDem": { + "dataSource": "vn" } } diff --git a/modules/supplier/back/models/pay-dem.json b/modules/supplier/back/models/pay-dem.json new file mode 100644 index 000000000..f214f3e3a --- /dev/null +++ b/modules/supplier/back/models/pay-dem.json @@ -0,0 +1,19 @@ +{ + "name": "PayDem", + "base": "VnModel", + "options": { + "mysql": { + "table": "payDem" + } + }, + "properties": { + "id": { + "type": "Number", + "id": true, + "description": "Identifier" + }, + "payDem": { + "type": "Number" + } + } +} diff --git a/modules/supplier/back/models/supplier.js b/modules/supplier/back/models/supplier.js index 953df5106..d3c32b814 100644 --- a/modules/supplier/back/models/supplier.js +++ b/modules/supplier/back/models/supplier.js @@ -1,3 +1,4 @@ module.exports = Self => { require('../methods/supplier/filter')(Self); + require('../methods/supplier/getSummary')(Self); }; diff --git a/modules/supplier/back/models/supplier.json b/modules/supplier/back/models/supplier.json index 41fc9c45c..3c87e4381 100644 --- a/modules/supplier/back/models/supplier.json +++ b/modules/supplier/back/models/supplier.json @@ -45,6 +45,12 @@ "isActive": { "type": "Boolean" }, + "isOfficial": { + "type": "Boolean" + }, + "note": { + "type": "String" + }, "street": { "type": "String" }, @@ -63,10 +69,35 @@ "payDemFk": { "type": "Number" }, + "payDay": { + "type": "Number" + }, "nickname": { "type": "String" } }, + "relations": { + "payMethod": { + "type": "belongsTo", + "model": "PayMethod", + "foreignKey": "payMethodFk" + }, + "payDem": { + "type": "belongsTo", + "model": "PayDem", + "foreignKey": "payDemFk" + }, + "province": { + "type": "belongsTo", + "model": "Province", + "foreignKey": "provinceFk" + }, + "country": { + "type": "belongsTo", + "model": "Country", + "foreignKey": "countryFk" + } + }, "acls": [ { "accessType": "READ", diff --git a/modules/supplier/front/card/index.html b/modules/supplier/front/card/index.html new file mode 100644 index 000000000..11908bce0 --- /dev/null +++ b/modules/supplier/front/card/index.html @@ -0,0 +1,5 @@ + + + + + diff --git a/modules/supplier/front/card/index.js b/modules/supplier/front/card/index.js new file mode 100644 index 000000000..77fd091a5 --- /dev/null +++ b/modules/supplier/front/card/index.js @@ -0,0 +1,42 @@ +import ngModule from '../module'; +import ModuleCard from 'salix/components/module-card'; + +class Controller extends ModuleCard { + reload() { + let filter = { + include: [ + { + relation: 'province', + scope: { + fields: ['id', 'name'] + } + }, + { + relation: 'country', + scope: { + fields: ['id', 'name', 'code'] + } + }, + { + relation: 'payMethod', + scope: { + fields: ['id', 'name'] + } + }, + { + relation: 'payDem', + scope: { + fields: ['id', 'payDem'] + } + } + ] + }; + this.$http.get(`Suppliers/${this.$params.id}`, {filter}) + .then(response => this.supplier = response.data); + } +} + +ngModule.vnComponent('vnSupplierCard', { + template: require('./index.html'), + controller: Controller +}); diff --git a/modules/supplier/front/descriptor/index.html b/modules/supplier/front/descriptor/index.html new file mode 100644 index 000000000..1ab95b529 --- /dev/null +++ b/modules/supplier/front/descriptor/index.html @@ -0,0 +1,14 @@ + + +
+ + + + +
+
+
diff --git a/modules/supplier/front/descriptor/index.js b/modules/supplier/front/descriptor/index.js new file mode 100644 index 000000000..676a15418 --- /dev/null +++ b/modules/supplier/front/descriptor/index.js @@ -0,0 +1,33 @@ +import ngModule from '../module'; +import Descriptor from 'salix/components/descriptor'; + +class Controller extends Descriptor { + get supplier() { + return this.entity; + } + + set supplier(value) { + this.entity = value; + } + loadData() { + const filter = { + fields: [ + 'id', + 'name', + 'nickname', + 'nif' + ] + }; + + return this.getData(`Suppliers/${this.id}`, {filter}) + .then(res => this.entity = res.data); + } +} + +ngModule.vnComponent('vnSupplierDescriptor', { + template: require('./index.html'), + controller: Controller, + bindings: { + supplier: '<' + } +}); diff --git a/modules/supplier/front/descriptor/index.spec.js b/modules/supplier/front/descriptor/index.spec.js new file mode 100644 index 000000000..84defea3b --- /dev/null +++ b/modules/supplier/front/descriptor/index.spec.js @@ -0,0 +1,43 @@ +import './index.js'; + +describe('Entry Component vnEntryDescriptor', () => { + let $httpBackend; + let controller; + const entry = {id: 2}; + + beforeEach(ngModule('entry')); + + beforeEach(inject(($componentController, _$httpBackend_) => { + $httpBackend = _$httpBackend_; + controller = $componentController('vnEntryDescriptor', {$element: null}, {entry}); + })); + + describe('showEntryReport()', () => { + it('should open a new window showing a delivery note PDF document', () => { + jest.spyOn(controller.vnReport, 'show'); + + window.open = jasmine.createSpy('open'); + const params = { + clientId: controller.vnConfig.storage.currentUserWorkerId, + entryId: entry.id + }; + controller.showEntryReport(); + + expect(controller.vnReport.show).toHaveBeenCalledWith('entry-order', params); + }); + }); + + describe('loadData()', () => { + it('should perform ask for the entry', () => { + let query = `Entries/${entry.id}`; + jest.spyOn(controller, 'getData'); + + $httpBackend.expectGET(query).respond(); + controller.loadData(); + $httpBackend.flush(); + + expect(controller.getData).toHaveBeenCalledTimes(1); + expect(controller.getData).toHaveBeenCalledWith(query, jasmine.any(Object)); + }); + }); +}); diff --git a/modules/supplier/front/descriptor/locale/es.yml b/modules/supplier/front/descriptor/locale/es.yml new file mode 100644 index 000000000..ac3c202a0 --- /dev/null +++ b/modules/supplier/front/descriptor/locale/es.yml @@ -0,0 +1 @@ +Tax number: NIF / CIF \ No newline at end of file diff --git a/modules/supplier/front/index.js b/modules/supplier/front/index.js index cb25b3b8c..daf19e606 100644 --- a/modules/supplier/front/index.js +++ b/modules/supplier/front/index.js @@ -3,3 +3,6 @@ export * from './module'; import './main'; import './index/'; import './search-panel'; +import './summary'; +import './card'; +import './descriptor'; diff --git a/modules/supplier/front/routes.json b/modules/supplier/front/routes.json index 21f1ceb26..78ae46985 100644 --- a/modules/supplier/front/routes.json +++ b/modules/supplier/front/routes.json @@ -2,6 +2,7 @@ "module": "supplier", "name": "Suppliers", "icon" : "icon-supplier", + "dependencies": ["client", "item"], "validations" : true, "menus": { "main": [ @@ -22,6 +23,19 @@ "state": "supplier.index", "component": "vn-supplier-index", "description": "Suppliers" + }, { + "url": "/:id", + "state": "supplier.card", + "abstract": true, + "component": "vn-supplier-card" + }, { + "url": "/summary", + "state": "supplier.card.summary", + "component": "vn-supplier-summary", + "description": "Summary", + "params": { + "supplier": "$ctrl.supplier" + } } ] } \ No newline at end of file diff --git a/modules/supplier/front/summary/index.html b/modules/supplier/front/summary/index.html new file mode 100644 index 000000000..a05470cea --- /dev/null +++ b/modules/supplier/front/summary/index.html @@ -0,0 +1,74 @@ + +
{{$ctrl.summary.name}} - {{$ctrl.summary.id}}
+ + +

Basic data

+ + + + + + + + + + +
+ +

Fiscal address

+ + + + + + + + + + + + + + +
+ +

Billing data

+ + + + + + + + + + +
+
+
+ + \ No newline at end of file diff --git a/modules/supplier/front/summary/index.js b/modules/supplier/front/summary/index.js new file mode 100644 index 000000000..f201127da --- /dev/null +++ b/modules/supplier/front/summary/index.js @@ -0,0 +1,44 @@ +import ngModule from '../module'; +import Section from 'salix/components/section'; +import './style.scss'; + +class Controller extends Section { + $onChanges() { + if (!this.supplier) + return; + + this.getSummary(); + } + + getSummary() { + this.$http.get(`Suppliers/${this.supplier.id}/getSummary`).then(response => { + this.summary = response.data; + }); + } + + // sumRisk() { + // let total = 0; + // this.summary.clientRisks.forEach(risk => { + // total += risk.amount; + // }); + // return total; + // } + + // claimRate(priceIncreasing) { + // if (priceIncreasing) + // return priceIncreasing * 100; + // } + + // claimingRate(rate) { + // if (rate) + // return rate * 100; + // } +} + +ngModule.vnComponent('vnSupplierSummary', { + template: require('./index.html'), + controller: Controller, + bindings: { + supplier: '<' + } +}); diff --git a/modules/supplier/front/summary/index.spec.js b/modules/supplier/front/summary/index.spec.js new file mode 100644 index 000000000..05491267c --- /dev/null +++ b/modules/supplier/front/summary/index.spec.js @@ -0,0 +1,52 @@ +import './index'; + +describe('Client', () => { + describe('Component vnClientSummary', () => { + let controller; + let $httpBackend; + let $scope; + + beforeEach(ngModule('client')); + + beforeEach(inject(($componentController, _$httpBackend_, $rootScope) => { + $httpBackend = _$httpBackend_; + $scope = $rootScope.$new(); + const $element = angular.element(''); + controller = $componentController('vnClientSummary', {$element, $scope}); + controller.client = {id: 101}; + })); + + describe('$onChanges()', () => { + it('should perform a GET query and then define the summary property', () => { + let res = {name: 'Superman', classifications: []}; + + jest.spyOn(controller, 'sumRisk').mockReturnThis(); + $httpBackend.expect('GET', `Clients/101/summary`).respond(200, res); + + controller.$onChanges(); + $httpBackend.flush(); + + expect(controller.summary).toBeDefined(); + expect(controller.summary.name).toEqual('Superman'); + }); + }); + + describe('sumRisk()', () => { + it('should sum property amount of an array', () => { + controller.summary = { + clientRisks: [{ + companyFk: 442, + amount: 100 + }, + { + companyFk: 567, + amount: 200 + }]}; + + let result = controller.sumRisk(); + + expect(result).toEqual(300); + }); + }); + }); +}); diff --git a/modules/supplier/front/summary/locale/es.yml b/modules/supplier/front/summary/locale/es.yml new file mode 100644 index 000000000..e69de29bb diff --git a/modules/supplier/front/summary/style.scss b/modules/supplier/front/summary/style.scss new file mode 100644 index 000000000..1520659d2 --- /dev/null +++ b/modules/supplier/front/summary/style.scss @@ -0,0 +1,7 @@ +@import "variables"; + +vn-client-summary { + .alert span { + color: $color-alert !important + } +} \ No newline at end of file