|
@@ -1,16 +1,24 @@
|
|
|
-import { SET_PAYMENT_TERMS, SET_LOADING_PAYMENT_TERMS, SET_PAYMENT_TYPE } from '@/constants/mutationTypes'
|
|
|
-import { INIT_PAYMENT_TERMS, CHANGE_PAYMENT_TYPE } from '@/constants/actionTypes'
|
|
|
+import { SET_PAYMENT_TERMS, SET_LOADING_PAYMENT_TERMS, AUTOSELECT_PAYMENT_TERM, SET_SELECTED_PAYMENT_TERM, SET_PAYMENT_TYPE, SET_INITIAL_PAYMENT, SET_PAYMENT_LINES } from '@/constants/mutationTypes'
|
|
|
+import { INIT_PAYMENT_TERMS, SELECT_PAYMENT_TERM, CHANGE_PAYMENT_TYPE, CHANGE_INITIAL_PAYMENT, COMPUTE_PAYMENT_LINES } from '@/constants/actionTypes'
|
|
|
|
|
|
const initialState = {
|
|
|
paymentTerms: [],
|
|
|
loadingPaymentTerms: false,
|
|
|
- paymentType: 'cash'
|
|
|
+ selectedPaymentTerm: null,
|
|
|
+ paymentType: 'cash',
|
|
|
+ initialPayment: 0,
|
|
|
+ paymentResidual: 0,
|
|
|
+ paymentLines: []
|
|
|
}
|
|
|
|
|
|
const state = {
|
|
|
paymentTerms: initialState.paymentTerms,
|
|
|
loadingPaymentTerms: !initialState.loadingPaymentTerms,
|
|
|
- paymentType: initialState.paymentType
|
|
|
+ selectedPaymentTerm: initialState.selectedPaymentTerm,
|
|
|
+ paymentType: initialState.paymentType,
|
|
|
+ initialPayment: initialState.initialPayment,
|
|
|
+ paymentResidual: initialState.paymentResidual,
|
|
|
+ paymentLines: initialState.paymentLines
|
|
|
}
|
|
|
|
|
|
const getters = {
|
|
@@ -28,12 +36,40 @@ const getters = {
|
|
|
loadingPaymentTerms(state) {
|
|
|
return state.loadingPaymentTerms
|
|
|
},
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ */
|
|
|
+ selectedPaymentTerm(state) {
|
|
|
+ return state.selectedPaymentTerm
|
|
|
+ },
|
|
|
/**
|
|
|
*
|
|
|
* @param {*} state
|
|
|
*/
|
|
|
paymentType(state) {
|
|
|
return state.paymentType
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ */
|
|
|
+ initialPayment(state) {
|
|
|
+ return state.initialPayment
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ */
|
|
|
+ paymentResidual(state) {
|
|
|
+ return state.paymentResidual
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ */
|
|
|
+ paymentLines(state) {
|
|
|
+ return state.paymentLines
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -53,6 +89,22 @@ const mutations = {
|
|
|
[SET_LOADING_PAYMENT_TERMS] (state, payload) {
|
|
|
state.loadingPaymentTerms = !!payload
|
|
|
},
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [AUTOSELECT_PAYMENT_TERM] (state) {
|
|
|
+ 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)
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [SET_SELECTED_PAYMENT_TERM] (state, payload) {
|
|
|
+ state.selectedPaymentTerm = payload
|
|
|
+ },
|
|
|
/**
|
|
|
*
|
|
|
* @param {*} state
|
|
@@ -60,6 +112,64 @@ const mutations = {
|
|
|
*/
|
|
|
[SET_PAYMENT_TYPE] (state, payload) {
|
|
|
state.paymentType = payload
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [SET_INITIAL_PAYMENT] (state, payload) {
|
|
|
+ state.initialPayment = payload
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} state
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [SET_PAYMENT_LINES] (state, payload) {
|
|
|
+ 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 = []
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -71,8 +181,17 @@ const actions = {
|
|
|
*/
|
|
|
[INIT_PAYMENT_TERMS] ({ commit }, payload) {
|
|
|
commit(SET_PAYMENT_TERMS, payload)
|
|
|
+ commit(AUTOSELECT_PAYMENT_TERM)
|
|
|
commit(SET_LOADING_PAYMENT_TERMS)
|
|
|
},
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} param0
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [SELECT_PAYMENT_TERM] ({ commit }, payload) {
|
|
|
+ commit(SET_SELECTED_PAYMENT_TERM, payload)
|
|
|
+ },
|
|
|
/**
|
|
|
*
|
|
|
* @param {*} param0
|
|
@@ -80,6 +199,25 @@ const actions = {
|
|
|
*/
|
|
|
[CHANGE_PAYMENT_TYPE] ({ commit }, payload) {
|
|
|
commit(SET_PAYMENT_TYPE, payload)
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} param0
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [CHANGE_INITIAL_PAYMENT] ({ commit }, payload) {
|
|
|
+ commit(SET_INITIAL_PAYMENT, payload)
|
|
|
+ },
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * @param {*} param0
|
|
|
+ * @param {*} payload
|
|
|
+ */
|
|
|
+ [COMPUTE_PAYMENT_LINES] ({ commit, getters }) {
|
|
|
+ commit(SET_PAYMENT_LINES, {
|
|
|
+ date: getters.date,
|
|
|
+ total: getters.cartTotal
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
|