Browse Source

[FIX] create invoice

Gogs 7 years ago
parent
commit
2a572963cc
7 changed files with 109 additions and 25 deletions
  1. 2 1
      __init__.py
  2. 1 1
      __openerp__.py
  3. 73 22
      controllers/main.py
  4. 2 0
      models/__init__.py
  5. 28 0
      models/purchase_order.py
  6. 1 0
      src/index.js
  7. 2 1
      src/store/app.js

+ 2 - 1
__init__.py

@@ -1,2 +1,3 @@
 # -*- coding: utf-8 -*-
-import controllers
+import controllers
+import models

+ 1 - 1
__openerp__.py

@@ -5,7 +5,7 @@
     'website': "http://www.yourcompany.com",
     'category': 'Uncategorized',
     'version': '0.1',
-    'depends': ['base'],
+    'depends': ['base', 'purchase'],
     'data': [
         'templates.xml'
     ]

+ 73 - 22
controllers/main.py

@@ -201,7 +201,7 @@ class Purchases(http.Controller):
     '''
     '''
     def make_info_log(self, log):
-        LOGGER.info('[INFO]' + log)
+        LOGGER.info('\033[1;34m[INFO] --> \033[m{}'.format(log))
 
     '''
         New purchase resource route
@@ -301,21 +301,34 @@ class Purchases(http.Controller):
         
         return pricelist.id
 
+    '''
+        Get default location
+    '''
+    def get_stock_location_id(self):
+        stock_location = request.env['stock.location'].search([('usage', '=', 'internal')])
+
+        return stock_location.id
+
     '''
         Create purchase order from cart and return id
     '''
-    def create_purchase_order(self, supplier_id, cart_items, date_aprove, currency_id, pricelist_id, payment_term_id=None):
+    def create_purchase_order(self, supplier_id, cart_items, date_order, currency_id, pricelist_id, payment_term_id=None):
         return request.env['purchase.order'].create({
+            'name': '/',
             'partner_id': supplier_id,
             'order_line': [[0, False, {
+                'name': line.get('name'),
+                'date_planned': date_order,
                 'product_id': int(line.get('id')),
-                'product_uom_qty': float(line.get('quantity')),
+                'product_qty': float(line.get('quantity')),
                 'price_unit': float(line.get('price'))
             }] for line in cart_items],
-            'date_aprove': date_aprove,
+            'date_order': date_order,
             'currency_id': currency_id,
             'pricelist_id': pricelist_id,
             'payment_term_id': payment_term_id,
+            'location_id': self.get_stock_location_id(),
+            'invoice_method': 'manual',
             'state': 'draft'
         })
 
@@ -325,29 +338,56 @@ class Purchases(http.Controller):
     def confirm_purchase_order(self, purchase_order_id):
         purchase_order = request.env['purchase.order'].browse(purchase_order_id)
         purchase_order.write({
-            'state': 'manual'
+            'state': 'confirmed'
         })
 
-        return purchase_order.action_confirm()
+        purchase_order.action_purchase_confirm()
 
+        for picking in purchase_order.picking_ids:
+                picking.force_assign()
+                picking.action_done()
+    
     '''
-        Create invoice from purchase order
+        Purchase order
     '''
-    def create_invoice(self, purchase_order_id, currency_id, date_now):
-        purchase_order = request.env['purchase.order'].browse(purchase_order_id)
-        invoice_id = purchase_order.action_invoice_create()
-        invoice = request.env['account.invoice'].browse(invoice_id)
+    def create_invoice(self, purchase_order_id):
+        purchase_order_obj = request.env['purchase.order']
+        purchase_order_line_obj = request.env['purchase.order.line']
+        purchase_order_line_invoice_obj = request.env['purchase.order.line_invoice']
+        account_invoice_line_obj = request.env['account.invoice.line']
 
-        date_due = parse(date_now) + rd(days=max(invoice.payment_term.line_ids.mapped(lambda x: x.days + x.days2)))
+        purchase_order = purchase_order_obj.browse(purchase_order_id)
+        invoice_lines = {}
 
-        invoice.write({
-            'currency_id': currency_id,
-            'date_invoice': date_now,
-            'date_due': date_due.strftime(DATE_FORMAT),
-            'state': 'open'
-        })
+        for line in purchase_order.order_line:
+            if (not line.invoiced) and (line.state not in ('draft', 'cancel')):
+                if not line.partner_id.id in invoice_lines:
+                    invoice_lines[line.partner_id.id] = []
 
-        return invoice
+                account_id = purchase_order_obj._choose_account_from_po_line(line)
+                account_invoice_line_values = purchase_order_obj._prepare_inv_line(account_id, line)
+                account_invoice_line_values.update({
+                    'origin': line.order_id.name
+                })
+
+                account_invoice_line_id = account_invoice_line_obj.create(account_invoice_line_values)
+            
+                purchase_order_line_obj.with_context({
+                    'invoiced': True,
+                    'invoice_lines': [(4, account_invoice_line_id.id)]
+                }).write([line.id])
+
+                invoice_lines[line.partner_id.id].append((line, account_invoice_line_id.id))
+
+        invoice_ids = []
+        for value in invoice_lines.values():
+            invoice_line = map(lambda x : x[1], value)
+            orders = list(set(map(lambda x : x[0].order_id, value)))
+
+            new_id = purchase_order_line_invoice_obj._make_invoice_by_partner(orders[0].partner_id, orders, invoice_line)
+            invoice_ids.append(new_id)
+
+        return invoice_ids
 
     '''
         Purchase processing resource route
@@ -356,7 +396,7 @@ class Purchases(http.Controller):
     def process_purchase(self, **kw):
         self.make_info_log('Processing purchase...')
 
-        # Get date
+        # # Get date
         date_now = datetime.now().strftime(DATE_FORMAT)
         self.make_info_log('Getting date')
 
@@ -366,10 +406,21 @@ class Purchases(http.Controller):
 
         # Get pricelist
         pricelist_id = self.get_pricelist_id(currency_id)
-        self.make_info_log('Getting product pricelist')
+        self.make_info_log('Product pricelist checked')
 
+        # Create purchase order 
         purchase_order = self.create_purchase_order(kw.get('supplierId'), kw.get('items'), date_now, currency_id, pricelist_id, kw.get('paymentTermId'))
-        self.make_info_log('Created purchase order')
+        self.make_info_log('Purchase order created')
+
+        # Confirm purchase 
+        self.confirm_purchase_order(purchase_order.id)
+        self.make_info_log('Purchase order confirmed')
+
+        # Create invoice
+        invoice_ids = self.create_invoice(purchase_order.id)
+        self.make_info_log('Invoice created')
+
+        print(invoice_ids)
 
         return {
             'status': 'ok'

+ 2 - 0
models/__init__.py

@@ -0,0 +1,2 @@
+# -*- coding: utf-8 -*-
+import purchase_order

+ 28 - 0
models/purchase_order.py

@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+from openerp import api, models
+
+class PurchaseOrder(models.Model):
+    _inherit = 'purchase.order'
+
+    '''
+    '''
+    def action_purchase_confirm(self, cr, uid, ids, context=None):
+        if not context:
+            context = {}
+
+        assert len(ids) == 1, 'This option should only be used for a single id at a time'
+        
+        self.signal_workflow(cr, uid, ids, 'purchase_confirm')
+
+        return True
+
+    '''
+    '''
+    @api.multi
+    def purchase_process_now(self):
+        for purchase in self:
+            # Process order
+            purchase.action_purchase_confirm()
+            for picking in purchase.picking_ids:
+                picking.force_assign()
+                picking.action_done()

+ 1 - 0
src/index.js

@@ -49,6 +49,7 @@ openerp.eiru_purchases = (instance, local) => {
             instance.eiru_sidebar_toggler.sidebar_fold()
         },
         sidebarUnfold() {
+            if (!instance.eiru_sidebar_toggler) return
             instance.eiru_sidebar_toggler.sidebar_unfold()
         }
     })

+ 2 - 1
src/store/app.js

@@ -117,11 +117,12 @@ const actions = {
                 items: getters.cartItems.map(item => {
                     return {
                         id: item.id,
+                        name: item.name,
                         quantity: item.quantity,
                         price: item.price
                     }
                 }),
-                supplierId: getters.selectedSupplierid,
+                supplierId: getters.selectedSupplier.id,
                 paymentTermId: getters.selectedPaymentTerm.id,
                 journalId: getters.selectedJournal.id,
                 payment: getters.initialPayment > getters.cartTotal ? getters.cartTotal : getters.initialPayment