const state = { loadingPaymentTerms: true, paymentTerms: [], paymentMethods: ['Efectivo', 'Banco'], selectedPaymentTerm: null, paymentType: 'cash', paymentMethod: 'Efectivo', amountToPay: 0, initialPayment: 0, amountResidual: 0, paymentLines: [], bankPaymentData: null, supplierInvoiceNumber: null } const getters = { paymentTerms(state) { return state.paymentTerms }, paymentMethods(state) { return state.paymentMethods.filter(p => p !== state.paymentMethod) }, selectedPaymentTerm(state) { return state.selectedPaymentTerm }, paymentType(state) { return state.paymentType }, paymentMethod(state) { return state.paymentMethod }, amountToPay(state) { return state.amountToPay }, // amountToPayInOtherCurrencies(state, { settings, currencies, user, selectedCurrency, cartTotal }) { // console.log(settings) // console.log(currencies) // console.log(user) // console.log(selectedCurrency) // console.log(cartTotal) // let values = [] // if (!user || !selectedCurrency || cartTotal === 0) { // return values // } // const base = currencies.find(c => c.id === user.company.currencyId) // for (let currency of settings.currencies) { // if (currency.id === selectedCurrency.id) { // continue // } // const rate = base.rateSilent / currency.rateSilent // values.push({ // currency, // amount: cartTotal / rate, // }) // } // return values // }, initialPayment(state) { return state.initialPayment }, amountResidual(state) { return state.amountResidual }, paymentLines(state) { return state.paymentLines }, supplierInvoiceNumber(state) { return state.supplierInvoiceNumber }, loadingPaymentTerms(state) { return state.loadingPaymentTerms } } const mutations = { setPaymentTerms(state, payload) { state.paymentTerms = [...payload] }, setLoadingPaymentTerms(state, payload) { state.loadingPaymentTerms = !!payload }, autoSelectPaymentTerm(state, payload) { if (!payload || payload === 'cash') { state.selectedPaymentTerm = state.paymentTerms.find(t => t.lines.length === 1 && t.lines[0].days === 0) || state.paymentTerms.find(t => t.lines.length === 1 && t.lines[0].days >= 0) } else { state.selectedPaymentTerm = state.paymentTerms.find(t => t.lines[0].days > 0) } }, setSelectedPaymentTerm(state, termId) { if (!termId) { state.selectedPaymentTerm = null return } state.selectedPaymentTerm = state.paymentTerms.find(item => item.id === termId) }, setPaymentType(state, payload) { state.paymentType = payload }, setPaymentMethod(state, payload) { state.paymentMethod = payload }, setAmountToPay(state, amount) { if (!this.getters.baseCurrency) { this.amountToPay = amount return } let rate = 1 if (this.getters.baseCurrency.id !== this.getters.selectedCurrency.id) { rate = this.getters.baseCurrency.rateSilent / this.getters.selectedCurrency.rateSilent } state.amountToPay = amount / rate }, setAmountResidual(state) { state.amountResidual = state.initialPayment < state.amountToPay ? 0 : state.initialPayment - state.amountToPay }, computePaymentInCurrency(state, { fromSymbol, toSymbol }) { const fromCurrency = this.getters.currencies.find(c => c.symbol === fromSymbol) const toCurrency = this.getters.currencies.find(c => c.symbol === toSymbol) if (!fromCurrency || !toCurrency) { return } const rate = fromCurrency.rateSilent / toCurrency.rateSilent state.amountToPay = state.amountToPay / rate state.initialPayment = state.initialPayment / rate state.amountResidual = state.amountResidual / rate }, setInitialPayment(state, payload) { state.initialPayment = payload }, setPaymentLines(state, payload) { state.paymentLines = [] if (!payload) { return } let percentPaid = state.initialPayment / payload.total let distributedPercentage = -(percentPaid / state.selectedPaymentTerm.lines.length) let totals = [] let residual = payload.total let dueDate = null for (let line of state.selectedPaymentTerm.lines) { dueDate = moment(payload.date).add(line.days + line.days2, 'days').format('YYYY-MM-DD') if(percentPaid && percentPaid < 1) { totals.push([payload.date, percentPaid]) percentPaid = 0 if (dueDate === payload.date) { distributedPercentage = ((totals[0][1] - line.valueAmount) / (state.selectedPaymentTerm.lines.length - 1)) continue } } if (line.value !== 'balance') { totals.push([dueDate, line.valueAmount + distributedPercentage]) continue } totals.push([dueDate, line.valueAmount]) for (let line of totals) { let currentPrice = (payload.total * line[1]).toFixed(2) if (currentPrice < 0) { continue } residual = residual - currentPrice state.paymentLines.push({ date: line[0], total: currentPrice !== parseFloat(0).toFixed(2) ? currentPrice : residual.toFixed(2) }) } totals = [] } }, setBankPaymentData(state, bankPaymentData) { state.bankPaymentData = bankPaymentData }, setSupplierInvoiceNumber(state, invoiceNumber) { state.supplierInvoiceNumber = invoiceNumber } } const actions = { initPaymentTerms({ commit }, payload) { commit('setPaymentTerms', payload) commit('autoSelectPaymentTerm') commit('setLoadingPaymentTerms', false) }, autoSelectPaymentTerm(state, payload) { if (!payload || payload === 'cash') { state.paymentTerm = state.paymentTerms.find(t => t.lines.length === 1 && t.lines[0].days === 0) || state.paymentTerms.find(t => t.lines.length === 1 && t.lines[0].days >= 0) } else { state.paymentTerm = state.paymentTerms.find(t => t.lines[0].days > 0) } }, selectPaymentTerm({ commit }, payload) { if (!payload) { return } commit('setSelectedPaymentTerm', payload) }, changePaymentType({ getters, commit, dispatch }, payload) { commit('setPaymentType', payload), commit('autoSelectPaymentTerm', payload) commit('setInitialPayment', 0) commit('setPaymentLines') if (getters.paymentType === 'credit') { dispatch('computePaymentLines') } }, changePaymentMethod({ commit, dispatch }, methodName) { if (methodName === 'Banco') { dispatch('toggleBankPayment') } commit('setPaymentMethod', methodName) dispatch('changeInitialPayment', 0) }, changeAmountToPay({ commit }, amount) { commit('setAmountToPay', amount) }, changeInitialPayment({ commit, dispatch, getters }, initialPayment) { commit('setInitialPayment', initialPayment) commit('setAmountResidual') if (getters.paymentType === 'credit') { dispatch('computePaymentLines') } }, computePaymentLines({ commit, getters }) { commit('setPaymentLines', { date: getters.date, total: getters.cartTotal }) }, changeSupplierInvoiceNumber({ commit }, invoiceNumber) { commit('setSupplierInvoiceNumber', invoiceNumber) }, resetPayment({ commit }) { commit('setLoadingPaymentTerms', true) commit('setPaymentTerms', []) commit('setSelectedPaymentTerm', null) commit('setPaymentType', 'cash') commit('setPaymentMethod', 'Efectivo') commit('setAmountToPay', 0) commit('setInitialPayment', 0) commit('setAmountResidual') commit('setSupplierInvoiceNumber', null) commit('autoSelectPaymentTerm') } } export default { state, getters, mutations, actions }