import ngModule from '../module'; import Section from 'salix/components/section'; import './style.scss'; class Controller extends Section { get route() { return this._route; } set route(value) { this._route = value; if (value) this.buildPossibleTicketsFilter(); } get isChecked() { if (this.tickets) { for (let instance of this.tickets) if (instance.checked) return true; } return false; } buildPossibleTicketsFilter() { let minDate = new Date(this.route.finished); minDate.setHours(0, 0, 0, 0); let maxDate = new Date(this.route.finished); maxDate.setHours(23, 59, 59, 59); this.possibleTicketsFilter = { where: { zoneFk: this.route.zoneFk, routeFk: null, landed: {between: [minDate, maxDate]}, }, include: [ { relation: 'warehouse', scope: { fields: ['name'] }, }, { relation: 'address' } ] }; } getHighestPriority() { let highestPriority = Math.max(...this.$.model.data.map(tag => { return tag.priority; })); return highestPriority + 1; } setPriority(id, priority) { let params = {priority: priority}; let query = `Tickets/${id}/`; this.$http.patch(query, params).then(() => { this.vnApp.showSuccess(this.$translate.instant('Data saved!')); this.$.model.refresh(); }); } getSelectedItems(items) { const selectedItems = []; if (items) { for (let i = 0; i < items.length; i++) { if (items[i].checked) selectedItems.push(items[i]); } } return selectedItems; } goToBuscaman() { let query = `Routes/${this.route.vehicleFk}/getDeliveryPoint`; let deliveryPointAddress; let addresses; this.$http.get(query).then(response => { deliveryPointAddress = response.data; }).then(() => { addresses = deliveryPointAddress; let lines = this.getSelectedItems(this.tickets); let url = 'http://gps.buscalia.com/usuario/localizar.aspx?bmi=true&addr='; lines.forEach(line => { addresses = addresses + '+to:' + line.address.postalCode + ' ' + line.address.city + ' ' + line.address.street; }); window.open(url + addresses, '_blank'); }); } showDeleteConfirm(id) { this.selectedTicket = id; this.$.confirm.show(); } removeTicketFromRoute(response) { if (response === 'accept') { let params = {routeFk: null}; let query = `Tickets/${this.selectedTicket}/`; this.$http.patch(query, params).then(() => { this.vnApp.showSuccess(this.$translate.instant('Ticket removed from route')); this.updateVolume(); }); } } updateVolume() { let url = `Routes/${this.$params.id}/updateVolume`; this.$http.post(url).then(() => { this.card.reload(); this.$.model.refresh(); }); } guessPriority() { let query = `Routes/${this.$params.id}/guessPriority/`; this.$http.get(query).then(() => { this.vnApp.showSuccess(this.$translate.instant('Order changed')); this.$.model.refresh(); }); } openPossibleTicketsDialog() { this.$.possibleTicketsModel.refresh(); this.$.possibleTicketsDialog.show(); } setTicketsRoute(response) { if (response === 'accept') { let tickets = this.getSelectedItems(this.possibleTickets); for (let i = 0; i < tickets.length; i++) { delete tickets[i].checked; tickets[i].routeFk = this.route.id; } return this.$.possibleTicketsModel.save().then(() => { this.$.model.data = this.$.model.data.concat(tickets); }); } return Promise.resolve(); } onDrop($event) { const ticketId = $event.dataTransfer.getData('Text'); if (isNaN(ticketId)) { const regexp = new RegExp(/\/ticket\/([0-9]+)\//i); const matches = ticketId.match(regexp); if (matches && matches.length) this.insert(matches[1]); else this.vnApp.showError(this.$translate.instant('Ticket not found')); } if (!isNaN(ticketId)) this.insert(ticketId); } insert(id) { const params = {routeFk: this.route.id}; this.$http.patch(`Tickets/${id}`, params).then(() => { this.vnApp.showSuccess(this.$translate.instant('Data saved!')); this.$.model.refresh(); this.card.reload(); }).catch(error => { if (error.status == 404) return this.vnApp.showError(this.$translate.instant('Ticket not found')); throw error; }); } } ngModule.component('vnRouteTickets', { template: require('./index.html'), controller: Controller, require: { card: '^vnRouteCard' }, bindings: { route: '<' } });