From 5236ef43f183ae40f53bb432b184be81a151b707 Mon Sep 17 00:00:00 2001 From: "Harry (OpenERP)" Date: Thu, 8 Sep 2011 15:13:29 +0530 Subject: [PATCH] [IMP] accout.edi_invoice: to split edi_import() in smaller methods for importing the different parts bzr revid: hmo@tinyerp.com-20110908094329-14cutn414nbpvgvr --- addons/account/edi_invoice.py | 147 +++++++++++++++++++--------------- 1 file changed, 84 insertions(+), 63 deletions(-) diff --git a/addons/account/edi_invoice.py b/addons/account/edi_invoice.py index 179f2eb7234..cbcddb2430d 100644 --- a/addons/account/edi_invoice.py +++ b/addons/account/edi_invoice.py @@ -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...