import axios from 'axios' import { Modes, States } from '../constants/app' import * as Urls from '../constants/resourcePaths' const state = { currentMode: Modes.PURCHASE, currentState: States.NONE, } const getters = { /** * */ mode() { return state.currentMode }, /** * */ isProcessing() { return state.currentState === States.PROCESSING }, /** * */ isDone() { return state.currentState === States.DONE }, /** * */ hasError() { return state.currentState === States.ERROR }, /** * */ state() { return state.currentState } } const mutations = { /** * * @param {*} state * @param {*} payload */ setMode(state, payload) { state.currentMode = payload }, /** * * @param {*} state * @param {*} payload */ setState(state, payload) { state.currentState = payload } } const actions = { /** * * @param {*} param0 * @param {*} payload */ initPurchase({ getters, commit, dispatch }, payload) { commit('setMode', payload || getters.mode) const timeStarted = Date.now() return axios.get(Urls.INIT_PURCHASE_URL).then(response => { commit('setState', States.NONE) dispatch('explodeData', response.data) const timeElapsed = Date.now() - timeStarted dispatch('notify', 'Datos cargados en ' + (timeElapsed / 1000) + ' segundos') }).catch(error => console.log(error)) }, /** * * @param {*} param0 * @param {*} payload */ explodeData({ dispatch }, payload) { for (let key in payload) { dispatch(`init${key[0].toUpperCase()}${key.slice(1)}`, payload[key]) } }, /** * * @param {*} param0 * @param {*} payload */ createObject({ dispatch }, payload) { const data = { jsonrpc: '2.0', method: 'call', params: { type: payload.type, data: payload.data } } return axios.post(Urls.CREATE_OBJECT_URL, data).then(response => { console.log(response) }).catch(error => console.log(error)) }, /** * * @param {*} param0 */ checkSupplier({ getters, dispatch}) { return !!getters.selectedSupplier || dispatch('notify', 'Necesitas seleccionar un proveedor para continuar') }, /** * * @param {*} param0 */ checkCart({ getters, dispatch}) { return !!getters.cartItems.length || dispatch('notify', 'Necesitar agregar producto al carrito para continuar') }, /** * * @param {*} param0 */ checkAmountReceived({ getters, dispatch }) { if (getters.paymentType == 'cash') { return getters.initialPayment >= getters.cartTotal || dispatch('notify', 'El monto recibido no puede ser menor al monto a pagar') } else { return getters.initialPayment < getters.cartTotal || dispatch('notify', 'El monto recibido no puede ser igual o mayor al monto a pagar') } }, /** * * @param {*} param0 */ createPurchase({ getters, commit, dispatch }) { commit('setState', States.PROCESSING) const data = { jsonrpc: '2.0', method: 'call', params: { mode: getters.mode, items: getters.cartItems.map(item => { return { id: item.id, name: item.name, quantity: item.quantity, price: item.price } }), supplierId: getters.selectedSupplier.id, paymentTermId: getters.selectedPaymentTerm.id, journalId: getters.selectedJournal.id, payment: getters.initialPayment > getters.cartTotal ? getters.cartTotal : getters.initialPayment } } return axios.post(Urls.PROCESS_PURCHASE_URL, data).then(response => { commit('setState', States.DONE) dispatch('resetPurchase') }).catch(error => { commit('setState', States.ERROR) }) }, /** * * @param {*} param0 */ resetPurchase({ rootState, dispatch }) { for (let key in rootState) { if (!(rootState[key] instanceof Object)) { continue } dispatch(`reset${key[0].toUpperCase()}${key.slice(1)}`) } dispatch('initPurchase') }, /** * * @param {*} param0 * @param {*} payload */ notify({ commit }, payload) { openerp.web.notification.do_warn('Atención', payload) return false }, } export default { state, getters, mutations, actions }