From 256206ace43bfe46805b01e6b0184fd1017e0618 Mon Sep 17 00:00:00 2001
From: Bernat Exposito Domenech <bernat.verdnatura@gmail.com>
Date: Tue, 20 Oct 2020 09:44:44 +0200
Subject: [PATCH] supplier summary dscriptor and card

---
 .../claim/back/methods/claim/getSummary.js    |  4 +-
 modules/client/back/models/pay-method.json    | 52 ++++++-------
 .../back/methods/supplier/getSummary.js       | 74 +++++++++++++++++++
 modules/supplier/back/model-config.json       |  3 +
 modules/supplier/back/models/pay-dem.json     | 19 +++++
 modules/supplier/back/models/supplier.js      |  1 +
 modules/supplier/back/models/supplier.json    | 31 ++++++++
 modules/supplier/front/card/index.html        |  5 ++
 modules/supplier/front/card/index.js          | 42 +++++++++++
 modules/supplier/front/descriptor/index.html  | 14 ++++
 modules/supplier/front/descriptor/index.js    | 33 +++++++++
 .../supplier/front/descriptor/index.spec.js   | 43 +++++++++++
 .../supplier/front/descriptor/locale/es.yml   |  1 +
 modules/supplier/front/index.js               |  3 +
 modules/supplier/front/routes.json            | 14 ++++
 modules/supplier/front/summary/index.html     | 74 +++++++++++++++++++
 modules/supplier/front/summary/index.js       | 44 +++++++++++
 modules/supplier/front/summary/index.spec.js  | 52 +++++++++++++
 modules/supplier/front/summary/locale/es.yml  |  0
 modules/supplier/front/summary/style.scss     |  7 ++
 20 files changed, 488 insertions(+), 28 deletions(-)
 create mode 100644 modules/supplier/back/methods/supplier/getSummary.js
 create mode 100644 modules/supplier/back/models/pay-dem.json
 create mode 100644 modules/supplier/front/card/index.html
 create mode 100644 modules/supplier/front/card/index.js
 create mode 100644 modules/supplier/front/descriptor/index.html
 create mode 100644 modules/supplier/front/descriptor/index.js
 create mode 100644 modules/supplier/front/descriptor/index.spec.js
 create mode 100644 modules/supplier/front/descriptor/locale/es.yml
 create mode 100644 modules/supplier/front/summary/index.html
 create mode 100644 modules/supplier/front/summary/index.js
 create mode 100644 modules/supplier/front/summary/index.spec.js
 create mode 100644 modules/supplier/front/summary/locale/es.yml
 create mode 100644 modules/supplier/front/summary/style.scss

diff --git a/modules/claim/back/methods/claim/getSummary.js b/modules/claim/back/methods/claim/getSummary.js
index fce4caecfa..9b04d29a9e 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 ceb08bfbeb..152544c01a 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 0000000000..fb1fa9f01a
--- /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 899e3c38a2..9c2f8f391f 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 0000000000..f214f3e3af
--- /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 953df51060..d3c32b814a 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 41fc9c45cc..3c87e43812 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 0000000000..11908bce0b
--- /dev/null
+++ b/modules/supplier/front/card/index.html
@@ -0,0 +1,5 @@
+<vn-portal slot="menu">
+    <vn-supplier-descriptor supplier="$ctrl.supplier"></vn-entry-descriptor>
+    <vn-left-menu source="card"></vn-left-menu>
+</vn-portal>
+<ui-view></ui-view>
diff --git a/modules/supplier/front/card/index.js b/modules/supplier/front/card/index.js
new file mode 100644
index 0000000000..77fd091a5f
--- /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 0000000000..1ab95b5294
--- /dev/null
+++ b/modules/supplier/front/descriptor/index.html
@@ -0,0 +1,14 @@
+<vn-descriptor-content
+    module="supplier"
+    description="$ctrl.supplier.name">
+    <slot-body>
+        <div class="attributes">
+            <vn-label-value label="Tax number" 
+                value="{{$ctrl.supplier.nif}}">
+            </vn-label-value>
+            <vn-label-value label="Alias" 
+                value="{{$ctrl.supplier.nickname}}">
+            </vn-label-value>       
+        </div>
+    </slot-body>
+</vn-descriptor-content>
diff --git a/modules/supplier/front/descriptor/index.js b/modules/supplier/front/descriptor/index.js
new file mode 100644
index 0000000000..676a154181
--- /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 0000000000..84defea3bb
--- /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 0000000000..ac3c202a09
--- /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 cb25b3b8ca..daf19e606c 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 21f1ceb263..78ae469850 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 0000000000..a05470cea0
--- /dev/null
+++ b/modules/supplier/front/summary/index.html
@@ -0,0 +1,74 @@
+<vn-card class="summary">
+    <h5>{{$ctrl.summary.name}} - {{$ctrl.summary.id}}</h5>
+    <vn-horizontal>
+        <vn-one>
+            <h4 translate>Basic data</h4>
+            <vn-label-value label="Id" 
+                value="{{$ctrl.summary.id}}">
+            </vn-label-value>
+            <vn-label-value label="Supplier alias" 
+                value="{{$ctrl.summary.nickname}}">
+            </vn-label-value>
+            <vn-check
+                label="Is official" 
+                ng-model="$ctrl.summary.isOfficial" 
+                disabled="true">
+            </vn-check>
+            <vn-check
+                label="Is active" 
+                ng-model="$ctrl.summary.isActive" 
+                disabled="true">
+            </vn-check>
+            <vn-label-value label="Notes" 
+                value="{{$ctrl.summary.note}}">
+            </vn-label-value>
+        </vn-one>
+        <vn-one>
+            <h4 translate>Fiscal address</h4>
+            <vn-label-value label="Social name" 
+                value="{{$ctrl.summary.name}}">
+            </vn-label-value>
+            <vn-label-value label="NIF / CIF" 
+                value="{{$ctrl.summary.nif}}">
+            </vn-label-value>
+            <vn-label-value label="Street" ellipsize="false"
+                value="{{$ctrl.summary.street}}">
+            </vn-label-value>
+            <vn-label-value label="City" 
+                value="{{$ctrl.summary.city}}">
+            </vn-label-value>
+            <vn-label-value label="Postcode" 
+                value="{{$ctrl.summary.postcode}}">
+            </vn-label-value>
+            <vn-label-value label="Province" 
+                value="{{$ctrl.summary.province.name}}">
+            </vn-label-value>
+            <vn-label-value label="Country" 
+                value="{{$ctrl.summary.country.country}}">
+            </vn-label-value>
+        </vn-one>
+        <vn-one>
+            <h4 translate>Billing data</h4>
+            <vn-label-value label="Pay method" 
+                value="{{$ctrl.summary.payMethod.name}}">
+            </vn-label-value>
+            <vn-label-value label="Pay dem" 
+                value="{{$ctrl.summary.payDem.payDem}}">
+            </vn-label-value>
+            <vn-label-value label="Pay day" 
+                value="{{$ctrl.summary.payDay}}">
+            </vn-label-value>
+            <vn-label-value label="Account" 
+                value="{{$ctrl.summary.account}}">
+            </vn-label-value>
+            <vn-check
+                label="Is Farmer" 
+                ng-model="$ctrl.summary.isFarmer" 
+                disabled="true">
+            </vn-check>
+        </vn-one>
+    </vn-horizontal>
+</vn-card>
+<vn-worker-descriptor-popover 
+    vn-id="workerDescriptor">
+</vn-worker-descriptor-popover>
\ 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 0000000000..f201127da5
--- /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 0000000000..05491267c2
--- /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('<vn-client-summary></vn-client-summary>');
+            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 0000000000..e69de29bb2
diff --git a/modules/supplier/front/summary/style.scss b/modules/supplier/front/summary/style.scss
new file mode 100644
index 0000000000..1520659d2b
--- /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