def _serializar_cliente(self, cliente, tag_raiz='dest', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros(cliente.numero_documento) etree.SubElement(raiz, 'xNome').text = cliente.razao_social etree.SubElement(raiz, 'IE').text = cliente.inscricao_estadual # Endereço endereco = etree.SubElement(raiz, 'enderDest') etree.SubElement(endereco, 'xLgr').text = cliente.endereco_logradouro etree.SubElement(endereco, 'nro').text = cliente.endereco_numero etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro etree.SubElement(endereco, 'cMun').text = cliente.endereco_municipio etree.SubElement(endereco, 'xMun').text = obter_municipio_por_codigo( cliente.endereco_municipio, cliente.endereco_uf, ) etree.SubElement(endereco, 'UF').text = cliente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(cliente.endereco_pais) etree.SubElement(endereco, 'fone').text = cliente.endereco_telefone if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def identificador_unico(self): # Monta 'Id' da tag raiz <infNFe> # Ex.: NFe35080599999090910270550010000000011518005123 key = "%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s" % { 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), 'mes': self.data_emissao.strftime('%m'), 'cnpj': so_numeros(self.emitente.cnpj), 'mod': self.modelo, 'serie': str(self.serie).zfill(3), 'nNF': str(self.numero_nf).zfill(9), 'tpEmis': str(self.forma_emissao), 'cNF': self._codigo_numerico_aleatorio(), } return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s" % { 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), 'mes': self.data_emissao.strftime('%m'), 'cnpj': so_numeros(self.emitente.cnpj), 'mod': self.modelo, 'serie': str(self.serie).zfill(3), 'nNF': str(self.numero_nf).zfill(9), 'tpEmis': str(self.forma_emissao), 'cNF': str(self.codigo_numerico_aleatorio), 'cDV': self._dv_codigo_numerico(key), }
def _serializar_emitente(self, emitente, tag_raiz="emit", retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, "CNPJ").text = so_numeros(emitente.cnpj) etree.SubElement(raiz, "xNome").text = emitente.razao_social etree.SubElement(raiz, "xFant").text = emitente.nome_fantasia etree.SubElement(raiz, "IE").text = emitente.inscricao_estadual # Endereço endereco = etree.SubElement(raiz, "enderEmit") etree.SubElement(endereco, "xLgr").text = emitente.endereco_logradouro etree.SubElement(endereco, "nro").text = emitente.endereco_numero etree.SubElement(endereco, "xCpl").text = emitente.endereco_complemento etree.SubElement(endereco, "xBairro").text = emitente.endereco_bairro etree.SubElement(endereco, "cMun").text = emitente.endereco_municipio etree.SubElement(endereco, "xMun").text = obter_municipio_por_codigo( emitente.endereco_municipio, emitente.endereco_uf ) etree.SubElement(endereco, "UF").text = emitente.endereco_uf etree.SubElement(endereco, "CEP").text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, "cPais").text = emitente.endereco_pais etree.SubElement(endereco, "xPais").text = obter_pais_por_codigo(emitente.endereco_pais) etree.SubElement(endereco, "fone").text = emitente.endereco_telefone if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_emitente(self, emitente, tag_raiz='emit', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, 'CNPJ').text = so_numeros(emitente.cnpj) etree.SubElement(raiz, 'xNome').text = emitente.razao_social etree.SubElement(raiz, 'xFant').text = emitente.nome_fantasia etree.SubElement(raiz, 'IE').text = emitente.inscricao_estadual # Endereço endereco = etree.SubElement(raiz, 'enderEmit') etree.SubElement(endereco, 'xLgr').text = emitente.endereco_logradouro etree.SubElement(endereco, 'nro').text = emitente.endereco_numero etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( emitente.endereco_municipio, emitente.endereco_uf) etree.SubElement(endereco, 'xMun').text = emitente.endereco_municipio etree.SubElement(endereco, 'UF').text = emitente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(emitente.endereco_pais) etree.SubElement(endereco, 'fone').text = emitente.endereco_telefone if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def identificador_unico(self): # Monta 'Id' da tag raiz <infNFe> # Ex.: NFe35080599999090910270550010000000011518005123 key = "%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s"%{ 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), 'mes': self.data_emissao.strftime('%m'), 'cnpj': so_numeros(self.emitente.cnpj), 'mod': self.modelo, 'serie': str(self.serie).zfill(3), 'nNF': str(self.numero_nf).zfill(9), 'tpEmis': str(self.forma_emissao), 'cNF': self._codigo_numerico_aleatorio(), } return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s"%{ 'uf': CODIGOS_ESTADOS[self.uf], 'ano': self.data_emissao.strftime('%y'), 'mes': self.data_emissao.strftime('%m'), 'cnpj': so_numeros(self.emitente.cnpj), 'mod': self.modelo, 'serie': str(self.serie).zfill(3), 'nNF': str(self.numero_nf).zfill(9), 'tpEmis': str(self.forma_emissao), 'cNF': str(self.codigo_numerico_aleatorio), 'cDV': self._dv_codigo_numerico(key), }
def _serializar_consulta(self, consulta, tag_raiz='Consulta', retorna_string=True): raiz = etree.Element(tag_raiz) etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe' etree.SubElement(raiz, 'Versao').text = self._versao etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'CnpjEmpresa').text = so_numeros(consulta.cnpj) etree.SubElement(raiz, 'CnpjEmissor').text = so_numeros(consulta.cnpj) if consulta.numero_inicial: etree.SubElement(raiz, 'NumeroInicial').text = str(consulta.numero_inicial) if consulta.numero_final: etree.SubElement(raiz, 'NumeroFinal').text = str(consulta.numero_final) etree.SubElement(raiz, 'Serie').text = str(consulta.serie) if consulta.chave_acesso: etree.SubElement(raiz, 'ChaveAcesso').text = str(consulta.chave_acesso) if consulta.data_inicial and consulta.data_final: etree.SubElement( raiz, 'DataEmissaoInicial').text = consulta.data_inicial.strftime("%Y-%m-%d") etree.SubElement( raiz, 'DataEmissaoFinal').text = consulta.data_final.strftime("%Y-%m-%d") if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_cliente(self, cliente, tag_raiz='dest', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros( cliente.numero_documento) etree.SubElement(raiz, 'xNome').text = cliente.razao_social etree.SubElement(raiz, 'IE').text = cliente.inscricao_estadual # Endereço endereco = etree.SubElement(raiz, 'enderDest') etree.SubElement(endereco, 'xLgr').text = cliente.endereco_logradouro etree.SubElement(endereco, 'nro').text = cliente.endereco_numero etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( cliente.endereco_municipio, cliente.endereco_uf) etree.SubElement(endereco, 'xMun').text = cliente.endereco_municipio etree.SubElement(endereco, 'UF').text = cliente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo( cliente.endereco_pais) etree.SubElement(endereco, 'fone').text = cliente.endereco_telefone if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_emitente(self, emitente, tag_raiz='emit', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, 'CNPJ').text = so_numeros(emitente.cnpj) etree.SubElement(raiz, 'xNome').text = emitente.razao_social etree.SubElement(raiz, 'xFant').text = emitente.nome_fantasia etree.SubElement(raiz, 'IE').text = emitente.inscricao_estadual # Endereço endereco = etree.SubElement(raiz, 'enderEmit') etree.SubElement(endereco, 'xLgr').text = emitente.endereco_logradouro etree.SubElement(endereco, 'nro').text = emitente.endereco_numero etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro etree.SubElement(endereco, 'cMun').text = emitente.endereco_municipio etree.SubElement(endereco, 'xMun').text = obter_municipio_por_codigo( emitente.endereco_municipio, emitente.endereco_uf, ) etree.SubElement(endereco, 'UF').text = emitente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo( emitente.endereco_pais) etree.SubElement(endereco, 'fone').text = emitente.endereco_telefone if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_empresa(self, empresa, tag_raiz='CadastroEmpresa', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do empresa etree.SubElement(raiz, 'EmpCNPJ').text = so_numeros(empresa.cnpj) etree.SubElement(raiz, 'EmpRazSocial').text = empresa.razao_social etree.SubElement(raiz, 'EmpNomFantasia').text = empresa.nome_fantasia etree.SubElement(raiz, 'EmpApelido').text = empresa.apelido etree.SubElement(raiz, 'EmpIE').text = empresa.inscricao_estadual # Inscricao Municipal if empresa.inscricao_municipal: etree.SubElement(raiz, 'EmpIM').text = so_numeros(empresa.inscricao_municipal) # Endereço etree.SubElement(raiz, 'EmpEndereco').text = empresa.endereco_logradouro etree.SubElement(raiz, 'EmpNumero').text = empresa.endereco_numero if empresa.endereco_complemento: etree.SubElement(raiz, 'EmpComplemento').text = empresa.endereco_complemento etree.SubElement(raiz, 'EmpBairro').text = empresa.endereco_bairro etree.SubElement(raiz, 'MunCodigo').text = obter_codigo_por_municipio( empresa.endereco_municipio, empresa.endereco_uf) etree.SubElement(raiz, 'EmpCEP').text = so_numeros(empresa.endereco_cep) if empresa.endereco_telefone: etree.SubElement(raiz, 'EmpTelefone').text = empresa.endereco_telefone etree.SubElement(raiz, 'EmpCNAE').text = empresa.cnae_fiscal etree.SubElement(raiz, 'EmpCRT').text = empresa.codigo_de_regime_tributario etree.SubElement(raiz, 'EmpIEST').text = '' etree.SubElement(raiz, 'EmpMarca').text = '' etree.SubElement(raiz, 'EmpMarcaExtensao').text = '' etree.SubElement(raiz, 'EmpEmail').text = empresa.email etree.SubElement(raiz, 'EmpTpoEndereco').text = empresa.tipo_endereco # Certificado raiz.append(self._serializar_certificado(empresa, retorna_string=False)) # Usuarios raiz.append(self._serializar_usuario(empresa, retorna_string=False)) # Parametros raiz.append(self._serializar_parametros(empresa, retorna_string=False)) # Licenciamento raiz.append(self._serializar_licenciamento(empresa, retorna_string=False)) if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_emitente(self, emitente, tag_raiz='emit', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, 'CNPJ').text = so_numeros(emitente.cnpj) etree.SubElement(raiz, 'xNome').text = emitente.razao_social etree.SubElement(raiz, 'xFant').text = emitente.nome_fantasia # Endereço endereco = etree.SubElement(raiz, 'enderEmit') etree.SubElement(endereco, 'xLgr').text = emitente.endereco_logradouro etree.SubElement(endereco, 'nro').text = emitente.endereco_numero if emitente.endereco_complemento: etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( emitente.endereco_municipio, emitente.endereco_uf) etree.SubElement(endereco, 'xMun').text = emitente.endereco_municipio etree.SubElement(endereco, 'UF').text = emitente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo( emitente.endereco_pais) if emitente.endereco_telefone: etree.SubElement(endereco, 'fone').text = emitente.endereco_telefone etree.SubElement(raiz, 'IE').text = emitente.inscricao_estadual # Apenas NF-e if emitente.inscricao_estadual_subst_tributaria: etree.SubElement( raiz, 'IEST').text = emitente.inscricao_estadual_subst_tributaria # Inscricao Municipal if emitente.inscricao_municipal: etree.SubElement(raiz, 'IM').text = emitente.inscricao_municipal # Campo Opcional. Pode ser informado quando a Inscrição Municipal (id:C19) for informada. if emitente.cnae_fiscal: etree.SubElement(raiz, 'CNAE').text = emitente.cnae_fiscal etree.SubElement(raiz, 'CRT').text = emitente.codigo_de_regime_tributario if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_transportadora(self, transportadora, tag_raiz='transporta', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da transportadora etree.SubElement(raiz, transportadora.tipo_documento).text = so_numeros( transportadora.numero_documento) etree.SubElement(raiz, 'xNome').text = transportadora.razao_social etree.SubElement(raiz, 'IE').text = transportadora.inscricao_estadual # Endereço etree.SubElement(raiz, 'xEnder').text = transportadora.endereco_logradouro etree.SubElement(raiz, 'cMun').text = transportadora.endereco_municipio etree.SubElement(raiz, 'xMun').text = obter_municipio_por_codigo( transportadora.endereco_municipio, transportadora.endereco_uf, ) etree.SubElement(raiz, 'UF').text = transportadora.endereco_uf if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_entrega_retirada(self, entrega_retirada, tag_raiz='entrega', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da entrega/retirada etree.SubElement(raiz, entrega_retirada.tipo_documento).text = so_numeros( entrega_retirada.numero_documento) # Endereço etree.SubElement(raiz, 'xLgr').text = entrega_retirada.endereco_logradouro etree.SubElement(raiz, 'nro').text = entrega_retirada.endereco_numero etree.SubElement(raiz, 'xCpl').text = entrega_retirada.endereco_complemento etree.SubElement(raiz, 'xBairro').text = entrega_retirada.endereco_bairro etree.SubElement(raiz, 'cMun').text = entrega_retirada.endereco_municipio etree.SubElement(raiz, 'xMun').text = obter_municipio_por_codigo( entrega_retirada.endereco_municipio, entrega_retirada.endereco_uf, ) etree.SubElement(raiz, 'UF').text = entrega_retirada.endereco_uf if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_evento(self, evento, tag_raiz='EnvioEvento', retorna_string=True): raiz = etree.Element(tag_raiz) etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe' etree.SubElement(raiz, 'Versao').text = self._versao # timezone Brasília -03:00 tz = time.strftime("%z") event = etree.SubElement(raiz, 'Evento') etree.SubElement(event, 'NtfCnpjEmissor').text = so_numeros(evento.cnpj) etree.SubElement(event, 'NtfNumero').text = evento.numero etree.SubElement(event, 'NtfSerie').text = evento.serie etree.SubElement(event, 'tpAmb').text = str(self._ambiente) eve_info = etree.SubElement(event, 'EveInf') etree.SubElement(eve_info, 'EveDh').text = evento.data_emissao.strftime( '%Y-%m-%dT%H:%M:%S') etree.SubElement(eve_info, 'EveFusoHorario').text = "{}:{}".format( tz[:-2], tz[-2:]) etree.SubElement(eve_info, 'EveTp').text = evento.tp_evento etree.SubElement(eve_info, 'EvenSeq').text = str(evento.n_seq_evento) eve_det = etree.SubElement(eve_info, 'Evedet') etree.SubElement(eve_det, 'EveDesc').text = evento.descricao etree.SubElement(eve_det, 'EvenProt').text = evento.protocolo etree.SubElement(eve_det, 'EvexJust').text = evento.justificativa if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_cliente(self, cliente, modelo, tag_raiz="dest", retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente (distinatario) etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros(cliente.numero_documento) if not self._so_cpf: if cliente.razao_social: etree.SubElement(raiz, "xNome").text = cliente.razao_social endereco = etree.SubElement(raiz, "enderDest") etree.SubElement(endereco, "xLgr").text = cliente.endereco_logradouro etree.SubElement(endereco, "nro").text = cliente.endereco_numero if cliente.endereco_complemento: etree.SubElement(endereco, "xCpl").text = cliente.endereco_complemento etree.SubElement(endereco, "xBairro").text = cliente.endereco_bairro etree.SubElement(endereco, "cMun").text = obter_codigo_por_municipio( cliente.endereco_municipio, cliente.endereco_uf ) etree.SubElement(endereco, "xMun").text = cliente.endereco_municipio etree.SubElement(endereco, "UF").text = cliente.endereco_uf etree.SubElement(endereco, "CEP").text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, "cPais").text = cliente.endereco_pais etree.SubElement(endereco, "xPais").text = obter_pais_por_codigo(cliente.endereco_pais) if cliente.endereco_telefone: etree.SubElement(endereco, "fone").text = cliente.endereco_telefone # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; 2 – Contribuinte isento de inscrição; 9 – Não Contribuinte if cliente.indicador_ie == 9: # 9 – Não Contribuinte etree.SubElement(raiz, "indIEDest").text = "9" elif (cliente.indicador_ie == 2 or cliente.isento_icms) or cliente.inscricao_estadual.upper() == "ISENTO": etree.SubElement(raiz, "indIEDest").text = "2" else: # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; etree.SubElement(raiz, "indIEDest").text = str(cliente.indicador_ie) etree.SubElement(raiz, "IE").text = cliente.inscricao_estadual # Suframa if cliente.inscricao_suframa: etree.SubElement(raiz, "ISUF").text = cliente.inscricao_suframa # Inscrição Municipal do tomador do serviço if cliente.inscricao_municipal: etree.SubElement(raiz, "IM").text = cliente.inscricao_municipal # E-mail if cliente.email: etree.SubElement(raiz, "email").text = cliente.email if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_cliente(self, cliente, modelo, tag_raiz='dest', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente (distinatario) etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros(cliente.numero_documento) if cliente.razao_social: etree.SubElement(raiz, 'xNome').text = cliente.razao_social if not self._so_cpf: endereco = etree.SubElement(raiz, 'enderDest') etree.SubElement(endereco, 'xLgr').text = cliente.endereco_logradouro etree.SubElement(endereco, 'nro').text = cliente.endereco_numero if cliente.endereco_complemento: etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( cliente.endereco_municipio, cliente.endereco_uf) etree.SubElement(endereco, 'xMun').text = cliente.endereco_municipio etree.SubElement(endereco, 'UF').text = cliente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(cliente.endereco_pais) if cliente.endereco_telefone: etree.SubElement(endereco, 'fone').text = cliente.endereco_telefone #Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; 2 – Contribuinte isento de inscrição; 9 – Não Contribuinte if cliente.isento_icms or cliente.inscricao_estadual.upper() == 'ISENTO': etree.SubElement(raiz, 'indIEDest').text = str(2) etree.SubElement(raiz, 'IE').text = 'ISENTO' elif cliente.indicador_ie == 9: # 9 – Não Contribuinte etree.SubElement(raiz, 'indIEDest').text = str(9) else: # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; etree.SubElement(raiz, 'indIEDest').text = cliente.indicador_ie etree.SubElement(raiz, 'IE').text = cliente.inscricao_estadual # Suframa if cliente.inscricao_suframa: etree.SubElement(raiz, 'ISUF').text = cliente.inscricao_suframa # Inscrição Municipal do tomador do serviço if cliente.inscricao_municipal: etree.SubElement(raiz, 'IM').text = cliente.inscricao_municipal # E-mail if cliente.email: etree.SubElement(raiz, 'email').text = cliente.email if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_cliente(self, cliente, modelo, tag_raiz='dest', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente (distinatario) etree.SubElement(raiz, cliente.tipo_documento).text = so_numeros(cliente.numero_documento) if not self._so_cpf: if cliente.razao_social: etree.SubElement(raiz, 'xNome').text = cliente.razao_social endereco = etree.SubElement(raiz, 'enderDest') etree.SubElement(endereco, 'xLgr').text = cliente.endereco_logradouro etree.SubElement(endereco, 'nro').text = cliente.endereco_numero if cliente.endereco_complemento: etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = cliente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( cliente.endereco_municipio, cliente.endereco_uf) etree.SubElement(endereco, 'xMun').text = cliente.endereco_municipio etree.SubElement(endereco, 'UF').text = cliente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(cliente.endereco_cep) etree.SubElement(endereco, 'cPais').text = cliente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(cliente.endereco_pais) if cliente.endereco_telefone: etree.SubElement(endereco, 'fone').text = cliente.endereco_telefone #Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; 2 – Contribuinte isento de inscrição; 9 – Não Contribuinte if cliente.indicador_ie == 9: # 9 – Não Contribuinte etree.SubElement(raiz, 'indIEDest').text = '9' elif (cliente.indicador_ie == 2 or cliente.isento_icms) or cliente.inscricao_estadual.upper() == 'ISENTO': etree.SubElement(raiz, 'indIEDest').text = '2' else: # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; etree.SubElement(raiz, 'indIEDest').text = str(cliente.indicador_ie) etree.SubElement(raiz, 'IE').text = cliente.inscricao_estadual # Suframa if cliente.inscricao_suframa: etree.SubElement(raiz, 'ISUF').text = cliente.inscricao_suframa # Inscrição Municipal do tomador do serviço if cliente.inscricao_municipal: etree.SubElement(raiz, 'IM').text = cliente.inscricao_municipal # E-mail if cliente.email: etree.SubElement(raiz, 'email').text = cliente.email if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_pulo(self, consulta, tag_raiz='PuloNumeracao', retorna_string=True): raiz = etree.Element(tag_raiz) etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe' etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'CnpjEmpresa').text = so_numeros(consulta.cnpj) etree.SubElement(raiz, 'DocEmtCNPJ').text = so_numeros(consulta.cnpj) etree.SubElement(raiz, 'Serie').text = str(consulta.serie) etree.SubElement( raiz, 'DataEmissaoInicial').text = consulta.data_inicial.strftime("%Y-%m-%d") etree.SubElement( raiz, 'DataEmissaoFinal').text = consulta.data_final.strftime("%Y-%m-%d") if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def inutilizar_faixa_numeracao(self, numero_inicial, numero_final, emitente, certificado, senha, ano=None, serie='1', justificativa=''): post = '/nfeweb/services/nfestatusservico.asmx' # Valores default ano = str(ano or datetime.date.today().year)[-2:] uf = CODIGOS_ESTADOS[emitente.endereco_uf] cnpj = so_numeros(emitente.cnpj) # Identificador da TAG a ser assinada formada com Código da UF + Ano (2 posições) + # CNPJ + modelo + série + nro inicial e nro final precedida do literal “ID” id_unico = 'ID%(uf)s%(ano)s%(cnpj)s%(modelo)s%(serie)s%(num_ini)s%(num_fin)s'%{ 'uf': uf, 'ano': ano, 'cnpj': cnpj, 'modelo': '55', 'serie': serie.zfill(3), 'num_ini': str(numero_inicial).zfill(9), 'num_fin': str(numero_final).zfill(9), } # Monta XML do corpo da requisição # FIXME raiz = etree.Element('inutNFe', xmlns="http://www.portalfiscal.inf.br/nfe", versao="1.07") inf_inut = etree.SubElement(raiz, 'infInut', Id=id_unico) etree.SubElement(inf_inut, 'tpAmb').text = str(self._ambiente) etree.SubElement(inf_inut, 'xServ').text = 'INUTILIZAR' etree.SubElement(inf_inut, 'cUF').text = uf etree.SubElement(inf_inut, 'ano').text = ano etree.SubElement(inf_inut, 'CNPJ').text = emitente.cnpj etree.SubElement(inf_inut, 'mod').text = '55' etree.SubElement(inf_inut, 'serie').text = serie etree.SubElement(inf_inut, 'nNFIni').text = str(numero_inicial) etree.SubElement(inf_inut, 'nNFFin').text = str(numero_final) etree.SubElement(inf_inut, 'xJust').text = justificativa #dados = etree.tostring(raiz, encoding='utf-8', xml_declaration=True) # Efetua assinatura assinatura = self._assinatura(certificado, senha) dados = assinatura.assinar_etree(etree.ElementTree(raiz), retorna_xml=True) # Monta XML para envio da requisição xml = self._construir_xml_soap( metodo='nfeRecepcao2', # XXX tag_metodo='nfeInutilizacaoNF', # XXX cabecalho=self._cabecalho_soap(), dados=dados, ) # Chama método que efetua a requisição POST no servidor SOAP retorno = self._post(post, xml, self._post_header()) # Transforma o retorno em etree # TODO #retorno = etree.parse(StringIO(retorno)) return retorno
def inutilizar_faixa_numeracao(self, numero_inicial, numero_final, emitente, certificado, senha, ano=None, serie='1', justificativa=''): post = '/nfeweb/services/nfestatusservico.asmx' metodo = 'NfeInutilizacao2' # Valores default ano = str(ano or datetime.date.today().year)[-2:] uf = CODIGOS_ESTADOS[emitente.endereco_uf] cnpj = so_numeros(emitente.cnpj) # Identificador da TAG a ser assinada formada com Código da UF + Ano (2 posições) + # CNPJ + modelo + série + nro inicial e nro final precedida do literal “ID” id_unico = 'ID%(uf)s%(ano)s%(cnpj)s%(modelo)s%(serie)s%(num_ini)s%(num_fin)s'%{ 'uf': uf, 'ano': ano, 'cnpj': cnpj, 'modelo': '55', 'serie': serie.zfill(3), 'num_ini': str(numero_inicial).zfill(9), 'num_fin': str(numero_final).zfill(9), } # Monta XML do corpo da requisição # FIXME raiz = etree.Element('inutNFe', xmlns="http://www.portalfiscal.inf.br/nfe", versao="1.07") inf_inut = etree.SubElement(raiz, 'infInut', Id=id_unico) etree.SubElement(inf_inut, 'tpAmb').text = str(self._ambiente) etree.SubElement(inf_inut, 'xServ').text = 'INUTILIZAR' etree.SubElement(inf_inut, 'cUF').text = uf etree.SubElement(inf_inut, 'ano').text = ano etree.SubElement(inf_inut, 'CNPJ').text = emitente.cnpj etree.SubElement(inf_inut, 'mod').text = '55' etree.SubElement(inf_inut, 'serie').text = serie etree.SubElement(inf_inut, 'nNFIni').text = str(numero_inicial) etree.SubElement(inf_inut, 'nNFFin').text = str(numero_final) etree.SubElement(inf_inut, 'xJust').text = justificativa #dados = etree.tostring(raiz, encoding='utf-8', xml_declaration=True) # Efetua assinatura assinatura = self._assinatura(certificado, senha) dados = assinatura.assinar_etree(etree.ElementTree(raiz), retorna_xml=True) # Monta XML para envio da requisição xml = self._construir_xml_soap( metodo='nfeRecepcao2', # XXX tag_metodo='nfeInutilizacaoNF', # XXX cabecalho=self._cabecalho_soap(), dados=dados, ) # Chama método que efetua a requisição POST no servidor SOAP retorno = self._post(post, xml, self._post_header()) # Transforma o retorno em etree # TODO #retorno = etree.parse(StringIO(retorno)) return retorno
def inutilizacao(self, modelo, cnpj, numero_inicial, numero_final, justificativa='', ano=None, serie='1'): """ Serviço destinado ao atendimento de solicitações de inutilização de numeração. :param modelo: Modelo da nota :param cnpj: CNPJda empresa :param numero_inicial: Número inicial :param numero_final: Número final :param justificativa: Justificativa :param ano: Ano :param serie: Série :return: """ # url do servico url = self._get_url(modelo=modelo, consulta='INUTILIZACAO') # Valores default ano = str(ano or datetime.date.today().year)[-2:] uf = CODIGOS_ESTADOS[self.uf.upper()] cnpj = so_numeros(cnpj) # Identificador da TAG a ser assinada formada com Código da UF + Ano (2 posições) + # CNPJ + modelo + série + nro inicial e nro final precedida do literal “ID” id_unico = 'ID%(uf)s%(ano)s%(cnpj)s%(modelo)s%(serie)s%(num_ini)s%(num_fin)s' % { 'uf': uf, 'ano': ano, 'cnpj': cnpj, 'modelo': '55' if modelo == 'nfe' else '65', # 55=NF-e; 65=NFC-e; 'serie': serie.zfill(3), 'num_ini': str(numero_inicial).zfill(9), 'num_fin': str(numero_final).zfill(9), } # Monta XML do corpo da requisição # FIXME raiz = etree.Element('inutNFe', versao=VERSAO_PADRAO, xmlns=NAMESPACE_NFE) inf_inut = etree.SubElement(raiz, 'infInut', Id=id_unico) etree.SubElement(inf_inut, 'tpAmb').text = str(self._ambiente) etree.SubElement(inf_inut, 'xServ').text = 'INUTILIZAR' etree.SubElement(inf_inut, 'cUF').text = uf etree.SubElement(inf_inut, 'ano').text = ano etree.SubElement(inf_inut, 'CNPJ').text = cnpj etree.SubElement(inf_inut, 'mod').text = '55' if modelo == 'nfe' else '65' # 55=NF-e; 65=NFC-e etree.SubElement(inf_inut, 'serie').text = serie etree.SubElement(inf_inut, 'nNFIni').text = str(numero_inicial) etree.SubElement(inf_inut, 'nNFFin').text = str(numero_final) etree.SubElement(inf_inut, 'xJust').text = justificativa # assinatura a1 = AssinaturaA1(self.certificado, self.certificado_senha) xml = a1.assinar(raiz) # Monta XML para envio da requisição xml = self._construir_xml_soap('NFeInutilizacao4', xml) # Faz request no Servidor da Sefaz e retorna resposta return self._post(url, xml)
def _serializar_emitente(self, emitente, tag_raiz="emit", retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, "CNPJ").text = so_numeros(emitente.cnpj) etree.SubElement(raiz, "xNome").text = emitente.razao_social etree.SubElement(raiz, "xFant").text = emitente.nome_fantasia # Endereço endereco = etree.SubElement(raiz, "enderEmit") etree.SubElement(endereco, "xLgr").text = emitente.endereco_logradouro etree.SubElement(endereco, "nro").text = emitente.endereco_numero if emitente.endereco_complemento: etree.SubElement(endereco, "xCpl").text = emitente.endereco_complemento etree.SubElement(endereco, "xBairro").text = emitente.endereco_bairro etree.SubElement(endereco, "cMun").text = obter_codigo_por_municipio( emitente.endereco_municipio, emitente.endereco_uf ) etree.SubElement(endereco, "xMun").text = emitente.endereco_municipio etree.SubElement(endereco, "UF").text = emitente.endereco_uf etree.SubElement(endereco, "CEP").text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, "cPais").text = emitente.endereco_pais etree.SubElement(endereco, "xPais").text = obter_pais_por_codigo(emitente.endereco_pais) if emitente.endereco_telefone: etree.SubElement(endereco, "fone").text = emitente.endereco_telefone etree.SubElement(raiz, "IE").text = emitente.inscricao_estadual # Apenas NF-e if emitente.inscricao_estadual_subst_tributaria: etree.SubElement(raiz, "IEST").text = emitente.inscricao_estadual_subst_tributaria # Inscricao Municipal if emitente.inscricao_municipal: etree.SubElement(raiz, "IM").text = emitente.inscricao_municipal # Campo Opcional. Pode ser informado quando a Inscrição Municipal (id:C19) for informada. if emitente.cnae_fiscal: etree.SubElement(raiz, "CNAE").text = emitente.cnae_fiscal etree.SubElement(raiz, "CRT").text = emitente.codigo_de_regime_tributario if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_emitente(self, emitente, tag_raiz='emit', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do emitente etree.SubElement(raiz, 'CNPJ').text = so_numeros(emitente.cnpj) etree.SubElement(raiz, 'xNome').text = emitente.razao_social etree.SubElement(raiz, 'xFant').text = emitente.nome_fantasia # Endereço endereco = etree.SubElement(raiz, 'enderEmit') etree.SubElement(endereco, 'xLgr').text = emitente.endereco_logradouro etree.SubElement(endereco, 'nro').text = emitente.endereco_numero if emitente.endereco_complemento: etree.SubElement(endereco, 'xCpl').text = emitente.endereco_complemento etree.SubElement(endereco, 'xBairro').text = emitente.endereco_bairro etree.SubElement(endereco, 'cMun').text = obter_codigo_por_municipio( emitente.endereco_municipio, emitente.endereco_uf) etree.SubElement(endereco, 'xMun').text = emitente.endereco_municipio etree.SubElement(endereco, 'UF').text = emitente.endereco_uf etree.SubElement(endereco, 'CEP').text = so_numeros(emitente.endereco_cep) etree.SubElement(endereco, 'cPais').text = emitente.endereco_pais etree.SubElement(endereco, 'xPais').text = obter_pais_por_codigo(emitente.endereco_pais) if emitente.endereco_telefone: etree.SubElement(endereco, 'fone').text = emitente.endereco_telefone etree.SubElement(raiz, 'IE').text = emitente.inscricao_estadual # Apenas NF-e if emitente.inscricao_estadual_subst_tributaria: etree.SubElement(raiz, 'IEST').text = emitente.inscricao_estadual_subst_tributaria # Inscricao Municipal if emitente.inscricao_municipal: etree.SubElement(raiz, 'IM').text = emitente.inscricao_municipal # Campo Opcional. Pode ser informado quando a Inscrição Municipal (id:C19) for informada. if emitente.cnae_fiscal: etree.SubElement(raiz, 'CNAE').text = emitente.cnae_fiscal etree.SubElement(raiz, 'CRT').text = emitente.codigo_de_regime_tributario if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def identificador_unico(self): # Monta 'Id' da tag raiz <infNFe> # Ex.: NFe35080599999090910270550010000000011518005123 return "NFe%(uf)s%(ano)s%(mes)s%(cnpj)s%(mod)s%(serie)s%(nNF)s%(tpEmis)s%(cNF)s%(cDV)s" % { "uf": CODIGOS_ESTADOS[self.uf], "ano": self.data_emissao.strftime("%y"), "mes": self.data_emissao.strftime("%m"), "cnpj": so_numeros(self.emitente.cnpj), "mod": self.modelo, "serie": str(self.serie).zfill(3), "nNF": str(self.numero_nf).zfill(9), "tpEmis": str(self.forma_emissao), "cNF": self.codigo_numerico_aleatorio.zfill(8), "cDV": self.dv_codigo_numerico_aleatorio, }
def _serializar_transportadora(self, transportadora, tag_raiz="transporta", retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da transportadora etree.SubElement(raiz, transportadora.tipo_documento.upper()).text = so_numeros(transportadora.numero_documento) etree.SubElement(raiz, "xNome").text = transportadora.razao_social etree.SubElement(raiz, "IE").text = transportadora.inscricao_estadual # Endereço etree.SubElement(raiz, "xEnder").text = transportadora.endereco_logradouro etree.SubElement(raiz, "xMun").text = transportadora.endereco_municipio etree.SubElement(raiz, "UF").text = transportadora.endereco_uf if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_evento(self, evento, tag_raiz='Inutilizacao', retorna_string=True): raiz = etree.Element(tag_raiz) etree.SubElement(raiz, 'ModeloDocumento').text = 'NFCe' etree.SubElement(raiz, 'Versao').text = self._versao etree.SubElement(raiz, 'tpAmb').text = str(self._ambiente) etree.SubElement(raiz, 'CnpjEmissor').text = so_numeros(evento.cnpj) etree.SubElement(raiz, 'NumeroInicial').text = str(evento.numero_inicial) etree.SubElement(raiz, 'NumeroFinal').text = str(evento.numero_final) etree.SubElement(raiz, 'Serie').text = str(evento.serie) etree.SubElement(raiz, 'Justificativa').text = evento.justificativa if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def _serializar_transportadora(self, transportadora, tag_raiz='transporta', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da transportadora etree.SubElement(raiz, transportadora.tipo_documento).text = so_numeros(transportadora.numero_documento) etree.SubElement(raiz, 'xNome').text = transportadora.razao_social etree.SubElement(raiz, 'IE').text = transportadora.inscricao_estadual # Endereço etree.SubElement(raiz, 'xEnder').text = transportadora.endereco_logradouro etree.SubElement(raiz, 'cMun').text = transportadora.endereco_municipio etree.SubElement(raiz, 'xMun').text = obter_municipio_por_codigo( transportadora.endereco_municipio, transportadora.endereco_uf, ) etree.SubElement(raiz, 'UF').text = transportadora.endereco_uf if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_entrega_retirada(self, entrega_retirada, tag_raiz='entrega', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da entrega/retirada etree.SubElement(raiz, entrega_retirada.tipo_documento).text = so_numeros(entrega_retirada.numero_documento) # Endereço etree.SubElement(raiz, 'xLgr').text = entrega_retirada.endereco_logradouro etree.SubElement(raiz, 'nro').text = entrega_retirada.endereco_numero etree.SubElement(raiz, 'xCpl').text = entrega_retirada.endereco_complemento etree.SubElement(raiz, 'xBairro').text = entrega_retirada.endereco_bairro etree.SubElement(raiz, 'cMun').text = entrega_retirada.endereco_municipio etree.SubElement(raiz, 'xMun').text = obter_municipio_por_codigo( entrega_retirada.endereco_municipio, entrega_retirada.endereco_uf, ) etree.SubElement(raiz, 'UF').text = entrega_retirada.endereco_uf if retorna_string: return etree.tostring(raiz, pretty_print=True) else: return raiz
def _serializar_entrega_retirada(self, entrega_retirada, tag_raiz="entrega", retorna_string=True): raiz = etree.Element(tag_raiz) # Dados da entrega/retirada etree.SubElement(raiz, entrega_retirada.tipo_documento).text = so_numeros(entrega_retirada.numero_documento) # Endereço etree.SubElement(raiz, "xLgr").text = entrega_retirada.endereco_logradouro etree.SubElement(raiz, "nro").text = entrega_retirada.endereco_numero etree.SubElement(raiz, "xCpl").text = entrega_retirada.endereco_complemento etree.SubElement(raiz, "xBairro").text = entrega_retirada.endereco_bairro etree.SubElement(raiz, "cMun").text = entrega_retirada.endereco_municipio etree.SubElement(raiz, "xMun").text = obter_municipio_por_codigo( entrega_retirada.endereco_municipio, entrega_retirada.endereco_uf ) etree.SubElement(raiz, "UF").text = entrega_retirada.endereco_uf if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def test_so_numeros_somente_com_letras(self): self.assertEqual(so_numeros("aabbccdd"), "")
def test_so_numeros_com_letras_e_numeros(self): self.assertEqual(so_numeros("aa223bb"), "223")
def test_so_numeros_valor_string(self): self.assertEqual(so_numeros("223"), "223")
def test_so_numeros_valor_int(self): self.assertEqual(so_numeros(223), "223")
def _serializar_cliente(self, cliente, modelo, tag_raiz='dest', retorna_string=True): raiz = etree.Element(tag_raiz) # Dados do cliente (distinatario) etree.SubElement(raiz, '%s_dest' % (cliente.tipo_documento)).text = so_numeros( cliente.numero_documento) if not self._so_cpf: if cliente.razao_social: etree.SubElement(raiz, 'xNome_dest').text = cliente.razao_social if any([cliente.endereco_logradouro, cliente.endereco_numero, cliente.endereco_bairro, cliente.endereco_municipio, cliente.endereco_uf, cliente.endereco_cep]): endereco = etree.SubElement(raiz, 'enderDest') if cliente.endereco_logradouro: etree.SubElement( endereco, 'xLgr_dest').text = cliente.endereco_logradouro if cliente.endereco_numero: etree.SubElement(endereco, 'nro_dest').text = cliente.endereco_numero if cliente.endereco_complemento: etree.SubElement(endereco, 'xCpl').text = cliente.endereco_complemento if cliente.endereco_bairro: etree.SubElement( endereco, 'xBairro_dest').text = cliente.endereco_bairro if cliente.endereco_municipio and cliente.endereco_uf: etree.SubElement( endereco, 'xMun_dest').text = cliente.endereco_municipio etree.SubElement(endereco, 'UF_dest').text = cliente.endereco_uf etree.SubElement(endereco, 'cMun_dest').text = obter_codigo_por_municipio( cliente.endereco_municipio, cliente.endereco_uf) if cliente.endereco_cep: etree.SubElement(endereco, 'CEP_dest').text = so_numeros( cliente.endereco_cep) etree.SubElement(endereco, 'cPais_dest').text = cliente.endereco_pais etree.SubElement(endereco, 'xPais_dest').text = obter_pais_por_codigo( cliente.endereco_pais) if cliente.endereco_telefone: etree.SubElement(endereco, 'fone_dest').text = so_numeros( cliente.endereco_telefone) # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; # 2 – Contribuinte isento de inscrição; 9 – Não Contribuinte if cliente.indicador_ie == 9: # 9 – Não Contribuinte etree.SubElement(raiz, 'indIEDest').text = '9' elif (cliente.indicador_ie == 2 or cliente.isento_icms) or cliente.inscricao_estadual.upper() == 'ISENTO': etree.SubElement(raiz, 'indIEDest').text = '2' else: # Indicador da IE do destinatário: 1 – Contribuinte ICMSpagamento à vista; etree.SubElement(raiz, 'indIEDest').text = str(cliente.indicador_ie) # E-mail if cliente.email: etree.SubElement(raiz, 'Email_dest').text = cliente.email if retorna_string: return etree.tostring(raiz, encoding="unicode", pretty_print=True) else: return raiz
def test_so_numeros_none(self): self.assertEqual(so_numeros(None), "")