Mayur Maheshwari(OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-bug-908063-mma into 
lp:openobject-addons.

Requested reviews:
  Rucha (Open ERP) (rpa-openerp)
Related bugs:
  Bug #908063 in OpenERP Addons: "purchase order containing service product not 
creating invoice of service product "
  https://bugs.launchpad.net/openobject-addons/+bug/908063

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-908063-mma/+merge/86902

Hello,

          purchase: I Have added action_invoice_create method in purchase stock 
file for create a invoice of service product when invoice control in Based on 
receptions.

Thanks.
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-908063-mma/+merge/86902
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-bug-908063-mma.
=== modified file 'purchase/stock.py'
--- purchase/stock.py	2011-12-19 16:54:40 +0000
+++ purchase/stock.py	2011-12-26 13:28:25 +0000
@@ -120,6 +120,79 @@
             purchase_obj.write(cursor, user, [picking.purchase_id.id], {'invoice_ids': [(4, invoice_id)]})
         return super(stock_picking, self)._invoice_hook(cursor, user, picking, invoice_id)
 
+    def action_invoice_create(self, cr, uid, ids, journal_id=False,
+            group=False, type='in_invoice', context=None):
+        if context is None:
+            context = {}
+        invoice_obj = self.pool.get('account.invoice')
+        picking_obj = self.pool.get('stock.picking')
+        invoice_line_obj = self.pool.get('account.invoice.line')
+        fiscal_position_obj = self.pool.get('account.fiscal.position')
+        order_line_obj = self.pool.get('purchase.order.line')
+
+        result = super(stock_picking, self).action_invoice_create(cr, uid,
+                ids, journal_id=journal_id, group=group, type=type,
+                context=context)
+        picking_ids = result.keys()
+        invoice_ids = result.values()
+        invoices = {}
+        for invoice in invoice_obj.browse(cr, uid, invoice_ids,
+                context=context):
+            invoices[invoice.id] = invoice
+
+        for picking in picking_obj.browse(cr, uid, picking_ids,
+                context=context):
+            if not picking.purchase_id or picking.backorder_id:
+                continue
+            purchase_lines = picking.purchase_id.order_line
+            invoice_created = invoices[result[picking.id]]
+
+            if picking.purchase_id.fiscal_position:
+                invoice_obj.write(cursor, user, [invoice_created.id], {'fiscal_position': picking.purchase_id.fiscal_position.id}, context=context)
+            
+            for purchase_line in purchase_lines:
+                if purchase_line.product_id.type == 'service' and purchase_line.invoiced == False:
+                    if not type:
+                        type = context.get('inv_type', False)
+                    if group:
+                        name = picking.name + '-' + purchase_line.name
+                    else:
+                        name = purchase_line.name
+                    if type in ('in_invoice', 'in_refund'):
+                        account_id = purchase_line.product_id.product_tmpl_id.\
+                                property_account_expense.id
+                        if not account_id:
+                            account_id = purchase_line.product_id.categ_id.\
+                                    property_account_expense_categ.id
+                    else:
+                        account_id = purchase_line.product_id.product_tmpl_id.\
+                                property_account_income.id
+                        if not account_id:
+                            account_id = purchase_line.product_id.categ_id.\
+                                    property_account_income_categ.id
+                    
+                    price_unit = purchase_line.price_unit
+                    tax_id = purchase_line.taxes_id
+                    tax_ids = map(lambda x: x.id, tax_id)
+
+                    account_id = fiscal_position_obj.map_account(cr, uid, picking.purchase_id.partner_id.property_account_position, account_id)
+                    invoice = invoices[result[picking.id]]
+                    invoice_line_id = invoice_line_obj.create(cr, uid, {
+                        'name': name,
+                        'invoice_id': invoice.id,
+                        'uos_id': purchase_line.product_uom.id,
+                        'product_id': purchase_line.product_id.id,
+                        'account_id': account_id,
+                        'price_unit': price_unit,
+                        'quantity': purchase_line.product_qty,
+                        'invoice_line_tax_id': [(6, 0, tax_ids)],
+                        'notes':purchase_line.notes
+                    }, context=context)
+                    order_line_obj.write(cr, uid, [purchase_line.id], {'invoiced': True,
+                        'invoice_lines': [(6, 0, [invoice_line_id])],
+                    })
+        return result
+    
 class stock_partial_picking(osv.osv_memory):
     _inherit = 'stock.partial.picking'
 

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to