payment.js 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. const state = {
  2. loadingPaymentTerms: true,
  3. paymentTerms: [],
  4. paymentMethods: ['Efectivo', 'Banco'],
  5. selectedPaymentTerm: null,
  6. paymentType: 'cash',
  7. paymentMethod: 'Efectivo',
  8. amountToPay: 0,
  9. initialPayment: 0,
  10. amountResidual: 0,
  11. paymentLines: [],
  12. bankPaymentData: null,
  13. supplierInvoiceNumber: null
  14. }
  15. const getters = {
  16. paymentTerms(state) {
  17. return state.paymentTerms
  18. },
  19. paymentMethods(state) {
  20. return state.paymentMethods.filter(p => p !== state.paymentMethod)
  21. },
  22. selectedPaymentTerm(state) {
  23. return state.selectedPaymentTerm
  24. },
  25. paymentType(state) {
  26. return state.paymentType
  27. },
  28. paymentMethod(state) {
  29. return state.paymentMethod
  30. },
  31. amountToPay(state) {
  32. return state.amountToPay
  33. },
  34. // amountToPayInOtherCurrencies(state, { settings, currencies, user, selectedCurrency, cartTotal }) {
  35. // console.log(settings)
  36. // console.log(currencies)
  37. // console.log(user)
  38. // console.log(selectedCurrency)
  39. // console.log(cartTotal)
  40. // let values = []
  41. // if (!user || !selectedCurrency || cartTotal === 0) {
  42. // return values
  43. // }
  44. // const base = currencies.find(c => c.id === user.company.currencyId)
  45. // for (let currency of settings.currencies) {
  46. // if (currency.id === selectedCurrency.id) {
  47. // continue
  48. // }
  49. // const rate = base.rateSilent / currency.rateSilent
  50. // values.push({
  51. // currency,
  52. // amount: cartTotal / rate,
  53. // })
  54. // }
  55. // return values
  56. // },
  57. initialPayment(state) {
  58. return state.initialPayment
  59. },
  60. amountResidual(state) {
  61. return state.amountResidual
  62. },
  63. paymentLines(state) {
  64. return state.paymentLines
  65. },
  66. supplierInvoiceNumber(state) {
  67. return state.supplierInvoiceNumber
  68. },
  69. loadingPaymentTerms(state) {
  70. return state.loadingPaymentTerms
  71. }
  72. }
  73. const mutations = {
  74. setPaymentTerms(state, payload) {
  75. state.paymentTerms = [...payload]
  76. },
  77. setLoadingPaymentTerms(state, payload) {
  78. state.loadingPaymentTerms = !!payload
  79. },
  80. autoSelectPaymentTerm(state, payload) {
  81. if (!payload || payload === 'cash') {
  82. 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)
  83. } else {
  84. state.selectedPaymentTerm = state.paymentTerms.find(t => t.lines[0].days > 0)
  85. }
  86. },
  87. setSelectedPaymentTerm(state, termId) {
  88. if (!termId) {
  89. state.selectedPaymentTerm = null
  90. return
  91. }
  92. state.selectedPaymentTerm = state.paymentTerms.find(item => item.id === termId)
  93. },
  94. setPaymentType(state, payload) {
  95. state.paymentType = payload
  96. },
  97. setPaymentMethod(state, payload) {
  98. state.paymentMethod = payload
  99. },
  100. setAmountToPay(state, amount) {
  101. if (!this.getters.baseCurrency) {
  102. this.amountToPay = amount
  103. return
  104. }
  105. let rate = 1
  106. if (this.getters.baseCurrency.id !== this.getters.selectedCurrency.id) {
  107. rate = this.getters.baseCurrency.rateSilent / this.getters.selectedCurrency.rateSilent
  108. }
  109. state.amountToPay = amount / rate
  110. },
  111. setAmountResidual(state) {
  112. state.amountResidual = state.initialPayment < state.amountToPay ? 0 : state.initialPayment - state.amountToPay
  113. },
  114. computePaymentInCurrency(state, { fromSymbol, toSymbol }) {
  115. const fromCurrency = this.getters.currencies.find(c => c.symbol === fromSymbol)
  116. const toCurrency = this.getters.currencies.find(c => c.symbol === toSymbol)
  117. if (!fromCurrency || !toCurrency) {
  118. return
  119. }
  120. const rate = fromCurrency.rateSilent / toCurrency.rateSilent
  121. state.amountToPay = state.amountToPay / rate
  122. state.initialPayment = state.initialPayment / rate
  123. state.amountResidual = state.amountResidual / rate
  124. },
  125. setInitialPayment(state, payload) {
  126. state.initialPayment = payload
  127. },
  128. setPaymentLines(state, payload) {
  129. state.paymentLines = []
  130. if (!payload) {
  131. return
  132. }
  133. let percentPaid = state.initialPayment / payload.total
  134. let distributedPercentage = -(percentPaid / state.selectedPaymentTerm.lines.length)
  135. let totals = []
  136. let residual = payload.total
  137. let dueDate = null
  138. for (let line of state.selectedPaymentTerm.lines) {
  139. dueDate = moment(payload.date).add(line.days + line.days2, 'days').format('YYYY-MM-DD')
  140. if(percentPaid && percentPaid < 1) {
  141. totals.push([payload.date, percentPaid])
  142. percentPaid = 0
  143. if (dueDate === payload.date) {
  144. distributedPercentage = ((totals[0][1] - line.valueAmount) / (state.selectedPaymentTerm.lines.length - 1))
  145. continue
  146. }
  147. }
  148. if (line.value !== 'balance') {
  149. totals.push([dueDate, line.valueAmount + distributedPercentage])
  150. continue
  151. }
  152. totals.push([dueDate, line.valueAmount])
  153. for (let line of totals) {
  154. let currentPrice = (payload.total * line[1]).toFixed(2)
  155. if (currentPrice < 0) {
  156. continue
  157. }
  158. residual = residual - currentPrice
  159. state.paymentLines.push({
  160. date: line[0],
  161. total: currentPrice !== parseFloat(0).toFixed(2) ? currentPrice : residual.toFixed(2)
  162. })
  163. }
  164. totals = []
  165. }
  166. },
  167. setBankPaymentData(state, bankPaymentData) {
  168. state.bankPaymentData = bankPaymentData
  169. },
  170. setSupplierInvoiceNumber(state, invoiceNumber) {
  171. state.supplierInvoiceNumber = invoiceNumber
  172. }
  173. }
  174. const actions = {
  175. initPaymentTerms({ commit }, payload) {
  176. commit('setPaymentTerms', payload)
  177. commit('autoSelectPaymentTerm')
  178. commit('setLoadingPaymentTerms', false)
  179. },
  180. autoSelectPaymentTerm(state, payload) {
  181. if (!payload || payload === 'cash') {
  182. 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)
  183. } else {
  184. state.paymentTerm = state.paymentTerms.find(t => t.lines[0].days > 0)
  185. }
  186. },
  187. selectPaymentTerm({ commit }, payload) {
  188. if (!payload) {
  189. return
  190. }
  191. commit('setSelectedPaymentTerm', payload)
  192. },
  193. changePaymentType({ getters, commit, dispatch }, payload) {
  194. commit('setPaymentType', payload),
  195. commit('autoSelectPaymentTerm', payload)
  196. commit('setInitialPayment', 0)
  197. commit('setPaymentLines')
  198. if (getters.paymentType === 'credit') {
  199. dispatch('computePaymentLines')
  200. }
  201. },
  202. changePaymentMethod({ commit, dispatch }, methodName) {
  203. if (methodName === 'Banco') {
  204. dispatch('toggleBankPayment')
  205. }
  206. commit('setPaymentMethod', methodName)
  207. dispatch('changeInitialPayment', 0)
  208. },
  209. changeAmountToPay({ commit }, amount) {
  210. commit('setAmountToPay', amount)
  211. },
  212. changeInitialPayment({ commit, dispatch, getters }, initialPayment) {
  213. commit('setInitialPayment', initialPayment)
  214. commit('setAmountResidual')
  215. if (getters.paymentType === 'credit') {
  216. dispatch('computePaymentLines')
  217. }
  218. },
  219. computePaymentLines({ commit, getters }) {
  220. commit('setPaymentLines', {
  221. date: getters.date,
  222. total: getters.cartTotal
  223. })
  224. },
  225. changeSupplierInvoiceNumber({ commit }, invoiceNumber) {
  226. commit('setSupplierInvoiceNumber', invoiceNumber)
  227. },
  228. resetPayment({ commit }) {
  229. commit('setLoadingPaymentTerms', true)
  230. commit('setPaymentTerms', [])
  231. commit('setSelectedPaymentTerm', null)
  232. commit('setPaymentType', 'cash')
  233. commit('setPaymentMethod', 'Efectivo')
  234. commit('setAmountToPay', 0)
  235. commit('setInitialPayment', 0)
  236. commit('setAmountResidual')
  237. commit('setSupplierInvoiceNumber', null)
  238. commit('autoSelectPaymentTerm')
  239. }
  240. }
  241. export default {
  242. state,
  243. getters,
  244. mutations,
  245. actions
  246. }