import axios from 'axios' import { INIT_SALE_URL, CREATE_PRODUCT_URL, CREATE_CUSTOMER_URL, PROCESS_SALE_URL } from '@/constants/resourcePaths' import { SET_PROCESSING, SET_COMPLETED } from '@/constants/mutationTypes' import { INIT_SALE, NOTIFY, EXPLODE_DATA, CREATE_PRODUCT, CREATE_CUSTOMER, RECEIVE_PRODUCT, RECEIVE_CUSTOMER, CHECK_CART, CHECK_CUSTOMER, CHECK_PAYMENT_METHOD, CHECK_AMOUNT_RECEIVED, CREATE_SALE, COMPLETE_SALE, RESET_SALE } from '@/constants/actionTypes' const actions = { /** * * @param {*} param0 * @param {*} payload */ [NOTIFY] ({ commit }, payload) { openerp.web.notification.do_warn('Atención', payload) return false }, /** * * @param {*} param0 */ [INIT_SALE] ({ commit, dispatch }) { return axios.get(INIT_SALE_URL).then(response => { dispatch(COMPLETE_SALE, false) dispatch(EXPLODE_DATA, response.data) }).catch(error => { console.log(error) }) }, /** * * @param {*} param0 * @param {*} payload */ [EXPLODE_DATA] ({ dispatch }, payload) { for (let value in payload) { dispatch(`init${value[0].toUpperCase()}${value.slice(1)}`, payload[value]) } }, /** * * @param {*} param0 * @param {*} payload */ [CREATE_PRODUCT] ({ dispatch }, payload) { const data = { jsonrpc: '2.0', method: 'call', params: { ...payload } } return axios.post(CREATE_PRODUCT_URL, data).then(response => { dispatch(RECEIVE_PRODUCT, response.data.result) }).catch(error => { console.log(error) }) }, /** * * @param {*} param0 * @param {*} payload */ [CREATE_CUSTOMER] ({ dispatch }, payload) { const data = { jsonrpc: '2.0', method: 'call', params: { ...payload } } return axios.post(CREATE_CUSTOMER_URL, data).then(response => { dispatch(RECEIVE_CUSTOMER, response.data.result) }).catch(error => { console.log(error) }) }, /** * * @param {*} param0 */ [CHECK_CART] ({ getters, dispatch }) { return !!getters.cartItems.length || dispatch(NOTIFY, 'Necesitas agregar productos al carrito para continuar') }, /** * * @param {*} param0 */ [CHECK_CUSTOMER] ({ getters, dispatch }) { if (getters.processing) { return dispatch(NOTIFY, 'Espere mientras se está procesando') } return !!getters.selectedCustomer || dispatch(NOTIFY, 'Necesitas seleccionar un cliente para continuar') }, /** * * @param {*} param0 */ [CHECK_PAYMENT_METHOD] ({ getters }) { if (getters.processing) { return dispatch(NOTIFY, 'Espere mientras se está procesando') } return true }, /** * * @param {*} param0 */ [CHECK_AMOUNT_RECEIVED] ({ 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 */ [CREATE_SALE] ({ getters, commit, dispatch }, payload) { commit(SET_PROCESSING, true) const data = { jsonrpc: '2.0', method: 'call', params: { items: getters.cartItems.map(item => { return { id: item.id, quantity: item.quantity, price: item.price } }), total: getters.cartTotal, customerId: getters.selectedCustomer.id, paymentTermId: getters.selectedPaymentTerm.id, journalId: getters.selectedJournal.id, payment: getters.initialPayment > getters.cartTotal ? getters.cartTotal : getters.initialPayment } } return axios.post(PROCESS_SALE_URL, data).then(response => { commit(SET_PROCESSING, !response.data.result) dispatch(COMPLETE_SALE, response.data.result) }).catch(error => { console.log(error) commit(SET_PROCESSING, false) }) }, /** * * @param {*} param0 * @param {*} payload */ [COMPLETE_SALE] ({ commit }, payload) { commit(SET_COMPLETED, !!payload) }, /** * * @param {*} param0 */ [RESET_SALE] ({ rootState, commit, dispatch }) { for (let key in rootState) { if (!(rootState[key] instanceof Object)) { continue } dispatch(`reset${key[0].toUpperCase()}${key.slice(1)}`) } dispatch(INIT_SALE) } } export default actions