Browse Source

[ADD] ticket layout

Gogs 7 years ago
parent
commit
98608e1cf2

+ 16 - 5
controllers/main.py

@@ -16,6 +16,7 @@ import logging
 
 LOGGER = logging.getLogger(__name__)
 DATE_FORMAT = '%Y-%m-%d'
+DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S'
 GZIP_COMPRESSION_LEVEL = 9
 
 '''
@@ -41,8 +42,8 @@ class PosSales(http.Controller):
     '''
         Get server date
     '''
-    def get_server_date(self):
-        return datetime.now(self.get_timezone()).strftime(DATE_FORMAT)
+    def get_server_datetime(self):
+        return datetime.now(self.get_timezone()).strftime(DATETIME_FORMAT)
 
     '''
         Get current user information
@@ -63,7 +64,15 @@ class PosSales(http.Controller):
             'company': {
                 'id': user.company_id.id,
                 'name': user.company_id.name,
-                'displayName': user.company_id.display_name
+                'displayName': user.company_id.display_name,
+                'phone': user.company_id.phone or None,
+                'city': user.company_id.city or None,
+                'website': user.company_id.website,
+                'state': {
+                    'id': user.company_id.state_id.id,
+                    'name': user.company_id.state_id.name,
+                    'displayName': user.company_id.state_id.display_name
+                }
             }
         }
 
@@ -229,7 +238,7 @@ class PosSales(http.Controller):
         self.make_info_log('Sending JSON response')
     
         return self.make_gzip_response({
-            'date': self.get_server_date(),
+            'date': self.get_server_datetime(),
             'user': self.get_user(),
             'currencies': self.get_currencies(),
             'journals': self.get_journals(),
@@ -649,5 +658,7 @@ class PosSales(http.Controller):
         self.make_info_log('[OK] Creating account bank statement')
 
         return {
-            'process': True
+            'process': True,
+            'name': sale_order.display_name,
+            'date': self.get_server_datetime()
         }

+ 87 - 0
src/components/modals/DocumentSelector.vue

@@ -0,0 +1,87 @@
+<template lang="pug">
+    modal(name='document-modal' transition='nice-modal-fade' @before-close='beforeClose' :classes="['v--modal', 'document-modal']")
+        h2.document-title Seleccione el tipo de impresión
+        ul.document-types
+            li.document-choice(@click="onClick('ticket')")
+                .document-item
+                    h3 Ticket
+                    i.fa.fa-print
+        .button-actions
+            button.button-action(@click='onCancel') Cancelar
+</template>
+
+<script>
+    export default {
+        props: {
+            show: {
+                type: Boolean,
+                default: false
+            }
+        },
+        watch: {
+            show(value) {
+                if (!value) {
+                    this.$modal.hide('document-modal')
+                    return
+                }
+
+                this.$modal.show('document-modal')
+            }
+        },
+        methods: {
+            beforeClose(e) {
+                if (this.show) {
+                    e.stop()
+                }
+            },
+            onClick(documentType) {
+                this.$emit('onPrint', documentType)
+            },
+            onCancel() {
+                this.$emit('onCancel')
+            }
+        }
+    }
+</script>
+
+<style lang="sass">
+    @import '../../assets/variables' 
+    .document-modal
+        padding: 15px !important
+        .document-title
+            font-size: 8pt
+            color: $app-dark-color
+        .document-types
+            width: 100%
+            height: 170px
+            padding-right: 10px
+            .document-choice
+                width: 100%
+                height: 35px
+                margin-top: 15px
+                border-bottom: 1px solid $app-title-color
+                position: relative
+                list-style-type: none
+                cursor: pointer
+                &:hover 
+                    border-bottom: 2px solid $app-main-color
+                .document-item
+                    h3
+                        font-size: 14pt
+                    i
+                        position: absolute
+                        right: 15px
+                        bottom: 15px
+                        font-size: 14pt
+        .button-actions
+            float: right
+            .button-action
+                width: 150px
+                height: 40px
+                border: none
+                box-shadow: none
+                border-radius: 0
+                margin-right: 5px
+                background: $app-main-color
+                color: $app-bg-color
+</style>

+ 9 - 4
src/components/steps/PaymentAmount.vue

@@ -29,6 +29,7 @@
                         tr(v-for='line in paymentLines')
                             td {{ line.total | currency(...selectedCurrency) }}
                             td {{ line.date }}
+        document-selector(:show='askForPrint' @onPrint='processPrint' @onCancel='processPrint')
 </template>
 
 <script>
@@ -36,13 +37,15 @@
 
     import Ticket from '@@/common/Ticket'
     import Spinner from '@/components/common/Spinner'
+    import DocumentSelector from '@/components/modals/DocumentSelector'
 
-    import { CHANGE_INITIAL_PAYMENT, COMPUTE_PAYMENT_LINES } from '@/constants/actionTypes'
+    import { CHANGE_INITIAL_PAYMENT, COMPUTE_PAYMENT_LINES, PROCESS_PRINT } from '@/constants/actionTypes'
 
     export default {
         components: {
             Ticket,
-            Spinner
+            Spinner,
+            DocumentSelector
         },
         computed: {
             amountReceived: {
@@ -75,7 +78,8 @@
                 'initialPayment',
                 'paymentResidual',
                 'selectedCurrency',
-                'processing'
+                'processing',
+                'askForPrint'
             ])
         },
         methods: {
@@ -84,7 +88,8 @@
             },
             ...mapActions([
                 CHANGE_INITIAL_PAYMENT,
-                COMPUTE_PAYMENT_LINES
+                COMPUTE_PAYMENT_LINES,
+                PROCESS_PRINT
             ])
         },
         data() {

+ 7 - 1
src/constants/actionTypes.js

@@ -4,6 +4,12 @@ const ERROR_SALE = 'errorSale'
 
 const NOTIFY = 'notify'
 
+const ASK_FOR_PRINT = 'askForPrint'
+
+const PROCESS_PRINT = 'processPrint'
+
+const PRINT_TICKET = 'printTicket'
+
 const INIT_SALE = 'initSale'
 
 const EXPLODE_DATA = 'explodeData'
@@ -103,7 +109,7 @@ const RESET_USER = 'resetUser'
 const RESET_SALE = 'resetSale'
 
 export {
-    COMPLETE_SALE, ERROR_SALE, // App
+    COMPLETE_SALE, ERROR_SALE, ASK_FOR_PRINT, PROCESS_PRINT, PRINT_TICKET, // App
     NOTIFY, INIT_SALE, EXPLODE_DATA, CHECK_CART, CHECK_CUSTOMER, CHECK_PAYMENT_METHOD, CHECK_AMOUNT_RECEIVED, CREATE_SALE, RESET_SALE, // Sale
     INIT_USER, RESET_USER, // Users
     INIT_PRODUCTS, FILTER_PRODUCTS, SHOW_PRODUCT_FORM, HIDE_PRODUCT_FORM, SUBMIT_PRODUCT, CREATE_PRODUCT, RECEIVE_PRODUCT, SELECT_PRODUCT, RESET_PRODUCT, // Product

+ 5 - 1
src/constants/mutationTypes.js

@@ -2,6 +2,8 @@ const SET_MODE = 'setMode'
 
 const SET_PROCESSING = 'setProcessing'
 
+const SET_ASK_FOR_PRINT = 'setAskForPrint'
+
 const SET_COMPLETED = 'setCompleted'
 
 const SET_ERROR = 'setError'
@@ -82,8 +84,10 @@ const SET_ITEM_PRICE = 'setItemPrice'
 
 const RESET_PRICE = 'resetPrice'
 
+const SET_RESULT = 'setResult'
+
 export {
-    SET_MODE, SET_PROCESSING, SET_COMPLETED, SET_ERROR, // App
+    SET_MODE, SET_PROCESSING, SET_ASK_FOR_PRINT,  SET_COMPLETED, SET_RESULT, SET_ERROR, // App
     SET_USER, SET_LOADING_USER, // User
     SET_PRODUCTS, SET_FILTERED_PRODUCTS, SET_LOADING_PRODUCTS, ADD_PRODUCT, SET_SHOW_PRODUCT_FORM, SELECT_PRODUCT, SET_PRODUCT_WITH_VARIANT, // Product
     SET_PAYMENT_TERMS, SET_LOADING_PAYMENT_TERMS, AUTOSELECT_PAYMENT_TERM, SET_SELECTED_PAYMENT_TERM, SET_PAYMENT_TYPE, SET_INITIAL_PAYMENT, SET_PAYMENT_LINES, // Payment

+ 50 - 5
src/store/actions.js

@@ -10,7 +10,10 @@ import {
 import {
     SET_MODE,
     SET_PROCESSING,
-    SET_COMPLETED 
+    SET_DATE,
+    SET_ASK_FOR_PRINT,
+    SET_COMPLETED,
+    SET_RESULT
 } from '@/constants/mutationTypes'
 
 import { 
@@ -25,7 +28,9 @@ import {
     CHECK_CUSTOMER, 
     CHECK_PAYMENT_METHOD,
     CHECK_AMOUNT_RECEIVED, 
-    CREATE_SALE, 
+    CREATE_SALE,
+    PROCESS_PRINT,
+    PRINT_TICKET,
     COMPLETE_SALE,
     RESET_SALE
 } from '@/constants/actionTypes'
@@ -46,6 +51,7 @@ const actions = {
      */
     [INIT_SALE] ({ getters, commit, dispatch }, payload) {
         commit(SET_MODE, payload || getters.mode)
+        commit(SET_RESULT, '')
         
         return axios.get(INIT_SALE_URL).then(response => {
             dispatch(COMPLETE_SALE, false)
@@ -173,8 +179,11 @@ const actions = {
         }
 
         return axios.post(PROCESS_SALE_URL, data).then(response => {
-            commit(SET_PROCESSING, !response.data.result)
-            dispatch(COMPLETE_SALE, response.data.result)
+            commit(SET_DATE, response.data.result.date)
+            commit(SET_PROCESSING, !response.data.result.process)
+            commit(SET_RESULT, response.data.result.name)
+
+            dispatch(COMPLETE_SALE, response.data.result.process)
         }).catch(error => {
             console.log(error)
 
@@ -187,7 +196,43 @@ const actions = {
      * @param {*} payload 
      */
     [COMPLETE_SALE] ({ commit }, payload) {
-        commit(SET_COMPLETED, !!payload)
+        commit(SET_ASK_FOR_PRINT, !!payload)
+    },
+    [PROCESS_PRINT] ({ commit, dispatch }, payload) {
+        if (payload) {
+            if (payload === 'ticket') {
+                dispatch(PRINT_TICKET)
+            }
+        } 
+        
+        commit(SET_ASK_FOR_PRINT, false)
+        commit(SET_COMPLETED, true)
+    },
+    /**
+     * 
+     */
+    [PRINT_TICKET] ({ getters }) {
+        let data = {
+            company: getters.user.company.name.toUpperCase(),
+            city:  getters.user.company.city,
+            street: getters.user.company.street,
+            state: getters.user.company.state.displayName.toUpperCase(),
+            phone:  getters.user.company.phone,
+            website: getters.user.company.website,
+            customer: getters.selectedCustomer.name.toUpperCase(),
+            ruc: getters.selectedCustomer.ruc,
+            date: getters.date,
+            symbol: getters.selectedCurrency ? getters.selectedCurrency.symbol : '$',
+            items: getters.cartItems.map(item => {
+                return [item.name.toUpperCase(), item.price, item.quantity, item.price * item.quantity]
+            }),
+            total: getters.cartTotal,
+            payment: getters.initialPayment,
+            cashier: getters.user.name.toUpperCase(),
+            result: getters.result
+        }
+
+        openerp.print_engine.socket_manager.printTicket(data.company, data.city, data.street, data.state, data.phone, data.website, data.date, data.symbol, data.items, data.total, data.payment, data.customer, data.ruc, data.cashier, data.result)
     },
     /**
      * 

+ 18 - 0
src/store/getters.js

@@ -6,6 +6,10 @@ const getters = {
     mode(state) {
         return state.mode
     },
+    /**
+     * 
+     * @param {*} state 
+     */
     isSale(state) {
         return state.mode === 'sale'
     },
@@ -16,6 +20,13 @@ const getters = {
     processing(state) {
         return state.processing
     },
+    /**
+     * 
+     * @param {*} state 
+     */
+    result(state) {
+        return state.result
+    },
     /**
      * 
      * @param {*} state 
@@ -23,6 +34,13 @@ const getters = {
     completed(state) {
         return state.completed
     },
+    /**
+     * 
+     * @param {*} state 
+     */
+    askForPrint(state) {
+        return state.askForPrint
+    },
     /**
      * 
      * @param {*} state 

+ 2 - 1
src/store/modules/cart.js

@@ -1,7 +1,8 @@
 import { 
     SET_CART, 
     PUSH_TO_CART, 
-    PULL_FROM_CART, 
+    PULL_FROM_CART,
+    SET_DATE,
     SET_CART_TOTAL,
     SET_ITEM_TO_DISCOUNT,
     SET_ITEM_PRICE,

+ 16 - 1
src/store/mutations.js

@@ -1,7 +1,9 @@
 import { 
     SET_MODE,
     SET_PROCESSING,
-    SET_COMPLETED
+    SET_ASK_FOR_PRINT,
+    SET_COMPLETED,
+    SET_RESULT
  } from '@/constants/mutationTypes'
 
 const mutations = {
@@ -14,12 +16,25 @@ const mutations = {
     [SET_PROCESSING] (state, payload) {
         state.processing = payload
     },
+    /**
+     * 
+     */
+    [SET_ASK_FOR_PRINT] (state, payload) {
+        state.askForPrint = payload
+    },
     /**
      * 
      */
     [SET_COMPLETED] (state, payload) {
         state.completed = payload
+    },
+    /**
+     * 
+     */
+    [SET_RESULT] (state, payload) {
+        state.result = payload
     }
+
 }
 
 export default mutations

+ 2 - 0
src/store/state.js

@@ -2,6 +2,8 @@ const state = {
     mode: 'sale',
     processing: false,
     completed: false,
+    result: '',
+    askForPrint: false,
     error: false
 }