credativ team mailing list archive
-
credativ team
-
Mailing list archive
-
Message #02387
[Bug 909248] [NEW] Invoice account search in PO is not multi-company
Public bug reported:
When creating a PO in multi-company environment, accounts selected for the invoice are in the wrong company due to this piece of code:
if ol.product_id:
acc_id = ol.product_id.product_tmpl_id.property_account_expense.id
if not acc_id:
acc_id = ol.product_id.categ_id.property_account_expense_categ.id
If there are 2 companies, it selects the accounts for the first company, whatever the company of the PO.
I suggest the following code as a patch (inspired from invoice.py) to
search for the correct code.
def action_invoice_create(self, cr, uid, ids, *args):
res = False
journal_obj = self.pool.get('account.journal')
for o in self.browse(cr, uid, ids):
il = []
todo = []
for ol in o.order_line:
todo.append(ol.id)
if ol.product_id:
if o.company_id.id:
company_id=o.company_id.id
property_obj = self.pool.get('ir.property')
account_obj = self.pool.get('account.account')
exp_pro_id = property_obj.search(cr, uid, [('name','=','property_account_expense'),('res_id','=','product.template,'+str(ol.product_id.product_tmpl_id.id)+''),('company_id','=',company_id)])
if not exp_pro_id:
exp_pro_id = property_obj.search(cr, uid, [('name','=','property_account_expense_categ'),('res_id','=','product.category,'+str(ol.product_id.categ_id.id)+''),('company_id','=',company_id)])#EC
if not exp_pro_id:
ex_acc = ol.product_id.product_tmpl_id.property_account_expense
ex_acc_cate = ol.product_id.categ_id.property_account_expense_categ
if ex_acc:
app_acc_exp = ex_acc
else:
app_acc_exp = ex_acc_cate
else:
# Get the fields from the ir.property record
my_value = property_obj.read(cr,uid,exp_pro_id,['name','value_reference','res_id'])
# Parse the value_reference field to get the ID of the account.account record
account_id = int (my_value[0]["value_reference"].split(",")[1])
# Use the ID of the account.account record in the browse for the account.account record
app_acc_exp = account_obj.browse(cr, uid, account_id)
if not exp_pro_id:
ex_acc = ol.product_id.product_tmpl_id.property_account_expense
ex_acc_cate = ol.product_id.categ_id.property_account_expense_categ
if ex_acc:
app_acc_exp = ex_acc
else:
app_acc_exp = ex_acc_cate
if app_acc_exp and app_acc_exp.company_id.id != company_id:
exp_res_id = account_obj.search(cr, uid, [('name','=',app_acc_exp.name),('company_id','=',company_id)])
if not exp_res_id:
raise osv.except_osv(_('Configuration Error !'),
_('Can not find account chart for this company, Please Create account.'))
exp_obj_acc = account_obj.browse(cr, uid, exp_res_id)
if ex_acc:
ol.product_id.product_tmpl_id.property_account_expense = exp_obj_acc[0]
else:
ol.product_id.categ_id.property_account_expense_categ = exp_obj_acc[0]
a = app_acc_exp.id
else:
a = ol.product_tmpl_id.property_account_expense.id
if not a:
a = ol.categ_id.property_account_expense_categ.id
if not a:
raise osv.except_osv(_('Error !'), _('There is no expense account defined for this product: "%s" (id:%d)') % (ol.product_id.name, ol.product_id.id,))
else:
a = self.pool.get('ir.property').get(cr, uid, 'property_account_expense_categ', 'product.category').id
fpos = o.fiscal_position or False
a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a)
il.append(self.inv_line_create(cr, uid, a, ol))
a = o.partner_id.property_account_payable.id
journal_ids = journal_obj.search(cr, uid, [('type', '=','purchase'),('company_id', '=', o.company_id.id)], limit=1)
if not journal_ids:
raise osv.except_osv(_('Error !'),
_('There is no purchase journal defined for this company: "%s" (id:%d)') % (o.company_id.name, o.company_id.id))
inv = {
'name': o.partner_ref or o.name,
'reference': o.partner_ref or o.name,
'account_id': a,
'type': 'in_invoice',
'partner_id': o.partner_id.id,
'currency_id': o.pricelist_id.currency_id.id,
'address_invoice_id': o.partner_address_id.id,
'address_contact_id': o.partner_address_id.id,
'journal_id': len(journal_ids) and journal_ids[0] or False,
'origin': o.name,
'invoice_line': il,
'fiscal_position': o.fiscal_position.id or o.partner_id.property_account_position.id,
'payment_term': o.partner_id.property_payment_term and o.partner_id.property_payment_term.id or False,
'company_id': o.company_id.id,
}
inv_id = self.pool.get('account.invoice').create(cr, uid, inv, {'type':'in_invoice'})
self.pool.get('account.invoice').button_compute(cr, uid, [inv_id], {'type':'in_invoice'}, set_total=True)
self.pool.get('purchase.order.line').write(cr, uid, todo, {'invoiced':True})
self.write(cr, uid, [o.id], {'invoice_ids': [(4, inv_id)]})
res = inv_id
return res
** Affects: openobject-addons
Importance: Undecided
Status: New
--
You received this bug notification because you are a member of OpenERP
Framework Experts, which is subscribed to OpenERP Addons.
https://bugs.launchpad.net/bugs/909248
Title:
Invoice account search in PO is not multi-company
Status in OpenERP Addons (modules):
New
Bug description:
When creating a PO in multi-company environment, accounts selected for the invoice are in the wrong company due to this piece of code:
if ol.product_id:
acc_id = ol.product_id.product_tmpl_id.property_account_expense.id
if not acc_id:
acc_id = ol.product_id.categ_id.property_account_expense_categ.id
If there are 2 companies, it selects the accounts for the first company, whatever the company of the PO.
I suggest the following code as a patch (inspired from invoice.py) to
search for the correct code.
def action_invoice_create(self, cr, uid, ids, *args):
res = False
journal_obj = self.pool.get('account.journal')
for o in self.browse(cr, uid, ids):
il = []
todo = []
for ol in o.order_line:
todo.append(ol.id)
if ol.product_id:
if o.company_id.id:
company_id=o.company_id.id
property_obj = self.pool.get('ir.property')
account_obj = self.pool.get('account.account')
exp_pro_id = property_obj.search(cr, uid, [('name','=','property_account_expense'),('res_id','=','product.template,'+str(ol.product_id.product_tmpl_id.id)+''),('company_id','=',company_id)])
if not exp_pro_id:
exp_pro_id = property_obj.search(cr, uid, [('name','=','property_account_expense_categ'),('res_id','=','product.category,'+str(ol.product_id.categ_id.id)+''),('company_id','=',company_id)])#EC
if not exp_pro_id:
ex_acc = ol.product_id.product_tmpl_id.property_account_expense
ex_acc_cate = ol.product_id.categ_id.property_account_expense_categ
if ex_acc:
app_acc_exp = ex_acc
else:
app_acc_exp = ex_acc_cate
else:
# Get the fields from the ir.property record
my_value = property_obj.read(cr,uid,exp_pro_id,['name','value_reference','res_id'])
# Parse the value_reference field to get the ID of the account.account record
account_id = int (my_value[0]["value_reference"].split(",")[1])
# Use the ID of the account.account record in the browse for the account.account record
app_acc_exp = account_obj.browse(cr, uid, account_id)
if not exp_pro_id:
ex_acc = ol.product_id.product_tmpl_id.property_account_expense
ex_acc_cate = ol.product_id.categ_id.property_account_expense_categ
if ex_acc:
app_acc_exp = ex_acc
else:
app_acc_exp = ex_acc_cate
if app_acc_exp and app_acc_exp.company_id.id != company_id:
exp_res_id = account_obj.search(cr, uid, [('name','=',app_acc_exp.name),('company_id','=',company_id)])
if not exp_res_id:
raise osv.except_osv(_('Configuration Error !'),
_('Can not find account chart for this company, Please Create account.'))
exp_obj_acc = account_obj.browse(cr, uid, exp_res_id)
if ex_acc:
ol.product_id.product_tmpl_id.property_account_expense = exp_obj_acc[0]
else:
ol.product_id.categ_id.property_account_expense_categ = exp_obj_acc[0]
a = app_acc_exp.id
else:
a = ol.product_tmpl_id.property_account_expense.id
if not a:
a = ol.categ_id.property_account_expense_categ.id
if not a:
raise osv.except_osv(_('Error !'), _('There is no expense account defined for this product: "%s" (id:%d)') % (ol.product_id.name, ol.product_id.id,))
else:
a = self.pool.get('ir.property').get(cr, uid, 'property_account_expense_categ', 'product.category').id
fpos = o.fiscal_position or False
a = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, a)
il.append(self.inv_line_create(cr, uid, a, ol))
a = o.partner_id.property_account_payable.id
journal_ids = journal_obj.search(cr, uid, [('type', '=','purchase'),('company_id', '=', o.company_id.id)], limit=1)
if not journal_ids:
raise osv.except_osv(_('Error !'),
_('There is no purchase journal defined for this company: "%s" (id:%d)') % (o.company_id.name, o.company_id.id))
inv = {
'name': o.partner_ref or o.name,
'reference': o.partner_ref or o.name,
'account_id': a,
'type': 'in_invoice',
'partner_id': o.partner_id.id,
'currency_id': o.pricelist_id.currency_id.id,
'address_invoice_id': o.partner_address_id.id,
'address_contact_id': o.partner_address_id.id,
'journal_id': len(journal_ids) and journal_ids[0] or False,
'origin': o.name,
'invoice_line': il,
'fiscal_position': o.fiscal_position.id or o.partner_id.property_account_position.id,
'payment_term': o.partner_id.property_payment_term and o.partner_id.property_payment_term.id or False,
'company_id': o.company_id.id,
}
inv_id = self.pool.get('account.invoice').create(cr, uid, inv, {'type':'in_invoice'})
self.pool.get('account.invoice').button_compute(cr, uid, [inv_id], {'type':'in_invoice'}, set_total=True)
self.pool.get('purchase.order.line').write(cr, uid, todo, {'invoiced':True})
self.write(cr, uid, [o.id], {'invoice_ids': [(4, inv_id)]})
res = inv_id
return res
To manage notifications about this bug go to:
https://bugs.launchpad.net/openobject-addons/+bug/909248/+subscriptions
Follow ups
References