import ngModule from '../module'; import './style.scss'; class Controller { constructor($scope, $timeout, $stateParams, $http, vnApp, $translate) { this.$ = $scope; this.vnApp = vnApp; this.translate = $translate; this.$timeout = $timeout; this.$state = $stateParams; this.$http = $http; this.deletable = false; this.edit = {}; this.moreOptions = [ {callback: this.showAddTurnDialog, name: "Add turn", always: true}, {callback: this.showDeleteTicketDialog, name: "Delete ticket", always: true}, {callback: this.markAsReserved, name: 'Mark as reserved'}, {callback: this.unmarkAsReserved, name: 'Unmark as reserved'}, {callback: this.showEditDialog, name: 'Update discount'} ]; } getSales() { this.$http.get(`/api/Tickets/${this.ticket.id}/getSales`).then(res => { this.sales = res.data; this.getTaxes(); }); } $onChanges() { if (this.ticket && this.ticket.clientFk) this.getSales(this.ticket.clientFk); } onMoreOpen() { let options = this.moreOptions.filter(o => o.always || this.isChecked); this.$.moreButton.data = options; } getTaxes() { this.getSubTotal(); this.getVAT(); } getSubTotal() { let sales = this.sales; this.subTotal = 0.00; sales.forEach(sale => { this.subTotal += (sale.quantity * sale.price) - ((sale.discount * (sale.quantity * sale.price)) / 100); }); } getVAT() { this.$http.get(`/ticket/api/Tickets/${this.ticket.id}/getVAT`).then(res => { this.VAT = res.data || 0; this.total = this.subTotal + this.VAT; }); } get isEditable() { try { return !this.ticket.tracking.state.alertLevel; } catch (e) {} return true; } get isChecked() { let data = this.sales; if (data) for (let instance of data) if (instance.checked) return true; return false; } getCheckedLines() { let lines = []; let data = this.sales; if (data) for (let i = 0; i < data.length; i++) if (data[i].checked) lines.push({id: data[i].id, instance: i}); return lines; } onMoreChange(callback) { callback.call(this); } // Change State onStateOkClick() { let filter = {where: {code: "OK"}, fields: ["id"]}; let json = encodeURIComponent(JSON.stringify(filter)); this.$http.get(`/ticket/api/States?filter=${json}`).then(res => { this.onStateChange(res.data[0].id); }); } onStateChange(value) { let params = {ticketFk: this.$state.params.id, stateFk: value}; this.$http.post(`/ticket/api/TicketTrackings/changeState`, params).then(() => { this.card.reload(); this.vnApp.showSuccess(this.translate.instant('Data saved!')); }); } // Add Turn showAddTurnDialog() { this.$.addTurn.show(); } addTurn(day) { let params = {ticketFk: this.$state.params.id, weekDay: day}; this.$http.patch(`/ticket/api/TicketWeeklies`, params).then(() => { this.$.addTurn.hide(); this.vnApp.showSuccess(this.translate.instant('Data saved!')); }); } // Delete Ticket showDeleteTicketDialog() { this.$.deleteConfirmation.show(); } deleteTicket(response) { if (response === 'ACCEPT') { let params = {id: this.$state.params.id}; this.$http.post(`/ticket/api/Tickets/deleted`, params).then(() => { this.$state.go('ticket.index'); this.vnApp.showSuccess(this.translate.instant('Ticket deleted')); }); } } // Remove Lines onRemoveLinesClick(response) { if (response === 'ACCEPT') { let sales = this.getCheckedLines(); let params = {sales: sales, actualTicketFk: this.ticket.id}; let query = `/ticket/api/Sales/removes`; this.$http.post(query, params).then(() => { this.removeInstances(sales); }); } } removeInstances(instances) { for (let i = instances.length - 1; i >= 0; i--) { this.sales.splice(instances[i].instance, 1); } } showRemoveLinesDialog() { this.$.deleteLines.show(); } // Move Lines showTransferPopover(event) { let filter = {clientFk: this.ticket.clientFk, ticketFk: this.ticket.id}; let json = encodeURIComponent(JSON.stringify(filter)); let query = `/ticket/api/Tickets/threeLastActive?filter=${json}`; this.$http.get(query).then(res => { this.lastThreeTickets = res.data; }); this.$.transfer.parent = event.target; this.$.transfer.show(); } moveLines(ticketID) { let sales = this.getCheckedLines(); let params = {sales: sales, newTicketFk: ticketID, actualTicketFk: this.ticket.id}; this.$http.post(`/ticket/api/Sales/moveToTicket`, params).then(() => { this.goToTicket(ticketID); }); } // In Progress linesToNewTicket() { let ticket = { oldTicketFk: this.ticket.id, clientFk: this.ticket.clientFk, addressFk: this.ticket.addressFk, agencyModeFk: this.ticket.agencyModeFk, warehouseFk: this.ticket.warehouseFk }; let sales = this.getCheckedLines(); this.$http.post(`/api/Sales/MoveToNewTicket`, {ticket: ticket, sales: sales}).then(res => { let url = this.$state.href("ticket.card.sale", {id: res.data}, {absolute: true}); window.open(url, '_blank'); this.$.transfer.hide(); this.getSales(); }); } goToTicket(ticketID) { this.$state.go("ticket.card.sale", {id: ticketID}); } // Focus First Input focusFirstInput(e) { let firstFocusable = e.querySelector('input, textarea'); if (firstFocusable) { firstFocusable.addEventListener('focus', () => { firstFocusable.select(); }); setTimeout(() => { firstFocusable.focus(); }, 200); } } // Slesperson Mana getManaSalespersonMana() { this.$http.get(`/api/Tickets/${this.$state.params.id}/getSalesPersonMana`).then(res => { this.mana = res.data; }); } // Item Descriptor showDescriptor(event, itemFk) { this.$.descriptor.itemFk = itemFk; this.$.descriptor.parent = event.target; this.$.descriptor.show(); } onDescriptorLoad() { this.$.popover.relocate(); } // Edit Line showEditPricePopover(event, sale) { this.sale = sale; this.editedPrice = this.sale.price; this.edit = { ticketFk: this.ticket.id, id: sale.id, quantity: sale.quantity }; this.$.editPricePopover.parent = event.target; this.$.editPricePopover.show(); this.focusFirstInput(this.$.editPricePopover.$element[0]); } updatePrice() { if (this.editedPrice != this.sale.price) { this.$http.post(`/ticket/api/Sales/updatePrice`, {id: this.edit.id, price: this.editedPrice, ticketFk: this.ticket.id}).then(() => { this.sale.price = this.edit.price; this.getSales(); }); } this.$.editPricePopover.hide(); } showEditPopover(event, sale) { this.sale = sale; this.edit = [{ ticketFk: this.ticket.id, id: sale.id, quantity: sale.quantity, price: sale.price, discount: sale.discount }]; this.$.editPopover.parent = event.target; this.$.editPopover.show(); this.focusFirstInput(this.$.editPopover.$element[0]); } showEditDialog() { this.edit = this.getCheckedLines(); this.$.editDialog.show(); this.focusFirstInput(this.$.editDialog.$element[0]); } hideEditDialog() { this.getSales(); this.$.editDialog.hide(); } hideEditPopover() { this.getSales(); this.$.editPopover.hide(); } updateQuantity(id, quantity) { this.$http.post(`/ticket/api/Sales/${id}/updateQuantity`, {quantity: parseInt(quantity)}).then(() => { this.vnApp.showSuccess(this.translate.instant('Data saved!')); }).catch(e => { this.vnApp.showError(this.translate.instant(e.data.error.message)); this.getSales(); }); } /** * Unmark sale as reserved */ unmarkAsReserved() { this.setReserved(false); } /** * Mark sale as reserved */ markAsReserved() { this.setReserved(true); } setReserved(reserved) { let sales = this.getCheckedLines(); let params = {sales: sales, ticketFk: this.ticket.id, reserved: reserved}; this.$http.post(`/ticket/api/Sales/reserve`, params).then(() => { this.getSales(); }); } } Controller.$inject = ['$scope', '$timeout', '$state', '$http', 'vnApp', '$translate']; ngModule.component('vnTicketSale', { template: require('./index.html'), controller: Controller, bindings: { ticket: '<' }, require: { card: '^vnTicketCard' } });