import ngModule from '../module'; import Section from 'salix/components/section'; import UserError from 'core/lib/user-error'; import './style.scss'; class Controller extends Section { $onInit() { const date = Date.vnNew(); Object.assign(this, { maxShipped: new Date(date.getFullYear(), date.getMonth(), 0), clientsToInvoice: 'all', }); this.$http.get('UserConfigs/getUserConfig') .then(res => { this.companyFk = res.data.companyFk; this.getInvoiceDate(this.companyFk); }); } getInvoiceDate(companyFk) { const params = { companyFk: companyFk }; this.fetchInvoiceDate(params); } fetchInvoiceDate(params) { this.$http.get('InvoiceOuts/getInvoiceDate', { params }) .then(res => { this.minInvoicingDate = res.data.issued ? new Date(res.data.issued) : null; this.invoiceDate = this.minInvoicingDate; }); } stopInvoicing() { this.status = 'stopping'; } makeInvoice() { this.invoicing = true; this.status = 'packageInvoicing'; this.errors = []; this.addresses = null; try { if (this.clientsToInvoice == 'one' && !this.clientId) throw new UserError('Choose a valid client'); if (!this.invoiceDate || !this.maxShipped) throw new UserError('Invoice date and the max date should be filled'); if (this.invoiceDate < this.maxShipped) throw new UserError('Invoice date can\'t be less than max date'); if (this.minInvoicingDate && this.invoiceDate.getTime() < this.minInvoicingDate.getTime()) throw new UserError('Exists an invoice with a future date'); if (!this.companyFk) throw new UserError('Choose a valid company'); if (!this.printerFk) throw new UserError('Choose a valid printer'); if (this.clientsToInvoice == 'all') this.clientId = undefined; const params = { invoiceDate: this.invoiceDate, maxShipped: this.maxShipped, clientId: this.clientId, companyFk: this.companyFk }; this.$http.post(`InvoiceOuts/clientsToInvoice`, params) .then(res => { this.addresses = res.data; if (!this.addresses.length) throw new UserError(`There aren't tickets to invoice`); this.addressIndex = 0; return this.invoiceOut(); }) .catch(err => this.handleError(err)); } catch (err) { this.handleError(err); } } handleError(err) { this.invoicing = false; this.status = null; throw err; } invoiceOut() { if (this.addressIndex == this.addresses.length || this.status == 'stopping') { this.invoicing = false; this.status = 'done'; return; } this.status = 'invoicing'; const address = this.addresses[this.addressIndex]; this.currentAddress = address; const params = { clientId: address.clientId, addressId: address.id, invoiceDate: this.invoiceDate, maxShipped: this.maxShipped, companyFk: this.companyFk, printerFk: this.printerFk, }; this.$http.post(`InvoiceOuts/invoiceClient`, params) .then(() => this.invoiceNext()) .catch(res => { if (res.status >= 400 && res.status < 500) { const error = res.data?.error; let isWarning; switch(error?.code) { case 'pdfError': case 'mailNotSent': isWarning = true; break; } const message = error?.message || res.message; this.errors.unshift({address, message, isWarning}); this.invoiceNext(); } else { this.invoicing = false; this.status = 'done'; throw new UserError(`Critical invoicing error, proccess stopped`); } }) } invoiceNext() { this.addressIndex++; this.invoiceOut(); } get nAddresses() { if (!this.addresses) return 0; return this.addresses.length; } get addressNumber() { return Math.min(this.addressIndex + 1, this.nAddresses); } get percentage() { const len = this.nAddresses; return Math.min(this.addressIndex, len) / len; } } ngModule.vnComponent('vnInvoiceOutGlobalInvoicing', { template: require('./index.html'), controller: Controller });