import ngModule from '../../module'; import Dialog from 'core/components/dialog'; import './style.scss'; class Controller extends Dialog { constructor($element, $, $transclude) { super($element, $, $transclude); this.invoice = { maxShipped: new Date() }; } $onInit() { this.getMinClientId(); this.getMaxClientId(); } getMinClientId() { this.getClientId('min') .then(res => this.invoice.fromClientId = res.data.id); } getMaxClientId() { this.getClientId('max') .then(res => this.invoice.toClientId = res.data.id); } getClientId(func) { const order = func == 'min' ? 'ASC' : 'DESC'; const params = { filter: { order: 'id ' + order, limit: 1 } }; return this.$http.get('Clients/findOne', {params}); } get companyFk() { return this.invoice.companyFk; } set companyFk(value) { this.invoice.companyFk = value; } restartValues() { this.lastClientId = null; this.$.invoiceButton.disabled = false; } async responseHandler(response) { try { if (response !== 'accept') return super.responseHandler(response); if (!this.invoice.invoiceDate || !this.invoice.maxShipped) throw new Error('Invoice date and the max date should be filled'); if (!this.invoice.fromClientId) throw new Error('Choose a valid clients range'); this.on('close', () => { if (this.canceler) this.canceler.resolve(); this.vnApp.showSuccess(this.$t('Data saved!')); }); this.$.invoiceButton.disabled = true; return this.$http.post(`InvoiceOuts/clientToInvoice`, this.invoice) .then(async res => { const clientsAndAddresses = res.data.clientsAndAddresses; const invoice = res.data.invoice; if (!clientsAndAddresses.length) return super.responseHandler(response); this.lastClientId = clientsAndAddresses[clientsAndAddresses.length - 1].clientId; for (let clientAndAddress of clientsAndAddresses) { this.currentClientId = clientAndAddress.clientId; const params = { clientId: clientAndAddress.clientId, addressId: clientAndAddress.addressId, invoiceDate: invoice.invoiceDate, maxShipped: invoice.maxShipped, fromClientId: invoice.fromClientId, toClientId: invoice.toClientId, companyFk: invoice.companyFk, minShipped: invoice.minShipped, }; this.canceler = this.$q.defer(); const options = { timeout: this.canceler.promise }; await this.$http.post(`InvoiceOuts/globalInvoicing`, params, options); } }) .then(() => super.responseHandler(response)) .then(() => this.vnApp.showSuccess(this.$t('Data saved!'))) .finally(() => this.restartValues()); } catch (e) { this.restartValues(); this.vnApp.showError(this.$t(e.message)); return false; } } } Controller.$inject = ['$element', '$scope', '$transclude']; ngModule.vnComponent('vnInvoiceOutGlobalInvoicing', { slotTemplate: require('./index.html'), controller: Controller, bindings: { companyFk: '