diff --git a/client/client/src/address-create/address-create.html b/client/client/src/address-create/address-create.html index 712a771de6..1d9ddac6e7 100644 --- a/client/client/src/address-create/address-create.html +++ b/client/client/src/address-create/address-create.html @@ -30,7 +30,7 @@ diff --git a/client/client/src/notes/notes.js b/client/client/src/notes/notes.js index 7e0ec424a8..119c983e2c 100644 --- a/client/client/src/notes/notes.js +++ b/client/client/src/notes/notes.js @@ -1,5 +1,4 @@ import ngModule from '../module'; -import './style.css'; export default class Controller { constructor($http, $state) { diff --git a/client/client/src/notes/style.css b/client/client/src/notes/style.css deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/client/client/src/summary/client-summary.html b/client/client/src/summary/client-summary.html index 8788464f35..71a1fcd528 100644 --- a/client/client/src/summary/client-summary.html +++ b/client/client/src/summary/client-summary.html @@ -105,9 +105,9 @@
Default address
-

{{$ctrl.address.nickname}}

-

{{$ctrl.address.street}}

-

{{$ctrl.address.city}}

+

{{$ctrl.summary.addresses[0].nickname}}

+

{{$ctrl.summary.addresses[0].street}}

+

{{$ctrl.summary.addresses[0].city}}

Web access
@@ -122,34 +122,30 @@
Recovery
- -

Since {{$ctrl.recovery.started | date:'dd/MM/yyyy'}}

-

To {{$ctrl.recovery.finished | date:'dd/MM/yyyy'}}

-

Amount {{$ctrl.recovery.amount | currency:'€':2}}

-

Period {{$ctrl.recovery.period}}

+ +

Since {{$ctrl.summary.recovery.started | date:'dd/MM/yyyy'}}

+

To {{$ctrl.summary.recovery.finished | date:'dd/MM/yyyy'}}

+

Amount {{$ctrl.summary.recovery.amount | currency:'€ ':2}}

+

Period {{$ctrl.summary.recovery.period}}

- + +
Financial data
+

Mana {{$ctrl.summary.mana.mana | currency:'€ ':2}}

+

Risk {{$ctrl.summary.debt.debt | currency:'€ ':2}}

+

Average invoiced {{$ctrl.summary.averageInvoiced.invoiced | currency:'€ ':2}}

+

Total greuge {{$ctrl.summary.totalGreuge | currency:'€ ':2}}

+

+ Credit + {{$ctrl.summary.credit | currency:'€ ':2}} +

+

+ Secured credit + - + {{$ctrl.summary.creditInsurance | currency:'€ ':2}} +

+
- - -
Total greuge
-

Total {{$ctrl.greuge.sumAmount | currency:'€':2}}

-
- - -
Credit
-

- Credit - {{$ctrl.summary.credit | currency:'€':2}} -

-

- Secured credit - - - {{$ctrl.summary.creditInsurance | currency:'€':2}} -

-
-
\ No newline at end of file diff --git a/client/client/src/summary/client-summary.js b/client/client/src/summary/client-summary.js index 2a6b9e3f31..9a10cb7a1a 100644 --- a/client/client/src/summary/client-summary.js +++ b/client/client/src/summary/client-summary.js @@ -1,73 +1,22 @@ import ngModule from '../module'; +import './style.scss'; class Controller { - constructor($http) { this.$http = $http; } $onChanges() { - if (!this.client || !this.client.id) + if (!this.client) return; - this.getSummary(); - this.getGreuse(); - this.getRecoveries(); - } - - getSummary() { - let filter = { - include: [ - {relation: 'account', scope: {fields: ['name', 'active']}}, - {relation: 'salesPerson', scope: {fields: ['name']}}, - {relation: 'country', scope: {fields: ['country']}}, - {relation: 'province', scope: {fields: ['name']}}, - {relation: 'contactChannel', scope: {fields: ['name']}}, - {relation: 'payMethod', scope: {fields: ['name']}}, - { - relation: 'addresses', - scope: { - where: {isDefaultAddress: true}, - fields: ['nickname', 'street', 'city', 'postalCode'] - } - } - ] - }; - filter = encodeURIComponent(JSON.stringify(filter)); - - let query = `/client/api/Clients/${this.client.id}?filter=${filter}`; - this.$http.get(query).then(res => { - if (res.data) { + this.$http.get(`/client/api/Clients/${this.client.id}/summary`).then(res => { + if (res && res.data) this.summary = res.data; - this.address = res.data.addresses[0]; - } - }); - } - - getGreuse() { - let query = `/client/api/Greuges/${this.client.id}/sumAmount`; - this.$http.get(query).then(res => { - if (res.data) - this.greuge = res.data; - }); - } - - getRecoveries() { - let filter = { - where: { - and: [{clientFk: this.client.id}, {or: [{finished: null}, {finished: {gt: Date.now()}}]}] - }, - limit: 1 - }; - filter = encodeURIComponent(JSON.stringify(filter)); - - let query = `/client/api/Recoveries?filter=${filter}`; - this.$http.get(query).then(res => { - if (res.data) - this.recovery = res.data[0]; }); } } + Controller.$inject = ['$http']; ngModule.component('vnClientSummary', { diff --git a/client/client/src/summary/locale/es.yml b/client/client/src/summary/locale/es.yml index 27ebf6e37a..081ae70b8d 100644 --- a/client/client/src/summary/locale/es.yml +++ b/client/client/src/summary/locale/es.yml @@ -1,2 +1,7 @@ Default address: Consignatario pred. -Total greuge: Greuge total \ No newline at end of file +Total greuge: Greuge total +Financial data: Datos financieros +Mana: Maná +Risk: Riesgo +Secured credit: Crédito asegurado +Average invoiced: Consumo medio \ No newline at end of file diff --git a/client/client/src/summary/style.scss b/client/client/src/summary/style.scss new file mode 100644 index 0000000000..0769fb51da --- /dev/null +++ b/client/client/src/summary/style.scss @@ -0,0 +1,3 @@ +vn-dialog vn-one { + min-width: 200px +} \ No newline at end of file diff --git a/client/core/src/components/autocomplete/autocomplete.html b/client/core/src/components/autocomplete/autocomplete.html index 4d04f884fd..7e6580d781 100755 --- a/client/core/src/components/autocomplete/autocomplete.html +++ b/client/core/src/components/autocomplete/autocomplete.html @@ -8,6 +8,7 @@
.mdl-checkbox { + width: initial; + } } \ No newline at end of file diff --git a/client/core/src/components/grid/style.scss b/client/core/src/components/grid/style.scss index b46e94865f..ce292e5221 100644 --- a/client/core/src/components/grid/style.scss +++ b/client/core/src/components/grid/style.scss @@ -1,5 +1,6 @@ .vn-grid { border-collapse: collapse; + width: 100%; td, th{ text-align: left; padding: 10px; diff --git a/client/core/src/components/textfield/textfield.html b/client/core/src/components/textfield/textfield.html index 7f39ccf643..57837cf09e 100644 --- a/client/core/src/components/textfield/textfield.html +++ b/client/core/src/components/textfield/textfield.html @@ -20,7 +20,7 @@ info_outline clear diff --git a/client/item/src/tags/item-tags.js b/client/item/src/tags/item-tags.js index f2a0b6e5d1..de750b294b 100644 --- a/client/item/src/tags/item-tags.js +++ b/client/item/src/tags/item-tags.js @@ -37,7 +37,7 @@ class ItemTags { addItemTag() { if (this.instancedItemTags) { - this.instancedItemTags.push({value: null, itemFk: this.params.id, tagFk: null, priority: null, showAddIcon: true}); + this.instancedItemTags.push({value: null, itemFk: this.params.id, tagFk: null, priority: this.getMaxPriority(this.instancedItemTags) + 1, showAddIcon: true}); this._setIconAdd(); } } @@ -54,6 +54,15 @@ class ItemTags { } } + getMaxPriority(instancedItemTags) { + let max = 0; + instancedItemTags.forEach(tag => { + if (tag.priority > max) + max = tag.priority; + }); + return max; + } + _equalItemTags(oldTag, newTag) { return oldTag.tagFk === newTag.tagFk && oldTag.value === newTag.value && oldTag.priority === newTag.priority; } diff --git a/client/ticket/routes.json b/client/ticket/routes.json index c602f87689..e27853dfa1 100644 --- a/client/ticket/routes.json +++ b/client/ticket/routes.json @@ -96,8 +96,14 @@ }, { "url" : "/package", + "abstract": true, "state": "ticket.card.package", - "component": "vn-ticket-package", + "component": "ui-view" + }, + { + "url" : "/index", + "state": "ticket.card.package.index", + "component": "vn-ticket-package-index", "params": { "ticket": "$ctrl.ticket" }, @@ -107,8 +113,14 @@ } }, { - "url" : "/tracking", + "url": "/tracking", "state": "ticket.card.tracking", + "abstract": true, + "component": "ui-view" + }, + { + "url" : "/index", + "state": "ticket.card.tracking.index", "component": "vn-ticket-tracking", "params": { "ticket": "$ctrl.ticket" @@ -118,6 +130,14 @@ "icon": "remove_red_eye" } }, + { + "url": "/edit", + "state": "ticket.card.tracking.edit", + "component": "vn-ticket-tracking-edit", + "params": { + "ticket": "$ctrl.ticket" + } + }, { "url": "/create", "state": "ticket.card.tracking.create", @@ -137,6 +157,18 @@ "description": "Sale", "icon": "icon-lines" } + }, + { + "url" : "/sale-checked", + "state": "ticket.card.saleChecked", + "component": "vn-ticket-sale-checked", + "params": { + "ticket": "$ctrl.ticket" + }, + "menu": { + "description": "Sale Checked", + "icon": "assignment" + } } ] } \ No newline at end of file diff --git a/client/ticket/src/expedition/ticket-expedition.html b/client/ticket/src/expedition/ticket-expedition.html index c7be8da691..f85c4ca6fe 100644 --- a/client/ticket/src/expedition/ticket-expedition.html +++ b/client/ticket/src/expedition/ticket-expedition.html @@ -18,13 +18,13 @@ vn-one class="list list-element text-center" pad-small-bottom ng-repeat="expedition in index.model.instances track by expedition.id"> - + delete - + {{expedition.itemFk}} {{expedition.item.name}} {{expedition.package.name}} diff --git a/client/ticket/src/locale/es.yml b/client/ticket/src/locale/es.yml index 5f40255880..a95164c74a 100644 --- a/client/ticket/src/locale/es.yml +++ b/client/ticket/src/locale/es.yml @@ -19,3 +19,11 @@ Sale: Lineas del pedido Some fields are invalid: Algunos campos no son válidos The observation type must be unique: El tipo de observación debe ser único Tickets: Tickets +Date : Fecha +Employee : Empleado +State: Estado +Tracking: Revisión +Created : Añadido +New : Nuevo +New state: Nuevo estado +Sale Checked: Control clientes diff --git a/client/ticket/src/package/locale/es.yml b/client/ticket/src/package/index/locale/es.yml similarity index 100% rename from client/ticket/src/package/locale/es.yml rename to client/ticket/src/package/index/locale/es.yml diff --git a/client/ticket/src/package/package.html b/client/ticket/src/package/index/package.html similarity index 100% rename from client/ticket/src/package/package.html rename to client/ticket/src/package/index/package.html diff --git a/client/ticket/src/package/package.js b/client/ticket/src/package/index/package.js similarity index 59% rename from client/ticket/src/package/package.js rename to client/ticket/src/package/index/package.js index 6cb7495171..78b3bca946 100644 --- a/client/ticket/src/package/package.js +++ b/client/ticket/src/package/index/package.js @@ -1,4 +1,4 @@ -import ngModule from '../module'; +import ngModule from '../../module'; class Controller { @@ -8,7 +8,6 @@ class Controller { this.$translate = $translate; this.vnApp = vnApp; this.removedPackages = []; - this.updatedPackages = []; } submit() { @@ -23,10 +22,16 @@ class Controller { if (typeof item.id === 'undefined') packagesObj.create.push(item); - if (typeof item.id !== 'undefined' && angular.equals(item, this.oldPackages[item.id])) + if (typeof item.id !== 'undefined' && !this.packageEquals(item, this.oldPackages[item.id])) packagesObj.update.push(item); }); + if (this.$.form.$invalid) + return this.vnApp.showMessage(this.$translate.instant('Some fields are invalid')); + + if (!this.hasChanges(packagesObj)) + return this.vnApp.showMessage(this.$translate.instant('No changes to save')); + this.$http.post(query, packagesObj).then(res => { this.$.index.accept(); }); @@ -55,16 +60,31 @@ class Controller { } setOldPackages() { + if (this.oldPackages && !this.$.watcher.dataChanged()) + return; + this.oldPackages = []; + this.removedPackages = []; this.packages.forEach(item => { - this.oldPackages[item.id] = item; + this.oldPackages[item.id] = Object.assign({}, item); }); } + + packageEquals(newPackage, oldPackage) { + return newPackage.packagingFk === oldPackage.packagingFk && newPackage.quantity == oldPackage.quantity; + } + + hasChanges(packagesObj) { + if (packagesObj.create.length || packagesObj.update.length || packagesObj.delete.length) + return true; + + return false; + } } -Controller.$inject = ['$http', '$scope']; +Controller.$inject = ['$http', '$scope', '$translate', 'vnApp']; -ngModule.component('vnTicketPackage', { +ngModule.component('vnTicketPackageIndex', { template: require('./package.html'), controller: Controller, bindings: { diff --git a/client/ticket/src/package/package.spec.js b/client/ticket/src/package/index/package.spec.js similarity index 83% rename from client/ticket/src/package/package.spec.js rename to client/ticket/src/package/index/package.spec.js index b9b7c310a2..1ff4442274 100644 --- a/client/ticket/src/package/package.spec.js +++ b/client/ticket/src/package/index/package.spec.js @@ -1,7 +1,7 @@ import './package.js'; describe('Ticket', () => { - describe('Component vnTicketPackage', () => { + describe('Component vnTicketPackageIndex', () => { let $componentController; let controller; let $httpBackend; @@ -19,7 +19,7 @@ describe('Ticket', () => { accept: function() {} } }; - controller = $componentController('vnTicketPackage', {$scope: $scope}); + controller = $componentController('vnTicketPackageIndex', {$scope: $scope}); })); describe('removePackage()', () => { @@ -37,11 +37,11 @@ describe('Ticket', () => { let query = '/ticket/api/TicketPackagings/crudTicketPackaging'; controller.removedPackages = []; controller.oldPackages = [ - {id: 1, quantity: 5, ticketFk: 1} + {id: 1, packagingFk: 1, quantity: 5, ticketFk: 1} ]; controller.packages = [ - {quantity: 5, ticketFk: 1}, - {id: 1, quantity: 25, ticketFk: 1} + {quantity: 5, packagingFk: 2, ticketFk: 1}, + {id: 1, packagingFk: 1, quantity: 25, ticketFk: 1} ]; let packagesObj = { delete: controller.removedPackages, diff --git a/client/ticket/src/sale-checked/sale-checked.html b/client/ticket/src/sale-checked/sale-checked.html new file mode 100644 index 0000000000..6785f33913 --- /dev/null +++ b/client/ticket/src/sale-checked/sale-checked.html @@ -0,0 +1,36 @@ + + + + + Sale checked + + + + + + + + + + + + + + + + + + +
Is checkedItemDescriptionQuantity
{{::sale.itemFk}} + + {{::sale.concept}} + + + {{::fetchedTag.tag.name}} {{::fetchedTag.value}} + + + + {{::sale.quantity}}
+
+
+
diff --git a/client/ticket/src/sale-checked/sale-checked.js b/client/ticket/src/sale-checked/sale-checked.js new file mode 100644 index 0000000000..ff5bf01a40 --- /dev/null +++ b/client/ticket/src/sale-checked/sale-checked.js @@ -0,0 +1,17 @@ +import ngModule from '../module'; +import FilterTicketList from '../filter-ticket-list'; + +class Controller extends FilterTicketList { + constructor($scope, $timeout, $state) { + super($scope, $timeout, $state); + + this.onOrder('quantity', 'ASC'); + } +} + +Controller.$inject = ['$scope', '$timeout', '$state']; + +ngModule.component('vnTicketSaleChecked', { + template: require('./sale-checked.html'), + controller: Controller +}); diff --git a/client/ticket/src/sale/sale.html b/client/ticket/src/sale/sale.html index 5b93746869..5f2ab24ad9 100644 --- a/client/ticket/src/sale/sale.html +++ b/client/ticket/src/sale/sale.html @@ -1,4 +1,4 @@ - + diff --git a/client/ticket/src/sale/sale.js b/client/ticket/src/sale/sale.js index feaafefbef..ddf0ee7edc 100644 --- a/client/ticket/src/sale/sale.js +++ b/client/ticket/src/sale/sale.js @@ -1,7 +1,17 @@ import ngModule from '../module'; import FilterTicketList from '../filter-ticket-list'; +class Controller extends FilterTicketList { + constructor($scope, $timeout, $state) { + super($scope, $timeout, $state); + + this.onOrder('quantity', 'ASC'); + } +} + +Controller.$inject = ['$scope', '$timeout', '$state']; + ngModule.component('vnTicketSale', { template: require('./sale.html'), - controller: FilterTicketList + controller: Controller }); diff --git a/client/ticket/src/ticket.js b/client/ticket/src/ticket.js index 132502666a..6cf8be3370 100644 --- a/client/ticket/src/ticket.js +++ b/client/ticket/src/ticket.js @@ -8,7 +8,9 @@ import './data/ticket-data'; import './note/ticket-observation'; import './expedition/ticket-expedition'; import './volume/ticket-volume'; -import './package/package'; +import './package/index/package'; import './sale/sale'; -import './tracking/tracking'; +import './tracking/index'; +import './tracking/edit/edit'; import './fetched-tags/fetched-tags'; +import './sale-checked/sale-checked'; diff --git a/client/ticket/src/tracking/edit/edit.html b/client/ticket/src/tracking/edit/edit.html new file mode 100644 index 0000000000..ff5b0de403 --- /dev/null +++ b/client/ticket/src/tracking/edit/edit.html @@ -0,0 +1,23 @@ + + + +
+ + New state + + + + + + + + +
\ No newline at end of file diff --git a/client/ticket/src/tracking/edit/edit.js b/client/ticket/src/tracking/edit/edit.js new file mode 100644 index 0000000000..2d1f5e5a05 --- /dev/null +++ b/client/ticket/src/tracking/edit/edit.js @@ -0,0 +1,25 @@ +import ngModule from '../../module'; + +export default class Controller { + constructor($scope, $state) { + this.$ = $scope; + this.$state = $state; + this.ticket = { + ticketFk: $state.params.id, + text: null + }; + } + onSubmit() { + this.$.watcher.submit().then( + () => { + this.$state.go('ticket.card.tracking.index'); + } + ); + } +} +Controller.$inject = ['$scope', '$state']; + +ngModule.component('vnTicketTrackingEdit', { + template: require('./edit.html'), + controller: Controller +}); diff --git a/client/ticket/src/tracking/tracking.html b/client/ticket/src/tracking/index.html similarity index 90% rename from client/ticket/src/tracking/tracking.html rename to client/ticket/src/tracking/index.html index ec827fac3a..3d287d9405 100644 --- a/client/ticket/src/tracking/tracking.html +++ b/client/ticket/src/tracking/index.html @@ -1,5 +1,5 @@ - + Tracking @@ -7,7 +7,6 @@ - {{::ticket.state.name}} - {{::ticket.worker.firstName}} {{::ticket.worker.name}} - {{::ticket.created | date:'dd/MM/yyyy HH:mm' }} - + {{::ticket.worker.firstName}} {{ticket.worker.name}} + {{::ticket.created | date:'dd/MM/yyyy HH:mm'}} No results @@ -26,6 +24,6 @@ - + \ No newline at end of file diff --git a/client/ticket/src/tracking/tracking.js b/client/ticket/src/tracking/index.js similarity index 79% rename from client/ticket/src/tracking/tracking.js rename to client/ticket/src/tracking/index.js index be147ed918..fc0777775c 100644 --- a/client/ticket/src/tracking/tracking.js +++ b/client/ticket/src/tracking/index.js @@ -2,6 +2,6 @@ import ngModule from '../module'; import FilterTicketList from '../filter-ticket-list'; ngModule.component('vnTicketTracking', { - template: require('./tracking.html'), + template: require('./index.html'), controller: FilterTicketList }); diff --git a/client/ticket/src/tracking/locale/es.yml b/client/ticket/src/tracking/locale/es.yml deleted file mode 100644 index e61e1dd246..0000000000 --- a/client/ticket/src/tracking/locale/es.yml +++ /dev/null @@ -1,5 +0,0 @@ -Date : Fecha -Employee : Empleado -State: Estado -Tracking: Revisión -Created : Añadido \ No newline at end of file diff --git a/services/client/common/methods/greuge/sumAmount.js b/services/client/common/methods/greuge/sumAmount.js index 0fa8d9034b..dcc780168a 100644 --- a/services/client/common/methods/greuge/sumAmount.js +++ b/services/client/common/methods/greuge/sumAmount.js @@ -18,14 +18,14 @@ module.exports = Self => { } }); - Self.sumAmount = (clientFk, callback) => { + Self.sumAmount = async clientFk => { let query = `SELECT SUM(amount) AS sumAmount FROM vn.greuge WHERE clientFk = ?`; - Self.rawSql(query, [clientFk]) - .then(response => { - callback(null, response.length ? response[0].sumAmount : 0); - }) - .catch(err => { - callback(err); - }); + try { + let [response] = await Self.rawSql(query, [clientFk]); + + return response ? response.sumAmount : 0; + } catch (e) { + throw new Error(e); + } }; }; diff --git a/services/client/common/models/credit-insurance.js b/services/client/common/models/credit-insurance.js index 95902ab9cb..155d4de449 100644 --- a/services/client/common/models/credit-insurance.js +++ b/services/client/common/models/credit-insurance.js @@ -1,22 +1,22 @@ module.exports = function(Self) { require('../methods/creditInsurance/filter.js')(Self); + Self.validateCredit = function(credit) { + return credit >= 0; + }; + Self.validateBinded('credit', Self.validateCredit, { message: 'The credit must be an integer greater than or equal to zero', allowNull: false, // FIXME: Ignored by loopback when it's false allowBlank: false }); - Self.validateCredit = function(credit) { - return (credit >= 0 && credit % 1 == 0); + Self.validateGrade = function(grade) { + return typeof grade === 'undefined' || grade >= 0; }; Self.validateBinded('grade', Self.validateGrade, { message: 'The grade must be an integer greater than or equal to zero', allowNull: true }); - - Self.validateGrade = function(grade) { - return (typeof grade === 'undefined' || (grade >= 0 && grade % 1 == 0)); - }; }; diff --git a/services/db/changes/1.0.2/07-agencyMode.sql b/services/db/changes/1.0.2/07-agencyMode.sql new file mode 100644 index 0000000000..268288135e --- /dev/null +++ b/services/db/changes/1.0.2/07-agencyMode.sql @@ -0,0 +1,22 @@ +USE `vn`; +CREATE + OR REPLACE ALGORITHM = UNDEFINED + DEFINER = `root`@`%` + SQL SECURITY DEFINER +VIEW `agencyMode` AS + SELECT + `a`.`Id_Agencia` AS `id`, + `a`.`Agencia` AS `name`, + `a`.`description` AS `description`, + `a`.`Vista` AS `deliveryMethodFk`, + `a`.`m3` AS `m3`, + `a`.`cod71` AS `cod71`, + `a`.`web` AS `web`, + `a`.`agency_id` AS `agencyFk`, + `a`.`agency_service_id` AS `agencyServiceFk`, + `a`.`inflacion` AS `inflation`, + `a`.`is_volumetric` AS `isVolumetric`, + `a`.`send_mail` AS `reportMail`, + `a`.`tpv` AS `isActive` + FROM + `vn2008`.`Agencias` `a`; diff --git a/services/loopback/common/locale/en.json b/services/loopback/common/locale/en.json index 35acd85068..288480f559 100644 --- a/services/loopback/common/locale/en.json +++ b/services/loopback/common/locale/en.json @@ -6,5 +6,6 @@ "Unable to default a disabled consignee": "Unable to default a disabled consignee", "El método de pago seleccionado requiere que se especifique el IBAN": "El método de pago seleccionado requiere que se especifique el IBAN", "Ya existe un usuario con ese nombre": "Ya existe un usuario con ese nombre", - "Quantity cannot be zero": "Quantity cannot be zero" + "Quantity cannot be zero": "Quantity cannot be zero", + "can't be blank": "can't be blank" } \ No newline at end of file diff --git a/services/loopback/common/locale/es.json b/services/loopback/common/locale/es.json index 791d0bc534..f4442b3c66 100644 --- a/services/loopback/common/locale/es.json +++ b/services/loopback/common/locale/es.json @@ -9,5 +9,6 @@ "DNI Incorrecto": "DNI Incorrecto", "Ya existe un usuario con ese nombre": "Ya existe un usuario con ese nombre", "is invalid": "is invalid", - "Quantity cannot be zero": "La cantidad no puede ser cero" + "Quantity cannot be zero": "La cantidad no puede ser cero", + "Package cannot be blank": "Package cannot be blank" } \ No newline at end of file diff --git a/services/loopback/common/methods/client/getAverageInvoiced.js b/services/loopback/common/methods/client/getAverageInvoiced.js new file mode 100644 index 0000000000..94ec033ed6 --- /dev/null +++ b/services/loopback/common/methods/client/getAverageInvoiced.js @@ -0,0 +1,28 @@ +module.exports = Self => { + Self.remoteMethod('getAverageInvoiced', { + description: 'Returns the annual average invoiced of a client', + accessType: 'READ', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'client id', + http: {source: 'path'} + }], + returns: { + type: 'number', + root: true + }, + http: { + path: `/:id/getAverageInvoiced`, + verb: 'GET' + } + }); + + Self.getAverageInvoiced = async clientFk => { + let query = `SELECT invoiced FROM vn.annualAverageInvoiced WHERE clientFk = ?`; + let [invoiced] = await Self.rawSql(query, [clientFk]); + + return invoiced; + }; +}; \ No newline at end of file diff --git a/services/loopback/common/methods/client/getDebt.js b/services/loopback/common/methods/client/getDebt.js index c04c208b82..c4f1677310 100644 --- a/services/loopback/common/methods/client/getDebt.js +++ b/services/loopback/common/methods/client/getDebt.js @@ -21,7 +21,8 @@ module.exports = Self => { Self.getDebt = async clientFk => { let query = `SELECT vn.clientGetDebt(?, CURDATE()) AS debt`; - let response = await Self.rawSql(query, [clientFk]); - return response[0]; + let [debt] = await Self.rawSql(query, [clientFk]); + + return debt; }; }; diff --git a/services/loopback/common/methods/client/getMana.js b/services/loopback/common/methods/client/getMana.js new file mode 100644 index 0000000000..88e337e321 --- /dev/null +++ b/services/loopback/common/methods/client/getMana.js @@ -0,0 +1,28 @@ +module.exports = Self => { + Self.remoteMethod('getMana', { + description: 'Returns the boolean mana of a client', + accessType: 'READ', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'client id', + http: {source: 'path'} + }], + returns: { + type: 'number', + root: true + }, + http: { + path: `/:id/getMana`, + verb: 'GET' + } + }); + + Self.getMana = async clientFk => { + let query = `SELECT vn.clientGetMana(?) AS mana`; + let [mana] = await Self.rawSql(query, [clientFk]); + + return mana; + }; +}; diff --git a/services/loopback/common/methods/client/summary.js b/services/loopback/common/methods/client/summary.js new file mode 100644 index 0000000000..ea3ab3ec1e --- /dev/null +++ b/services/loopback/common/methods/client/summary.js @@ -0,0 +1,68 @@ +module.exports = Self => { + Self.remoteMethod('summary', { + description: 'Returns a client summary', + accessType: 'READ', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'client id', + http: {source: 'path'} + }], + returns: { + type: [this.modelName], + root: true + }, + http: { + path: `/:id/summary`, + verb: 'GET' + } + }); + + Self.summary = async clientFk => { + let models = Self.app.models; + let summaryObj = await getSummary(models.Client, clientFk); + + summaryObj.mana = await models.Client.getMana(clientFk); + summaryObj.debt = await models.Client.getDebt(clientFk); + summaryObj.averageInvoiced = await models.Client.getAverageInvoiced(clientFk); + summaryObj.totalGreuge = await models.Greuge.sumAmount(clientFk); + summaryObj.recovery = await getRecoveries(models.Recovery, clientFk); + + return summaryObj; + }; + + async function getSummary(client, clientId) { + let filter = { + include: [ + {relation: 'account', scope: {fields: ['name', 'active']}}, + {relation: 'salesPerson', scope: {fields: ['name']}}, + {relation: 'country', scope: {fields: ['country']}}, + {relation: 'province', scope: {fields: ['name']}}, + {relation: 'contactChannel', scope: {fields: ['name']}}, + {relation: 'payMethod', scope: {fields: ['name']}}, + { + relation: 'addresses', + scope: { + where: {isDefaultAddress: true}, + fields: ['nickname', 'street', 'city', 'postalCode'] + } + } + ], + where: {id: clientId} + }; + + return await client.findOne(filter); + } + + async function getRecoveries(recovery, clientId) { + let filter = { + where: { + and: [{clientFk: clientId}, {or: [{finished: null}, {finished: {gt: Date.now()}}]}] + }, + limit: 1 + }; + + return await recovery.findOne(filter); + } +}; diff --git a/services/loopback/common/models/agency-mode.json b/services/loopback/common/models/agency-mode.json index d29695ae39..cff8b2f1e3 100644 --- a/services/loopback/common/models/agency-mode.json +++ b/services/loopback/common/models/agency-mode.json @@ -28,6 +28,9 @@ }, "reportMail": { "type": "string" + }, + "isActive":{ + "type": "boolean" } }, "relations": { @@ -49,5 +52,8 @@ "principalId": "$everyone", "permission": "ALLOW" } - ] + ], + "scopes" : { + "active" : {"where": {"isActive": {"neq": false}}} + } } diff --git a/services/loopback/common/models/client.js b/services/loopback/common/models/client.js index eee7100350..7114aef9a0 100644 --- a/services/loopback/common/models/client.js +++ b/services/loopback/common/models/client.js @@ -16,6 +16,9 @@ module.exports = function(Self) { require('../methods/client/activeSalesPerson')(Self); require('../methods/client/addressesPropagateRe')(Self); require('../methods/client/getDebt')(Self); + require('../methods/client/getMana')(Self); + require('../methods/client/getAverageInvoiced')(Self); + require('../methods/client/summary')(Self); // Validations diff --git a/services/loopback/common/models/warehouse.json b/services/loopback/common/models/warehouse.json index 7b6fef1cd5..789d5c7f88 100644 --- a/services/loopback/common/models/warehouse.json +++ b/services/loopback/common/models/warehouse.json @@ -20,7 +20,7 @@ "type": "Number" }, "isManaged":{ - "type":"boolean" + "type": "boolean" } }, "acls": [ diff --git a/services/ticket/common/methods/sale/filter.js b/services/ticket/common/methods/sale/filter.js index b33d5f1b63..66d73b6b24 100644 --- a/services/ticket/common/methods/sale/filter.js +++ b/services/ticket/common/methods/sale/filter.js @@ -20,6 +20,12 @@ module.exports = Self => { } } } + }, + { + relation: "isChecked", + scope: { + fields: ["isChecked"] + } }] }; } diff --git a/services/ticket/common/models/sale.json b/services/ticket/common/models/sale.json index a7d75cf1ef..f1bf0eab8c 100644 --- a/services/ticket/common/models/sale.json +++ b/services/ticket/common/models/sale.json @@ -51,6 +51,11 @@ "model": "Ticket", "foreignKey": "ticketFk", "required": true + }, + "isChecked": { + "type": "hasOne", + "model": "SaleChecked", + "foreignKey": "saleFk" } } } diff --git a/services/ticket/common/models/ticketTracking.js b/services/ticket/common/models/ticketTracking.js index ab8a13f1e1..91f890af51 100644 --- a/services/ticket/common/models/ticketTracking.js +++ b/services/ticket/common/models/ticketTracking.js @@ -1,3 +1,14 @@ module.exports = function(Self) { require('../methods/ticketTracking/filter')(Self); + + Self.observe('before save', function(ctx, next) { + let token = ctx.options.accessToken; + let userId = token && token.userId; + + Self.app.models.Worker.findOne({where: {userFk: userId}}, (err, user) => { + if (err) return next(err); + ctx.instance.workerFk = user.id; + next(); + }); + }); }; diff --git a/services/ticket/common/models/ticketTracking.json b/services/ticket/common/models/ticketTracking.json index b1f2769d40..176f84b274 100644 --- a/services/ticket/common/models/ticketTracking.json +++ b/services/ticket/common/models/ticketTracking.json @@ -3,7 +3,8 @@ "base": "VnModel", "options": { "mysql": { - "table": "ticketTracking" + "table": "ticketTracking", + "database": "vn" } }, "properties": {