Browse Source

[ADD] picking step

robert 6 years ago
parent
commit
45156235b0

+ 6 - 3
controllers/main.py

@@ -334,8 +334,10 @@ class PosSales(http.Controller):
         ╠╣ ║║║║║╚═╗╠═╣  ╠═╝╠╦╝║ ║ ║║║ ║║   ║    ║║║╣ ║  ║╚╗╔╝║╣ ╠╦╝╚╦╝
         ╚  ╩╝╚╝╩╚═╝╩ ╩  ╩  ╩╚═╚═╝═╩╝╚═╝╚═╝ ╩   ═╩╝╚═╝╩═╝╩ ╚╝ ╚═╝╩╚═ ╩ 
         '''
-        def finish_product_delivery():
-            pass
+        def finish_product_delivery(stock_picking_id):
+            from stock_picking import confirm_picking
+
+            confirm_picking(stock_picking_id)
 
         '''
         ╔═╗╦═╗╔═╗╔═╗╔═╗╔═╗╔═╗  ╔═╗╦╔╗╔╦╔═╗╦ ╦  ╔╦╗╔═╗╔═╗╦╔═╗╦╔═╗╔╗╔
@@ -372,7 +374,8 @@ class PosSales(http.Controller):
                 finish_payment(sale_order_id, currency_id, date_now, payment_term_id, payment, payment_method, bank_payment_data)
             
             if mode == 'product_delivery':
-                finish_product_delivery()
+                stock_picking_id = row.get('stockPickingId', None)
+                finish_product_delivery(stock_picking_id)
 
         return {
             'process': True,

+ 36 - 5
controllers/stock_picking.py

@@ -15,13 +15,44 @@ def get_pickings():
     sale_orders = request.env['sale.order'].search([('from_pos', '=', True)])
     sale_orders = sale_orders.mapped(lambda x: x.name)
 
+    domain = [
+        ('origin', 'in', sale_orders),
+        ('state', '=', 'assigned')
+    ]
+
     return [
         {
             'id': sp.id,
             'name': sp.display_name,
-            'origin': sp.origin
-        } for sp in request.env[_MODEL].search([
-            ('origin', 'in', sale_orders),
-            ('state', '=', 'assigned')
-        ])
+            'origin': sp.origin,
+            'packOperationExist': sp.pack_operation_exist,
+            'moveLines': [
+                {
+                    'id': move.id,
+                    'name': move.display_name,
+                    'availability': move.availability,
+                    'origin': move.origin,
+                    'quantity': move.product_qty,
+                    'product': {
+                        'id': move.product_id.id,
+                        'name': move.product_id.display_name,
+                        'image': move.product_id.image_medium
+                    }
+                }
+                for move in sp.move_lines
+            ],
+            'partner': {
+                'id': sp.partner_id.id,
+                'name': sp.partner_id.display_name,
+                'image': sp.partner_id.image_medium or None,
+                'ruc': sp.partner_id.ruc or None,
+                'phone': sp.partner_id.phone or None,
+                'mobile': sp.partner_id.mobile or None,
+                'email': sp.partner_id.email or None
+            }
+        } for sp in request.env[_MODEL].search(domain)
     ]
+
+def confirm_picking(stock_picking_id):
+    stock_picking = request.env[_MODEL].browse(stock_picking_id)
+    stock_picking.do_transfer()

+ 8 - 4
src/App.vue

@@ -48,13 +48,14 @@
             // Step 3
             template(v-else='isSaleDelivery')
                 tab-content(
-                    title='Cuál es la venta?'
+                    title='Cuál es la entrega?'
+                    :beforeChange='checkStockPicking'
                 )
                     delivery-step
                 tab-content(
-                    title='Entrega de productos'
+                    title='Confirmar entrega?'
                 )
-                    delivery-step
+                    delivery-confirm-step
             // Footer
             template(
                 slot='footer'
@@ -117,7 +118,8 @@
         Customer as CustomerStep,
         Budget as BudgetStep,
         Payment as PaymentStep,
-        Delivery as DeliveryStep
+        Delivery as DeliveryStep,
+        DeliveryConfirm as DeliveryConfirmStep
     } from './components/steps'
     import {
         LoadingOverlay,
@@ -136,6 +138,7 @@
             BudgetStep,
             PaymentStep,
             DeliveryStep,
+            DeliveryConfirmStep,
             LoadingOverlay,
             SettingsButton,
             SettingsModal,
@@ -194,6 +197,7 @@
                 'checkCart',
                 'checkCustomer',
                 'checkSaleOrder',
+                'checkStockPicking',
                 'toggleSettingsVisibility',
                 'changeSetting',
                 'changeInitialPayment',

+ 4 - 2
src/components/common/Card.vue

@@ -74,7 +74,8 @@
         position: relative
         &.selected-card
             transition-duration: 300ms
-            border-bottom: 3px solid $app-main-color
+            // border-bottom: 3px solid $app-main-color
+            border: 2px solid $app-main-color
         &:hover
             cursor: pointer
         .card-title
@@ -94,7 +95,8 @@
             width: 75px
             height: 75px
             margin: 0
-            border: none
+            // border: none
+            border-radius: 50%
             position: absolute
             top: 50%
             left: 50%

+ 33 - 5
src/components/steps/Delivery.vue

@@ -1,19 +1,47 @@
 <template lang="pug">
     .pos-step
-        .sale-selector-step
-            .sale-selector
+        .delivery-selector-step
+            .delivery-selector
                 searcher(
                     mode='normal'
                     :items='stockPickings'
-                    :keys="['name', 'origin']"
+                    :keys="['name', 'origin', 'partner.name']"
                     @onSearch='filterStockPickings'
                 )
                 card-grid(
+                    imageKey='partner.image'
                     :items='visibleStockPickings'
+                    :headerKeys="['name', 'partner.name']"
                     :footerKeys="['origin']"
                     :loading='loadingStockPickings'
                     @onSelect='selectStockPicking'
                 )
+            transition(name='slide-fade')
+                form.sale-order-form(v-if='!!selectedSaleOrder')
+                    .form-separator
+                        h3 Detalles Generales
+                        hr
+                    .form-item
+                        label.form-label Descripción
+                        input.form-input(v-model='selectedSaleOrder.name' readonly)
+                    .form-item
+                        label.form-label Monto
+                        input.form-input(v-model='selectedSaleOrder.amountTotal' readonly)
+                    .form-separator
+                        h3 Items
+                        hr
+                    .form-item
+                        table
+                            thead
+                                tr
+                                    th Descripción
+                                    th Precio
+                                    th Cantidad
+                            tbody
+                                tr(v-for='item in cartItems')
+                                    td {{ item.name }}
+                                    td {{ item.price }}
+                                    td {{ item.quantity }}
 </template>
 
 <script>
@@ -39,11 +67,11 @@
 
 <style lang="sass">
     .pos-step
-        .sale-selector-step
+        .delivery-selector-step
             width: 100%
             height: 100%
             display: flex
-            .sale-selector
+            .delivery-selector
                 width: 100%
                 height: 100%
 </style>

+ 32 - 0
src/components/steps/DeliveryConfirm.vue

@@ -0,0 +1,32 @@
+<template lang="pug">
+    .pos-step
+        .delivery-confirm-step
+            card-grid(
+                imageKey='product.image'
+                :items='selectedMoveLines'
+                :headerKeys="['product.name']"
+                :footerKeys="['quantity']"
+            )
+</template>
+
+<script>
+    import { mapGetters, mapActions } from 'vuex'
+    import { CardGrid } from '../common'
+
+    export default {
+        components: {
+            CardGrid
+        },
+        computed: mapGetters([
+            'selectedMoveLines'
+        ])
+    }
+</script>
+
+<style lang="sass">
+    .pos-step
+        .delivery-confirm-step
+            width: 100%
+            height: 100%
+            display: flex
+</style>

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

@@ -3,11 +3,13 @@ import Customer from './Customer'
 import Budget from './Budget'
 import Payment from './Payment'
 import Delivery from './Delivery'
+import DeliveryConfirm from './DeliveryConfirm'
 
 export {
     Product,
     Customer,
     Budget,
     Payment,
-    Delivery
+    Delivery,
+    DeliveryConfirm
 }

+ 10 - 0
src/store/actions.js

@@ -79,6 +79,9 @@ const actions = {
     checkSaleOrder({ getters, dispatch }) {
         return !!getters.selectedSaleOrder || dispatch('notify', 'Necesitas seleccionar un presupuesto para continuar')
     },
+    checkStockPicking({ getters, dispatch }) {
+        return !!getters.selectedStockPicking || dispatch('notify', 'Necesitas seleccionar una entrega para confirmar')
+    },
     checkPaymentMethod({ getters }) {
         if (getters.processing) {
             return dispatch('notify', 'Espere mientras se está procesando')
@@ -179,6 +182,13 @@ const actions = {
             }
         }
 
+        if (mode === 'product_delivery') {
+            data = {
+                ...data,
+                stockPickingId: getters.selectedStockPicking.id
+            }
+        }
+
         dispatch('storeData', data)
 
         if (getters.isWired) {

+ 3 - 0
src/store/modules/stockPicking.js

@@ -17,6 +17,9 @@ const getters = {
     },
     selectedStockPicking(state) {
         return state.selectedStockPicking
+    },
+    selectedMoveLines(state) {
+        return (state.selectedStockPicking && state.selectedStockPicking.moveLines) || []
     }
 }