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