[IMP] accout.edi_invoice: to split edi_import() in smaller methods for importing the different parts
bzr revid: hmo@tinyerp.com-20110908094329-14cutn414nbpvgvr
This commit is contained in:
parent
39b40d789a
commit
5236ef43f1
|
@ -113,50 +113,57 @@ class account_invoice(osv.osv, ir_edi.edi):
|
|||
edi_doc_list.append(edi_doc)
|
||||
return edi_doc_list
|
||||
|
||||
def edi_import(self, cr, uid, edi_document, context=None):
|
||||
""" During import, invoices will import the company that is provided in the invoice as
|
||||
a new partner (e.g. supplier company for a customer invoice will be come a supplier
|
||||
record for the new invoice.
|
||||
Summary of tasks that need to be done:
|
||||
- import company as a new partner, if type==in then supplier=1, else customer=1
|
||||
- partner_id field is modified to point to the new partner
|
||||
- company_address data used to add address to new partner
|
||||
- change type: out_invoice'<->'in_invoice','out_refund'<->'in_refund'
|
||||
- reference: should contain the value of the 'internal_number'
|
||||
- reference_type: 'none'
|
||||
- internal number: reset to False, auto-generated
|
||||
- journal_id: should be selected based on type: simply put the 'type'
|
||||
in the context when calling create(), will be selected correctly
|
||||
- payment_term: if set, create a default one based on name...
|
||||
- for invoice lines, the account_id value should be taken from the
|
||||
product's default, i.e. from the default category, as it will not
|
||||
be provided.
|
||||
- for tax lines, we disconnect from the invoice.line, so all tax lines
|
||||
will be of type 'manual', and default accounts should be picked based
|
||||
on the tax config of the DB where it is imported.
|
||||
"""
|
||||
|
||||
partner_pool = self.pool.get('res.partner')
|
||||
partner_address_pool = self.pool.get('res.partner.address')
|
||||
model_data_pool = self.pool.get('ir.model.data')
|
||||
product_pool = self.pool.get('product.product')
|
||||
product_categ_pool = self.pool.get('product.category')
|
||||
company_pool = self.pool.get('res.company')
|
||||
country_pool = self.pool.get('res.country')
|
||||
state_pool = self.pool.get('res.country.state')
|
||||
account_journal_pool = self.pool.get('account.journal')
|
||||
invoice_line_pool = self.pool.get('account.invoice.line')
|
||||
account_pool = self.pool.get('account.account')
|
||||
tax_id = []
|
||||
account_id = []
|
||||
partner_id = None
|
||||
company_id = None
|
||||
def get_invoice_journal(self, cr, uid, invoice_type, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
account_journal_pool = self.pool.get('account.journal')
|
||||
journal_context = context.copy()
|
||||
journal_context.update({'type':invoice_type})
|
||||
journal_id = self._get_journal(cr, uid, context=journal_context)
|
||||
journal = False
|
||||
if journal_id:
|
||||
journal = account_journal_pool.browse(cr, uid, journal_id, context=context)
|
||||
return journal
|
||||
|
||||
def get_tax_account(self, cr, uid, invoice_type='out_invoice', context=None):
|
||||
#TOCHECK: should select account of output VAT for Customer Invoice and Input VAT for Supplier Invoice
|
||||
account_pool = self.pool.get('account.account')
|
||||
account_ids = account_pool.search(cr, uid, [('type','<>','view'),('type','<>','income'), ('type', '<>', 'closed')])
|
||||
tax_account = False
|
||||
if account_ids:
|
||||
tax_account = account_pool.browse(cr, uid, account_ids[0])
|
||||
return tax_account
|
||||
|
||||
def get_invoice_account(self, cr, uid, partner_id, invoice_type, context=None):
|
||||
partner_pool = self.pool.get('res.partner')
|
||||
partner = partner_pool.browse(cr, uid, partner_id, context=context)
|
||||
if invoice_type in ('out_invoice', 'out_refund'):
|
||||
invoice_account = partner.property_account_receivable
|
||||
else:
|
||||
invoice_account = partner.property_account_payable
|
||||
return invoice_account
|
||||
|
||||
def get_product_account(self, cr, uid, product_id, invoice_type, context=None):
|
||||
product_pool = self.pool.get('product.product')
|
||||
product = product_pool.browse(cr, uid, product_id, context=context)
|
||||
account = False
|
||||
if invoice_type in ('out_invoice','out_refund'):
|
||||
account = product.product_tmpl_id.property_account_income
|
||||
if not account:
|
||||
account = product.categ_id.property_account_income_categ
|
||||
else:
|
||||
account = product.product_tmpl_id.property_account_expense
|
||||
if not account:
|
||||
account = product.categ_id.property_account_expense_categ
|
||||
return account
|
||||
|
||||
def edi_import_company(self, cr, uid, edi_document, context=None):
|
||||
# import company as a new partner, if type==in then supplier=1, else customer=1
|
||||
# partner_id field is modified to point to the new partner
|
||||
# company_address data used to add address to new partner
|
||||
|
||||
partner_pool = self.pool.get('res.partner')
|
||||
partner_address_pool = self.pool.get('res.partner.address')
|
||||
edi_company_address = edi_document['company_address']
|
||||
edi_partner_id = edi_document['partner_id']
|
||||
company_name = edi_document['company_id'][1]
|
||||
|
@ -198,15 +205,43 @@ class account_invoice(osv.osv, ir_edi.edi):
|
|||
partner_address = partner_address_pool.browse(cr, uid, address_id, context=context)
|
||||
edi_document['address_invoice_id'] = self.edi_m2o(cr, uid, partner_address, context=context)
|
||||
|
||||
return partner.id
|
||||
|
||||
def edi_import(self, cr, uid, edi_document, context=None):
|
||||
""" During import, invoices will import the company that is provided in the invoice as
|
||||
a new partner (e.g. supplier company for a customer invoice will be come a supplier
|
||||
record for the new invoice.
|
||||
Summary of tasks that need to be done:
|
||||
- import company as a new partner, if type==in then supplier=1, else customer=1
|
||||
- partner_id field is modified to point to the new partner
|
||||
- company_address data used to add address to new partner
|
||||
- change type: out_invoice'<->'in_invoice','out_refund'<->'in_refund'
|
||||
- reference: should contain the value of the 'internal_number'
|
||||
- reference_type: 'none'
|
||||
- internal number: reset to False, auto-generated
|
||||
- journal_id: should be selected based on type: simply put the 'type'
|
||||
in the context when calling create(), will be selected correctly
|
||||
- payment_term: if set, create a default one based on name...
|
||||
- for invoice lines, the account_id value should be taken from the
|
||||
product's default, i.e. from the default category, as it will not
|
||||
be provided.
|
||||
- for tax lines, we disconnect from the invoice.line, so all tax lines
|
||||
will be of type 'manual', and default accounts should be picked based
|
||||
on the tax config of the DB where it is imported.
|
||||
"""
|
||||
if context is None:
|
||||
context = {}
|
||||
|
||||
#import company as a new partner
|
||||
partner_id = self.edi_import_company(cr, uid, edi_document, context=context)
|
||||
|
||||
# change type: out_invoice'<->'in_invoice','out_refund'<->'in_refund'
|
||||
invoice_type = edi_document['type']
|
||||
invoice_type = invoice_type.startswith('in_') and invoice_type.replace('in_','out_') or invoice_type.replace('out_','in_')
|
||||
edi_document['type'] = invoice_type
|
||||
|
||||
# Set Account
|
||||
if invoice_type in ('out_invoice', 'out_refund'):
|
||||
invoice_account = partner.property_account_receivable
|
||||
else:
|
||||
invoice_account = partner.property_account_payable
|
||||
invoice_account = self.get_invoice_account(cr, uid, partner_id, invoice_type, context=context)
|
||||
edi_document['account_id'] = invoice_account and self.edi_m2o(cr, uid, invoice_account, context=context) or False
|
||||
|
||||
# reference: should contain the value of the 'internal_number'
|
||||
|
@ -222,13 +257,9 @@ class account_invoice(osv.osv, ir_edi.edi):
|
|||
del edi_document['company_id']
|
||||
|
||||
# journal_id: should be selected based on type: simply put the 'type' in the context when calling create(), will be selected correctly
|
||||
journal_context = context.copy()
|
||||
journal_context.update({'type':invoice_type})
|
||||
journal_id = self._get_journal(cr, uid, context=journal_context)
|
||||
journal = False
|
||||
if journal_id:
|
||||
journal = account_journal_pool.browse(cr, uid, journal_id, context=context)
|
||||
journal = self.get_invoice_journal(cr, uid, invoice_type, context=context)
|
||||
edi_document['journal_id'] = journal and self.edi_m2o(cr, uid, journal, context=context) or False
|
||||
|
||||
# for invoice lines, the account_id value should be taken from the product's default, i.e. from the default category, as it will not be provided.
|
||||
for edi_invoice_line in edi_document.get('invoice_line', []):
|
||||
product_id = edi_invoice_line.get('product_id', False)
|
||||
|
@ -236,16 +267,7 @@ class account_invoice(osv.osv, ir_edi.edi):
|
|||
if product_id:
|
||||
product_name = product_id and product_id[1]
|
||||
product_id = self.edi_import_relation(cr, uid, 'product.product', product_name, context=context)
|
||||
product = product_pool.browse(cr, uid, product_id, context=context)
|
||||
|
||||
if invoice_type in ('out_invoice','out_refund'):
|
||||
account = product.product_tmpl_id.property_account_income
|
||||
if not account:
|
||||
account = product.categ_id.property_account_income_categ
|
||||
else:
|
||||
account = product.product_tmpl_id.property_account_expense
|
||||
if not account:
|
||||
account = product.categ_id.property_account_expense_categ
|
||||
account = self.get_product_account(cr, uid, product_id, invoice_type, context=context)
|
||||
# TODO: add effect of fiscal position
|
||||
# account = fpos_obj.map_account(cr, uid, fiscal_position_id, account.id)
|
||||
edi_invoice_line['account_id'] = account and self.edi_m2o(cr, uid, account, context=context) or False
|
||||
|
@ -253,10 +275,9 @@ class account_invoice(osv.osv, ir_edi.edi):
|
|||
# for tax lines, we disconnect from the invoice.line, so all tax lines will be of type 'manual', and default accounts should be picked based
|
||||
# on the tax config of the DB where it is imported.
|
||||
for edi_tax_line in edi_document.get('tax_line', []):
|
||||
account_ids = account_pool.search(cr, uid, [('type','<>','view'),('type','<>','income'), ('type', '<>', 'closed')])
|
||||
if account_ids:
|
||||
tax_account = account_pool.browse(cr, uid, account_ids[0])
|
||||
edi_tax_line['account_id'] = self.edi_m2o(cr, uid, tax_account, context=context) #TODO should select account of output VAT for Customer Invoice and Input VAT for Supplier Invoice
|
||||
tax_account = self.get_tax_account(cr, uid, context=context)
|
||||
if tax_account:
|
||||
edi_tax_line['account_id'] = self.edi_m2o(cr, uid, tax_account, context=context)
|
||||
edi_tax_line['manual'] = True
|
||||
|
||||
# TODO :=> payment_term: if set, create a default one based on name...
|
||||
|
|
Loading…
Reference in New Issue