← Back to team overview

openerp-brazil-team team mailing list archive

[Merge] lp:~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz into lp:openerp.pt-br-localiz

 

Fabio Negrini has proposed merging lp:~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz into lp:openerp.pt-br-localiz.

Requested reviews:
  Renato Lima - http://www.akretion.com (renatonlima)

For more details, see:
https://code.launchpad.net/~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz/+merge/80941

Exportação em formato XML gerando um XML válido
-- 
https://code.launchpad.net/~fnegrini/openerp.pt-br-localiz/openerp.pt-br-localiz/+merge/80941
Your team OpenERP Brazil Team is subscribed to branch lp:openerp.pt-br-localiz.
=== modified file 'l10n_br_account/invoice.py'
--- l10n_br_account/invoice.py	2011-10-01 03:31:45 +0000
+++ l10n_br_account/invoice.py	2011-11-01 19:15:28 +0000
@@ -647,7 +647,14 @@
             raise osv.except_osv(_('Error !'),_("Error Validating NFE:\n '%s'") % (strErro.encode('utf-8')))
         
         return True
+    
+    def text_only_number(self, text):
+        return re.sub('[%s]' % re.escape(string.punctuation), '', str(text or '').replace(' ',''))
+    
+    def text_normalize(self, text):
         
+        return normalize('NFKD', unicode(text or '')).encode('ASCII','ignore')
+    
 
     def nfe_export_txt(self, cr, uid, ids, context=False):
 
@@ -1216,427 +1223,467 @@
             self.write(cr, uid, [inv.id], {'nfe_export_date': datetime.now()})
 
         return unicode(StrFile.encode('utf-8'), errors='replace')
+    
+    def invoice_access_key(self, cr, uid, invoice):
+
+        company_addr = self.pool.get('res.partner').address_get(cr, uid, [invoice.company_id.partner_id.id], ['default'])
+        company_addr_default = self.pool.get('res.partner.address').browse(cr, uid, [company_addr['default']], context={'lang': 'pt_BR'})[0]
+
+        #MontaChave da Nota Fiscal Eletronica
+        #UUPPPPCCCCCCCCCCCCCCMMSSSNNNNNNNNNEAAAAAAAAD
+        #UU - Codigo UF IBGE
+        nfe_key = unicode(company_addr_default.state_id.ibge_code).strip().rjust(2, u'0')
+        ##PPPP - Periodo AAMM
+        nfe_key += unicode(datetime.strptime(invoice.date_invoice, '%Y-%m-%d').strftime(u'%y%m')).strip().rjust(4, u'0')
+        #CCCCCCCCCCCCCC - CNPJ Emissor
+        nfe_key += re.sub('[%s]' % re.escape(string.punctuation), '', invoice.company_id.partner_id.cnpj_cpf or '')
+        #MM - Modelo
+        nfe_key += invoice.fiscal_document_id.code
+        ##SSS - Serie
+        nfe_key += unicode(invoice.document_serie_id.code).strip().rjust(3, u'0')
+        #NNNNNNNNN - Numero da NFe
+        nfe_key += unicode(invoice.internal_number).strip().rjust(9, u'0')
+        #E - Tipo de emissao
+        nfe_key += unicode('1').strip().rjust(1, u'0') # Homologação
+        #AAAAAAAA - Numero aleatorio
+        nfe_key += unicode(invoice.internal_number).strip().rjust(8, u'0')
+        #D - Digito verificador
+        nfe_key += unicode(self.nfe_dv(nfe_key)).strip().rjust(1, u'0')
+
+        return nfe_key
+    
+    def invoice_to_xml(self, cr, uid, invoice):
+
+        #Endereço do company
+        company_addr = self.pool.get('res.partner').address_get(cr, uid, [invoice.company_id.partner_id.id], ['default'])
+        company_addr_default = self.pool.get('res.partner.address').browse(cr, uid, [company_addr['default']], context={'lang': 'pt_BR'})[0]
+        
+        nfe_key = self.invoice_access_key(cr, uid, invoice)
+        
+        # NFe = SubElement(nfeProc, 'NFe', { 'xmlns': 'http://www.portalfiscal.inf.br/nfe' })
+        NFe = Element('NFe')
+        
+        NFe.set('xmlns','http://www.portalfiscal.inf.br/nfe')
+        
+        infNFe = SubElement(NFe, 'infNFe', {'versao': '2.00', 'Id': nfe_key })
+
+        #Dados da identificação da nota fiscal
+        ide = SubElement(infNFe, 'ide')
+
+        ide_cUF = SubElement(ide, 'cUF')
+        ide_cUF.text = company_addr_default.state_id.ibge_code
+        
+        ide_cNF = SubElement(ide, 'cNF')
+        ide_cNF.text = unicode(invoice.internal_number).strip().rjust(8, u'0')
+        
+        ide_natOp = SubElement(ide, 'natOp')
+        ide_natOp.text = self.text_normalize(invoice.cfop_id.name)
+        
+        ide_indPag = SubElement(ide, 'indPag')
+        ide_indPag.text = "2"
+        
+        ide_mod = SubElement(ide, 'mod')
+        ide_mod.text = invoice.fiscal_document_id.code 
+        
+        ide_serie = SubElement(ide, 'serie')
+        ide_serie.text = invoice.document_serie_id.code
+        
+        ide_nNF = SubElement(ide, 'nNF')
+        ide_nNF.text = invoice.internal_number
+        
+        ide_dEmi = SubElement(ide, 'dEmi')
+        ide_dEmi.text = invoice.date_invoice
+        
+        ide_dSaiEnt = SubElement(ide, 'dSaiEnt')
+        ide_dSaiEnt.text = invoice.date_invoice 
+        
+        ide_tpNF = SubElement(ide, 'tpNF')
+        if invoice.type in ("out_invoice", "in_refuld"): 
+            ide_tpNF.text = '0'
+        else:
+            ide_tpNF.text = '1'
+        
+        ide_cMunFG = SubElement(ide, 'cMunFG')
+        ide_cMunFG.text = ('%s%s') % (company_addr_default.state_id.ibge_code, company_addr_default.l10n_br_city_id.ibge_code)
+        
+        ide_tpImp = SubElement(ide, 'tpImp')
+        ide_tpImp.text = "1"
+        
+        ide_tpEmis = SubElement(ide, 'tpEmis')
+        ide_tpEmis.text = "1"
+        
+        ide_cDV = SubElement(ide, 'cDV')
+        ide_cDV.text = self.nfe_dv(nfe_key)
+        
+        #Tipo de ambiente: 1 - Produção; 2 - Homologação
+        ide_tpAmb = SubElement(ide, 'tpAmb')
+        ide_tpAmb.text = "2"
+        
+        #Finalidade da emissão da NF-e: 1 - NFe normal 2 - NFe complementar 3 - NFe de ajuste
+        ide_finNFe = SubElement(ide, 'finNFe')
+        ide_finNFe.text = "1"
+        
+        ide_procEmi = SubElement(ide, 'procEmi')
+        ide_procEmi.text = "0"
+        
+        ide_verProc = SubElement(ide, 'verProc')
+        ide_verProc.text = "2.0.4"
+        
+        emit = SubElement(infNFe, 'emit')
+        
+        emit_CNPJ = SubElement(emit, 'CNPJ')
+        emit_CNPJ.text = self.text_only_number(invoice.company_id.partner_id.cnpj_cpf)
+        
+        emit_xNome = SubElement(emit, 'xNome')
+        emit_xNome.text = self.text_normalize(invoice.company_id.partner_id.legal_name)
+        
+        emit_xFant = SubElement(emit, 'xFant')
+        emit_xFant.text = self.text_normalize(invoice.company_id.partner_id.name)
+        
+        enderEmit = SubElement(emit, 'enderEmit')
+        
+        enderEmit_xLgr = SubElement(enderEmit, 'xLgr')
+        enderEmit_xLgr.text = self.text_normalize(company_addr_default.street)
+        
+        enderEmit_nro = SubElement(enderEmit, 'nro')
+        enderEmit_nro.text = company_addr_default.number
+        
+        enderEmit_xBairro = SubElement(enderEmit, 'xBairro')
+        enderEmit_xBairro.text = self.text_normalize(company_addr_default.district)
+        
+        enderEmit_cMun = SubElement(enderEmit, 'cMun')
+        enderEmit_cMun.text = ('%s%s') % (company_addr_default.state_id.ibge_code, company_addr_default.l10n_br_city_id.ibge_code)
+        
+        enderEmit_xMun = SubElement(enderEmit, 'xMun')
+        enderEmit_xMun.text = self.text_normalize(company_addr_default.l10n_br_city_id.name)
+        
+        enderEmit_UF = SubElement(enderEmit, 'UF')
+        enderEmit_UF.text = company_addr_default.state_id.code
+        
+        enderEmit_CEP = SubElement(enderEmit, 'CEP')
+        enderEmit_CEP.text = self.text_only_number(company_addr_default.zip)
+        
+        enderEmit_cPais = SubElement(enderEmit, 'cPais')
+        enderEmit_cPais.text = str(int(company_addr_default.country_id.bc_code or ''))
+        
+        enderEmit_xPais = SubElement(enderEmit, 'xPais')
+        enderEmit_xPais.text = self.text_normalize(company_addr_default.country_id.name)
+        
+        enderEmit_fone = SubElement(enderEmit, 'fone')
+
+        enderEmit_fone.text = self.text_only_number(str(company_addr_default.phone or ''))
+        
+        emit_IE = SubElement(emit, 'IE')
+        emit_IE.text = invoice.company_id.partner_id.inscr_est
+        
+        emit_IEST = SubElement(emit, 'IEST')
+        emit_IEST.text = '0000000000' #FIXME
+        
+        emit_IM = SubElement(emit, 'IM')
+        emit_IM.text = '0000000000' #FIXME
+        
+        emit_CNAE = SubElement(emit, 'CNAE')
+        emit_CNAE.text = '0111301'  #FIXME
+        
+        emit_CRT = SubElement(emit, 'CRT')
+        emit_CRT.text = '3'  #FIXME
+        
+        dest = SubElement(infNFe, 'dest')
+        
+        dest_CNPJ = SubElement(dest, 'CNPJ')
+        dest_CNPJ.text = self.text_only_number(invoice.partner_id.cnpj_cpf)
+        
+        dest_xNome = SubElement(dest, 'xNome')
+        dest_xNome.text = self.text_normalize(invoice.partner_id.legal_name)
+        
+        enderDest = SubElement(dest, 'enderDest')
+        
+        enderDest_xLgr = SubElement(enderDest, 'xLgr')
+        enderDest_xLgr.text = invoice.address_invoice_id.street
+        
+        enderDest_nro = SubElement(enderDest, 'nro')
+        enderDest_nro.text = invoice.address_invoice_id.number
+        
+        enderDest_xBairro = SubElement(enderDest, 'xBairro')
+        enderDest_xBairro.text = invoice.address_invoice_id.district
+        
+        enderDest_cMun = SubElement(enderDest, 'cMun')
+        enderDest_cMun.text = ('%s%s') % (invoice.address_invoice_id.state_id.ibge_code, invoice.address_invoice_id.l10n_br_city_id.ibge_code)
+        
+        enderDest_xMun = SubElement(enderDest, 'xMun')
+        enderDest_xMun.text = self.text_normalize(invoice.address_invoice_id.l10n_br_city_id.name)
+        
+        enderDest_UF = SubElement(enderDest, 'UF')
+        enderDest_UF.text = invoice.address_invoice_id.state_id.code
+        
+        enderDest_CEP = SubElement(enderDest, 'CEP')
+        enderDest_CEP.text = self.text_only_number(invoice.address_invoice_id.zip or '')
+        
+        enderDest_cPais = SubElement(enderDest, 'cPais')
+        enderDest_cPais.text = str(int(invoice.address_invoice_id.country_id.bc_code or ''))
+        
+        enderDest_xPais = SubElement(enderDest, 'xPais')
+        enderDest_xPais.text = self.text_normalize(invoice.address_invoice_id.country_id.name)
+        
+        enderDest_fone = SubElement(enderDest, 'fone')
+        enderDest_fone.text = self.text_only_number(str(invoice.address_invoice_id.phone or ''))
+        
+        dest_IE = SubElement(dest, 'IE')
+        dest_IE.text = invoice.partner_id.inscr_est or ''
+        
+        for inv_line in invoice.invoice_line:
+            i =+ 1
+            det = SubElement(infNFe, 'det', {'nItem': str(i)})
+            
+            det_prod = SubElement(det, 'prod')
+            
+            prod_cProd = SubElement(det_prod, 'cProd')
+            if inv_line.product_id.code:
+                prod_cProd.text = self.text_normalize(inv_line.product_id.code)
+            else:
+                prod_cProd.text = self.text_normalize(unicode(i).strip().rjust(4, u'0'))
+            
+            prod_cEAN = SubElement(det_prod, 'cEAN')
+            prod_cEAN.text = inv_line.product_id.ean13 or ''
+            
+            prod_xProd = SubElement(det_prod, 'xProd')
+            prod_xProd.text = self.text_normalize(inv_line.product_id.name)
+            
+            prod_NCM = SubElement(det_prod, 'NCM')
+            prod_NCM.text = self.text_only_number(inv_line.product_id.property_fiscal_classification.name)
+            
+            prod_CFOP = SubElement(det_prod, 'CFOP')
+            prod_CFOP.text = inv_line.cfop_id.code
+            
+            prod_uCom = SubElement(det_prod, 'uCom')
+            prod_uCom.text = self.text_normalize(inv_line.uos_id.name)
+            
+            prod_qCom = SubElement(det_prod, 'qCom')
+            prod_qCom.text = str("%.4f" % inv_line.quantity)
+            
+            prod_vUnCom = SubElement(det_prod, 'vUnCom')
+            prod_vUnCom.text = str("%.4f" % inv_line.price_unit)
+            
+            prod_vProd = SubElement(det_prod, 'vProd')
+            prod_vProd.text = str("%.2f" % inv_line.price_subtotal)
+                    
+            prod_cEANTrib = SubElement(det_prod, 'cEANTrib')
+            #prod_vProd.text(inv_line.total)
+            
+            prod_uTrib = SubElement(det_prod, 'uTrib')
+            prod_uTrib.text = self.text_normalize(inv_line.uos_id.name)
+            
+            prod_qTrib = SubElement(det_prod, 'qTrib')
+            prod_qTrib.text = '0.0000'  #TODO
+            
+            prod_vUnTrib = SubElement(det_prod, 'vUnTrib')
+            prod_vUnTrib.text = '0.00'  #TODO
+            
+            #prod_vFrete = SubElement(det_prod, 'vFrete')
+            #prod_vFrete.text = '0.00'  #TODO - Valor do Frete
+            
+            #prod_vSeg = SubElement(det_prod, 'vSeg')
+            #prod_vSeg.text = '0.00'  #TODO - Valor do seguro
+
+            #prod_vDesc = SubElement(det_prod, 'vDesc')
+            #prod_vDesc.text = str("%.2f" % inv_line.discount)  #TODO
+            
+            #prod_vOutro = SubElement(det_prod, 'vOutro')
+            #prod_vOutro.text = '0.0000'  #TODO
+            
+            prod_indTot = SubElement(det_prod, 'indTot')
+            prod_indTot.text = '1'  #TODO
+
+            prod_imposto = SubElement(det, 'imposto')
+
+            imposto_icms = SubElement(prod_imposto, 'ICMS' ) # + inv_line.icms_cst)
+            
+            imposto_icms_cst = SubElement(imposto_icms, 'ICMS%s' % (inv_line.icms_cst))
+            
+            icms_orig = SubElement(imposto_icms_cst, 'orig')
+            icms_orig.text = inv_line.product_id.origin
+            
+            icms_CST = SubElement(imposto_icms_cst, 'CST')
+            icms_CST.text = inv_line.icms_cst
+            
+            icms_modBC = SubElement(imposto_icms_cst, 'modBC')
+            icms_modBC.text = '0' # TODO
+            
+            icms_vBC = SubElement(imposto_icms_cst, 'vBC')
+            icms_vBC.text = str("%.2f" % inv_line.icms_base)
+            
+            icms_pICMS = SubElement(imposto_icms_cst, 'pICMS')
+            icms_pICMS.text = str("%.2f" % inv_line.icms_percent)
+            
+            icms_vICMS = SubElement(imposto_icms_cst, 'vICMS')
+            icms_vICMS.text = str("%.2f" % inv_line.icms_value)
+            
+            imposto_ipi = SubElement(prod_imposto, 'IPI')
+            
+            icms_cEnq = SubElement(imposto_ipi, 'cEnq')
+            icms_cEnq.text = '999'
+            
+            #Imposto Não Tributado
+            ipi_IPINT = SubElement(imposto_ipi, 'IPINT')
+            
+            ipi_CST = SubElement(ipi_IPINT, 'CST')
+            ipi_CST.text = inv_line.ipi_cst
+            
+            imposto_pis = SubElement(prod_imposto, 'PIS')
+            
+            pis_PISAliq = SubElement(imposto_pis, 'PISAliq')
+            
+            pis_CST = SubElement(pis_PISAliq, 'CST')
+            pis_CST.text = inv_line.pis_cst
+            
+            pis_vBC = SubElement(pis_PISAliq, 'vBC')
+            pis_vBC.text = str("%.2f" % inv_line.pis_base)
+            
+            pis_pPIS = SubElement(pis_PISAliq, 'pPIS')
+            pis_pPIS.text = str("%.2f" % inv_line.pis_percent)
+            
+            pis_vPIS = SubElement(pis_PISAliq, 'vPIS')
+            pis_vPIS.text = str("%.2f" % inv_line.pis_value)
+            
+            imposto_cofins = SubElement(prod_imposto, 'COFINS')
+            
+            cofins_COFINSAliq = SubElement(imposto_cofins, 'COFINSAliq')
+            
+            cofins_CST = SubElement(cofins_COFINSAliq, 'CST')
+            cofins_CST.text = inv_line.pis_cst
+            
+            cofins_vBC = SubElement(cofins_COFINSAliq, 'vBC')
+            cofins_vBC.text = str("%.2f" % inv_line.cofins_base)
+            
+            cofins_pCOFINS = SubElement(cofins_COFINSAliq, 'pCOFINS')
+            cofins_pCOFINS.text = str("%.2f" % inv_line.cofins_percent)
+            
+            cofins_vCOFINS = SubElement(cofins_COFINSAliq, 'vCOFINS')
+            cofins_vCOFINS.text = str("%.2f" % inv_line.cofins_value)
+            
+        total = SubElement(infNFe, 'total')
+        total_ICMSTot = SubElement(total, 'ICMSTot')
+        
+        ICMSTot_vBC = SubElement(total_ICMSTot, 'vBC')
+        ICMSTot_vBC.text = str("%.2f" % invoice.icms_base)
+        
+        ICMSTot_vICMS = SubElement(total_ICMSTot, 'vICMS')
+        ICMSTot_vICMS.text = str("%.2f" % invoice.icms_value)
+        
+        ICMSTot_vBCST = SubElement(total_ICMSTot, 'vBCST')
+        ICMSTot_vBCST.text = '0.00' # TODO 
+        
+        ICMSTot_vST = SubElement(total_ICMSTot, 'vST')
+        ICMSTot_vST.text = '0.00' # TODO
+        
+        ICMSTot_vProd = SubElement(total_ICMSTot, 'vProd')
+        ICMSTot_vProd.text = str("%.2f" % invoice.amount_untaxed)
+        
+        ICMSTot_vFrete = SubElement(total_ICMSTot, 'vFrete')
+        ICMSTot_vFrete.text = str("%.2f" % invoice.amount_freight)
+        
+        ICMSTot_vSeg = SubElement(total_ICMSTot, 'vSeg')
+        ICMSTot_vSeg.text = str("%.2f" % invoice.amount_insurance) 
+        
+        ICMSTot_vDesc = SubElement(total_ICMSTot, 'vDesc')
+        ICMSTot_vDesc.text = '0.00' # TODO
+        
+        ICMSTot_II = SubElement(total_ICMSTot, 'vII')
+        ICMSTot_II.text = '0.00' # TODO
+        
+        ICMSTot_vIPI = SubElement(total_ICMSTot, 'vIPI')
+        ICMSTot_vIPI.text = str("%.2f" % invoice.ipi_value)
+        
+        ICMSTot_vPIS = SubElement(total_ICMSTot, 'vPIS')
+        ICMSTot_vPIS.text = str("%.2f" % invoice.pis_value)
+        
+        ICMSTot_vCOFINS = SubElement(total_ICMSTot, 'vCOFINS')
+        ICMSTot_vCOFINS.text = str("%.2f" % invoice.cofins_value)
+        
+        ICMSTot_vOutro = SubElement(total_ICMSTot, 'vOutro')
+        ICMSTot_vOutro.text = str("%.2f" % invoice.amount_costs)
+        
+        ICMSTot_vNF = SubElement(total_ICMSTot, 'vNF')
+        ICMSTot_vNF.text = str("%.2f" % invoice.amount_total)
+        
+        
+        transp = SubElement(infNFe, 'transp')
+        
+        # Modo do Frete: 0- Por conta do emitente; 1- Por conta do destinatário/remetente; 2- Por conta de terceiros; 9- Sem frete (v2.0)
+        transp_modFrete = SubElement(transp, 'modFrete')
+        transp_modFrete.text = '0' #TODO
+        
+        if invoice.carrier_id:
+            
+            #Endereço do company
+            carrier_addr = self.pool.get('res.partner').address_get(cr, uid, [invoice.carrier_id.partner_id.id], ['default'])
+            carrier_addr_default = self.pool.get('res.partner.address').browse(cr, uid, [carrier_addr['default']])[0]
+            
+            transp_transporta = SubElement(transp, 'transporta')
+            
+            if invoice.carrier_id.partner_id.tipo_pessoa == 'J':
+                transporta_CNPJ = SubElement(transp_transporta, 'CNPJ')
+                transporta_CNPJ.text = invoice.carrier_id.partner_id.cnpj_cpf
+            else:
+                transporta_CPF = SubElement(transp_transporta, 'CPF')
+                transporta_CPF.text = invoice.carrier_id.partner_id.cnpj_cpf
+            
+            transporta_xNome = SubElement(transp_transporta, 'xNome')
+            if invoice.carrier_id.partner_id.legal_name:
+                transporta_xNome.text = self.text_normalize(invoice.carrier_id.partner_id.legal_name)
+            else:
+                transporta_xNome.text = self.text_normalize(invoice.carrier_id.partner_id.name)
+            
+            transporta_IE = SubElement(transp_transporta, 'IE')
+            transporta_IE.text = invoice.carrier_id.partner_id.inscr_est
+            
+            transporta_xEnder = SubElement(transp_transporta, 'xEnder')
+            transporta_xEnder.text = carrier_addr_default.street
+            
+            transporta_xMun = SubElement(transp_transporta, 'xMun')
+            transporta_xMun.text = ('%s%s') % (carrier_addr_default.state_id.ibge_code, carrier_addr_default.l10n_br_city_id.ibge_code)
+            
+            transporta_UF = SubElement(transp_transporta, 'UF')
+            transporta_UF.text = carrier_addr_default.state_id.code
+            
+        
+        if invoice.number_of_packages:
+            transp_vol = SubElement(transp, 'vol')
+        
+            vol_qVol = SubElement(transp_vol, 'qVol')
+            vol_qVol.text = invoice.number_of_packages
+            
+            vol_esp = SubElement(transp_vol, 'esp')
+            vol_esp.text = 'volume' #TODO
+            
+            vol_pesoL = SubElement(transp_vol, 'pesoL')
+            vol_pesoL.text = invoice.weight_net
+            
+            vol_pesoB = SubElement(transp_vol, 'pesoB')
+            vol_pesoB.text = invoice.weight
+            
+        return NFe
+            
+    def nfe_to_xml_proc(self, cr, uid, ids, context=False):
+                        
+        nfeProc = Element('nfeProc', {'versao': '2.00', 'xmlns': 'http://www.portalfiscal.inf.br/nfe' })
+        
+        for invoice_id in ids:
+
+            inv = self.browse(cr, uid, invoice_id)
+            
+            NFe = self.invoice_to_xml(cr, uid, inv)
+            
+            nfeProc.extend([NFe])
+                
+        return nfeProc
 
     def nfe_export_xml(self, cr, uid, ids, context=False):
-                
-        nfeProc = Element('nfeProc', {'versao': '2.00', 'xmlns': 'http://www.portalfiscal.inf.br/nfe' })
-        
-        for inv in self.browse(cr, uid, ids, context={'lang': 'pt_BR'}):
-            
-            #Endereço do company
-            company_addr = self.pool.get('res.partner').address_get(cr, uid, [inv.company_id.partner_id.id], ['default'])
-            company_addr_default = self.pool.get('res.partner.address').browse(cr, uid, [company_addr['default']], context={'lang': 'pt_BR'})[0]
-            
-            #MontaChave da Nota Fiscal Eletronica
-            nfe_key = unicode(company_addr_default.state_id.ibge_code).strip().rjust(2, u'0')
-            nfe_key += unicode(datetime.strptime(inv.date_invoice, '%Y-%m-%d').strftime(u'%y%m')).strip().rjust(4, u'0')
-            nfe_key +=  '08478495000170' # unicode(inv.company_id.partner_id.cnpj_cpf).strip().rjust(14, u'0')
-            nfe_key += inv.fiscal_document_id.code
-            nfe_key += unicode(inv.document_serie_id.code).strip().rjust(3, u'0')
-            nfe_key += unicode(inv.internal_number).strip().rjust(9, u'0')
-            nfe_key += unicode('1').strip().rjust(1, u'0') # Homologação
-            nfe_key += unicode(inv.internal_number).strip().rjust(8, u'0')
-            nfe_key += unicode(self.nfe_dv(nfe_key)).strip().rjust(1, u'0')
-            
-            NFe = SubElement(nfeProc, 'NFe', { 'xmlns': 'http://www.portalfiscal.inf.br/nfe' })
-            
-            infNFe = SubElement(NFe, 'infNFe', {'versao': '2.00', 'Id': nfe_key })
-
-            #Dados da identificação da nota fiscal
-            ide = SubElement(infNFe, 'ide')
-
-            ide_cUF = SubElement(ide, 'cUF')
-            ide_cUF.text = company_addr_default.state_id.ibge_code
-            
-            ide_cNF = SubElement(ide, 'cNF')
-            ide_cNF.text = unicode(inv.internal_number).strip().rjust(8, u'0')
-            
-            ide_natOp = SubElement(ide, 'natOp')
-            ide_natOp.text = inv.cfop_id.name
-            
-            ide_indPag = SubElement(ide, 'indPag')
-            ide_indPag.text = "2"
-            
-            ide_mod = SubElement(ide, 'mod')
-            ide_mod.text = inv.fiscal_document_id.code 
-            
-            ide_serie = SubElement(ide, 'serie')
-            ide_serie.text = inv.document_serie_id.code
-            
-            ide_nNF = SubElement(ide, 'nNF')
-            ide_nNF.text = inv.internal_number
-            
-            ide_dEmi = SubElement(ide, 'dEmi')
-            ide_dEmi.text = inv.date_invoice
-            
-            ide_dSaiEnt = SubElement(ide, 'dSaiEnt')
-            ide_dSaiEnt.text = inv.date_invoice 
-            
-            ide_tpNF = SubElement(ide, 'tpNF')
-            if inv.type in ("out_invoice", "in_refuld"): 
-                ide_tpNF.text = '0'
-            else:
-                ide_tpNF.text = '1'
-            
-            ide_cMunFG = SubElement(ide, 'cMunFG')
-            ide_cMunFG.text = ('%s%s') % (company_addr_default.state_id.ibge_code, company_addr_default.l10n_br_city_id.ibge_code)
-            
-            ide_tpImp = SubElement(ide, 'tpImp')
-            ide_tpImp.text = "1"
-            
-            ide_tpEmis = SubElement(ide, 'tpEmis')
-            ide_tpEmis.text = "1"
-            
-            ide_cDV = SubElement(ide, 'cDV')
-            ide_cDV.text = self.nfe_dv(nfe_key)
-            
-            #Tipo de ambiente: 1 - Produção; 2 - Homologação
-            ide_tpAmb = SubElement(ide, 'tpAmb')
-            ide_tpAmb.text = "2"
-            
-            #Finalidade da emissão da NF-e: 1 - NFe normal 2 - NFe complementar 3 - NFe de ajuste
-            ide_finNFe = SubElement(ide, 'finNFe')
-            ide_finNFe.text = "1"
-            
-            ide_procEmi = SubElement(ide, 'procEmi')
-            ide_procEmi.text = "0"
-            
-            ide_verProc = SubElement(ide, 'verProc')
-            ide_verProc.text = "2.0.4"
-            
-            emit = SubElement(infNFe, 'emit')
-            
-            emit_CNPJ = SubElement(emit, 'CNPJ')
-            emit_CNPJ.text = inv.company_id.partner_id.cnpj_cpf
-            
-            emit_xNome = SubElement(emit, 'xNome')
-            emit_xNome.text = inv.company_id.partner_id.legal_name
-            
-            emit_xFant = SubElement(emit, 'xFant')
-            emit_xFant.text = inv.company_id.partner_id.name
-            
-            enderEmit = SubElement(emit, 'enderEmit')
-            
-            enderEmit_xLgr = SubElement(enderEmit, 'xLgr')
-            enderEmit_xLgr.text = company_addr_default.street
-            
-            enderEmit_nro = SubElement(enderEmit, 'nro')
-            enderEmit_nro.text = company_addr_default.number
-            
-            enderEmit_xBairro = SubElement(enderEmit, 'xBairro')
-            enderEmit_xBairro.text = company_addr_default.district
-            
-            enderEmit_cMun = SubElement(enderEmit, 'cMun')
-            enderEmit_cMun.text = ('%s%s') % (company_addr_default.state_id.ibge_code, company_addr_default.l10n_br_city_id.ibge_code)
-            
-            enderEmit_xMun = SubElement(enderEmit, 'xMun')
-            enderEmit_xMun.text = company_addr_default.l10n_br_city_id.name
-            
-            enderEmit_UF = SubElement(enderEmit, 'UF')
-            enderEmit_UF.text = company_addr_default.state_id.code
-            
-            enderEmit_CEP = SubElement(enderEmit, 'CEP')
-            enderEmit_CEP.text = company_addr_default.zip
-            
-            enderEmit_cPais = SubElement(enderEmit, 'cPais')
-            enderEmit_cPais.text = company_addr_default.country_id.bc_code
-            
-            enderEmit_xPais = SubElement(enderEmit, 'xPais')
-            enderEmit_xPais.text = company_addr_default.country_id.name
-            
-            enderEmit_fone = SubElement(enderEmit, 'fone')
-            enderEmit_fone.text = company_addr_default.phone
-            
-            emit_IE = SubElement(emit, 'IE')
-            emit_IE.text = inv.company_id.partner_id.inscr_est
-            
-            emit_IEST = SubElement(emit, 'IEST')
-            emit_IEST.text = '0000000000' #FIXME
-            
-            emit_IM = SubElement(emit, 'IM')
-            emit_IM.text = '0000000000' #FIXME
-            
-            emit_CNAE = SubElement(emit, 'CNAE')
-            emit_CNAE.text = '0111301'  #FIXME
-            
-            emit_CRT = SubElement(emit, 'CRT')
-            emit_CRT.text = '3'  #FIXME
-            
-            dest = SubElement(infNFe, 'dest')
-            
-            dest_CNPJ = SubElement(dest, 'CNPJ')
-            dest_CNPJ.text = inv.partner_id.cnpj_cpf
-            
-            dest_xNome = SubElement(dest, 'xNome')
-            dest_xNome.text = inv.partner_id.legal_name
-            
-            enderDest = SubElement(dest, 'enderDest')
-            
-            enderDest_xLgr = SubElement(enderDest, 'xLgr')
-            enderDest_xLgr.text = inv.address_invoice_id.street
-            
-            enderDest_nro = SubElement(enderDest, 'nro')
-            enderDest_nro.text = inv.address_invoice_id.number
-            
-            enderDest_xBairro = SubElement(enderDest, 'xBairro')
-            enderDest_xBairro.text = inv.address_invoice_id.district
-            
-            enderDest_cMun = SubElement(enderDest, 'cMun')
-            enderDest_cMun.text = ('%s%s') % (inv.address_invoice_id.state_id.ibge_code, inv.address_invoice_id.l10n_br_city_id.ibge_code)
-            
-            enderDest_xMun = SubElement(enderDest, 'xMun')
-            enderDest_xMun.text = inv.address_invoice_id.l10n_br_city_id.name
-            
-            enderDest_UF = SubElement(enderDest, 'UF')
-            enderDest_UF.text = inv.address_invoice_id.state_id.code
-            
-            enderDest_CEP = SubElement(enderDest, 'CEP')
-            enderDest_CEP.text = inv.address_invoice_id.zip
-            
-            enderDest_cPais = SubElement(enderDest, 'cPais')
-            enderDest_cPais.text = inv.address_invoice_id.country_id.bc_code
-            
-            enderDest_xPais = SubElement(enderDest, 'xPais')
-            enderDest_xPais.text = inv.address_invoice_id.country_id.name
-            
-            enderDest_fone = SubElement(enderDest, 'fone')
-            enderDest_fone.text = inv.address_invoice_id.phone
-            
-            dest_IE = SubElement(dest, 'IE')
-            dest_IE.text = inv.partner_id.inscr_est
-            
-            for inv_line in inv.invoice_line:
-                i =+ 1
-                det = SubElement(infNFe, 'det', {'nItem': str(i)})
-                
-                det_prod = SubElement(det, 'prod')
-                
-                prod_cProd = SubElement(det_prod, 'cProd')
-                if inv_line.product_id.code:
-                    prod_cProd.text = inv_line.product_id.code
-                else:
-                    prod_cProd.text = unicode(i).strip().rjust(4, u'0')
-                
-                prod_cEAN = SubElement(det_prod, 'cEAN')
-                prod_cEAN.text = inv_line.product_id.ean13
-                
-                prod_xProd = SubElement(det_prod, 'xProd')
-                prod_xProd.text = inv_line.product_id.name
-                
-                prod_NCM = SubElement(det_prod, 'NCM')
-                prod_NCM.text = inv_line.product_id.property_fiscal_classification.name
-                
-                prod_CFOP = SubElement(det_prod, 'CFOP')
-                prod_CFOP.text = inv_line.cfop_id.code
-                
-                prod_uCom = SubElement(det_prod, 'uCom')
-                prod_uCom.text = inv_line.uos_id.name
-                
-                prod_qCom = SubElement(det_prod, 'qCom')
-                prod_qCom.text = str("%.4f" % inv_line.quantity)
-                
-                prod_vUnCom = SubElement(det_prod, 'vUnCom')
-                prod_vUnCom.text = str("%.4f" % inv_line.price_unit)
-                
-                prod_vProd = SubElement(det_prod, 'vProd')
-                prod_vProd.text = str("%.2f" % inv_line.price_subtotal)
+        
+        nfeProc = self.nfe_to_xml_proc(cr, uid, ids, context)
+        
+        xml_string = etree.tostring(nfeProc)
                         
-                prod_cEANTrib = SubElement(det_prod, 'cEANTrib')
-                #prod_vProd.text(inv_line.total)
-                
-                prod_uTrib = SubElement(det_prod, 'uTrib')
-                prod_uTrib.text = inv_line.uos_id.name
-                
-                prod_qTrib = SubElement(det_prod, 'qTrib')
-                prod_qTrib.text = '0.0000'  #TODO
-                
-                prod_vUnTrib = SubElement(det_prod, 'vUnTrib')
-                prod_vUnTrib.text = '0.00'  #TODO
-                
-                prod_vFrete = SubElement(det_prod, 'vFrete')
-                prod_vFrete.text = '0.00'  #TODO - Valor do Frete
-                
-                prod_vSeg = SubElement(det_prod, 'vSeg')
-                prod_vSeg.text = '0.00'  #TODO - Valor do seguro
-
-                prod_vDesc = SubElement(det_prod, 'vDesc')
-                prod_vDesc.text = str("%.2f" % inv_line.discount)  #TODO
-                
-                prod_vOutro = SubElement(det_prod, 'vOutro')
-                prod_vOutro.text = '0.0000'  #TODO
-                
-                prod_indTot = SubElement(det_prod, 'indTot')
-                prod_indTot.text = '1'  #TODO
-
-                prod_imposto = SubElement(det, 'imposto')
-
-                imposto_icms = SubElement(prod_imposto, 'ICMS' ) # + inv_line.icms_cst)
-                
-                imposto_icms_cst = SubElement(imposto_icms, 'ICMS%s' % (inv_line.icms_cst))
-                
-                icms_orig = SubElement(imposto_icms_cst, 'orig')
-                icms_orig.text = inv_line.product_id.origin
-                
-                icms_CST = SubElement(imposto_icms_cst, 'CST')
-                icms_CST.text = inv_line.icms_cst
-                
-                icms_modBC = SubElement(imposto_icms_cst, 'modBC')
-                icms_modBC.text = '0' # TODO
-                
-                icms_vBC = SubElement(imposto_icms_cst, 'vBC')
-                icms_vBC.text = str("%.2f" % inv_line.icms_base)
-                
-                icms_pICMS = SubElement(imposto_icms_cst, 'pICMS')
-                icms_pICMS.text = str("%.2f" % inv_line.icms_percent)
-                
-                icms_vICMS = SubElement(imposto_icms_cst, 'vICMS')
-                icms_vICMS.text = str("%.2f" % inv_line.icms_value)
-                
-                imposto_ipi = SubElement(prod_imposto, 'IPI')
-                
-                icms_cEnq = SubElement(imposto_ipi, 'cEnq')
-                icms_cEnq.text = '999'
-                
-                #Imposto Não Tributado
-                ipi_IPINT = SubElement(imposto_ipi, 'IPINT')
-                
-                ipi_CST = SubElement(ipi_IPINT, 'CST')
-                ipi_CST.text = inv_line.ipi_cst
-                
-                imposto_pis = SubElement(prod_imposto, 'PIS')
-                
-                pis_PISAliq = SubElement(imposto_pis, 'PISAliq')
-                
-                pis_CST = SubElement(pis_PISAliq, 'CST')
-                pis_CST.text = inv_line.pis_cst
-                
-                pis_vBC = SubElement(pis_PISAliq, 'vBC')
-                pis_vBC.text = str("%.2f" % inv_line.pis_base)
-                
-                pis_pPIS = SubElement(pis_PISAliq, 'pPIS')
-                pis_pPIS.text = str("%.2f" % inv_line.pis_percent)
-                
-                pis_vPIS = SubElement(pis_PISAliq, 'vPIS')
-                pis_vPIS.text = str("%.2f" % inv_line.pis_value)
-                
-                imposto_cofins = SubElement(prod_imposto, 'COFINS')
-                
-                cofins_COFINSAliq = SubElement(imposto_cofins, 'COFINSAliq')
-                
-                cofins_CST = SubElement(cofins_COFINSAliq, 'CST')
-                cofins_CST.text = inv_line.pis_cst
-                
-                cofins_vBC = SubElement(cofins_COFINSAliq, 'vBC')
-                cofins_vBC.text = str("%.2f" % inv_line.cofins_base)
-                
-                cofins_pCOFINS = SubElement(cofins_COFINSAliq, 'pCOFINS')
-                cofins_pCOFINS.text = str("%.2f" % inv_line.cofins_percent)
-                
-                cofins_vCOFINS = SubElement(cofins_COFINSAliq, 'vCOFINS')
-                cofins_vCOFINS.text = str("%.2f" % inv_line.cofins_value)
-                
-            total = SubElement(infNFe, 'total')
-            total_ICMSTot = SubElement(total, 'ICMSTot')
-            
-            ICMSTot_vBC = SubElement(total_ICMSTot, 'vBC')
-            ICMSTot_vBC.text = str("%.2f" % inv.icms_base)
-            
-            ICMSTot_vICMS = SubElement(total_ICMSTot, 'vICMS')
-            ICMSTot_vICMS.text = str("%.2f" % inv.icms_value)
-            
-            ICMSTot_vBCST = SubElement(total_ICMSTot, 'vBCST')
-            ICMSTot_vBCST.text = '0.00' # TODO 
-            
-            ICMSTot_vST = SubElement(total_ICMSTot, 'vST')
-            ICMSTot_vST.text = '0.00' # TODO
-            
-            ICMSTot_vProd = SubElement(total_ICMSTot, 'vProd')
-            ICMSTot_vProd.text = str("%.2f" % inv.amount_untaxed)
-            
-            ICMSTot_vFrete = SubElement(total_ICMSTot, 'vFrete')
-            ICMSTot_vFrete.text = '0.00' # TODO
-            
-            ICMSTot_vSeg = SubElement(total_ICMSTot, 'vSeg')
-            ICMSTot_vSeg.text = str("%.2f" % inv.amount_insurance) 
-            
-            ICMSTot_vDesc = SubElement(total_ICMSTot, 'vDesc')
-            ICMSTot_vDesc.text = '0.00' # TODO
-            
-            ICMSTot_II = SubElement(total_ICMSTot, 'vII')
-            ICMSTot_II.text = '0.00' # TODO
-            
-            ICMSTot_vIPI = SubElement(total_ICMSTot, 'vIPI')
-            ICMSTot_vIPI.text = str("%.2f" % inv.ipi_value)
-            
-            ICMSTot_vPIS = SubElement(total_ICMSTot, 'vPIS')
-            ICMSTot_vPIS.text = str("%.2f" % inv.pis_value)
-            
-            ICMSTot_vCOFINS = SubElement(total_ICMSTot, 'vCOFINS')
-            ICMSTot_vCOFINS.text = str("%.2f" % inv.cofins_value)
-            
-            ICMSTot_vOutro = SubElement(total_ICMSTot, 'vOutro')
-            ICMSTot_vOutro.text = str("%.2f" % inv.amount_costs)
-            
-            ICMSTot_vNF = SubElement(total_ICMSTot, 'vNF')
-            ICMSTot_vNF.text = str("%.2f" % inv.amount_total)
-            
-            
-            transp = SubElement(infNFe, 'transp')
-            
-            # Modo do Frete: 0- Por conta do emitente; 1- Por conta do destinatário/remetente; 2- Por conta de terceiros; 9- Sem frete (v2.0)
-            transp_modFrete = SubElement(transp, 'modFrete')
-            transp_modFrete.text = '0' #TODO
-            
-            if inv.carrier_id:
-                
-                #Endereço do company
-                carrier_addr = self.pool.get('res.partner').address_get(cr, uid, [inv.carrier_id.partner_id.id], ['default'])
-                carrier_addr_default = self.pool.get('res.partner.address').browse(cr, uid, [carrier_addr['default']])[0]
-                
-                transp_transporta = SubElement(transp, 'transporta')
-                
-                if inv.carrier_id.partner_id.tipo_pessoa == 'J':
-                    transporta_CNPJ = SubElement(transp_transporta, 'CNPJ')
-                    transporta_CNPJ.text = inv.carrier_id.partner_id.cnpj_cpf
-                else:
-                    transporta_CPF = SubElement(transp_transporta, 'CPF')
-                    transporta_CPF.text = inv.carrier_id.partner_id.cnpj_cpf
-                
-                transporta_xNome = SubElement(transp_transporta, 'xNome')
-                if inv.carrier_id.partner_id.legal_name:
-                    transporta_xNome.text = inv.carrier_id.partner_id.legal_name
-                else:
-                    transporta_xNome.text = inv.carrier_id.partner_id.name
-                
-                transporta_IE = SubElement(transp_transporta, 'IE')
-                transporta_IE.text = inv.carrier_id.partner_id.inscr_est
-                
-                transporta_xEnder = SubElement(transp_transporta, 'xEnder')
-                transporta_xEnder.text = carrier_addr_default.street
-                
-                transporta_xMun = SubElement(transp_transporta, 'xMun')
-                transporta_xMun.text = ('%s%s') % (carrier_addr_default.state_id.ibge_code, carrier_addr_default.l10n_br_city_id.ibge_code)
-                
-                transporta_UF = SubElement(transp_transporta, 'UF')
-                transporta_UF.text = carrier_addr_default.state_id.code
-                
-            
-            if inv.number_of_packages:
-                transp_vol = SubElement(transp, 'vol')
-            
-                vol_qVol = SubElement(transp_vol, 'qVol')
-                vol_qVol.text = inv.number_of_packages
-                
-                vol_esp = SubElement(transp_vol, 'esp')
-                vol_esp.text = 'volume' #TODO
-                
-                vol_pesoL = SubElement(transp_vol, 'pesoL')
-                vol_pesoL.text = inv.weight_net
-                
-                vol_pesoB = SubElement(transp_vol, 'pesoB')
-                vol_pesoB.text = inv.weight
-            
-        xml_string = ElementTree.tostring(nfeProc, 'utf-8')
         return xml_string
 
     def _fiscal_position_map(self, cr, uid, ids, partner_address_id, partner_id, company_id, fiscal_operation_category_id):


Follow ups