From 195231c94a359c4788ac8219aad5945099bb5545 Mon Sep 17 00:00:00 2001 From: William Benjamim Menezes Sampaio Date: Thu, 15 Aug 2024 14:40:07 -0400 Subject: [PATCH] update 0.3.0 --- README.md | 45 +- docs/index.md | 45 +- febraban_barcode/__init__.py | 252 +++++----- febraban_barcode/base64.py | 14 +- febraban_barcode/constants.py | 60 +++ febraban_barcode/functions.py | 114 ++++- febraban_barcode/image.py | 12 +- febraban_barcode/modulo10.py | 55 --- febraban_barcode/modulo11.py | 53 --- .../{retorno/layout5.py => retorno.py} | 53 +-- febraban_barcode/retorno/__init__.py | 59 --- main.py | 45 +- pyproject.toml | 2 +- tests/test_base64.py | 57 --- tests/test_base64_png_func.py | 33 ++ tests/test_base64_svg_func.py | 33 ++ tests/test_calc_dac_modulo10_func.py | 6 + tests/test_calc_dac_modulo11_func.py | 6 + tests/test_calcular_dac_func.py | 21 + ...y => test_decode_codigo_de_barras_func.py} | 69 +-- ..._gerar_numeracao_codigo_de_barras_func.py} | 39 +- tests/test_html_base64_img_func.py | 35 ++ .../{test_image.py => test_image_png_func.py} | 19 +- tests/test_image_svg_func.py | 32 ++ tests/test_layout5.py | 87 ---- tests/test_linha_digitavel.py | 21 - tests/test_modulo_10.py | 10 - tests/test_modulo_11.py | 10 - tests/test_registro_a_func.py | 84 ++++ tests/test_registro_g_func.py | 436 ++++++++++++++++++ tests/test_registro_z_func.py | 26 ++ 31 files changed, 1207 insertions(+), 626 deletions(-) delete mode 100644 febraban_barcode/modulo10.py delete mode 100644 febraban_barcode/modulo11.py rename febraban_barcode/{retorno/layout5.py => retorno.py} (90%) delete mode 100644 febraban_barcode/retorno/__init__.py delete mode 100644 tests/test_base64.py create mode 100644 tests/test_base64_png_func.py create mode 100644 tests/test_base64_svg_func.py create mode 100644 tests/test_calc_dac_modulo10_func.py create mode 100644 tests/test_calc_dac_modulo11_func.py create mode 100644 tests/test_calcular_dac_func.py rename tests/{test_decode_barcode.py => test_decode_codigo_de_barras_func.py} (56%) rename tests/{test_barcode.py => test_gerar_numeracao_codigo_de_barras_func.py} (63%) create mode 100644 tests/test_html_base64_img_func.py rename tests/{test_image.py => test_image_png_func.py} (53%) create mode 100644 tests/test_image_svg_func.py delete mode 100644 tests/test_layout5.py delete mode 100644 tests/test_linha_digitavel.py delete mode 100644 tests/test_modulo_10.py delete mode 100644 tests/test_modulo_11.py create mode 100644 tests/test_registro_a_func.py create mode 100644 tests/test_registro_g_func.py create mode 100644 tests/test_registro_z_func.py diff --git a/README.md b/README.md index b9df429..646993c 100644 --- a/README.md +++ b/README.md @@ -37,21 +37,24 @@ from datetime import date from tinydb import TinyDB -from febraban_barcode import barcode, decode_barcode, linha_digitavel -from febraban_barcode.base64 import base64_png, base64_svg, html_base64_teste +from febraban_barcode import ( + calcular_dac, + decode_codigo_de_barras, + gerar_numeracao_codigo_de_barras, +) +from febraban_barcode.base64 import base64_png, base64_svg, html_base64_img from febraban_barcode.constants import ( MODULO10_VALOR_EFETIVO, PRODUTO_ARRECADACAO, SEGMENTO_TELECOMUNICACOES, ) +from febraban_barcode.functions import calc_dac_modulo10, calc_dac_modulo11 from febraban_barcode.image import image_png, image_svg -from febraban_barcode.modulo10 import modulo10 -from febraban_barcode.modulo11 import modulo11 if __name__ == '__main__': # Gera o código de barras - codigo_de_barras = barcode( + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -63,46 +66,46 @@ if __name__ == '__main__': print(codigo_de_barras) # Gera linha digitável - txt_linha_digitavel = linha_digitavel(codigo_de_barras) - print(txt_linha_digitavel) + codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + print(codigo_de_barras_com_dac) # Decodifica o código de barras - decode_barcode(codigo_de_barras) + decode_codigo_de_barras(codigo_de_barras) # Decodifica o código de barras e grava em um json db = TinyDB('db.json') - db.insert(decode_barcode(txt_linha_digitavel, True)) + db.insert(decode_codigo_de_barras(codigo_de_barras_com_dac, True)) # Calcula o módulo 10 de 01230067896 - print(modulo10('01230067896')) # 3 + print(calc_dac_modulo10('01230067896')) # 3 # Calcula o módulo 11 de 01230067896 - print(modulo11('01230067896')) # 0 + print(calc_dac_modulo11('01230067896')) # 0 # Gera o código de barras em PNG image_png( - filename='barcode.png', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.png', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em SVG image_svg( - filename='barcode.svg', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.svg', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em base64 PNG para utilização em html - html_base64_teste( + html_base64_img( 'index1.html', - base64_png(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_png(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) # Gera o código de barras em base64 SVG para utilização em html - html_base64_teste( + html_base64_img( 'index2.html', - base64_svg(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_svg(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) ``` diff --git a/docs/index.md b/docs/index.md index b9df429..646993c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -37,21 +37,24 @@ from datetime import date from tinydb import TinyDB -from febraban_barcode import barcode, decode_barcode, linha_digitavel -from febraban_barcode.base64 import base64_png, base64_svg, html_base64_teste +from febraban_barcode import ( + calcular_dac, + decode_codigo_de_barras, + gerar_numeracao_codigo_de_barras, +) +from febraban_barcode.base64 import base64_png, base64_svg, html_base64_img from febraban_barcode.constants import ( MODULO10_VALOR_EFETIVO, PRODUTO_ARRECADACAO, SEGMENTO_TELECOMUNICACOES, ) +from febraban_barcode.functions import calc_dac_modulo10, calc_dac_modulo11 from febraban_barcode.image import image_png, image_svg -from febraban_barcode.modulo10 import modulo10 -from febraban_barcode.modulo11 import modulo11 if __name__ == '__main__': # Gera o código de barras - codigo_de_barras = barcode( + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -63,46 +66,46 @@ if __name__ == '__main__': print(codigo_de_barras) # Gera linha digitável - txt_linha_digitavel = linha_digitavel(codigo_de_barras) - print(txt_linha_digitavel) + codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + print(codigo_de_barras_com_dac) # Decodifica o código de barras - decode_barcode(codigo_de_barras) + decode_codigo_de_barras(codigo_de_barras) # Decodifica o código de barras e grava em um json db = TinyDB('db.json') - db.insert(decode_barcode(txt_linha_digitavel, True)) + db.insert(decode_codigo_de_barras(codigo_de_barras_com_dac, True)) # Calcula o módulo 10 de 01230067896 - print(modulo10('01230067896')) # 3 + print(calc_dac_modulo10('01230067896')) # 3 # Calcula o módulo 11 de 01230067896 - print(modulo11('01230067896')) # 0 + print(calc_dac_modulo11('01230067896')) # 0 # Gera o código de barras em PNG image_png( - filename='barcode.png', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.png', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em SVG image_svg( - filename='barcode.svg', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.svg', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em base64 PNG para utilização em html - html_base64_teste( + html_base64_img( 'index1.html', - base64_png(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_png(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) # Gera o código de barras em base64 SVG para utilização em html - html_base64_teste( + html_base64_img( 'index2.html', - base64_svg(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_svg(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) ``` diff --git a/febraban_barcode/__init__.py b/febraban_barcode/__init__.py index 1c9d724..bd3ead0 100644 --- a/febraban_barcode/__init__.py +++ b/febraban_barcode/__init__.py @@ -1,6 +1,6 @@ from datetime import date, datetime -from febraban_barcode.functions import clear_barcode, dac_func +from febraban_barcode import functions as fn from .constants import ( MODULO10_QUANTIDADE_MOEDA, @@ -17,11 +17,9 @@ SEGMENTO_SANEAMENTO, SEGMENTO_TELECOMUNICACOES, ) -from .modulo10 import digito_verificador_modulo10 -from .modulo11 import digito_verificador_modulo11 -def barcode( +def gerar_numeracao_codigo_de_barras( produto: int, segmento: int, codigo_moeda: int, @@ -29,6 +27,7 @@ def barcode( id_empresa_orgao: str, dados_campo_livre: str = '', vencimento: date | None = None, + incluir_dac: bool = False, ) -> str: """ Identificação da Empresa/Órgão: @@ -79,37 +78,39 @@ def barcode( codigo_moeda == MODULO10_VALOR_EFETIVO or codigo_moeda == MODULO10_QUANTIDADE_MOEDA ): - digito_verificador = digito_verificador_modulo10(parte1, parte2) + digito_verificador = fn.calc_dac_modulo10(str(parte1) + str(parte2)) elif ( codigo_moeda == MODULO11_VALOR_EFETIVO or codigo_moeda == MODULO11_QUANTIDADE_MOEDA ): - digito_verificador = digito_verificador_modulo11(parte1, parte2) + digito_verificador = fn.calc_dac_modulo11(str(parte1) + str(parte2)) if digito_verificador == '': raise Exception('Dígito verificador inválido.') - numeracao += parte1 + digito_verificador + parte2 + numeracao += parte1 + str(digito_verificador) + parte2 - # print(len(numeracao)) + if incluir_dac is False: + return numeracao - return numeracao + return calcular_dac(numeracao) -def linha_digitavel(barcode: str) -> str: - barcode_limpo = clear_barcode(barcode) - if len(barcode_limpo) != 44: +def calcular_dac(codigo_de_barras: str) -> str: + codigo_de_barras_limpo = fn.limpar_codigo_de_barras(codigo_de_barras) + if len(codigo_de_barras_limpo) != 44: raise Exception('Código de barra inválido.') - codigo_moeda = int(barcode_limpo[2]) - modulo = dac_func(codigo_moeda) + codigo_moeda = int(codigo_de_barras_limpo[2]) + modulo = fn.dac_func(codigo_moeda) if modulo is None: raise Exception('Código moeda inválido.') str_linha_digitavel = '' partes = [ - barcode_limpo[i : i + 11] for i in range(0, len(barcode_limpo), 11) + codigo_de_barras_limpo[i : i + 11] + for i in range(0, len(codigo_de_barras_limpo), 11) ] for parte in partes: @@ -118,29 +119,31 @@ def linha_digitavel(barcode: str) -> str: return str_linha_digitavel.strip() -def decode_barcode(barcode: str, as_dict: bool = False) -> None | dict: - barcode_limpo = clear_barcode(barcode) +def decode_codigo_de_barras( + codigo_de_barras: str, as_dict: bool = False +) -> None | dict: + codigo_de_barras_limpo = fn.limpar_codigo_de_barras(codigo_de_barras) dac_blocos = [] - if len(barcode_limpo) == 48: - barcode_digitos = [i for i in barcode_limpo] - dac_blocos.append(barcode_digitos.pop(47)) - dac_blocos.append(barcode_digitos.pop(35)) - dac_blocos.append(barcode_digitos.pop(23)) - dac_blocos.append(barcode_digitos.pop(11)) + if len(codigo_de_barras_limpo) == 48: + codigo_de_barras_digitos = [i for i in codigo_de_barras_limpo] + dac_blocos.append(codigo_de_barras_digitos.pop(47)) + dac_blocos.append(codigo_de_barras_digitos.pop(35)) + dac_blocos.append(codigo_de_barras_digitos.pop(23)) + dac_blocos.append(codigo_de_barras_digitos.pop(11)) dac_blocos.reverse() - barcode_44 = ''.join(barcode_digitos) - elif len(barcode_limpo) == 44: - barcode_44 = barcode_limpo + codigo_de_barras_44 = ''.join(codigo_de_barras_digitos) + elif len(codigo_de_barras_limpo) == 44: + codigo_de_barras_44 = codigo_de_barras_limpo else: raise Exception('Código de Barras inválido.') - modulo = dac_func(barcode_44[2]) + modulo = fn.dac_func(codigo_de_barras_44[2]) - barcode_dict = { - 'barcode_44': barcode_44, - 'barcode_desc': barcode_44, + codigo_de_barras_dict = { + 'codigo_de_barras_44': codigo_de_barras_44, + 'codigo_de_barras_desc': codigo_de_barras_44, 'identificador_produto': '', 'identificador_produto_desc': '', 'identificador_segmento': '', @@ -161,84 +164,111 @@ def decode_barcode(barcode: str, as_dict: bool = False) -> None | dict: 'erro': [], } - barcode_str = 'Código de Barras: ' - partes = [barcode_44[i : i + 11] for i in range(0, len(barcode_44), 11)] + codigo_de_barras_str = 'Código de Barras: ' + partes = [ + codigo_de_barras_44[i : i + 11] + for i in range(0, len(codigo_de_barras_44), 11) + ] for i in range(len(partes)): dac = '' if len(dac_blocos) > 0: dac = '-' + dac_blocos[i] - barcode_str += partes[i] + dac + ' ' - barcode_dict['barcode_desc'] = barcode_str + codigo_de_barras_str += partes[i] + dac + ' ' + codigo_de_barras_dict['codigo_de_barras_desc'] = codigo_de_barras_str - if int(barcode_44[0]) == PRODUTO_ARRECADACAO: - barcode_dict['identificador_produto'] = barcode_44[0] - barcode_dict[ + if int(codigo_de_barras_44[0]) == PRODUTO_ARRECADACAO: + codigo_de_barras_dict['identificador_produto'] = codigo_de_barras_44[0] + codigo_de_barras_dict[ 'identificador_produto_desc' ] = 'Identificação do Produto: (8) Arrecadação.' else: raise Exception('Identificação do Produto inválido.') - if int(barcode_44[1]) == SEGMENTO_PREFEITURA: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + if int(codigo_de_barras_44[1]) == SEGMENTO_PREFEITURA: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (1) Prefeituras.' - elif int(barcode_44[1]) == SEGMENTO_SANEAMENTO: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_SANEAMENTO: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (2) Saneamento.' - elif int(barcode_44[1]) == SEGMENTO_ENERGIA_ELETRICA_GAS: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_ENERGIA_ELETRICA_GAS: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (3) Energia Elétrica e Gás.' - elif int(barcode_44[1]) == SEGMENTO_TELECOMUNICACOES: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_TELECOMUNICACOES: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (4) Telecomunicações.' - elif int(barcode_44[1]) == SEGMENTO_ORGAOS_GOVERNAMENTAIS: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_ORGAOS_GOVERNAMENTAIS: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (5) Órgãos Governamentais.' - elif int(barcode_44[1]) == SEGMENTO_DEMAIS: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_DEMAIS: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (6) Carnes e Assemelhados ou demais Empresas.' - elif int(barcode_44[1]) == SEGMENTO_MULTAS_TRANSITO: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_MULTAS_TRANSITO: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (7) Multas de trânsito.' - elif int(barcode_44[1]) == SEGMENTO_EXCLUSIVO_BANCO: - barcode_dict['identificador_segmento'] = barcode_44[1] - barcode_dict[ + elif int(codigo_de_barras_44[1]) == SEGMENTO_EXCLUSIVO_BANCO: + codigo_de_barras_dict['identificador_segmento'] = codigo_de_barras_44[ + 1 + ] + codigo_de_barras_dict[ 'identificador_segmento_desc' ] = 'Identificação do Segmento: (9) Uso exclusivo do banco.' else: raise Exception('Identificação do Segmento inválido.') - if int(barcode_44[2]) == MODULO10_VALOR_EFETIVO: - barcode_dict['identificador_valor_ref'] = barcode_44[2] - barcode_dict[ + if int(codigo_de_barras_44[2]) == MODULO10_VALOR_EFETIVO: + codigo_de_barras_dict['identificador_valor_ref'] = codigo_de_barras_44[ + 2 + ] + codigo_de_barras_dict[ 'identificador_valor_ref_desc' ] = 'Identificador de Valor Efetivo ou Referência: (6) Valor a ser cobrado efetivamente em reais com dígito verificador calculado pelo módulo 10 na quarta posição do código de barras.' - elif int(barcode_44[2]) == MODULO10_QUANTIDADE_MOEDA: - barcode_dict['identificador_valor_ref'] = barcode_44[2] - barcode_dict[ + elif int(codigo_de_barras_44[2]) == MODULO10_QUANTIDADE_MOEDA: + codigo_de_barras_dict['identificador_valor_ref'] = codigo_de_barras_44[ + 2 + ] + codigo_de_barras_dict[ 'identificador_valor_ref_desc' ] = 'Identificador de Valor Efetivo ou Referência: (7) Quantidade de moeda\n\tZeros – somente na impossibilidade de utilizar o valor;\n\tValor a ser reajustado por um índice\n\tcom dígito verificador calculado pelo módulo 10 na quarta posição do código de barras.' - elif int(barcode_44[2]) == MODULO11_VALOR_EFETIVO: - barcode_dict['identificador_valor_ref'] = barcode_44[2] - barcode_dict[ + elif int(codigo_de_barras_44[2]) == MODULO11_VALOR_EFETIVO: + codigo_de_barras_dict['identificador_valor_ref'] = codigo_de_barras_44[ + 2 + ] + codigo_de_barras_dict[ 'identificador_valor_ref_desc' ] = 'Identificador de Valor Efetivo ou Referência: (8) Valor a ser cobrado efetivamente em reais com dígito verificador calculado pelo módulo 11 na quarta posição do código de barras.' - elif int(barcode_44[2]) == MODULO11_QUANTIDADE_MOEDA: - barcode_dict['identificador_valor_ref'] = barcode_44[2] - barcode_dict[ + elif int(codigo_de_barras_44[2]) == MODULO11_QUANTIDADE_MOEDA: + codigo_de_barras_dict['identificador_valor_ref'] = codigo_de_barras_44[ + 2 + ] + codigo_de_barras_dict[ 'identificador_valor_ref_desc' ] = 'Identificador de Valor Efetivo ou Referência: (9) Quantidade de moeda\n\tZeros – somente na impossibilidade de utilizar o valor; \n\tValor a ser reajustado por um índice\n\tcom dígito verificador calculado pelo módulo 11 na quarta posição do código de barras.' else: @@ -246,93 +276,107 @@ def decode_barcode(barcode: str, as_dict: bool = False) -> None | dict: 'Identificador de Valor Efetivo ou Referência inválido.' ) - digito_verificador_geral = barcode_44[3] - barcode_dict['digito_verificador'] = digito_verificador_geral - barcode_dict['digito_verificador_desc'] = ( + digito_verificador_geral = codigo_de_barras_44[3] + codigo_de_barras_dict['digito_verificador'] = digito_verificador_geral + codigo_de_barras_dict['digito_verificador_desc'] = ( 'Dígito verificador geral (módulo 10 ou 11): ' + digito_verificador_geral ) - dac = modulo(barcode_44[0:3] + barcode_44[4:44]) + dac = modulo(codigo_de_barras_44[0:3] + codigo_de_barras_44[4:44]) if dac != int(digito_verificador_geral): - barcode_dict['erro'].append('Erro: Dígito verificador geral inválido.') - barcode_dict['valido'] = False + codigo_de_barras_dict['erro'].append( + 'Erro: Dígito verificador geral inválido.' + ) + codigo_de_barras_dict['valido'] = False - valor_efetivo_ref = barcode_44[4:15] + valor_efetivo_ref = codigo_de_barras_44[4:15] - if int(barcode_44[2]) in (MODULO10_VALOR_EFETIVO, MODULO11_VALOR_EFETIVO): - barcode_dict['valor_efetivo_referencia'] = ( + if int(codigo_de_barras_44[2]) in ( + MODULO10_VALOR_EFETIVO, + MODULO11_VALOR_EFETIVO, + ): + codigo_de_barras_dict['valor_efetivo_referencia'] = ( float(valor_efetivo_ref) / 100 ) - barcode_dict[ + codigo_de_barras_dict[ 'valor_efetivo_referencia_desc' ] = 'Valor Efetivo: R$ ' + str(float(valor_efetivo_ref) / 100).replace( '.', ',' ) else: - barcode_dict['valor_efetivo_referencia'] = int(valor_efetivo_ref) - barcode_dict[ + codigo_de_barras_dict['valor_efetivo_referencia'] = int( + valor_efetivo_ref + ) + codigo_de_barras_dict[ 'valor_efetivo_referencia_desc' ] = 'Valor Referência: ' + str(int(valor_efetivo_ref)) - identificador_empresa = barcode_44[15:19] - barcode_dict['identificador_empresa_orgao'] = identificador_empresa + identificador_empresa = codigo_de_barras_44[15:19] + codigo_de_barras_dict[ + 'identificador_empresa_orgao' + ] = identificador_empresa - if int(barcode_44[1]) == SEGMENTO_EXCLUSIVO_BANCO: - barcode_dict['identificador_empresa_orgao_desc'] = ( + if int(codigo_de_barras_44[1]) == SEGMENTO_EXCLUSIVO_BANCO: + codigo_de_barras_dict['identificador_empresa_orgao_desc'] = ( 'Identificação da Empresa/Órgão: ' + identificador_empresa + ' código de compensação.' ) else: - barcode_dict['identificador_empresa_orgao_desc'] = ( + codigo_de_barras_dict['identificador_empresa_orgao_desc'] = ( 'Identificação da Empresa/Órgão: ' + identificador_empresa + ' código de Febraban.' ) - campo_livre = barcode_44[19:44] + campo_livre = codigo_de_barras_44[19:44] try: vencimento = datetime.strptime(campo_livre[0:8], '%Y%m%d') - barcode_dict['vencimento'] = vencimento.strftime('%Y-%m-%d') - barcode_dict[ + codigo_de_barras_dict['vencimento'] = vencimento.strftime('%Y-%m-%d') + codigo_de_barras_dict[ 'vencimento_desc' ] = 'Data de Vencimento: ' + vencimento.strftime('%d/%m/%Y') except Exception: - barcode_dict['vencimento_desc'] = 'Data de Vencimento: Não informado.' + codigo_de_barras_dict[ + 'vencimento_desc' + ] = 'Data de Vencimento: Não informado.' - barcode_dict['campo_livre'] = campo_livre - barcode_dict['campo_livre_desc'] = ( + codigo_de_barras_dict['campo_livre'] = campo_livre + codigo_de_barras_dict['campo_livre_desc'] = ( 'Campo Livre (25 posições): ' + campo_livre ) - partes = [barcode_44[i : i + 11] for i in range(0, len(barcode_44), 11)] + partes = [ + codigo_de_barras_44[i : i + 11] + for i in range(0, len(codigo_de_barras_44), 11) + ] - if len(barcode_limpo) == 48: + if len(codigo_de_barras_limpo) == 48: for i in range(len(partes)): if modulo(partes[i]) != int(dac_blocos[i]): - barcode_dict['erro'].append( + codigo_de_barras_dict['erro'].append( 'Erro: DAC (Dígito de Auto-Conferência) do bloco ' + str(i + 1) + ' inválido.' ) - barcode_dict['valido'] = False + codigo_de_barras_dict['valido'] = False if as_dict: return { key: value - for (key, value) in barcode_dict.items() + for (key, value) in codigo_de_barras_dict.items() if '_desc' not in key } - for key, desc in barcode_dict.items(): + for key, desc in codigo_de_barras_dict.items(): if '_desc' in key: print(desc) - if not barcode_dict['valido']: + if not codigo_de_barras_dict['valido']: print('STATUS: Inválido.') - for erro in barcode_dict['erro']: + for erro in codigo_de_barras_dict['erro']: print(' -> ' + erro) else: print('STATUS: Válido.') diff --git a/febraban_barcode/base64.py b/febraban_barcode/base64.py index 84e2d14..4769204 100644 --- a/febraban_barcode/base64.py +++ b/febraban_barcode/base64.py @@ -6,9 +6,11 @@ from barcode.writer import ImageWriter, SVGWriter -def base64_png(barcode: str, linha_digitavel: str | None = None) -> str: +def base64_png( + codigo_de_barras: str, linha_digitavel: str | None = None +) -> str: data = BytesIO() - ITF(barcode, writer=ImageWriter()).write( + ITF(codigo_de_barras, writer=ImageWriter()).write( data, options={ 'module_width': float(0.3), @@ -24,9 +26,11 @@ def base64_png(barcode: str, linha_digitavel: str | None = None) -> str: return 'data:image/png;charset=utf-8;base64,' + b64 -def base64_svg(barcode: str, linha_digitavel: str | None = None) -> str: +def base64_svg( + codigo_de_barras: str, linha_digitavel: str | None = None +) -> str: data = BytesIO() - ITF(barcode, writer=SVGWriter()).write( + ITF(codigo_de_barras, writer=SVGWriter()).write( data, options={ 'module_width': float(0.3), @@ -42,6 +46,6 @@ def base64_svg(barcode: str, linha_digitavel: str | None = None) -> str: return 'data:image/svg+xml;charset=utf-8;base64,' + b64 -def html_base64_teste(filename: str | Path, base64: str) -> None: +def html_base64_img(filename: str | Path, base64: str) -> None: with open(filename, 'w') as f: f.write("".format(base64)) diff --git a/febraban_barcode/constants.py b/febraban_barcode/constants.py index bca42cc..60c75c3 100644 --- a/febraban_barcode/constants.py +++ b/febraban_barcode/constants.py @@ -13,3 +13,63 @@ MODULO10_QUANTIDADE_MOEDA = 7 MODULO11_VALOR_EFETIVO = 8 MODULO11_QUANTIDADE_MOEDA = 9 + +ARRECADACAO_GUICHE_COM_FATURA = '1' +"""1 – Guichê de Caixa com fatura/guia de arrecadação""" + +ARRECADACAO_ELETRONICA_COM_FATURA = '2' +""" +2 – Arrecadação Eletrônica com fatura/guia de arrecadação (terminais de +auto - atendimento, ATM, home/office banking) +""" + +ARRECADACAO_INTERNET_COM_FATURA = '3' +"""3 – Internet com fatura/guia de arrecadação""" + +ARRECADACAO_OUTROS_COM_FATURA = '4' +"""4 – Outros meios com fatura/guia de arrecadação""" + +ARRECADACAO_CORRESPONDENTES_COM_FATURA = '5' +"""5 – Correspondentes bancários com fatura/guia de arrecadação""" + +ARRECADACAO_TELEFONE_COM_FATURA = '6' +"""6 – Telefone com fatura/guia de arrecadação""" + +ARRECADACAO_LOTERICAS_COM_FATURA = '7' +"""7 – Casas lotéricas com fatura/guia de arrecadação""" + +ARRECADACAO_GUICHE_SEM_FATURA = 'a' +"""a – Guichê de Caixa sem fatura/guia de arrecadação""" + +ARRECADACAO_ELETRONICA_SEM_FATURA = 'b' +""" +b – Arrecadação Eletrônica sem fatura/guia de arrecadação (terminais de +auto - atendimento, ATM, home/office banking) +""" + +ARRECADACAO_INTERNET_SEM_FATURA = 'c' +"""c – Internet sem fatura/guia de arrecadação""" + +ARRECADACAO_CORRESPONDENTES_SEM_FATURA = 'd' +"""d – Correspondentes bancários sem fatura/guia de arrecadação""" + +ARRECADACAO_TELEFONE_SEM_FATURA = 'e' +"""e – Telefone sem fatura/guia de arrecadação""" + +ARRECADACAO_OUTROS_SEM_FATURA = 'f' +"""f – Outros meios sem fatura/guia de arrecadação""" + +ARRECADACAO_LOTERICAS_SEM_FATURA = 'g' +"""g – Casas lotéricas sem fatura/guia de arrecadação""" + +PAGAMENTO_DINHEIRO = '1' +"""1 – Dinheiro""" + +PAGAMENTO_CHEQUE = '2' +"""2 – Cheque""" + +PAGAMENTO_NAO_IDENTIFICADO = '3' +"""3 – Não identificado/outras formas""" + +PAGAMENTO_OUTRAS_FORMAS = '3' +"""3 – Não identificado/outras formas""" diff --git a/febraban_barcode/functions.py b/febraban_barcode/functions.py index 12fd4c5..52f4e9b 100644 --- a/febraban_barcode/functions.py +++ b/febraban_barcode/functions.py @@ -6,8 +6,110 @@ MODULO11_QUANTIDADE_MOEDA, MODULO11_VALOR_EFETIVO, ) -from .modulo10 import modulo10 -from .modulo11 import modulo11 + + +def calc_dac_modulo10(sequencia: str) -> int: + """ + O DAC (Dígito de Auto-Conferência) módulo 10, de um número é calculado + multiplicando cada algarismo, pela seqüência de multiplicadores 2, 1, + 2, 1, ... posicionados da direita para a esquerda. + + A soma dos algarismos do produto é dividida por 10 e o DAC será a diferença + entre o divisor (10) e o resto da divisão: + + DAC = 10 - (resto da divisão) + + Observação: quando o resto da divisão for 0 (zero), o DAC calculado é o + 0 (zero). + + EXEMPLO + + Calcular o DAC módulo 10 da seguinte seqüência de números: 01230067896. + A fórmula do cálculo é: + + 1. Multiplicação pela sequência 2, 1, 2, 1, ... da direita para a + esquerda. + 0 1 2 3 0 0 6 7 8 9 6 + X 2 1 2 1 2 1 2 1 2 1 2 + 0 1 4 3 0 0 12 7 16 9 12 + + 2. Soma dos dígitos do produto + 0 + 1 + 4 + 3 + 0 + 0 + 1 + 2 + 7 + 1 + 6 + 9 + 1 + 2 = 37 + Observação: Cada dígito deverá ser somado individualmente. + + 3. Divisão do resultado da soma acima por 10 + 37 : 10 = 3 , resto = 7 + DAC = 10 - (resto da divisão), portando 10 - 7 = 3 + + O DAC da seqüência numérica é igual a “3”. + """ + multiplicador_atual = 2 + soma = 0 + + for element in sequencia[::-1]: + resultado = int(element) * multiplicador_atual + multiplicador_atual = 1 if multiplicador_atual == 2 else 2 + if resultado < 10: + soma += resultado + else: + soma += int(resultado / 10) + soma += resultado % 10 + + resto_divisao = soma % 10 + if resto_divisao == 0: + return resto_divisao + return 10 - resto_divisao + + +def calc_dac_modulo11(sequencia) -> int: + """ + O DAC (Dígito de Auto-Conferência) módulo 11, de um número é calculado + multiplicando cada algarismo, pela seqüência de multiplicadores 2,3,4,5,6, + 7,8,9,2,3,4.... + posicionados da direita para a esquerda. + + A soma dos produtos dessa multiplicação é dividida por 11, obtém-se o + resto da divisão, este resto deve ser subtraído de 11, o produto da + subtração é o DAC. + + Observação: Quando o resto da divisão for igual a 0 ou 1, atribuí-se ao DV + o digito “0”, e quando for 10, atribuí-se ao DV o digito “1”. + + EXEMPLO + + Calcular o DAC módulo 11 da seguinte seqüência de números: 01230067896. + A fórmula do cálculo é: + + 1. Multiplicação pela seqüência 2,3,4,5,6,7,8,9, 2,3,4 da direita + para a esquerda. + 0 1 2 3 0 0 6 7 8 9 6 + X 4 3 2 9 8 7 6 5 4 3 2 + 0 3 4 27 0 0 36 35 32 27 12 + + 2. Soma dos produtos da multiplicação: + 0 + 3 + 4 + 27 + 0 + 0 + 36 + 35 + 32 + 27 + 12 = 176 + + 3. Divisão do resultado da soma acima por 11 + 176 : 11 = 16 , resto = 0 + + O DAC da seqüência numérica é igual a “0”. + """ + multiplicador_atual = 2 + soma = 0 + + for element in sequencia[::-1]: + resultado = int(element) * multiplicador_atual + multiplicador_atual = ( + 2 if multiplicador_atual == 9 else multiplicador_atual + 1 + ) + soma += resultado + + resto_divisao = soma % 11 + if resto_divisao in (0, 1): + return 0 + if resto_divisao == 10: + return 1 + return 11 - resto_divisao def dac_func(codigo_moeda): @@ -16,14 +118,14 @@ def dac_func(codigo_moeda): int(codigo_moeda) == MODULO10_VALOR_EFETIVO or int(codigo_moeda) == MODULO10_QUANTIDADE_MOEDA ): - modulo = modulo10 + modulo = calc_dac_modulo10 elif ( int(codigo_moeda) == MODULO11_VALOR_EFETIVO or int(codigo_moeda) == MODULO11_QUANTIDADE_MOEDA ): - modulo = modulo11 + modulo = calc_dac_modulo11 return modulo -def clear_barcode(barcode): - return ''.join([i for i in re.findall(r'\d+', barcode)]) +def limpar_codigo_de_barras(codigo_de_barras: str): + return ''.join([i for i in re.findall(r'\d+', codigo_de_barras)]) diff --git a/febraban_barcode/image.py b/febraban_barcode/image.py index 0fdea2a..3f06974 100644 --- a/febraban_barcode/image.py +++ b/febraban_barcode/image.py @@ -7,10 +7,12 @@ def image_png( - filename: str | Path, barcode: str, linha_digitavel: str | None = None + filename: str | Path, + codigo_de_barras: str, + linha_digitavel: str | None = None, ) -> None: data = BytesIO() - ITF(barcode, writer=ImageWriter()).write( + ITF(codigo_de_barras, writer=ImageWriter()).write( data, options={ 'module_width': float(0.3), @@ -26,10 +28,12 @@ def image_png( def image_svg( - filename: str | Path, barcode: str, linha_digitavel: str | None = None + filename: str | Path, + codigo_de_barras: str, + linha_digitavel: str | None = None, ) -> None: with open(filename, 'wb') as f: - ITF(barcode, writer=SVGWriter()).write( + ITF(codigo_de_barras, writer=SVGWriter()).write( f, options={ 'module_width': float(0.3), diff --git a/febraban_barcode/modulo10.py b/febraban_barcode/modulo10.py deleted file mode 100644 index 346d8ec..0000000 --- a/febraban_barcode/modulo10.py +++ /dev/null @@ -1,55 +0,0 @@ -def modulo10(sequencia) -> int: - """ - O DAC (Dígito de Auto-Conferência) módulo 10, de um número é calculado - multiplicando cada algarismo, pela seqüência de multiplicadores 2, 1, - 2, 1, ... posicionados da direita para a esquerda. - - A soma dos algarismos do produto é dividida por 10 e o DAC será a diferença - entre o divisor (10) e o resto da divisão: - - DAC = 10 - (resto da divisão) - - Observação: quando o resto da divisão for 0 (zero), o DAC calculado é o - 0 (zero). - - EXEMPLO - - Calcular o DAC módulo 10 da seguinte seqüência de números: 01230067896. - A fórmula do cálculo é: - - 1. Multiplicação pela sequência 2, 1, 2, 1, ... da direita para a - esquerda. - 0 1 2 3 0 0 6 7 8 9 6 - X 2 1 2 1 2 1 2 1 2 1 2 - 0 1 4 3 0 0 12 7 16 9 12 - - 2. Soma dos dígitos do produto - 0 + 1 + 4 + 3 + 0 + 0 + 1 + 2 + 7 + 1 + 6 + 9 + 1 + 2 = 37 - Observação: Cada dígito deverá ser somado individualmente. - - 3. Divisão do resultado da soma acima por 10 - 37 : 10 = 3 , resto = 7 - DAC = 10 - (resto da divisão), portando 10 - 7 = 3 - - O DAC da seqüência numérica é igual a “3”. - """ - multiplicador_atual = 2 - soma = 0 - - for element in sequencia[::-1]: - resultado = int(element) * multiplicador_atual - multiplicador_atual = 1 if multiplicador_atual == 2 else 2 - if resultado < 10: - soma += resultado - else: - soma += int(resultado / 10) - soma += resultado % 10 - - resto_divisao = soma % 10 - if resto_divisao == 0: - return resto_divisao - return 10 - resto_divisao - - -def digito_verificador_modulo10(campo1: str, campo2: str) -> str: - return str(modulo10(campo1 + campo2)) diff --git a/febraban_barcode/modulo11.py b/febraban_barcode/modulo11.py deleted file mode 100644 index 0734d5a..0000000 --- a/febraban_barcode/modulo11.py +++ /dev/null @@ -1,53 +0,0 @@ -def modulo11(sequencia) -> int: - """ - O DAC (Dígito de Auto-Conferência) módulo 11, de um número é calculado - multiplicando cada algarismo, pela seqüência de multiplicadores 2,3,4,5,6, - 7,8,9,2,3,4.... - posicionados da direita para a esquerda. - - A soma dos produtos dessa multiplicação é dividida por 11, obtém-se o - resto da divisão, este resto deve ser subtraído de 11, o produto da - subtração é o DAC. - - Observação: Quando o resto da divisão for igual a 0 ou 1, atribuí-se ao DV - o digito “0”, e quando for 10, atribuí-se ao DV o digito “1”. - - EXEMPLO - - Calcular o DAC módulo 11 da seguinte seqüência de números: 01230067896. - A fórmula do cálculo é: - - 1. Multiplicação pela seqüência 2,3,4,5,6,7,8,9, 2,3,4 da direita - para a esquerda. - 0 1 2 3 0 0 6 7 8 9 6 - X 4 3 2 9 8 7 6 5 4 3 2 - 0 3 4 27 0 0 36 35 32 27 12 - - 2. Soma dos produtos da multiplicação: - 0 + 3 + 4 + 27 + 0 + 0 + 36 + 35 + 32 + 27 + 12 = 176 - - 3. Divisão do resultado da soma acima por 11 - 176 : 11 = 16 , resto = 0 - - O DAC da seqüência numérica é igual a “0”. - """ - multiplicador_atual = 2 - soma = 0 - - for element in sequencia[::-1]: - resultado = int(element) * multiplicador_atual - multiplicador_atual = ( - 2 if multiplicador_atual == 9 else multiplicador_atual + 1 - ) - soma += resultado - - resto_divisao = soma % 11 - if resto_divisao in (0, 1): - return 0 - if resto_divisao == 10: - return 1 - return 11 - resto_divisao - - -def digito_verificador_modulo11(campo1: str, campo2: str) -> str: - return str(modulo11(campo1 + campo2)) diff --git a/febraban_barcode/retorno/layout5.py b/febraban_barcode/retorno.py similarity index 90% rename from febraban_barcode/retorno/layout5.py rename to febraban_barcode/retorno.py index f7f2da2..36f24c7 100644 --- a/febraban_barcode/retorno/layout5.py +++ b/febraban_barcode/retorno.py @@ -1,21 +1,6 @@ from datetime import datetime -from . import ( - ARRECADACAO_CORRESPONDENTES_COM_FATURA, - ARRECADACAO_CORRESPONDENTES_SEM_FATURA, - ARRECADACAO_ELETRONICA_COM_FATURA, - ARRECADACAO_ELETRONICA_SEM_FATURA, - ARRECADACAO_GUICHE_COM_FATURA, - ARRECADACAO_GUICHE_SEM_FATURA, - ARRECADACAO_INTERNET_COM_FATURA, - ARRECADACAO_INTERNET_SEM_FATURA, - ARRECADACAO_LOTERICAS_COM_FATURA, - ARRECADACAO_LOTERICAS_SEM_FATURA, - ARRECADACAO_OUTROS_COM_FATURA, - ARRECADACAO_OUTROS_SEM_FATURA, - ARRECADACAO_TELEFONE_COM_FATURA, - ARRECADACAO_TELEFONE_SEM_FATURA, -) +from febraban_barcode import constants as c def registro_A( @@ -137,7 +122,7 @@ def registro_G( conta_digito='0', data_pagamento='', data_credito='', - barcode_44=' ', + codigo_de_barras_44=' ', valor_recebido=0.0, valor_tarifa=0.0, nsr=None, @@ -157,7 +142,7 @@ def registro_G( conta_digito (str, optional): G.02 - Identificação do dígito da conta da empresa/órgão creditada. Defaults to '0'. data_pagamento (str, optional): G.03 - Data de pagamento (AAAA/MM/DD). Defaults to ''. data_credito (str, optional): G.04 - Data de crédito (AAAA/MM/DD). Defaults to ''. - barcode_44 (str, optional): G.05 - Código de Barras (44 posições). Defaults to ' '. + codigo_de_barras_44 (str, optional): G.05 - Código de Barras (44 posições). Defaults to ' '. valor_recebido (float, optional): G.06 - Valor recebido. Defaults to 0.0. valor_tarifa (float, optional): G.07 - Valor da tarifa referente a cada comprovante arrecadado (será informado desde que acordado entre as partes). Defaults to 0.0. nsr (_type_, optional): G.08 - NSR - Número Seqüencial de Registro. Defaults to None. @@ -240,11 +225,11 @@ def registro_G( ) registro_g += data_credito - if len(barcode_44) != 44: + if len(codigo_de_barras_44) != 44: raise Exception( 'Campo G.05 Inválido. O campo deve ser um código de barras de 44 posições.' ) - registro_g += barcode_44 + registro_g += codigo_de_barras_44 if not isinstance(valor_recebido, float): raise Exception('Campo G.06 Inválido. O campo deve ser um float.') @@ -268,20 +253,20 @@ def registro_G( raise Exception('Campo G.10 Inválido. O campo deve ter o tamanho 1.') if forma_arrecadacao not in [ - ARRECADACAO_GUICHE_COM_FATURA, - ARRECADACAO_ELETRONICA_COM_FATURA, - ARRECADACAO_INTERNET_COM_FATURA, - ARRECADACAO_OUTROS_COM_FATURA, - ARRECADACAO_CORRESPONDENTES_COM_FATURA, - ARRECADACAO_TELEFONE_COM_FATURA, - ARRECADACAO_LOTERICAS_COM_FATURA, - ARRECADACAO_GUICHE_SEM_FATURA, - ARRECADACAO_ELETRONICA_SEM_FATURA, - ARRECADACAO_INTERNET_SEM_FATURA, - ARRECADACAO_CORRESPONDENTES_SEM_FATURA, - ARRECADACAO_TELEFONE_SEM_FATURA, - ARRECADACAO_OUTROS_SEM_FATURA, - ARRECADACAO_LOTERICAS_SEM_FATURA, + c.ARRECADACAO_GUICHE_COM_FATURA, + c.ARRECADACAO_ELETRONICA_COM_FATURA, + c.ARRECADACAO_INTERNET_COM_FATURA, + c.ARRECADACAO_OUTROS_COM_FATURA, + c.ARRECADACAO_CORRESPONDENTES_COM_FATURA, + c.ARRECADACAO_TELEFONE_COM_FATURA, + c.ARRECADACAO_LOTERICAS_COM_FATURA, + c.ARRECADACAO_GUICHE_SEM_FATURA, + c.ARRECADACAO_ELETRONICA_SEM_FATURA, + c.ARRECADACAO_INTERNET_SEM_FATURA, + c.ARRECADACAO_CORRESPONDENTES_SEM_FATURA, + c.ARRECADACAO_TELEFONE_SEM_FATURA, + c.ARRECADACAO_OUTROS_SEM_FATURA, + c.ARRECADACAO_LOTERICAS_SEM_FATURA, ]: raise Exception('Campo G.10 Inválido.') diff --git a/febraban_barcode/retorno/__init__.py b/febraban_barcode/retorno/__init__.py deleted file mode 100644 index 4f1c8cd..0000000 --- a/febraban_barcode/retorno/__init__.py +++ /dev/null @@ -1,59 +0,0 @@ -ARRECADACAO_GUICHE_COM_FATURA = '1' -"""1 – Guichê de Caixa com fatura/guia de arrecadação""" - -ARRECADACAO_ELETRONICA_COM_FATURA = '2' -""" -2 – Arrecadação Eletrônica com fatura/guia de arrecadação (terminais de -auto - atendimento, ATM, home/office banking) -""" - -ARRECADACAO_INTERNET_COM_FATURA = '3' -"""3 – Internet com fatura/guia de arrecadação""" - -ARRECADACAO_OUTROS_COM_FATURA = '4' -"""4 – Outros meios com fatura/guia de arrecadação""" - -ARRECADACAO_CORRESPONDENTES_COM_FATURA = '5' -"""5 – Correspondentes bancários com fatura/guia de arrecadação""" - -ARRECADACAO_TELEFONE_COM_FATURA = '6' -"""6 – Telefone com fatura/guia de arrecadação""" - -ARRECADACAO_LOTERICAS_COM_FATURA = '7' -"""7 – Casas lotéricas com fatura/guia de arrecadação""" - -ARRECADACAO_GUICHE_SEM_FATURA = 'a' -"""a – Guichê de Caixa sem fatura/guia de arrecadação""" - -ARRECADACAO_ELETRONICA_SEM_FATURA = 'b' -""" -b – Arrecadação Eletrônica sem fatura/guia de arrecadação (terminais de -auto - atendimento, ATM, home/office banking) -""" - -ARRECADACAO_INTERNET_SEM_FATURA = 'c' -"""c – Internet sem fatura/guia de arrecadação""" - -ARRECADACAO_CORRESPONDENTES_SEM_FATURA = 'd' -"""d – Correspondentes bancários sem fatura/guia de arrecadação""" - -ARRECADACAO_TELEFONE_SEM_FATURA = 'e' -"""e – Telefone sem fatura/guia de arrecadação""" - -ARRECADACAO_OUTROS_SEM_FATURA = 'f' -"""f – Outros meios sem fatura/guia de arrecadação""" - -ARRECADACAO_LOTERICAS_SEM_FATURA = 'g' -"""g – Casas lotéricas sem fatura/guia de arrecadação""" - -PAGAMENTO_DINHEIRO = '1' -"""1 – Dinheiro""" - -PAGAMENTO_CHEQUE = '2' -"""2 – Cheque""" - -PAGAMENTO_NAO_IDENTIFICADO = '3' -"""3 – Não identificado/outras formas""" - -PAGAMENTO_OUTRAS_FORMAS = '3' -"""3 – Não identificado/outras formas""" diff --git a/main.py b/main.py index ae60332..e69388f 100644 --- a/main.py +++ b/main.py @@ -2,21 +2,24 @@ from tinydb import TinyDB -from febraban_barcode import barcode, decode_barcode, linha_digitavel -from febraban_barcode.base64 import base64_png, base64_svg, html_base64_teste +from febraban_barcode import ( + calcular_dac, + decode_codigo_de_barras, + gerar_numeracao_codigo_de_barras, +) +from febraban_barcode.base64 import base64_png, base64_svg, html_base64_img from febraban_barcode.constants import ( MODULO10_VALOR_EFETIVO, PRODUTO_ARRECADACAO, SEGMENTO_TELECOMUNICACOES, ) +from febraban_barcode.functions import calc_dac_modulo10, calc_dac_modulo11 from febraban_barcode.image import image_png, image_svg -from febraban_barcode.modulo10 import modulo10 -from febraban_barcode.modulo11 import modulo11 if __name__ == '__main__': # Gera o código de barras - codigo_de_barras = barcode( + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -28,44 +31,44 @@ print(codigo_de_barras) # Gera linha digitável - txt_linha_digitavel = linha_digitavel(codigo_de_barras) - print(txt_linha_digitavel) + codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + print(codigo_de_barras_com_dac) # Decodifica o código de barras - decode_barcode(codigo_de_barras) + decode_codigo_de_barras(codigo_de_barras) # Decodifica o código de barras e grava em um json db = TinyDB('db.json') - db.insert(decode_barcode(txt_linha_digitavel, True)) + db.insert(decode_codigo_de_barras(codigo_de_barras_com_dac, True)) # Calcula o módulo 10 de 01230067896 - print(modulo10('01230067896')) # 3 + print(calc_dac_modulo10('01230067896')) # 3 # Calcula o módulo 11 de 01230067896 - print(modulo11('01230067896')) # 0 + print(calc_dac_modulo11('01230067896')) # 0 # Gera o código de barras em PNG image_png( - filename='barcode.png', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.png', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em SVG image_svg( - filename='barcode.svg', - barcode=codigo_de_barras, - linha_digitavel=txt_linha_digitavel, + filename='codigo_de_barras.svg', + codigo_de_barras=codigo_de_barras, + linha_digitavel=codigo_de_barras_com_dac, ) # Gera o código de barras em base64 PNG para utilização em html - html_base64_teste( + html_base64_img( 'index1.html', - base64_png(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_png(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) # Gera o código de barras em base64 SVG para utilização em html - html_base64_teste( + html_base64_img( 'index2.html', - base64_svg(codigo_de_barras, linha_digitavel=txt_linha_digitavel), + base64_svg(codigo_de_barras, linha_digitavel=codigo_de_barras_com_dac), ) diff --git a/pyproject.toml b/pyproject.toml index 109216a..3dc9d33 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,7 +5,7 @@ license = "MIT" name = "febraban-barcode" packages = [{include = "febraban_barcode"}] readme = "README.md" -version = "0.2.0" +version = "0.3.0" [tool.poetry.urls] "Código" = "https://github.com/WilliamSampaio/febraban_barcode" diff --git a/tests/test_base64.py b/tests/test_base64.py deleted file mode 100644 index 92329a5..0000000 --- a/tests/test_base64.py +++ /dev/null @@ -1,57 +0,0 @@ -import os -import tempfile -from datetime import date - -import pytest - -from febraban_barcode import barcode, linha_digitavel -from febraban_barcode.base64 import base64_png, base64_svg, html_base64_teste -from febraban_barcode.constants import ( - MODULO10_VALOR_EFETIVO, - PRODUTO_ARRECADACAO, - SEGMENTO_TELECOMUNICACOES, -) - -codigo_de_barras = barcode( - produto=PRODUTO_ARRECADACAO, - segmento=SEGMENTO_TELECOMUNICACOES, - codigo_moeda=MODULO10_VALOR_EFETIVO, - valor=10.99, - id_empresa_orgao='1042', - vencimento=date(2023, 12, 31), - dados_campo_livre='54321', -) - -txt_linha_digitavel = linha_digitavel(codigo_de_barras) - - -def test_base64_png(): - base64 = base64_png(codigo_de_barras, txt_linha_digitavel) - assert isinstance(base64, str) - - -def test_base64_png_codigo_de_barras_invalido(): - with pytest.raises(Exception): - base64_png('zzzzzz', txt_linha_digitavel) - - -def test_base64_svg(): - base64 = base64_svg(codigo_de_barras, txt_linha_digitavel) - assert isinstance(base64, str) - - -def test_base64_svg_codigo_de_barras_invalido(): - with pytest.raises(Exception): - base64_svg('zzzzzz', txt_linha_digitavel) - - -def test_html_base64_teste(): - base64 = base64_png(codigo_de_barras, txt_linha_digitavel) - temp_filename = tempfile.NamedTemporaryFile().name - html_base64_teste(temp_filename, base64) - contains = False - with open(temp_filename) as f: - if base64 in f.read(): - contains = True - os.remove(temp_filename) - assert contains is True diff --git a/tests/test_base64_png_func.py b/tests/test_base64_png_func.py new file mode 100644 index 0000000..593adde --- /dev/null +++ b/tests/test_base64_png_func.py @@ -0,0 +1,33 @@ +from datetime import date + +import pytest + +from febraban_barcode import calcular_dac, gerar_numeracao_codigo_de_barras +from febraban_barcode.base64 import base64_png +from febraban_barcode.constants import ( + MODULO10_VALOR_EFETIVO, + PRODUTO_ARRECADACAO, + SEGMENTO_TELECOMUNICACOES, +) + +codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=PRODUTO_ARRECADACAO, + segmento=SEGMENTO_TELECOMUNICACOES, + codigo_moeda=MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', +) + +codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + + +def test_base64_png(): + base64 = base64_png(codigo_de_barras, codigo_de_barras_com_dac) + assert isinstance(base64, str) + + +def test_numeracao_codigo_de_barras_invalido(): + with pytest.raises(Exception): + base64_png('zzzzzz', codigo_de_barras_com_dac) diff --git a/tests/test_base64_svg_func.py b/tests/test_base64_svg_func.py new file mode 100644 index 0000000..95af0e2 --- /dev/null +++ b/tests/test_base64_svg_func.py @@ -0,0 +1,33 @@ +from datetime import date + +import pytest + +from febraban_barcode import calcular_dac, gerar_numeracao_codigo_de_barras +from febraban_barcode.base64 import base64_svg +from febraban_barcode.constants import ( + MODULO10_VALOR_EFETIVO, + PRODUTO_ARRECADACAO, + SEGMENTO_TELECOMUNICACOES, +) + +codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=PRODUTO_ARRECADACAO, + segmento=SEGMENTO_TELECOMUNICACOES, + codigo_moeda=MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', +) + +codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + + +def test_base64_svg(): + base64 = base64_svg(codigo_de_barras, codigo_de_barras_com_dac) + assert isinstance(base64, str) + + +def test_numeracao_codigo_de_barras_invalido(): + with pytest.raises(Exception): + base64_svg('zzzzzz', codigo_de_barras_com_dac) diff --git a/tests/test_calc_dac_modulo10_func.py b/tests/test_calc_dac_modulo10_func.py new file mode 100644 index 0000000..3ffe9c3 --- /dev/null +++ b/tests/test_calc_dac_modulo10_func.py @@ -0,0 +1,6 @@ +from febraban_barcode.functions import calc_dac_modulo10 + + +def test_calculo_do_digito_de_auto_conferencia_modulo10(): + assert calc_dac_modulo10('01230067896') == 3 + assert calc_dac_modulo10('00000000000') == 0 diff --git a/tests/test_calc_dac_modulo11_func.py b/tests/test_calc_dac_modulo11_func.py new file mode 100644 index 0000000..5ad1d22 --- /dev/null +++ b/tests/test_calc_dac_modulo11_func.py @@ -0,0 +1,6 @@ +from febraban_barcode.functions import calc_dac_modulo11 + + +def test_calculo_do_digito_de_auto_conferencia_modulo11(): + assert calc_dac_modulo11('01230067896') == 0 + assert calc_dac_modulo11('01201611227') == 3 diff --git a/tests/test_calcular_dac_func.py b/tests/test_calcular_dac_func.py new file mode 100644 index 0000000..ee4f16e --- /dev/null +++ b/tests/test_calcular_dac_func.py @@ -0,0 +1,21 @@ +import pytest + +from febraban_barcode import calcular_dac + + +def test_calcular_digito_de_auto_conferencia_da_numeracao(): + result = calcular_dac('84670000000109910422023123100000000000054321') + assert ( + result + == '84670000000 9 10991042202 0 31231000000 4 00000054321 5' + ) + + +def test_numeracao_informada_invalida(): + with pytest.raises(Exception): + calcular_dac('8467000000010991042202312310000000000005432') + + +def test_codigo_moeda_invalido(): + with pytest.raises(Exception): + calcular_dac('84070000000109910422023123100000000000054321') diff --git a/tests/test_decode_barcode.py b/tests/test_decode_codigo_de_barras_func.py similarity index 56% rename from tests/test_decode_barcode.py rename to tests/test_decode_codigo_de_barras_func.py index 1cc5697..b4b4913 100644 --- a/tests/test_decode_barcode.py +++ b/tests/test_decode_codigo_de_barras_func.py @@ -1,6 +1,9 @@ import pytest -from febraban_barcode import barcode, decode_barcode +from febraban_barcode import ( + decode_codigo_de_barras, + gerar_numeracao_codigo_de_barras, +) from febraban_barcode.constants import ( MODULO10_QUANTIDADE_MOEDA, MODULO10_VALOR_EFETIVO, @@ -18,46 +21,48 @@ ) -def test_decode_barcode_as_dict_true(): - barcode_dict = decode_barcode( - '84670000000109910422023123100000000000054321', True +def test_decode_codigo_de_barras(): + codigo_de_barras = decode_codigo_de_barras( + '84670000000109910422023123100000000000054321' ) - assert isinstance(barcode_dict, dict) + assert codigo_de_barras is None -def test_decode_barcode_as_dict_false(): - barcode = decode_barcode('84670000000109910422023123100000000000054321') +def test_decode_codigo_de_barras_campo_as_dict_true(): + codigo_de_barras_dict = decode_codigo_de_barras( + '84670000000109910422023123100000000000054321', True + ) - assert barcode is None + assert isinstance(codigo_de_barras_dict, dict) -def test_decode_barcode_as_dict_true_len_48(): - barcode_dict = decode_barcode( +def test_numeracao_com_dac_tamanho_48(): + codigo_de_barras_dict = decode_codigo_de_barras( '84670000000 9 10991042202 0 31231000000 4 00000054321 5', True ) - assert isinstance(barcode_dict, dict) + assert isinstance(codigo_de_barras_dict, dict) -def test_decode_barcode_invalid_barcode(): +def test_numeracao_invalida(): with pytest.raises(Exception): - decode_barcode( + decode_codigo_de_barras( '84670000000 9 10991042202 0 31231000000 4 00000054321' ) -def test_decode_barcode_indentificacao_produto_invalido(): +def test_indentificacao_produto_invalido(): with pytest.raises(Exception): - decode_barcode('04670000000109910422023123100000000000054321') + decode_codigo_de_barras('04670000000109910422023123100000000000054321') -def test_decode_barcode_segmento_invalido(): +def test_segmento_invalido(): with pytest.raises(Exception): - decode_barcode('80670000000109910422023123100000000000054321') + decode_codigo_de_barras('80670000000109910422023123100000000000054321') -def test_decode_barcode_segmentos_validos(): +def test_segmentos_validos(): for segmento in [ SEGMENTO_PREFEITURA, SEGMENTO_SANEAMENTO, @@ -69,7 +74,7 @@ def test_decode_barcode_segmentos_validos(): SEGMENTO_EXCLUSIVO_BANCO, ]: assert isinstance( - decode_barcode( + decode_codigo_de_barras( f'8{str(segmento)}670000000109910422023123100000000000054321', True, ), @@ -77,12 +82,12 @@ def test_decode_barcode_segmentos_validos(): ) -def test_decode_barcode_valor_efetivo_ou_referencia_invalido(): +def test_valor_efetivo_ou_referencia_invalido(): with pytest.raises(Exception): - decode_barcode('84070000000109910422023123100000000000054321') + decode_codigo_de_barras('84070000000109910422023123100000000000054321') -def test_decode_barcode_valor_efetivo_ou_referencia_validos(): +def test_efetivo_ou_referencia_validos(): for valor in [ MODULO10_QUANTIDADE_MOEDA, MODULO10_VALOR_EFETIVO, @@ -90,7 +95,7 @@ def test_decode_barcode_valor_efetivo_ou_referencia_validos(): MODULO11_VALOR_EFETIVO, ]: assert isinstance( - decode_barcode( + decode_codigo_de_barras( f'84{str(valor)}70000000109910422023123100000000000054321', True, ), @@ -98,8 +103,8 @@ def test_decode_barcode_valor_efetivo_ou_referencia_validos(): ) -def test_decode_barcode_data_vencimento_nao_informada(): - codigo_de_barras = barcode( +def test_data_vencimento_nao_informada(): + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -108,19 +113,19 @@ def test_decode_barcode_data_vencimento_nao_informada(): vencimento=None, dados_campo_livre='54321', ) - result = decode_barcode(codigo_de_barras, True) + result = decode_codigo_de_barras(codigo_de_barras, True) assert result['vencimento'] is None -def test_decode_barcode_dac_invalido(): - barcode_dict = decode_barcode( +def test_dac_invalido(): + codigo_de_barras_dict = decode_codigo_de_barras( '84670000000 9 10991042202 1 31231000000 4 00000054321 5', True ) - assert barcode_dict['valido'] is False + assert codigo_de_barras_dict['valido'] is False -def test_decode_barcode_dac_invalido_as_dict_false(): - barcode_dict = decode_barcode( +def test_dac_invalido_com_campo_as_dict_false(): + codigo_de_barras_dict = decode_codigo_de_barras( '84670000000 9 10991042202 1 31231000000 4 00000054321 5' ) - assert barcode_dict is None + assert codigo_de_barras_dict is None diff --git a/tests/test_barcode.py b/tests/test_gerar_numeracao_codigo_de_barras_func.py similarity index 63% rename from tests/test_barcode.py rename to tests/test_gerar_numeracao_codigo_de_barras_func.py index 2ec9951..63f4886 100644 --- a/tests/test_barcode.py +++ b/tests/test_gerar_numeracao_codigo_de_barras_func.py @@ -7,12 +7,12 @@ MODULO11_QUANTIDADE_MOEDA, PRODUTO_ARRECADACAO, SEGMENTO_TELECOMUNICACOES, - barcode, + gerar_numeracao_codigo_de_barras, ) -def test_barcode(): - codigo_de_barras = barcode( +def test_gerar_numeracao_codigo_de_barras(): + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -24,9 +24,26 @@ def test_barcode(): assert codigo_de_barras == '84670000000109910422023123100000000000054321' -def test_barcode_id_empresa_orgao_exception(): +def test_gerar_numeracao_codigo_de_barras_com_dac(): + codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=PRODUTO_ARRECADACAO, + segmento=SEGMENTO_TELECOMUNICACOES, + codigo_moeda=MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', + incluir_dac=True, + ) + assert ( + codigo_de_barras + == '84670000000 9 10991042202 0 31231000000 4 00000054321 5' + ) + + +def test_campo_id_empresa_orgao_invalido(): with pytest.raises(Exception): - barcode( + gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -37,8 +54,8 @@ def test_barcode_id_empresa_orgao_exception(): ) -def test_barcode_vencimento_is_none(): - codigo_de_barras = barcode( +def test_campo_vencimento_nao_informado(): + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -49,8 +66,8 @@ def test_barcode_vencimento_is_none(): assert codigo_de_barras[19:27] == '00000000' -def test_barcode_modulo_11(): - codigo_de_barras = barcode( +def test_campo_codigo_moeda_modulo11(): + codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO11_QUANTIDADE_MOEDA, @@ -62,9 +79,9 @@ def test_barcode_modulo_11(): assert codigo_de_barras == '84910000000010010422023123100000000000054321' -def test_barcode_digito_verificador_exception(): +def test_campo_codigo_moeda_invalido(): with pytest.raises(Exception): - barcode( + gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=None, diff --git a/tests/test_html_base64_img_func.py b/tests/test_html_base64_img_func.py new file mode 100644 index 0000000..b850aea --- /dev/null +++ b/tests/test_html_base64_img_func.py @@ -0,0 +1,35 @@ +import os +import tempfile +from datetime import date + +from febraban_barcode import calcular_dac, gerar_numeracao_codigo_de_barras +from febraban_barcode.base64 import base64_png, html_base64_img +from febraban_barcode.constants import ( + MODULO10_VALOR_EFETIVO, + PRODUTO_ARRECADACAO, + SEGMENTO_TELECOMUNICACOES, +) + +codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=PRODUTO_ARRECADACAO, + segmento=SEGMENTO_TELECOMUNICACOES, + codigo_moeda=MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', +) + +codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + + +def test_html_base64_img(): + base64 = base64_png(codigo_de_barras, codigo_de_barras_com_dac) + temp_filename = tempfile.NamedTemporaryFile().name + html_base64_img(temp_filename, base64) + contains = False + with open(temp_filename) as f: + if base64 in f.read(): + contains = True + os.remove(temp_filename) + assert contains is True diff --git a/tests/test_image.py b/tests/test_image_png_func.py similarity index 53% rename from tests/test_image.py rename to tests/test_image_png_func.py index 905548a..91f81af 100644 --- a/tests/test_image.py +++ b/tests/test_image_png_func.py @@ -2,15 +2,15 @@ import tempfile from datetime import date -from febraban_barcode import barcode, linha_digitavel +from febraban_barcode import calcular_dac, gerar_numeracao_codigo_de_barras from febraban_barcode.constants import ( MODULO10_VALOR_EFETIVO, PRODUTO_ARRECADACAO, SEGMENTO_TELECOMUNICACOES, ) -from febraban_barcode.image import image_png, image_svg +from febraban_barcode.image import image_png -codigo_de_barras = barcode( +codigo_de_barras = gerar_numeracao_codigo_de_barras( produto=PRODUTO_ARRECADACAO, segmento=SEGMENTO_TELECOMUNICACOES, codigo_moeda=MODULO10_VALOR_EFETIVO, @@ -20,21 +20,12 @@ dados_campo_livre='54321', ) -txt_linha_digitavel = linha_digitavel(codigo_de_barras) +codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) def test_image_png(): temp_filename = tempfile.NamedTemporaryFile(suffix='.png').name - image_png(temp_filename, codigo_de_barras, txt_linha_digitavel) - exist = False - exist = os.path.exists(temp_filename) - os.remove(temp_filename) - assert exist is True - - -def test_image_svg(): - temp_filename = tempfile.NamedTemporaryFile(suffix='.svg').name - image_svg(temp_filename, codigo_de_barras, txt_linha_digitavel) + image_png(temp_filename, codigo_de_barras, codigo_de_barras_com_dac) exist = False exist = os.path.exists(temp_filename) os.remove(temp_filename) diff --git a/tests/test_image_svg_func.py b/tests/test_image_svg_func.py new file mode 100644 index 0000000..7711646 --- /dev/null +++ b/tests/test_image_svg_func.py @@ -0,0 +1,32 @@ +import os +import tempfile +from datetime import date + +from febraban_barcode import calcular_dac, gerar_numeracao_codigo_de_barras +from febraban_barcode.constants import ( + MODULO10_VALOR_EFETIVO, + PRODUTO_ARRECADACAO, + SEGMENTO_TELECOMUNICACOES, +) +from febraban_barcode.image import image_svg + +codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=PRODUTO_ARRECADACAO, + segmento=SEGMENTO_TELECOMUNICACOES, + codigo_moeda=MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', +) + +codigo_de_barras_com_dac = calcular_dac(codigo_de_barras) + + +def test_image_svg(): + temp_filename = tempfile.NamedTemporaryFile(suffix='.svg').name + image_svg(temp_filename, codigo_de_barras, codigo_de_barras_com_dac) + exist = False + exist = os.path.exists(temp_filename) + os.remove(temp_filename) + assert exist is True diff --git a/tests/test_layout5.py b/tests/test_layout5.py deleted file mode 100644 index c6c75f0..0000000 --- a/tests/test_layout5.py +++ /dev/null @@ -1,87 +0,0 @@ -import pytest - -import febraban_barcode.retorno.layout5 as l5 - - -def test_registro_a(): - assert isinstance(l5.registro_A(data_geracao='20240101'), str) - - -def test_registro_a_codigo_remessa_invalido_len_not_equal_1(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', codigo_remessa='') - - -def test_registro_a_codigo_remessa_invalido_is_not_digit(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', codigo_remessa='a') - - -def test_registro_a_codigo_convenio_len_more_than_20(): - with pytest.raises(Exception): - l5.registro_A( - data_geracao='20240101', codigo_convenio='123456789012345678901' - ) - - -def test_registro_a_nome_empresa_len_more_than_20(): - with pytest.raises(Exception): - l5.registro_A( - data_geracao='20240101', nome_empresa='EMPRESA DE TESTE - PYTHON' - ) - - -def test_registro_a_codigo_banco_tamanho_maior_que_3(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', codigo_banco='0001') - - -def test_registro_a_codigo_banco_nao_e_string_digitos(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', codigo_banco='A01') - - -def test_registro_a_nome_banco_len_more_than_20(): - with pytest.raises(Exception): - l5.registro_A( - data_geracao='20240101', - nome_banco='EMPRESA DE TESTE - NOME BANCOS', - ) - - -def test_registro_a_data_geracao(): - with pytest.raises(Exception): - l5.registro_A() - - -def test_registro_a_nsa_tamanho_maior_que_6(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', nsa='1234567') - - -def test_registro_a_nsa_nao_e_string_digitos(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', nsa='123 56') - - -def test_registro_a_versao_layout_tamanho_maior_que_2(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', versao_layout='123') - - -def test_registro_a_versao_layout_nao_e_string_digitos(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', versao_layout='9A') - - -def test_registro_a_servico_tamanho_maior_que_17(): - with pytest.raises(Exception): - l5.registro_A(data_geracao='20240101', servico=' ') - - -def test_registro_a_reservado_tamanho_maior_que_52(): - with pytest.raises(Exception): - l5.registro_A( - data_geracao='20240101', - reservado='KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK', - ) diff --git a/tests/test_linha_digitavel.py b/tests/test_linha_digitavel.py deleted file mode 100644 index 108af53..0000000 --- a/tests/test_linha_digitavel.py +++ /dev/null @@ -1,21 +0,0 @@ -import pytest - -from febraban_barcode import linha_digitavel - - -def test_linha_digitavel(): - result = linha_digitavel('84670000000109910422023123100000000000054321') - assert ( - result - == '84670000000 9 10991042202 0 31231000000 4 00000054321 5' - ) - - -def test_linha_digitavel_len_not_equal_44(): - with pytest.raises(Exception): - linha_digitavel('8467000000010991042202312310000000000005432') - - -def test_linha_digitavel_modulo_is_none(): - with pytest.raises(Exception): - linha_digitavel('84070000000109910422023123100000000000054321') diff --git a/tests/test_modulo_10.py b/tests/test_modulo_10.py deleted file mode 100644 index 46cf691..0000000 --- a/tests/test_modulo_10.py +++ /dev/null @@ -1,10 +0,0 @@ -from febraban_barcode.modulo10 import digito_verificador_modulo10, modulo10 - - -def test_modulo_10(): - assert modulo10('01230067896') == 3 - assert modulo10('00000000000') == 0 - - -def test_digito_verificador_modulo10(): - assert digito_verificador_modulo10('11111111111', '11111111111') == '7' diff --git a/tests/test_modulo_11.py b/tests/test_modulo_11.py deleted file mode 100644 index d388420..0000000 --- a/tests/test_modulo_11.py +++ /dev/null @@ -1,10 +0,0 @@ -from febraban_barcode.modulo11 import digito_verificador_modulo11, modulo11 - - -def test_modulo_11(): - assert modulo11('01230067896') == 0 - assert modulo11('01201611227') == 3 - - -def test_digito_verificador_modulo11(): - assert digito_verificador_modulo11('22222222222', '22222222222') == '1' diff --git a/tests/test_registro_a_func.py b/tests/test_registro_a_func.py new file mode 100644 index 0000000..fabc37a --- /dev/null +++ b/tests/test_registro_a_func.py @@ -0,0 +1,84 @@ +import pytest + +from febraban_barcode.retorno import registro_A + + +def test_registro_a(): + assert isinstance(registro_A(data_geracao='20240101'), str) + + +def test_codigo_remessa_invalido(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', codigo_remessa='') + with pytest.raises(Exception): + registro_A(data_geracao='20240101', codigo_remessa='a') + + +def test_codigo_convenio_maior_que_20_caracteres(): + with pytest.raises(Exception): + registro_A( + data_geracao='20240101', codigo_convenio='123456789012345678901' + ) + + +def test_nome_empresa_maior_que_20_caracteres(): + with pytest.raises(Exception): + registro_A( + data_geracao='20240101', nome_empresa='EMPRESA DE TESTE - PYTHON' + ) + + +def test_codigo_banco_maior_que_3_caracteres(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', codigo_banco='0001') + + +def test_codigo_banco_string_nao_numerica(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', codigo_banco='A01') + + +def test_nome_banco_maior_que_20_caracteres(): + with pytest.raises(Exception): + registro_A( + data_geracao='20240101', + nome_banco='EMPRESA DE TESTE - NOME BANCOS', + ) + + +def test_data_geracao_nao_informado(): + with pytest.raises(Exception): + registro_A() + + +def test_nsa_tamanho_maior_que_6_caracteres(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', nsa='1234567') + + +def test_nsa_string_nao_numerica(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', nsa='123 56') + + +def test_versao_layout_maior_que_2_caracteres(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', versao_layout='123') + + +def test_versao_layout_string_nao_numerica(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', versao_layout='9A') + + +def test_servico_tamanho_maior_que_17_caracteres(): + with pytest.raises(Exception): + registro_A(data_geracao='20240101', servico=' ') + + +def test_reservado_tamanho_maior_que_52_caracteres(): + with pytest.raises(Exception): + registro_A( + data_geracao='20240101', + reservado='KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK', + ) diff --git a/tests/test_registro_g_func.py b/tests/test_registro_g_func.py new file mode 100644 index 0000000..8ae18a5 --- /dev/null +++ b/tests/test_registro_g_func.py @@ -0,0 +1,436 @@ +from datetime import date + +import pytest + +from febraban_barcode import constants as c +from febraban_barcode import gerar_numeracao_codigo_de_barras +from febraban_barcode.retorno import registro_G + +codigo_de_barras = gerar_numeracao_codigo_de_barras( + produto=c.PRODUTO_ARRECADACAO, + segmento=c.SEGMENTO_TELECOMUNICACOES, + codigo_moeda=c.MODULO10_VALOR_EFETIVO, + valor=10.99, + id_empresa_orgao='1042', + vencimento=date(2023, 12, 31), + dados_campo_livre='54321', +) + + +def test_registro_z(): + assert isinstance( + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ), + str, + ) + + +def test_codigo_banco_invalido(): + with pytest.raises(Exception): + registro_G( + codigo_banco='0001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + with pytest.raises(Exception): + registro_G( + codigo_banco='0 1', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_agencia_string_nao_numerica(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1A34', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_conta_string_nao_numerica(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='1B345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_conta_digito_string_nao_numerica(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='C', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_agencia_conta_e_conta_digito_maior_que_17_caracteres(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='12345678', + conta='123456789', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_data_pagamento_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento=None, + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_data_credito_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito=None, + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_codigo_de_barras_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras + '0', + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_valor_recebido_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido='99.99', + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_valor_tarifa_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa='0.01', + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_nsr_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr='999', + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_codigo_agencia_invalida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='123456789', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_forma_arrecadacao_maior_que_1_caracteres(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao='99', + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_forma_arrecadacao_desconhecida(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao='z', + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_autenticacao_maior_que_23_caracteres(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='AAAAAAAAAAAAAAAAAAAAAAAA', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='', + ) + + +def test_forma_pagamento_maior_que_1_caracteres(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento='99', + reservado='', + ) + + +def test_forma_pagamento_string_nao_numerica(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento='B', + reservado='', + ) + + +def test_reservado_maior_que_9_caracteres(): + with pytest.raises(Exception): + registro_G( + codigo_banco='001', + agencia='1234', + conta='12345', + conta_digito='6', + data_pagamento='20240101', + data_credito='20240102', + codigo_de_barras_44=codigo_de_barras, + valor_recebido=99.99, + valor_tarifa=0.01, + nsr=999, + codigo_agencia='', + forma_arrecadacao=c.ARRECADACAO_INTERNET_COM_FATURA, + autenticacao='', + forma_pagamento=c.PAGAMENTO_DINHEIRO, + reservado='AAAAAAAAAA', + ) diff --git a/tests/test_registro_z_func.py b/tests/test_registro_z_func.py new file mode 100644 index 0000000..513a9fe --- /dev/null +++ b/tests/test_registro_z_func.py @@ -0,0 +1,26 @@ +import pytest + +from febraban_barcode.retorno import registro_Z + + +def test_registro_z(): + assert isinstance(registro_Z(3, 999.99, ''), str) + + +def test_total_registros_valor_nao_e_int(): + with pytest.raises(Exception): + registro_Z('3', 999.99, '') + + +def test_valor_total_registros_nao_e_float(): + with pytest.raises(Exception): + registro_Z(3, '999.99', '') + + +def test_reservado_string_maior_que_126_caracteres(): + with pytest.raises(Exception): + registro_Z( + 3, + 999.99, + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA', + )