import ngModule from '../../module'; import './style.scss'; class Controller { constructor($scope, $http, $translate, vnApp) { this.$scope = $scope; this.$http = $http; this.$translate = $translate; this.vnApp = vnApp; } $onInit() { this.basicData.registerChild(this); } get ticket() { return this._ticket; } set ticket(value) { this._ticket = value; if (!value || !value.id) return; this.onChangeClient(value.clientFk); } get clientId() { return this.ticket && this.ticket.clientFk; } set clientId(value) { this.ticket.clientFk = value; this.ticket.addressFk = null; this.onChangeClient(value); } get addressId() { return this.ticket && this.ticket.addressFk; } set addressId(value) { if (value != this.ticket.addressFk) { this.ticket.addressFk = value; this.getShipped({ landed: this.ticket.landed, addressFk: value, agencyModeFk: this.ticket.agencyModeFk }); } } get warehouseId() { return this.ticket && this.ticket.warehouseFk; } set warehouseId(value) { if (value != this.ticket.warehouseFk) { this.ticket.warehouseFk = value; this.getShipped({ landed: this.ticket.landed, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk, warehouseFk: value }); } } get shipped() { return this.ticket && this.ticket.shipped; } set shipped(value) { this.ticket.shipped = value; this.getLanded({ shipped: value, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk }); } get landed() { return this.ticket && this.ticket.landed; } set landed(value) { this.ticket.landed = value; this.getShipped({ landed: value, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk }); } get agencyModeId() { return this.ticket && this.ticket.agencyModeFk; } set agencyModeId(value) { if (value != this.ticket.agencyModeFk) { this.ticket.agencyModeFk = value; this.getLanded({ shipped: this.ticket.shipped, addressFk: this.ticket.addressFk, agencyModeFk: value }); } } get zoneId() { return this.ticket && this.ticket.zoneFk; } set zoneId(value) { if (value != this.ticket.zoneFk) { this.ticket.zoneFk = value; this.onChangeZone(value); } } /* * Autocompletes address on client change */ onChangeClient(value) { let filter = { include: [ { relation: 'province', scope: { fields: ['name'] } }, { relation: 'agencyMode', scope: { fields: ['name'] } } ] }; filter = encodeURIComponent(JSON.stringify(filter)); let query = `Clients/${value}/addresses?filter=${filter}`; this.$http.get(query).then(res => { if (res.data) this.addresses = res.data; }); } /* * Gets an agency from an specified zone */ onChangeZone(zoneId) { this.ticket.agencyModeFk = null; const query = `Zones/${zoneId}`; this.$http.get(query).then(res => { this.ticket.agencyModeFk = res.data.agencyModeFk; }); } async onStepChange() { if (this.isFormInvalid()) { return this.vnApp.showError( this.$translate.instant('Some fields are invalid') ); } let query = `tickets/${this.ticket.id}/priceDifference`; let params = { landed: this.ticket.landed, addressId: this.ticket.addressFk, agencyModeId: this.ticket.agencyModeFk, zoneId: this.ticket.zoneFk, warehouseId: this.ticket.warehouseFk }; return this.$http.post(query, params).then(res => { if (res.data) this.ticket.sale = res.data; return true; }, err => { this.vnApp.showError( this.$translate.instant(err.data.error.message) ); }); } /* * Returns a landing date */ getLanded(params) { this.ticket.zoneFk = null; const query = `Agencies/getLanded`; this.$http.get(query, {params}).then(res => { if (res.data) { this.ticket.zoneFk = res.data.zoneFk; this.ticket.agencyModeFk = res.data.agencyModeFk; this.ticket.landed = res.data.landed; this.ticket.shipped = params.shipped; } else { return this.vnApp.showError( this.$translate.instant(`No delivery zone available for this landing date`) ); } }); } /* * Returns a shipment date */ getShipped(params) { this.ticket.zoneFk = null; const query = `Agencies/getShipped`; this.$http.get(query, {params}).then(res => { if (res.data) { this.ticket.zoneFk = res.data.zoneFk; this.ticket.agencyModeFk = res.data.agencyModeFk; this.ticket.landed = params.landed; this.ticket.shipped = res.data.shipped; } else { return this.vnApp.showError( this.$translate.instant(`No delivery zone available for this landing date`) ); } }); } isFormInvalid() { return !this.ticket.clientFk || !this.ticket.addressFk || !this.ticket.agencyModeFk || !this.ticket.companyFk || !this.ticket.shipped || !this.ticket.landed || !this.ticket.zoneFk; } } Controller.$inject = ['$scope', '$http', '$translate', 'vnApp']; ngModule.component('vnTicketBasicDataStepOne', { template: require('./index.html'), controller: Controller, bindings: { ticket: '<' }, require: { basicData: '^vnTicketBasicData' } });