Skip to content
This repository has been archived by the owner on Jan 24, 2025. It is now read-only.

Commit

Permalink
Algumas refatorações sobre mod10, mod11 e febraran... (#21)
Browse files Browse the repository at this point in the history
* refatora ModService

* adiciona FebrabranService

* faz algumas refatorações
  • Loading branch information
rodrigondec authored Jan 26, 2021
1 parent a4f6d2c commit 6890af2
Show file tree
Hide file tree
Showing 7 changed files with 127 additions and 115 deletions.
4 changes: 2 additions & 2 deletions bb_wrapper/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
from ._version import get_versions
from .services import ( # noqa
from .services import ( # noqa: F401
generate_qrcode_b64image,
generate_barcode_b64image,
parse_unicode_to_alphanumeric,
)
from .wrapper import CobrancasBBWrapper # noqa
from .wrapper import CobrancasBBWrapper # noqa: F401

__version__ = get_versions()["version"]
del get_versions
5 changes: 3 additions & 2 deletions bb_wrapper/services/__init__.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from .b64 import Base64Service # noqa
from .b64 import Base64Service # noqa: F401
from .unicode import UnicodeService
from .qrcode import QRCodeService
from .barcode import BarCodeService
from .mod import ModService # noqa
from .mod import ModService # noqa: F401
from .febrabran import FebrabranService # noqa: F401


parse_unicode_to_alphanumeric = UnicodeService().parse_unicode_to_alphanumeric
Expand Down
21 changes: 7 additions & 14 deletions bb_wrapper/services/barcode.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from barcode.writer import SVGWriter

from .b64 import Base64Service
from .mod import ModService
from .febrabran import FebrabranService


class BarCodeService:
Expand Down Expand Up @@ -84,17 +84,17 @@ def barcode_to_codeline(self, barcode):
first_number += barcode[0:3] # banco
first_number += barcode[3] # moeda
first_number += barcode[19:24] # 5 primeiras posições do campo livre
first_dv = ModService().modulo10(first_number)
first_dv = self.calculate_codeline_dv(first_number)

codeline += first_number + str(first_dv)

second_number = barcode[24:34] # 10 seguintes posições do campo livre
second_dv = ModService().modulo10(second_number)
second_dv = self.calculate_codeline_dv(second_number)

codeline += second_number + str(second_dv)

third_number = barcode[34:44] # 10 seguintes posições do campo livre
third_dv = ModService().modulo10(third_number)
third_dv = self.calculate_codeline_dv(third_number)

codeline += third_number + str(third_dv)

Expand All @@ -106,16 +106,9 @@ def barcode_to_codeline(self, barcode):

def calculate_barcode_dv(self, number):
"""
Método para calcular o DV
https://github.com/eduardocereto/pyboleto/blob/1fed215eac2c974efc6f03a16b94406c2bb55cc2/pyboleto/data.py#L242 # noqa
Método para calcular o DV geral do código de barras
"""
resto2 = ModService().modulo11(number, r_base=1)
if resto2 in [0, 1, 10]:
dv = 1
else:
dv = 11 - resto2
return dv
return FebrabranService().dac_11(number)

def calculate_codeline_dv(self, number):
"""
Expand All @@ -127,7 +120,7 @@ def calculate_codeline_dv(self, number):
O que não significa que é uma regra universal!
"""
return ModService().modulo10(number)
return FebrabranService().dac_10(number)

def validate_barcode(self, barcode):
"""
Expand Down
27 changes: 27 additions & 0 deletions bb_wrapper/services/febrabran.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from .mod import ModService


class FebrabranService:
def dac_10(self, number):
"""
Método para calcular o dac modulo 10 de um número.
Referência:
- página 14 https://github.com/imobanco/bb-wrapper/blob/7643255ac3d6f4ed1d6086cc2ad37c281659ea95/docs/Layout%20-%20C%C3%B3digo%20de%20Barras%20ATUALIZADO.pdf # noqa
"""
dv = ModService().mod_10(number)
if dv == 10:
dv = 0
return dv

def dac_11(self, number):
"""
Método para calcular o dac modulo 11 de um número.
Referências:
- página 16 https://github.com/imobanco/bb-wrapper/blob/7643255ac3d6f4ed1d6086cc2ad37c281659ea95/docs/Layout%20-%20C%C3%B3digo%20de%20Barras%20ATUALIZADO.pdf # noqa
"""
dv = ModService().mod_11(number, False)
if dv in [11, 10]:
dv = 0
return dv
76 changes: 31 additions & 45 deletions bb_wrapper/services/mod.py
Original file line number Diff line number Diff line change
@@ -1,66 +1,52 @@
class ModService:
def modulo10(self, num):
def mod_10(self, num):
"""
Método para calcular módulo 10.
Método para calcular o DV módulo 10.
Referências:
- https://pt.wikipedia.org/wiki/D%C3%ADgito_verificador
- página 14 https://github.com/imobanco/bb-wrapper/blob/7643255ac3d6f4ed1d6086cc2ad37c281659ea95/docs/Layout%20-%20C%C3%B3digo%20de%20Barras%20ATUALIZADO.pdf # noqa
- https://github.com/eduardocereto/pyboleto/blob/1fed215eac2c974efc6f03a16b94406c2bb55cc2/pyboleto/data.py#L453 # noqa
"""
if not isinstance(num, str):
raise TypeError
soma = 0
peso = 2
for c in reversed(num):
parcial = int(c) * peso
if parcial > 9:
s = str(parcial)
parcial = int(s[0]) + int(s[1])
soma += parcial
if peso == 2:
peso = 1
else:
peso = 2
if isinstance(num, int):
num = str(num)

resto10 = soma % 10
if not isinstance(num, str):
raise TypeError("O número deve estar no formato de str!")

if resto10 == 0:
modulo10 = 0
else:
modulo10 = 10 - resto10
total = 0
factor = 2
for digit in reversed(num):
result = int(digit) * factor
total += sum([int(d) for d in str(result)])
factor = (factor % 2) + 1

return modulo10
rest = total % 10
dv = 10 - rest
return dv

def modulo11(self, num, base=9, r_base=0):
def mod_11(self, num, multiply_by_10_flag=True, base=9):
"""
Método para calcular módulo 11.
Método para calcular o DV módulo 11.
Referências:
- https://pt.wikipedia.org/wiki/D%C3%ADgito_verificador
- página 16 https://github.com/imobanco/bb-wrapper/blob/7643255ac3d6f4ed1d6086cc2ad37c281659ea95/docs/Layout%20-%20C%C3%B3digo%20de%20Barras%20ATUALIZADO.pdf # noqa
- https://github.com/eduardocereto/pyboleto/blob/1fed215eac2c974efc6f03a16b94406c2bb55cc2/pyboleto/data.py#L478 # noqa
"""
if not isinstance(num, str):
raise TypeError
if isinstance(num, int):
num = str(num)

if r_base != 0 and r_base != 1:
raise ValueError("O r_base precisa ser 1 ou 0")

soma = 0
fator = 2
for c in reversed(num):
soma += int(c) * fator
if fator == base:
fator = 1
fator += 1

if r_base == 0:
soma = soma * 10
if not isinstance(num, str):
raise TypeError("O número deve estar no formato de str!")

digito = soma % 11
total = 0
factor = 2
for digit in reversed(num):
total += int(digit) * factor
factor = (factor % base) + 1 + (factor // base) * 1

if r_base == 0 and digito == 10:
digito = 0
if multiply_by_10_flag:
total = total * 10

return digito
rest = total % 11
dv = 11 - rest
return dv
7 changes: 6 additions & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,12 @@
long_description=long_description,
long_description_content_type="text/x-rst",
url="https://github.com/imobanco/bb-wrapper/",
packages=["bb_wrapper", "bb_wrapper.wrapper", "bb_wrapper.models", "bb_wrapper.services"],
packages=[
"bb_wrapper",
"bb_wrapper.wrapper",
"bb_wrapper.models",
"bb_wrapper.services",
],
classifiers=[
"Programming Language :: Python :: 3",
"Development Status :: 3 - Alpha",
Expand Down
Loading

0 comments on commit 6890af2

Please sign in to comment.