def _serializar_produto_servico(self, produto_servico, retorna_string=True): serial_data = [ "\nI", produto_servico.codigo, produto_servico.ean, produto_servico.descricao, produto_servico.ncm, produto_servico.ex_tipi, produto_servico.cfop, produto_servico.unidade_comercial, formatar_decimal(produto_servico.quantidade_comercial), formatar_decimal(produto_servico.valor_unitario_comercial), formatar_decimal(produto_servico.valor_total_bruto), produto_servico.ean_tributavel, produto_servico.unidade_tributavel, formatar_decimal(produto_servico.quantidade_tributavel), formatar_decimal(produto_servico.valor_unitario_tributavel), formatar_decimal(produto_servico.total_frete) if produto_servico.total_frete else "", formatar_decimal(produto_servico.total_seguro) if produto_servico.total_seguro else "", formatar_decimal(produto_servico.desconto) if produto_servico.desconto else "", formatar_decimal(produto_servico.outras_despesas_acessorias) if produto_servico.outras_despesas_acessorias else "", produto_servico.compoe_valor_total, produto_servico.numero_pedido, produto_servico.numero_do_item, "", # nFCI "\nM", # IMPOSTOS "\nN", # ICMS "\nN06", produto_servico.icms_origem, produto_servico.icms_modalidade_determinacao_bc, produto_servico.icms_valor if produto_servico.icms_valor else "", produto_servico.icms_motivo_desoneracao if produto_servico.icms_valor else "", "\nQ", # PIS "\nQ02", produto_servico.pis_tipo_calculo, formatar_decimal(produto_servico.pis_valor_base_calculo), formatar_decimal(produto_servico.pis_aliquota_percentual), formatar_decimal(produto_servico.pis_valor), "\nS", # COFINS "\nS02", produto_servico.cofins_situacao_tributaria, formatar_decimal(produto_servico.cofins_valor_base_calculo), formatar_decimal(produto_servico.cofins_aliquota_percentual), formatar_decimal(produto_servico.cofins_valor), ] if retorna_string: return "|".join(map(str, serial_data)) return serial_data
def _serializar_nota_fiscal(self, nota_fiscal, retorna_string=True): cod_municipio, municipio = obter_municipio_e_codigo( dict(codigo="", municipio=nota_fiscal.municipio), nota_fiscal.uf ) if nota_fiscal.emitente.endereco_uf == nota_fiscal.cliente.endereco_uf: id_dest = "1" else: id_dest = "2" tz = time.strftime("%z") tz = "{}:{}".format(tz[:-2], tz[-2:]) serial_data = [ "A", "3.10", nota_fiscal.identificador_unico, "\nB", CODIGOS_ESTADOS.get(nota_fiscal.uf, nota_fiscal.uf), nota_fiscal.codigo_numerico_aleatorio, nota_fiscal.natureza_operacao, nota_fiscal.forma_pagamento, nota_fiscal.modelo, nota_fiscal.serie, nota_fiscal.numero_nf, nota_fiscal.data_emissao.strftime("%Y-%m-%dT%H:%M:%S") + tz, nota_fiscal.data_saida_entrada.strftime("%Y-%m-%dT%H:%M:%S") + tz, nota_fiscal.tipo_documento, id_dest, # idDest cod_municipio, nota_fiscal.tipo_impressao_danfe, nota_fiscal.forma_emissao, nota_fiscal.dv_codigo_numerico_aleatorio, self._ambiente, nota_fiscal.finalidade_emissao, nota_fiscal.cliente_final, # indFinal nota_fiscal.indicador_presencial, # indPres nota_fiscal.processo_emissao, "%s %s" % (self._nome_aplicacao, nota_fiscal.versao_processo_emissao), "", # dhCont - Data e Hora da entrada em contingência "", # xJust - Justificativa da entrada em contingência ] serial_data += self._serializar_emitente(nota_fiscal.emitente, retorna_string=False) serial_data += self._serializar_cliente(nota_fiscal.cliente, retorna_string=False) # Produtos e serviços produtos_servicos = enumerate(nota_fiscal.produtos_e_servicos, start=1) for num, produto_servico in produtos_servicos: num_produto = ["\nH", num, "" ""] # Número do produto na lista # End Pipe serial_data += num_produto serial_data += self._serializar_produto_servico(produto_servico, retorna_string=False) serial_data += [ "\nW", # Valores totais NFe, "\nW02", formatar_decimal(nota_fiscal.totais_icms_base_calculo), formatar_decimal(nota_fiscal.totais_icms_total), "", # ICMSDeson formatar_decimal(nota_fiscal.totais_icms_st_base_calculo), formatar_decimal(nota_fiscal.totais_icms_st_total), formatar_decimal(nota_fiscal.totais_icms_total_produtos_e_servicos), formatar_decimal(nota_fiscal.totais_icms_total_frete), formatar_decimal(nota_fiscal.totais_icms_total_seguro), formatar_decimal(nota_fiscal.totais_icms_total_desconto), formatar_decimal(nota_fiscal.totais_icms_total_ii), formatar_decimal(nota_fiscal.totais_icms_total_ipi), formatar_decimal(nota_fiscal.totais_icms_pis), formatar_decimal(nota_fiscal.totais_icms_cofins), formatar_decimal(nota_fiscal.totais_icms_outras_despesas_acessorias), formatar_decimal(nota_fiscal.totais_icms_total_nota), "", # vTotTrib "\nX", nota_fiscal.transporte_modalidade_frete, "\nZ", nota_fiscal.informacoes_adicionais_interesse_fisco, nota_fiscal.informacoes_complementares_interesse_contribuinte, "", # End Pipe ] if retorna_string: try: return "|".join(map(remover_acentos, serial_data)) except TypeError as err: enum_args = "\n".join(map(lambda x: str(x[0]) + " " + str(x[1]), enumerate(serial_data))) message = err.message + "\n" + enum_args raise TypeError(message) return serial_data
def _serializar_nota_fiscal(self, nota_fiscal, retorna_string=True): cod_municipio, municipio = obter_municipio_e_codigo( dict(codigo='', municipio=nota_fiscal.municipio), nota_fiscal.uf) if nota_fiscal.emitente.endereco_uf == nota_fiscal.cliente.endereco_uf: id_dest = '1' else: id_dest = '2' tz = time.strftime("%z") tz = "{}:{}".format(tz[:-2], tz[-2:]) serial_data = [ 'A', '3.10', nota_fiscal.identificador_unico, '\nB', CODIGOS_ESTADOS.get(nota_fiscal.uf, nota_fiscal.uf), nota_fiscal.codigo_numerico_aleatorio, nota_fiscal.natureza_operacao, nota_fiscal.forma_pagamento, nota_fiscal.modelo, nota_fiscal.serie, nota_fiscal.numero_nf, nota_fiscal.data_emissao.strftime('%Y-%m-%dT%H:%M:%S') + tz, nota_fiscal.data_saida_entrada.strftime('%Y-%m-%dT%H:%M:%S') + tz, nota_fiscal.tipo_documento, id_dest, # idDest cod_municipio, nota_fiscal.tipo_impressao_danfe, nota_fiscal.forma_emissao, nota_fiscal.dv_codigo_numerico_aleatorio, self._ambiente, nota_fiscal.finalidade_emissao, nota_fiscal.cliente_final, # indFinal nota_fiscal.indicador_presencial, # indPres nota_fiscal.processo_emissao, '%s %s' % (self._nome_aplicacao, nota_fiscal.versao_processo_emissao), '', # dhCont - Data e Hora da entrada em contingência '', # xJust - Justificativa da entrada em contingência ] serial_data += self._serializar_emitente(nota_fiscal.emitente, retorna_string=False) serial_data += self._serializar_cliente(nota_fiscal.cliente, retorna_string=False) # Produtos e serviços produtos_servicos = enumerate(nota_fiscal.produtos_e_servicos, start=1) for num, produto_servico in produtos_servicos: num_produto = [ '\nH', num, # Número do produto na lista '' '' # End Pipe ] serial_data += num_produto serial_data += self._serializar_produto_servico( produto_servico, retorna_string=False) serial_data += [ '\nW', #Valores totais NFe, '\nW02', formatar_decimal(nota_fiscal.totais_icms_base_calculo), formatar_decimal(nota_fiscal.totais_icms_total), '', # ICMSDeson formatar_decimal(nota_fiscal.totais_icms_st_base_calculo), formatar_decimal(nota_fiscal.totais_icms_st_total), formatar_decimal( nota_fiscal.totais_icms_total_produtos_e_servicos), formatar_decimal(nota_fiscal.totais_icms_total_frete), formatar_decimal(nota_fiscal.totais_icms_total_seguro), formatar_decimal(nota_fiscal.totais_icms_total_desconto), formatar_decimal(nota_fiscal.totais_icms_total_ii), formatar_decimal(nota_fiscal.totais_icms_total_ipi), formatar_decimal(nota_fiscal.totais_icms_pis), formatar_decimal(nota_fiscal.totais_icms_cofins), formatar_decimal( nota_fiscal.totais_icms_outras_despesas_acessorias), formatar_decimal(nota_fiscal.totais_icms_total_nota), '', # vTotTrib '\nX', nota_fiscal.transporte_modalidade_frete, '\nZ', nota_fiscal.informacoes_adicionais_interesse_fisco, nota_fiscal.informacoes_complementares_interesse_contribuinte, '' # End Pipe ] if retorna_string: try: return '|'.join(map(remover_acentos, serial_data)) except TypeError as err: enum_args = '\n'.join( map(lambda x: str(x[0]) + ' ' + str(x[1]), enumerate(serial_data))) message = err.message + '\n' + enum_args raise TypeError(message) return serial_data
def _serializar_produto_servico(self, produto_servico, retorna_string=True): serial_data = [ '\nI', produto_servico.codigo, produto_servico.ean, produto_servico.descricao, produto_servico.ncm, produto_servico.ex_tipi, produto_servico.cfop, produto_servico.unidade_comercial, formatar_decimal(produto_servico.quantidade_comercial), formatar_decimal(produto_servico.valor_unitario_comercial), formatar_decimal(produto_servico.valor_total_bruto), produto_servico.ean_tributavel, produto_servico.unidade_tributavel, formatar_decimal(produto_servico.quantidade_tributavel), formatar_decimal(produto_servico.valor_unitario_tributavel), formatar_decimal(produto_servico.total_frete) if produto_servico.total_frete else '', formatar_decimal(produto_servico.total_seguro) if produto_servico.total_seguro else '', formatar_decimal(produto_servico.desconto) if produto_servico.desconto else '', formatar_decimal(produto_servico.outras_despesas_acessorias) if produto_servico.outras_despesas_acessorias else '', produto_servico.compoe_valor_total, produto_servico.numero_pedido, produto_servico.numero_do_item, '', # nFCI '\nM', #IMPOSTOS '\nN', #ICMS '\nN06', produto_servico.icms_origem, produto_servico.icms_modalidade_determinacao_bc, produto_servico.icms_valor if produto_servico.icms_valor else '', produto_servico.icms_motivo_desoneracao if produto_servico.icms_valor else '', '\nQ', #PIS '\nQ02', produto_servico.pis_tipo_calculo, formatar_decimal(produto_servico.pis_valor_base_calculo), formatar_decimal(produto_servico.pis_aliquota_percentual), formatar_decimal(produto_servico.pis_valor), '\nS', #COFINS '\nS02', produto_servico.cofins_situacao_tributaria, formatar_decimal(produto_servico.cofins_valor_base_calculo), formatar_decimal(produto_servico.cofins_aliquota_percentual), formatar_decimal(produto_servico.cofins_valor) ] if retorna_string: return '|'.join(map(str, serial_data)) return serial_data
def test_formatar_decimal_1_011(self): self.assertEqual(formatar_decimal(1.011), '1.011')
def test_formatar_decimal_1_00(self): self.assertEqual(formatar_decimal(1.00), '1.00')
def _serializar_nota_fiscal(self, nota_fiscal, retorna_string=True): cod_municipio, municipio = obter_municipio_e_codigo( nota_fiscal.municipio, nota_fiscal.uf ) serial_data = [ 'A', '2.00', # Versão da NFe | notasfiscal.modelo está em int() nota_fiscal.identificador_unico, '\nB', CODIGOS_ESTADOS.get(nota_fiscal.uf, nota_fiscal.uf), nota_fiscal.codigo_numerico_aleatorio, nota_fiscal.natureza_operacao, nota_fiscal.forma_pagamento, nota_fiscal.modelo, nota_fiscal.serie, nota_fiscal.numero_nf, nota_fiscal.data_emissao.strftime('%Y-%m-%d'), nota_fiscal.data_saida_entrada.strftime('%Y-%m-%d'), nota_fiscal.hora_saida_entrada.strftime('%H:%M:%S'), nota_fiscal.tipo_documento, cod_municipio, nota_fiscal.tipo_impressao_danfe, nota_fiscal.forma_emissao, nota_fiscal.dv_codigo_numerico_aleatorio, self._ambiente, nota_fiscal.finalidade_emissao, nota_fiscal.processo_emissao, '%s %s' % (self._nome_aplicacao, nota_fiscal.versao_processo_emissao), '', # dhCont - Data e Hora da entrada em contingência '', # xJust - Justificativa da entrada em contingência ] serial_data += self._serializar_emitente(nota_fiscal.emitente, retorna_string=False) serial_data += self._serializar_cliente(nota_fiscal.cliente, retorna_string=False) # Produtos e serviços produtos_servicos = enumerate(nota_fiscal.produtos_e_servicos, start=1) for num, produto_servico in produtos_servicos: num_produto = [ '\nH', num, # Número do produto na lista '' '' # End Pipe ] serial_data += num_produto serial_data += self._serializar_produto_servico(produto_servico, retorna_string=False) serial_data += [ '\nW', #Valores totais NFe, '\nW02', formatar_decimal(nota_fiscal.totais_icms_base_calculo), formatar_decimal(nota_fiscal.totais_icms_total), formatar_decimal(nota_fiscal.totais_icms_st_base_calculo), formatar_decimal(nota_fiscal.totais_icms_st_total), formatar_decimal(nota_fiscal.totais_icms_total_produtos_e_servicos), formatar_decimal(nota_fiscal.totais_icms_total_frete), formatar_decimal(nota_fiscal.totais_icms_total_seguro), formatar_decimal(nota_fiscal.totais_icms_total_desconto), formatar_decimal(nota_fiscal.totais_icms_total_ii), formatar_decimal(nota_fiscal.totais_icms_total_ipi), formatar_decimal(nota_fiscal.totais_icms_pis), formatar_decimal(nota_fiscal.totais_icms_cofins), formatar_decimal(nota_fiscal.totais_icms_outras_despesas_acessorias), formatar_decimal(nota_fiscal.totais_icms_total_nota), '\nX', nota_fiscal.transporte_modalidade_frete, '\nZ', nota_fiscal.informacoes_adicionais_interesse_fisco, nota_fiscal.informacoes_complementares_interesse_contribuinte, '' # End Pipe ] if retorna_string: try: return '|'.join(map(safe_str, serial_data)) except TypeError as err: enum_args = '\n'.join( map( lambda x: str(x[0]) + ' ' + str(x[1]), enumerate(serial_data) ) ) message = err.message + '\n' + enum_args raise TypeError(message) return serial_data