瀏覽代碼

[ADD] process decision

robert 6 年之前
父節點
當前提交
62417a7af0

+ 126 - 42
controllers/helpers/__init__.py

@@ -8,7 +8,7 @@ from account_voucher import create_account_voucher
 from http_response import make_gzip_response
 from product_pricelist import get_pricelist_id
 from product_template import get_products
-from purchase_order import create_purchase_order, confirm_purchase_order
+from purchase_order import (get_purchase_orders, get_purchase_order, create_purchase_order, confirm_purchase_order, force_assign_picking, done_picking)
 from res_bank_cheque_type import get_cheque_types
 from res_bank_payments_type import get_bank_payment_types
 from res_bank import get_banks
@@ -19,11 +19,12 @@ from server_date import get_date
 from stock_picking_type import get_picking_types
 from stock_picking import get_pickings
 
-'''
-'''
+
 def get_data(mode=None):
     data = {}
 
+    check_base_currency()
+
     if mode == 'purchase' or mode == 'expense':
         data = {
             'date': get_date(),
@@ -31,7 +32,7 @@ def get_data(mode=None):
             'currencies': get_currencies_from_journal(),
             'journals': get_journals(),
             'suppliers': get_suppliers(),
-            'products': get_products(kw.get('mode')),
+            'products': get_products(mode),
             'pickingTypes': get_picking_types(),
             'paymentTerms': get_payment_terms(),
             'banks': get_banks(),
@@ -50,13 +51,14 @@ def get_data(mode=None):
 
     if mode == 'payment':
         data = {
+            'purchaseOrders': get_purchase_orders(),
             'currencies': get_currencies_from_journal(),
             'suppliers': get_suppliers(),
             'journals': get_journals(),
             'paymentTerms': get_payment_terms(),
             'banks': get_banks(),
             'bankPaymentTypes': get_bank_payment_types(),
-            'chequeTypes': get_cheque_types()
+            'chequeTypes': get_cheque_types(),
         }
     
     if mode == 'product_taking':
@@ -67,18 +69,68 @@ def get_data(mode=None):
     return make_gzip_response(data)
 
 
-'''
-'''
-def store_data(data=None):
+def process_data(data=None):
     if not data:
         return {}
 
-    def create_purchase():
-        pass
-    
-    def create_expense():
-        pass
-    
+    def drafting_order(journal_id, supplier_id, cart_items, date_now, payment_term_id, warehouse_id):
+        currency_id = get_currency_id(journal_id)
+        pricelist_id = get_pricelist_id(currency_id)
+
+        order = create_purchase_order(supplier_id, cart_items, date_now, currency_id, pricelist_id, payment_term_id, warehouse_id)
+
+        return order.id, currency_id
+
+    def making_order(order_id):
+        if not order_id:
+            return None
+
+        order = get_purchase_order(order_id)
+        confirm_purchase_order(order.id)
+
+        return order.id
+
+    def paying_order(
+            order_id,
+            supplier_invoice_number=None,
+            supplier_id=None,
+            cart_items=None,
+            date_now=None,
+            payment_term_id=None,
+            warehouse_id=None
+    ):
+        invoice = None
+
+        if order_id:
+            order = get_purchase_order(order_id)
+            invoice = order.invoice_ids
+
+        if not invoice:
+            invoice = create_invoice(supplier_id, cart_items, currency_id, payment_term_id, supplier_invoice_number)
+
+        invoice_ids = invoice.mapped(lambda x: x.id)
+
+        prepare_invoice(invoice_ids, currency_id, date_now)
+        move_lines = create_invoice_move_lines(invoice_ids, payment, date_now)
+        account_move = create_account_move(invoice_ids, move_lines)
+
+        validate_invoice(invoice_ids, mode)
+
+        account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
+        close_invoice(invoice_ids)
+
+        statement_lines = create_bank_statement_lines(account_voucher.id)
+        bank_statement = create_bank_statement(account_voucher.id, statement_lines, date_now)
+
+        return bank_statement.id
+
+    def complete_order(order_id):
+        if not order_id:
+            return None
+
+        force_assign_picking(order_id)
+        done_picking(order_id)
+
     date_now = get_date()
     mode = data.get('mode')
     journal_id = data.get('journalId')
@@ -86,38 +138,70 @@ def store_data(data=None):
     supplier_invoice_number = data.get('supplierInvoiceNumber', None)
     cart_items = data.get('items')
     payment_term_id = data.get('paymentTermId')
-    payment = float(kw.get('payment'))
-
-    currency_id = get_currency_id(journal_id)
+    warehouse_id = data.get('warehouseId', None)
+    payment = float(data.get('payment'))
 
-    pricelist_id = get_pricelist_id(currency_id)
+    if mode not in ('product_picking', 'payment', 'product_taking'):
+        order_id = None
 
-    invoice = None
+        if mode == 'purchase':
+            order_id, currency_id = drafting_order(journal_id, supplier_id, cart_items, date_now, payment_term_id)
+            making_order(order_id)
+            complete_order(order_id)
+        else:
+            paying_order(order_id)
 
-    if mode == 'purchase':
-        purchase_order = create_purchase_order(supplier_id, cart_items, date_now, currency_id, pricelist_id, payment_term_id)
-        confirm_purchase_order(purchase_order.id)
-
-        invoice = purchase_order.invoice_ids
-        invoice.write({
-            'supplier_invoice_number': supplier_invoice_number
-        })
-    else:
-        invoice = create_invoice(supplier_id, cart_items, currency_id, payment_term_id, supplier_invoice_number)
-    
-    invoice_ids = invoice.mapped(lambda x: x.id)
-
-    prepare_invoice(invoice_ids, currency_id, date_now)
-    move_lines = create_invoice_move_lines(invoice_ids, payment, date_now)
-    account_move = create_account_move(invoice_ids, move_lines)
-
-    validate_invoice(invoice_ids, mode)
-
-    account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
-    close_invoice(invoice_ids)
+    if mode == 'product_picking':
+        order_id, currency_id = drafting_order(journal_id, supplier_id, cart_items, date_now, payment_term_id, warehouse_id)
+        making_order(order_id)
 
-    statement_lines = create_bank_statement_lines(account_voucher.id)
-    create_bank_statement(account_voucher.id, statement_lines, date_now)
+    if mode == 'payment':
+        order_id = data.get('orderId')
+        paying_order(order_id, supplier_invoice_number)
+
+    if mode == 'picking':
+        order_id = data.get('orderId')
+        complete_order(order_id)
+
+
+    # prepare_invoice(invoice_ids, currency_id, date_now)
+    # move_lines = create_invoice_move_lines(invoice_ids, payment, date_now)
+    # account_move = create_account_move(invoice_ids, move_lines)
+    #
+    # validate_invoice(invoice_ids, mode)
+    #
+    # account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
+    # close_invoice(invoice_ids)
+    #
+    # statement_lines = create_bank_statement_lines(account_voucher.id)
+    # create_bank_statement(account_voucher.id, statement_lines, date_now)
+
+    # invoice = None
+    #
+    # if mode == 'purchase':
+    #     purchase_order = create_purchase_order(supplier_id, cart_items, date_now, currency_id, pricelist_id, payment_term_id)
+    #     confirm_purchase_order(purchase_order.id)
+    #
+    #     invoice = purchase_order.invoice_ids
+    #     invoice.write({
+    #         'supplier_invoice_number': supplier_invoice_number
+    #     })
+    # else:
+    #     invoice = create_invoice(supplier_id, cart_items, currency_id, payment_term_id, supplier_invoice_number)
+    #
+    # invoice_ids = invoice.mapped(lambda x: x.id)
+    #
+    # prepare_invoice(invoice_ids, currency_id, date_now)
+    # move_lines = create_invoice_move_lines(invoice_ids, payment, date_now)
+    # account_move = create_account_move(invoice_ids, move_lines)
+    #
+    # validate_invoice(invoice_ids, mode)
+    #
+    # account_voucher = create_account_voucher(account_move.id, journal_id, currency_id, payment)
+    # close_invoice(invoice_ids)
+    #
+    # statement_lines = create_bank_statement_lines(account_voucher.id)
+    # create_bank_statement(account_voucher.id, statement_lines, date_now)
 
     return {
         'status': 'ok'

+ 1 - 0
controllers/helpers/product_pricelist.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_pricelist_id(currency_id):
     domain = [
         ('active', '=', True),

+ 2 - 0
controllers/helpers/product_template.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_products(type=None):
     product_obj = r.env['product.template']
     domain = [('standard_price', '>=', 0), ('active', '=', True)]
@@ -41,6 +42,7 @@ def get_products(type=None):
         } for p in product_obj.search(domain)
     ]
 
+
 def create_product(self, values):
     p = r.env['product.template'].create({
         'name': values.get('name'),

+ 76 - 11
controllers/helpers/purchase_order.py

@@ -1,7 +1,52 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
+from datetime import datetime
+from stock_location import get_stock_location_id
 
-def create_purchase_order(supplier_id, cart_items, date_order, currency_id, pricelist_id, payment_term_id=None):
+
+def get_purchase_orders():
+    domain = [
+        ('state', '=', 'manual'),
+        ('from_pop', '=', True)
+    ]
+
+    return [
+        {
+            'id': po.id,
+            'name': po.display_name,
+            'createDate': po.create_date,
+            'partner': {
+                'id': po.partner_id.id,
+                'name': po.partner_id.display_name,
+                'image': po.partner_id.image_medium or None,
+                'ruc': po.partner_id.ruc or None,
+                'phone': po.partner_id.phone or None,
+                'mobile': po.partner_id.mobile or None,
+                'email': po.partner_id.email or None
+            },
+            'userId': po.user_id.id,
+            'warehouseId': po.warehouse_id.id,
+            'amountTotal': po.amount_total,
+            'lines': [
+                {
+                    'id': l.product_id.id,
+                    'name': l.product_id.display_name,
+                    'listPrice': l.product_id.list_price,
+                    'quantity': l.product_uom_qty,
+                    'price': l.product_id. list_price,
+                    'discount': 0
+                } for l in po.order_line
+            ]
+        } for po in r.env['purchase.order'].search(domain)
+    ]
+
+
+def get_purchase_order(order_id):
+    return r.env['purchase.order'].browse(order_id)
+
+
+def create_purchase_order(supplier_id, cart_items, date_order, currency_id, pricelist_id, payment_term_id=None, warehouse_id=None):
 
     def get_product_obj(product_id):
         return r.env['product.product'].browse(product_id)
@@ -24,25 +69,45 @@ def create_purchase_order(supplier_id, cart_items, date_order, currency_id, pric
         'name': '/',
         'partner_id': supplier_id,
         'order_line': lines,
-        'date_order': datetime.utcnow().strftime(DATETIME_FORMAT),
+        'date_order': datetime.utcnow().strftime(DEFAULT_SERVER_DATETIME_FORMAT),
         'currency_id': currency_id,
         'pricelist_id': pricelist_id,
         'payment_term_id': payment_term_id,
-        'location_id': self.get_stock_location_id(),
+        'location_id': get_stock_location_id(),
         'invoice_method': 'order'
     }
 
-    return request.env['purchase.order'].create(values)
+    return r.env['purchase.order'].create(values)
 
 
 def confirm_purchase_order(purchase_order_id):
     po = r.env['purchase.order'].browse(purchase_order_id)
-    po.action_purchase_confirm()
-
-    for picking in po.picking_ids:
-            picking.force_assign()
-            picking.action_done()
-
     po.write({
         'state': 'done'
-    })
+    })
+    
+    # po.action_purchase_confirm()
+
+    # for picking in po.picking_ids:
+    #         picking.force_assign()
+    #         picking.action_done()
+
+    # po.write({
+    #     'state': 'done'
+    # })
+    
+    return po.action_purchase_confirm()
+
+
+def force_assign_picking(purchase_order_id):
+    po = r.env['purchase.order'].browse(purchase_order_id)
+
+    for p in po.picking_ids:
+        p.force_assing()
+
+
+def done_picking(purchase_order_id):
+    po = r.env['purchase.order'].browse(purchase_order_id)
+
+    for p in po.picking_ids:
+        p.action_done()

+ 1 - 0
controllers/helpers/res_bank.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_banks():
     domain = [
         ('active', '=', True)

+ 1 - 0
controllers/helpers/res_bank_cheque_type.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_cheque_types():
     return [
         {

+ 1 - 0
controllers/helpers/res_bank_payments_type.py

@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_bank_payment_types(journal_id=None):
     return r.env['res.bank.payments.type'].get_bank_payments_type(journal_id)

+ 4 - 3
controllers/helpers/res_currency.py

@@ -1,15 +1,16 @@
 # -*- coding: utf-8-*-
 from openerp.http import request as r
 
+
 def check_base_currency():
-    base_currency = request.env['res.currency'].search([('base', '=', True)])
+    base_currency = r.env['res.currency'].search([('base', '=', True)])
 
     if not base_currency:
-        request.env.user.company_id.currency_id.write({
+        r.env.user.company_id.currency_id.write({
             'base': True
         })
 
+
 def get_currency_id(journal_id):
     j = r.env['account.journal'].browse(journal_id)
     return j.default_debit_account_id.currency_id.id or j.default_debit_account_id.company_currency_id.id
-    

+ 2 - 0
controllers/helpers/res_partner.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_suppliers():
     domain = [
         ('supplier', '=', True),
@@ -20,6 +21,7 @@ def get_suppliers():
         } for s in r.env['res.partner'].search(domain)
     ]
 
+
 def create_supplier(values):
     s = r.env['res.partner'].create({
         'name': values.get('name'),

+ 1 - 0
controllers/helpers/res_users.py

@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_current_user():
     user = r.env.user
 

+ 3 - 0
controllers/helpers/server_date.py

@@ -4,11 +4,14 @@ from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FO
 from pytz import timezone
 from datetime import datetime
 
+
 def get_timezone():
     return timezone(r.context['tz'])
 
+
 def get_datetime():
     return datetime.now(get_timezone()).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
 
+
 def get_date():
     return datetime.now(get_timezone()).strftime(DEFAULT_SERVER_DATE_FORMAT)

+ 2 - 1
controllers/helpers/stock_location.py

@@ -1,7 +1,8 @@
 # -*- coding: utf-8 -*-
 from openerp.http import request as r
 
+
 def get_stock_location_id():
-    stock_location = request.env['stock.location'].search([('usage', '=', 'internal')])
+    stock_location = r.env['stock.location'].search([('usage', '=', 'internal')])
     
     return stock_location.id

+ 1 - 1
controllers/helpers/stock_picking.py

@@ -2,7 +2,7 @@
 from openerp.http import request as r
 
 def get_pickings():
-    purchase_orders = r.env['purchase.order'].search([('from_pos', '=', True)])
+    purchase_orders = r.env['purchase.order'].search([('from_pop', '=', True)])
     purchase_orders = purchase_orders.mapped(lambda x: x.name)
 
     domain = [

+ 2 - 3
controllers/main.py

@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 from openerp import http
 from openerp.http import request as r
-from helpers import get_data, store_data
+from helpers import get_data, process_data
 import logging
 
 LOGGER = logging.getLogger(__name__)
@@ -13,7 +13,6 @@ def make_info_log(log):
 
 class Purchases(http.Controller):
 
-
     @http.route('/eiru_purchases/init', auth='user', methods=['GET'])
     def init_purchase(self, **kw):
         mode = kw.get('mode')
@@ -43,4 +42,4 @@ class Purchases(http.Controller):
     @http.route('/eiru_purchases/process', type='json', auth='user', methods=['POST'])
     def process_purchase(self, **kw):
         make_info_log('Processing {}'.format(kw.get('mode')))
-        return store_data(kw)
+        return process_data(kw)

+ 11 - 2
src/App.vue

@@ -23,11 +23,16 @@
                     supplier-step
                 tab-content(title='Qué productos comprarás?' :beforeChange='checkCart')
                     product-step
-            template(v-else='isPurchasePicking')
+            template(v-else-if='isPurchasePayment')
                 tab-content(title='Qué presupuesto es?')
                     budget-step
-                tab-content(title='Cómo quieres pagar?' :beforeChange='checkAmountReceived')
+                tab-content(title='Cómo quieres pagar?')
                     payment-step
+            template(v-else='isPurchaseTaking')
+                tab-content(title='Qué compra es?')
+                    delivery-step
+                tab-content(title='Confirmar entrega?')
+                    delivery-confirm-step
         loading-overlay(:show='isLoading')
 </template>
 
@@ -41,6 +46,8 @@
     import ProductStep from '@/components/steps/ProductStep'
     import PaymentStep from '@/components/steps/PaymentStep'
     import BudgetStep from '@/components/steps/BudgetStep'
+    import DeliveryStep from './components/steps/DeliveryStep'
+    import DeliveryConfirmStep from './components/steps/DeliveryConfirmStep'
 
     import { LoadingOverlay } from '@/components/common'
 
@@ -52,6 +59,8 @@
             ProductStep,
             PaymentStep,
             BudgetStep,
+            DeliveryStep,
+            DeliveryConfirmStep,
             LoadingOverlay
         },
         computed: mapGetters([

+ 20 - 0
src/components/steps/DeliveryConfirmStep.vue

@@ -0,0 +1,20 @@
+<template lang="pug">
+    .purchase-step
+        .delivery-confirm-step
+            card-grid
+</template>
+
+<script>
+    import { mapGetters } from 'vuex'
+    import { CardGrid } from '../common'
+
+    export default {
+        components: {
+            CardGrid
+        },
+        computed: mapGetters([])
+    }
+</script>
+
+<style lang="sass">
+</style>

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

@@ -0,0 +1,32 @@
+<template lang="pug">
+    .purchase-step
+        .delivery-selector-step
+            .delivery-selector
+                searcher(mode='normal')
+                card-grid
+</template>
+
+<script>
+    import { mapGetters, mapActions } from 'vuex'
+    import { Searcher, CardGrid } from '../common'
+
+    export default {
+        components: {
+            Searcher,
+            CardGrid
+        },
+        computed: mapGetters([]),
+        methods: mapActions([])
+    }
+</script>
+
+<style lang="sass">
+    .purchase-step
+        .delivery-selector-step
+            width: 100%
+            height: 100%
+            display: flex
+            .delivery-selector
+                width: 100%
+                height: 100%
+</style>