Browse Source

[FIX] multiple request on load

robert 6 years ago
parent
commit
3c55747300

+ 14 - 3
controllers/main.py

@@ -40,6 +40,7 @@ class PosSales(http.Controller):
         from res_bank_payment_type import get_bank_payment_types
         from res_bank_payment_type import get_bank_payment_types
         from res_bank_cheque_type import get_cheque_types
         from res_bank_cheque_type import get_cheque_types
         from res_store import get_stores
         from res_store import get_stores
+        from sale_order import get_sale_orders
 
 
         # Logic 
         # Logic 
         check_base_currency()
         check_base_currency()
@@ -70,13 +71,23 @@ class PosSales(http.Controller):
                 'settings': config,
                 'settings': config,
                 'date': get_datetime(),
                 'date': get_datetime(),
                 'user': get_current_user(),
                 'user': get_current_user(),
+                'currencies': get_currencies_from_journals(),
                 'customers': get_customers(image_type=config.get('imageType')),
                 'customers': get_customers(image_type=config.get('imageType')),
-                'products': get_products(image_type=config.get('imageType')),
+                'products': get_products(image_type=config.get('imageType'))
             }
             }
 
 
         # Take data for payment
         # Take data for payment
         if mode == 'payment':
         if mode == 'payment':
-            data = {}
+            data = {
+                'saleOrders': get_sale_orders(),
+                'currencies': get_currencies_from_journals(),
+                'journals': get_journals(),
+                'paymentTerms': get_payment_terms(),
+                'banks': get_banks(),
+                'bankPaymentTypes': get_bank_payment_types(),
+                'chequeTypes': get_cheque_types(),
+                'stores': get_stores() 
+            }
 
 
         # Take data for delivery
         # Take data for delivery
         if mode == 'product_delivery':
         if mode == 'product_delivery':
@@ -282,7 +293,7 @@ class PosSales(http.Controller):
             customer_id = row.get('customerId', None)
             customer_id = row.get('customerId', None)
             cart_items = row.get('items', [])
             cart_items = row.get('items', [])
             payment_term_id = row.get('paymentTermId', None)
             payment_term_id = row.get('paymentTermId', None)
-            payment = float(row.get('payment'))
+            payment = float(row.get('payment', 0.0))
             payment_method = row.get('paymentMethod', 'Efectivo')
             payment_method = row.get('paymentMethod', 'Efectivo')
             bank_payment_data = row.get('bankPaymentData', {})
             bank_payment_data = row.get('bankPaymentData', {})
 
 

+ 41 - 4
src/App.vue

@@ -7,20 +7,37 @@
             ref='wizard'
             ref='wizard'
         )
         )
             tab-content(
             tab-content(
+                v-if='isSale || isSaleProductPicking'
                 title='Qué productos necesita?'
                 title='Qué productos necesita?'
                 :beforeChange='checkCart'
                 :beforeChange='checkCart'
             )
             )
                 product-step
                 product-step
             tab-content(
             tab-content(
+                v-if='isSale || isSaleProductPicking'
                 title='Quién es el cliente?'
                 title='Quién es el cliente?'
                 :beforeChange='checkCustomer'
                 :beforeChange='checkCustomer'
             )
             )
                 customer-step
                 customer-step
             tab-content(
             tab-content(
-                v-if='isSale'
+                v-if='isSalePayment'
+                title='Qué presupuesto es?'
+            )
+                budget-step             
+            tab-content(
+                v-if='isSale || isSalePayment'
                 title='Cómo quieres pagar?'
                 title='Cómo quieres pagar?'
             )
             )
                 payment-step
                 payment-step
+            tab-content(
+                v-if='isSaleDelivery',
+                title='Cuál es la venta?'
+            )
+                delivery-step
+            tab-content(
+                v-if='isSaleDelivery'
+                title='Entrega de productos'
+            )
+                delivery-step
             template(
             template(
                 slot='footer'
                 slot='footer'
                 slot-scope='props'
                 slot-scope='props'
@@ -40,7 +57,10 @@
                             :selected='selectedStore'
                             :selected='selectedStore'
                             @onSelect='selectStore'
                             @onSelect='selectStore'
                         )
                         )
-                connection-status(@onChangeNet='changeNetStatus')
+                connection-status(
+                    v-if='isSynchronizable'
+                    @onChangeNet='changeNetStatus'
+                )
                 .wizard-footer-right
                 .wizard-footer-right
                     wizard-button(
                     wizard-button(
                         v-if='!props.isLastStep'
                         v-if='!props.isLastStep'
@@ -74,8 +94,19 @@
     import 'vue-form-wizard/dist/vue-form-wizard.min.css'
     import 'vue-form-wizard/dist/vue-form-wizard.min.css'
 
 
     import SettingsModal from './components/modals/SettingsModal'
     import SettingsModal from './components/modals/SettingsModal'
-    import {Product as ProductStep, Customer as CustomerStep, Payment as PaymentStep} from './components/steps'
-    import { LoadingOverlay, SettingsButton, InputSelect, ConnectionStatus } from './components/common'
+    import {
+        Product as ProductStep, 
+        Customer as CustomerStep, 
+        Budget as BudgetStep, 
+        Payment as PaymentStep,
+        Delivery as DeliveryStep
+    } from './components/steps'
+    import { 
+        LoadingOverlay, 
+        SettingsButton, 
+        InputSelect, 
+        ConnectionStatus 
+    } from './components/common'
 
 
     export default {
     export default {
         components: {
         components: {
@@ -84,7 +115,9 @@
             WizardButton,
             WizardButton,
             ProductStep,
             ProductStep,
             CustomerStep,
             CustomerStep,
+            BudgetStep,
             PaymentStep,
             PaymentStep,
+            DeliveryStep,
             LoadingOverlay,
             LoadingOverlay,
             SettingsButton,
             SettingsButton,
             SettingsModal,
             SettingsModal,
@@ -93,6 +126,10 @@
         },
         },
         computed: mapGetters([
         computed: mapGetters([
             'isSale',
             'isSale',
+            'isSaleProductPicking',
+            'isSalePayment',
+            'isSaleDelivery',
+            'isSynchronizable',
             'footerButtonsVisibility',
             'footerButtonsVisibility',
             'settingsVisibility',
             'settingsVisibility',
             'settings',
             'settings',

+ 11 - 0
src/components/common/CardGrid.vue

@@ -15,6 +15,8 @@
                 :currencyOptions='currencyOptions'
                 :currencyOptions='currencyOptions'
                 @onClick='onClickCard(item)'
                 @onClick='onClickCard(item)'
             )
             )
+        .no-items
+            p No hay items
 </template>
 </template>
 
 
 <script>
 <script>
@@ -159,4 +161,13 @@
             justify-content: center
             justify-content: center
         .card-grid
         .card-grid
             width: 100%
             width: 100%
+        .no-items
+            width: 100%
+            height: 100%
+            display: flex
+            align-items: center
+            justify-content: center
+            p
+                color: #9e9e9e
+                font-size: 11pt
 </style>
 </style>

+ 29 - 0
src/components/steps/Budget.vue

@@ -0,0 +1,29 @@
+<template lang="pug">
+    .pos-step
+        .budget-selector-step
+            .budget-selector
+                searcher
+                card-grid
+</template>
+
+<script>
+    import { Searcher, CardGrid } from '../common'
+
+    export default {
+        components: {
+            Searcher,
+            CardGrid
+        }
+    }
+</script>
+
+<style lang="sass">
+    .pos-step
+        .budget-selector-step
+            width: 100%
+            height: 100%
+            display: flex
+            .budget-selector
+                width: 100%
+                height: 100%
+</style>

+ 29 - 0
src/components/steps/Delivery.vue

@@ -0,0 +1,29 @@
+<template lang="pug">
+    .pos-step
+        .sale-selector-step
+            .sale-selector
+                searcher
+                card-grid
+</template>
+
+<script>
+    import { Searcher, CardGrid } from '../common'
+
+    export default {
+        components: {
+            Searcher,
+            CardGrid
+        }
+    }
+</script>
+
+<style lang="sass">
+    .pos-step
+        .sale-selector-step
+            width: 100%
+            height: 100%
+            display: flex
+            .sale-selector
+                width: 100%
+                height: 100%
+</style>

+ 5 - 1
src/components/steps/index.js

@@ -1,9 +1,13 @@
 import Product from './Product'
 import Product from './Product'
 import Customer from './Customer'
 import Customer from './Customer'
+import Budget from './Budget'
 import Payment from './Payment'
 import Payment from './Payment'
+import Delivery from './Delivery'
 
 
 export {
 export {
     Product,
     Product,
     Customer,
     Customer,
-    Payment
+    Budget,
+    Payment,
+    Delivery
 }
 }

+ 1 - 10
src/index.js

@@ -6,9 +6,6 @@ import store from '@/store'
 import currency from '@@/filters/currency'
 import currency from '@@/filters/currency'
 import absolute from '@@/filters/absolute'
 import absolute from '@@/filters/absolute'
 
 
-import * as OfflinePluginRuntime from 'offline-plugin/runtime'
-OfflinePluginRuntime.install()
-
 Vue.filter('currency', currency)
 Vue.filter('currency', currency)
 Vue.filter('absolute', absolute)
 Vue.filter('absolute', absolute)
 
 
@@ -39,13 +36,7 @@ openerp.eiru_pos = (instance, local) => {
                     mode: this.mode
                     mode: this.mode
                 },
                 },
                 created() {
                 created() {
-                    // if ('serviceWorker' in navigator) {
-                    //     navigator.serviceWorker.register('./sw.js').then(ok => {
-                    //         console.log(ok)
-                    //     }).then(e => {
-                    //         console.log(e)
-                    //     })
-                    // }
+                    this.$store.dispatch('resetProcess')
                 },
                 },
                 destroyed() {
                 destroyed() {
                     this.$store.dispatch('resetProcess')
                     this.$store.dispatch('resetProcess')

+ 74 - 26
src/store/actions.js

@@ -6,6 +6,10 @@ const actions = {
         return false
         return false
     },
     },
     initProcess({ getters, commit, dispatch }, payload) {
     initProcess({ getters, commit, dispatch }, payload) {
+        if (!payload) {
+            return
+        }
+
         commit('setMode', payload || getters.mode)
         commit('setMode', payload || getters.mode)
         commit('setResult', '')
         commit('setResult', '')
         
         
@@ -21,7 +25,7 @@ const actions = {
             params: {
             params: {
                 mode: getters.mode
                 mode: getters.mode
             }
             }
-        }).then(({data}) => {
+        }).then(({ data }) => {
             commit('setLoading', false)
             commit('setLoading', false)
             commit('toggleFooterButtonsVisibility')
             commit('toggleFooterButtonsVisibility')
 
 
@@ -60,7 +64,7 @@ const actions = {
             params: {
             params: {
                 ...payload
                 ...payload
             }
             }
-        }).then(({data}) => {
+        }).then(({ data }) => {
             dispatch('receiveCustomer', data.result)
             dispatch('receiveCustomer', data.result)
         }).catch(error => {
         }).catch(error => {
             console.error(error)
             console.error(error)
@@ -93,7 +97,7 @@ const actions = {
     toggleSettingsVisibility({ commit }) {
     toggleSettingsVisibility({ commit }) {
         commit('setSettingsVisibility')
         commit('setSettingsVisibility')
     },
     },
-    changeSetting({dispatch, commit, getters}, setting) {
+    changeSetting({dispatch, commit}, setting) {
         commit('setLoading', true)
         commit('setLoading', true)
 
 
         return axios.post('/eiru_sales/save_settings', {
         return axios.post('/eiru_sales/save_settings', {
@@ -102,7 +106,7 @@ const actions = {
             params: {
             params: {
                 ...setting
                 ...setting
             }
             }
-        }).then(({data}) => {
+        }).then(({ data }) => {
             dispatch('updateImages', data.result)
             dispatch('updateImages', data.result)
 
 
             commit('updateSettings', data.result)
             commit('updateSettings', data.result)
@@ -118,7 +122,7 @@ const actions = {
             return
             return
         }
         }
 
 
-        return axios.get('/eiru_sales/get_images').then(({data}) => {
+        return axios.get('/eiru_sales/get_images').then(({ data }) => {
             commit('setProducts', data.products)
             commit('setProducts', data.products)
             commit('setCustomers', data.customers)
             commit('setCustomers', data.customers)
         }).catch(error =>  {
         }).catch(error =>  {
@@ -140,27 +144,60 @@ const actions = {
 
 
         commit('setLoading', true)
         commit('setLoading', true)
 
 
-        const data = {
-            mode,
-            items: getters.cartItems.map(item => {
-                return {
-                    id: item.id,
-                    quantity: item.quantity,
-                    price: item.price
+        let data = {
+            mode
+        }
+
+        if (['sale', 'budget', 'product_picking'].includes(mode)) {
+            data = {
+                ...data,
+                items: getters.cartItems.map(item => {
+                    return {
+                        id: item.id,
+                        quantity: item.quantity,
+                        price: item.price
+                    }
+                }),
+                customerId: getters.selectedCustomer.id,
+                currencyId: getters.selectedCurrency.id
+            }
+        }
+
+        if (['sale', 'budget', 'payment'].includes(mode)) {
+            data = {
+                ...data,
+                total: getters.cartTotal,
+                paymentTermId: getters.paymentTerm.id,
+                journalId: getters.selectedJournal.id,
+                payment: getters.initialPayment > getters.amountToPay ? getters.amountToPay : getters.initialPayment,
+                paymentMethod: getters.paymentMethod,
+                bankPaymentData: {
+                    ...getters.bankPaymentData
                 }
                 }
-            }),
-            total: getters.cartTotal,
-            customerId: getters.selectedCustomer.id,
-            paymentTermId: getters.paymentTerm.id,
-            journalId: getters.selectedJournal.id,
-            payment: getters.initialPayment > getters.amountToPay ? getters.amountToPay : getters.initialPayment,
-            currencyId: getters.selectedCurrency.id,
-            paymentMethod: getters.paymentMethod,
-            bankPaymentData: {
-                ...getters.bankPaymentData
             }
             }
         }
         }
 
 
+        // const data = {
+        //     mode,
+        //     items: getters.cartItems.map(item => {
+        //         return {
+        //             id: item.id,
+        //             quantity: item.quantity,
+        //             price: item.price
+        //         }
+        //     }),
+        //     customerId: getters.selectedCustomer.id,
+        //     total: getters.cartTotal,
+        //     paymentTermId: getters.paymentTerm.id,
+        //     journalId: getters.selectedJournal.id,
+        //     payment: getters.initialPayment > getters.amountToPay ? getters.amountToPay : getters.initialPayment,
+        //     currencyId: getters.selectedCurrency.id,
+        //     paymentMethod: getters.paymentMethod,
+        //     bankPaymentData: {
+        //         ...getters.bankPaymentData
+        //     }
+        // }
+
         dispatch('storeData', data)
         dispatch('storeData', data)
 
 
         if (getters.isWired) {
         if (getters.isWired) {
@@ -180,7 +217,9 @@ const actions = {
             return
             return
         }
         }
 
 
-        dispatch('notify', 'Estás conectado nuevamente. Sincronizaremos sus datos en segundo plano')
+        if (getters.isSynchronizable) {
+            dispatch('notify', 'Estás conectado nuevamente. Sincronizaremos sus datos en segundo plano')
+        }
 
 
         axios.post('/eiru_sales/finish', {
         axios.post('/eiru_sales/finish', {
             jsonrpc: '2.0',
             jsonrpc: '2.0',
@@ -189,9 +228,13 @@ const actions = {
                 data: getters.data
                 data: getters.data
             }
             }
         }).then(() => {
         }).then(() => {
-            dispatch('notify', 'Los datos fueron sincronizados con éxito')
+            if (getters.isSynchronizable) {
+                dispatch('notify', 'Los datos fueron sincronizados con éxito')
+            }
         }).catch(() => {
         }).catch(() => {
-            dispatch('notify', 'Los datos no fueron sincronizados correctamente')
+            if (getters.isSynchronizable) {
+                dispatch('notify', 'Los datos no fueron sincronizados correctamente')
+            }
         })
         })
 
 
         commit('resetData')
         commit('resetData')
@@ -201,7 +244,12 @@ const actions = {
             return dispatch('printTicket')
             return dispatch('printTicket')
         }
         }
     },
     },
-    printTicket({ getters }) {
+    printTicket({ getters, dispatch }) {
+        if (!openerp.printer_bridge) {
+            dispatch('notify', 'Impresión no disponible')
+            return
+        }
+
         const data = {
         const data = {
             company: getters.companyName,
             company: getters.companyName,
             street: getters.user.company.street,
             street: getters.user.company.street,

+ 9 - 6
src/store/getters.js

@@ -11,14 +11,17 @@ const getters = {
     isBudget(state) {
     isBudget(state) {
         return state.mode === 'budget'
         return state.mode === 'budget'
     },
     },
-    isSaleStep1(state) {
-        return state.mode === 'rel_1'
+    isSaleProductPicking(state) {
+        return state.mode === 'product_picking'
     },
     },
-    isSaleStep2(state) {
-        return state.mode === 'rel_2'
+    isSalePayment(state) {
+        return state.mode === 'payment'
     },
     },
-    isSaleStep3(state) {
-        return state.mode === 'rel_3'
+    isSaleDelivery(state) {
+        return state.mode === 'product_delivery'
+    },
+    isSynchronizable(state) {
+        return ['sale', 'budget'].includes(state.mode)
     },
     },
     isWired(state) {
     isWired(state) {
         return state.isWired
         return state.isWired

+ 3 - 1
src/store/index.js

@@ -19,6 +19,7 @@ import bankModule from '@/store/modules/bank'
 import bankPaymentTypeModule from '@/store/modules/bankPaymentType'
 import bankPaymentTypeModule from '@/store/modules/bankPaymentType'
 import chequeTypeModule from './modules/chequeType'
 import chequeTypeModule from './modules/chequeType'
 import storeModule from './modules/store'
 import storeModule from './modules/store'
+import saleOrderModule from './modules/saleOrder'
 
 
 Vue.use(Vuex)
 Vue.use(Vuex)
 
 
@@ -39,7 +40,8 @@ const store = new Vuex.Store({
         bankModule,
         bankModule,
         bankPaymentTypeModule,
         bankPaymentTypeModule,
         chequeTypeModule,
         chequeTypeModule,
-        storeModule
+        storeModule,
+        saleOrderModule
     },
     },
     plugins: [
     plugins: [
         createPersistedState({
         createPersistedState({

+ 51 - 0
src/store/modules/saleOrder.js

@@ -0,0 +1,51 @@
+const state = {
+    loadingSaleOrders: false,
+    saleOrders: [],
+    selectedSaleOrder: null
+}
+
+const getters = {
+    loadingSaleOrders(state) {
+        return state.loadingSaleOrders
+    },
+    saleOrders(state) {
+        return state.saleOrders
+    },
+    selectedSaleOrder(state) {
+        return state.selectedSaleOrder
+    }
+}
+
+const mutations = {
+    setLoadingSaleOrders(state, loading) {
+        state.loadingSaleOrders = !!loading
+    },
+    setSaleOrders(state, saleOrders) {
+        state.saleOrders = saleOrders
+    },
+    setSelectedSaleOrder(state, saleOrdeId) {
+        if (!saleOrdeId) {
+            return
+        }
+
+        state.selectedSaleOrder = state.saleOrders.find(s => s.id === saleOrdeId)
+    }
+}
+
+const actions = {
+    initSaleOrders({ commit }, saleOrders) {
+        commit('setSaleOrders', saleOrders)
+        commit('setLoadingSaleOrders')
+    },
+    resetSaleOrder({ commit }) {
+        commit('setSaleOrders', [])
+        commit('setSelectedSaleOrder', null)
+    }
+}
+
+export default {
+    state,
+    getters,
+    actions,
+    mutations
+}

+ 0 - 0
src/sw.js


+ 1 - 9
webpack.config.js

@@ -3,7 +3,6 @@ var LiveReloadPlugin = require('webpack-livereload-plugin')
 var HardSourcePlugin = require('hard-source-webpack-plugin')
 var HardSourcePlugin = require('hard-source-webpack-plugin')
 var ExtractTextPlugin = require('extract-text-webpack-plugin')
 var ExtractTextPlugin = require('extract-text-webpack-plugin')
 var CopyPlugin = require('copy-webpack-plugin')
 var CopyPlugin = require('copy-webpack-plugin')
-var OfflinePlugin = require('offline-plugin')
 
 
 var prod = process.env.NODE_ENV === 'production'
 var prod = process.env.NODE_ENV === 'production'
 
 
@@ -37,14 +36,7 @@ module.exports = {
                 files: ['package-lock.json', 'yarn.lock'],
                 files: ['package-lock.json', 'yarn.lock'],
             }
             }
         }),
         }),
-        new ExtractTextPlugin('main.css'),
-        new CopyPlugin([
-            {
-                from: 'src/sw.js',
-                to: '.'
-            }
-        ]),
-        new OfflinePlugin()
+        new ExtractTextPlugin('main.css')
     ],
     ],
     module: {
     module: {
         rules: [
         rules: [