Vijaykumar Baladaniya has proposed merging lp:~openerp-dev/openobject-addons/trunk-bug-1086051-vba into lp:openobject-addons.
Requested reviews: OpenERP Core Team (openerp) Related bugs: Bug #1086051 in OpenERP Addons: "Supplier invoice from packing missing service product" https://bugs.launchpad.net/openobject-addons/+bug/1086051 For more details, see: https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-1086051-vba/+merge/138718 Hello Sir, I have fix the problem when generate the invoice from receive delivery time, service attach to the purchase order invoice. Thanks, vba -- https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-bug-1086051-vba/+merge/138718 Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-addons/trunk-bug-1086051-vba.
=== modified file 'purchase/purchase.py' --- purchase/purchase.py 2012-12-06 09:24:12 +0000 +++ purchase/purchase.py 2012-12-07 13:07:12 +0000 @@ -1031,6 +1031,46 @@ self.write(cr, uid, ids, {'state': 'confirmed'}, context=context) return True + def _prepare_order_line_invoice_line(self, cr, uid, line, account_id=False, context=None): + res = {} + if not line.invoiced: + if not account_id: + if line.product_id: + account_id = line.product_id.product_tmpl_id.property_account_income.id + if not account_id: + account_id = line.product_id.categ_id.property_account_income_categ.id + if not account_id: + raise osv.except_osv(_('Error!'), + _('Please define income account for this product: "%s" (id:%d).') % \ + (line.product_id.name, line.product_id.id,)) + else: + prop = self.pool.get('ir.property').get(cr, uid, + 'property_account_income_categ', 'product.category', + context=context) + account_id = prop and prop.id or False + uosqty = line.product_qty or False + pu = 0.0 + if uosqty: + pu = round(line.price_unit * line.product_qty / uosqty, + self.pool.get('decimal.precision').precision_get(cr, uid, 'Product Price')) + fpos = line.order_id.fiscal_position or False + account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, account_id) + if not account_id: + raise osv.except_osv(_('Error!'), + _('There is no Fiscal Position defined or Income category account defined for default properties of Product categories.')) + res = { + 'name': line.name, + 'origin': line.order_id.name, + 'account_id': account_id, + 'price_unit': pu, + 'quantity': uosqty, + 'uos_id': line.product_uom.id or False, + 'product_id': line.product_id.id or False, + 'invoice_line_tax_id': [(6, 0, [x.id for x in line.taxes_id])], + 'account_analytic_id': line.account_analytic_id.id or False, + } + return res + purchase_order_line() class procurement_order(osv.osv): === modified file 'purchase/stock.py' --- purchase/stock.py 2012-11-30 17:11:30 +0000 +++ purchase/stock.py 2012-12-07 13:07:12 +0000 @@ -122,6 +122,67 @@ 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, cursor, user, ids, journal_id=False, + group=False, type='out_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(cursor, user, + 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(cursor, user, invoice_ids, + context=context): + invoices[invoice.id] = invoice + + for picking in picking_obj.browse(cursor, user, picking_ids, + context=context): + if not picking.purchase_id: + continue + purchase_lines = picking.purchase_id.order_line + invoice_created = invoices[result[picking.id]] + if picking.purchase_id.partner_id: + invoice_obj.write(cursor, user, [invoice_created.id], {'partner_id': picking.purchase_id.partner_id.id}, context=context) + + 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: + account_id = False + if not type: + type = context.get('inv_type', False) + if group: + name = picking.name + '-' + purchase_line.name + else: + name = purchase_line.name + if purchase_line.product_id.type == 'service' and purchase_line.invoiced == False: + if type in ('out_invoice', 'out_refund'): + 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 + else: + 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 + vals = order_line_obj._prepare_order_line_invoice_line(cursor, user, purchase_line, account_id, context) + if vals: #note: in some cases we may not want to include all service lines as invoice lines + vals['name'] = name + vals['invoice_id'] = invoices[result[picking.id]].id + invoice_line_id = invoice_line_obj.create(cursor, user, vals, context=context) + purchase_line.write({'invoice_lines': [(4, invoice_line_id)]}) + invoice_obj.button_compute(cursor, user, [invoice_created.id], context=context) + return result + class stock_partial_picking(osv.osv_memory): _inherit = 'stock.partial.picking'
_______________________________________________ Mailing list: https://launchpad.net/~openerp-dev-gtk Post to : openerp-dev-gtk@lists.launchpad.net Unsubscribe : https://launchpad.net/~openerp-dev-gtk More help : https://help.launchpad.net/ListHelp