class BoletoCaixaSigcb(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Caixa Economica Federal ''' agencia_cedente = CustomProperty('agencia_cedente', 4) conta_cedente = CustomProperty('conta_cedente', 6) nosso_numero = CustomProperty('nosso_numero', 17) def __init__(self): super(BoletoCaixaSigcb, self).__init__() self.codigo_banco = "104" self.local_pagamento = ("Preferencialmente nas Casas Lotéricas e " "Agências da Caixa") self.logo_image = "logo_bancocaixa.jpg" @property def campo_livre(self): # 24 digits content = "%6s%1s%3s%1s%3s%1s%9s" % ( self.conta_cedente.split('-')[0], self.modulo11( self.conta_cedente.split('-')[0]), self.nosso_numero[2:5], self.nosso_numero[0:1], self.nosso_numero[5:8], self.nosso_numero[1:2], self.nosso_numero[8:17]) dv_content = self.modulo11(content) return "%24s%1s" % (content, dv_content) def format_nosso_numero(self): return self.nosso_numero
class BoletoBanrisul(BoletoData): conta_cedente = CustomProperty('conta_cedente', 6) nosso_numero = CustomProperty('nosso_numero', 8) def __init__(self): BoletoData.__init__(self) self.codigo_banco = "041" self.logo_image = "logo_banrisul.jpg" @property def campo_livre(self): content = '21%04d%07d%08d40' % (int( self.agencia_cedente), int( self.conta_cedente), int(self.nosso_numero)) return '%s%s' % (content, self._dv_campo_livre(content)) # From http://jrimum.org/bopepo/browser/trunk/src/br/com/nordestefomento/ # jrimum/bopepo/campolivre/AbstractCLBanrisul.java def _dv_campo_livre(self, campo_livre): dv = self.modulo10(campo_livre) while True: restoMod11 = self.modulo11(campo_livre + str(dv), 7, 1) if restoMod11 != 1: break dv += 1 dv %= 10 return str(dv) + str(11 - restoMod11)
class BoletoItau109(BoletoData): '''Implementa Boleto Itaú Gera Dados necessários para criação de boleto para o banco Itau Todas as carteiras com excessão das que utilizam 15 dígitos: (106,107, 195,196,198) ''' # Nosso numero (sem dv) com 8 digitos nosso_numero = CustomProperty('nosso_numero', 8) # Conta (sem dv) com 4 digitos conta_cedente = CustomProperty('conta_cedente', 5) # Agência (sem dv) com 4 digitos agencia_cedente = CustomProperty('agencia_cedente', 4) carteira = CustomProperty('carteira', 3) def __init__(self): super(BoletoItau109, self).__init__() self.codigo_banco = "341" self.logo_image = "logo_itau.jpg" self.especie_documento = 'DM' self.carteira = '109' @property def dv_nosso_numero(self): composto = "%4s%5s%3s%8s" % (self.agencia_cedente,self.conta_cedente, self.carteira, self.nosso_numero) return self.modulo10(composto) @property def dv_agencia_conta_cedente(self): agencia_conta = "%s%s" % (self.agencia_cedente, self.conta_cedente) return self.modulo10(agencia_conta) @property def agencia_conta_cedente(self): return "%s/%s-%s" % (self.agencia_cedente, self.conta_cedente, self.dv_agencia_conta_cedente) def format_nosso_numero(self): return "%3s/%8s-%1s" % (self.carteira, self.nosso_numero, self.dv_nosso_numero) @property def campo_livre(self): content = "%3s%8s%1s%4s%5s%1s%3s" % (self.carteira, self.nosso_numero, self.dv_nosso_numero, self.agencia_cedente, self.conta_cedente, self.dv_agencia_conta_cedente, '000' ) return content
class BoletoHsbcComRegistro(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco HSBC com registro ''' # Nosso numero (sem dv) sao 10 digitos nosso_numero = CustomProperty('nosso_numero', 10) def __init__(self): super(BoletoHsbcComRegistro, self).__init__() self.codigo_banco = "399" self.logo_image = "logo_bancohsbc.jpg" self.carteira = 'CSB' self.especie_documento = 'PD' @property def dv_nosso_numero(self): resto = self.modulo11(self.nosso_numero, 7, 1) if resto == 0 or resto == 1: return 0 else: return 11 - resto @property def campo_livre(self): content = "%10s%1s%4s%7s001" % (self.nosso_numero, self.dv_nosso_numero, self.agencia_cedente.split('-')[0], self.conta_cedente.split('-')[0]) return content
class BoletoCaixaCs(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Caixa Economica Federal - Carteira CS ''' conta_cedente = CustomProperty('conta_cedente', 19) ''' Este numero tem o inicio fixo ''' nosso_numero = CustomProperty('nosso_numero', 8) def __init__(self): super(BoletoCaixaCs, self).__init__() self.codigo_banco = "104" self.local_pagamento = "Preferencialmente nas Casas Lotéricas e \ Agências da Caixa" self.logo_image = "logo_bancocaixa.jpg" @property def dv_nosso_numero(self): resto2 = self.modulo11('9' + self.nosso_numero.split('-')[0], 9, 1) digito = 11 - resto2 if digito == 10 or digito == 11: dv = 0 else: dv = digito return dv @property def campo_livre(self): content = '8' \ + self.nosso_numero.strip() \ + self.agencia_cedente.strip() \ + self.conta_cedente[7:10] \ + self.conta_cedente[11:19] return content def format_nosso_numero(self): return '8' + self.nosso_numero + '-' + str(self.dv_nosso_numero) @property def agencia_conta_cedente(self): resultado = self.conta_cedente[2:] return resultado
class BoletoBradesco(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Bradesco ''' nosso_numero = CustomProperty('nosso_numero', 11) agencia_cedente = CustomProperty('agencia_cedente', 4) conta_cedente = CustomProperty('conta_cedente', 7) def __init__(self, carteira='06', **kwargs): """ :param carteira: Supports (06 - not registered) and (09 - registered). """ super(BoletoBradesco, self).__init__() self.codigo_banco = "237" self.logo_image = "logo_bancobradesco.jpg" self.carteira = carteira self.local_pagamento = kwargs.pop( 'local_pagamento', "Pagável Preferencialmente na rede Bradesco ou no Bradesco expresso" ) def format_nosso_numero(self): return "%s/%s-%s" % (self.carteira, self.nosso_numero, self.dv_nosso_numero) @property def dv_nosso_numero(self): resto2 = self.modulo11(self.carteira + self.nosso_numero, 7, 1) digito = 11 - resto2 if digito == 10: dv = 'P' elif digito == 11: dv = 0 else: dv = digito return dv @property def campo_livre(self): content = "%4s%2s%11s%7s%1s" % (self.agencia_cedente.split('-')[0], self.carteira, self.nosso_numero, self.conta_cedente.split('-')[0], '0') return content
class BoletoCaixa(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Caixa Economica Federal ''' conta_cedente = CustomProperty('conta_cedente', 11) ''' Este numero tem o inicio fixo Carteira SR: 80, 81 ou 82 Carteira CR: 90 (Confirmar com gerente qual usar) ''' nosso_numero = CustomProperty('nosso_numero', 10) def __init__(self): super(BoletoCaixa, self).__init__() self.codigo_banco = "104" self.local_pagamento = "Preferencialmente nas Casas Lotéricas e \ Agências da Caixa" self.logo_image = "logo_bancocaixa.jpg" @property def dv_nosso_numero(self): resto2 = self.modulo11(self.nosso_numero.split('-')[0], 9, 1) digito = 11 - resto2 if digito == 10 or digito == 11: dv = 0 else: dv = digito return dv @property def campo_livre(self): content = "%10s%4s%11s" % (self.nosso_numero, self.agencia_cedente, self.conta_cedente.split('-')[0]) return content def format_nosso_numero(self): return self.nosso_numero + '-' + str(self.dv_nosso_numero)
class BoletoSantander(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Santander ''' nosso_numero = CustomProperty('nosso_numero', 12) #: Também chamado de "ponto de venda" agencia_cedente = CustomProperty('agencia_cedente', 4) #: Também chamdo de código do cedente, se for uma conta de 9 dígitos #: ignorar os 2 primeiros conta_cedente = CustomProperty('conta_cedente', 7) def __init__(self): super(BoletoSantander, self).__init__() self.codigo_banco = "033" self.logo_image = "logo_santander.jpg" self.carteira = '102' # IOS - somente para Seguradoras (Se 7% informar 7, limitado 9%) # Demais clientes usar 0 (zero) self.ios = "0" def format_nosso_numero(self): return "%s-%s" % (self.nosso_numero, self._dv_nosso_numero()) def _dv_nosso_numero(self): return str(self.modulo11(self.nosso_numero, 9, 0)) @property def campo_livre(self): content = "".join([ '9', self.conta_cedente, self.nosso_numero, self._dv_nosso_numero(), self.ios, self.carteira, ]) return content
class BoletoHsbc(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco HSBC ''' numero_documento = CustomProperty('numero_documento', 13) def __init__(self): super(BoletoHsbc, self).__init__() self.codigo_banco = "399" self.logo_image = "logo_bancohsbc.jpg" self.carteira = 'CNR' def format_nosso_numero(self): nosso_numero = self.nosso_numero # Primeiro DV nosso_numero += str(self.modulo11(nosso_numero)) # Cobrança com vencimento = 4 nosso_numero += "4" # Segundo DV sum_params = int(nosso_numero) + int(self.conta_cedente) sum_params += int(self.data_vencimento.strftime('%d%m%y')) sum_params = str(sum_params) nosso_numero += str(self.modulo11(sum_params)) return nosso_numero @property def data_vencimento_juliano(self): data_vencimento = str(self.data_vencimento.timetuple().tm_yday) data_vencimento += str(self.data_vencimento.year)[-1:] return data_vencimento.zfill(4) @property def campo_livre(self): content = "%7s%13s%4s2" % (self.conta_cedente, self.nosso_numero, self.data_vencimento_juliano) return content
class BoletoCaixaSig14(BoletoData): ''' Gera Dados necessários para criação de boleto para o banco Caixa Economica Federal ''' conta_cedente = CustomProperty('conta_cedente', 6) ''' Este numero tem o inicio fixo Carteira SR: 80, 81 ou 82 Carteira CR: 90 (Confirmar com gerente qual usar) ''' nosso_numero = CustomProperty('nosso_numero', 15) def __init__(self): super(BoletoCaixaSig14, self).__init__() self.codigo_banco = "104" self.local_pagamento = "Preferencialmente nas Casas Lotéricas e \ Agências da Caixa" self.logo_image = "logo_bancocaixa.jpg" @property def dv_agencia_conta_cedente(self): conta_cedente = "%s" % (self.conta_cedente) dv = self.modulo11(conta_cedente) return dv @property def agencia_conta_cedente(self): resultado = "%s/%s-%s" % (self.agencia_cedente, self.conta_cedente, self.dv_agencia_conta_cedente) return resultado @property def dv_nosso_numero(self): resto2 = self.modulo11('14' + self.nosso_numero, 9, 1) digito = 11 - resto2 if digito == 10 or digito == 11: dv = 0 else: dv = digito return dv @property def campo_livre(self): # 24 digits nosso_numero = '14' + self.nosso_numero content = "%6s%1s%3s%1s%3s%1s%9s" % ( self.conta_cedente.split('-')[0], self.modulo11(self.conta_cedente.split('-')[0]), nosso_numero[2:5], nosso_numero[0:1], nosso_numero[5:8], nosso_numero[1:2], nosso_numero[8:17]) dv_content = self.modulo11(content) return "%24s%1s" % (content, dv_content) def format_nosso_numero(self): return "14%s-%s" % (self.nosso_numero, str(self.dv_nosso_numero))
class BoletoBB(BoletoData): ''' Gera Dados necessários para criação de boleto para o Banco do Brasil ''' agencia_cedente = CustomProperty('agencia_cedente', 4) conta_cedente = CustomProperty('conta_cedente', 8) def __init__(self, format_convenio, format_nnumero): ''' Construtor para boleto do Banco deo Brasil Args: format_convenio Formato do convenio 4, 6, 7 ou 8 format_nnumero Formato nosso numero 1 ou 2 (apenas para convenio 6) ''' super(BoletoBB, self).__init__() self.codigo_banco = "001" self.carteira = 18 self.logo_image = "logo_bb.jpg" # Size of convenio 4, 6, 7 or 8 self.format_convenio = format_convenio # Nosso Numero format. 1 or 2 # Used only for convenio=6 # 1: Nosso Numero with 5 positions # 2: Nosso Numero with 17 positions self.format_nnumero = format_nnumero self._convenio = "" self._nosso_numero = "" def format_nosso_numero(self): if self.format_convenio == 7: return "%7s%10s" % (self.convenio, self.nosso_numero) else: return "%s%s-%s" % (self.convenio, self.nosso_numero, self.dv_nosso_numero) # Nosso numero (sem dv) sao 11 digitos def _get_nosso_numero(self): return self._nosso_numero def _set_nosso_numero(self, val): val = str(val) if self.format_convenio == 4: nn = val.zfill(7) elif self.format_convenio == 6: if self.format_nnumero == 1: nn = val.zfill(5) elif self.format_nnumero == 2: nn = val.zfill(17) elif self.format_convenio == 7: nn = val.zfill(10) elif self.format_convenio == 8: nn = val.zfill(9) self._nosso_numero = nn nosso_numero = property(_get_nosso_numero, _set_nosso_numero) def _get_convenio(self): return self._convenio def _set_convenio(self, val): self._convenio = str(val).ljust(self.format_convenio, '0') convenio = property(_get_convenio, _set_convenio) @property def agencia_conta_cedente(self): return "%s-%s / %s-%s" % ( self.agencia_cedente, self.modulo11(self.agencia_cedente), self.conta_cedente, self.modulo11(self.conta_cedente)) @property def dv_nosso_numero(self): ''' This function uses a modified version of modulo11 ''' num = self.convenio + self.nosso_numero base = 2 fator = 9 soma = 0 for c in reversed(num): soma += int(c) * fator if fator == base: fator = 10 fator -= 1 r = soma % 11 if r == 10: return 'X' return r @property def campo_livre(self): if self.format_convenio == 4: content = "%s%s%s%s%s" % (self.convenio, self.nosso_numero, self.agencia_cedente, self.conta_cedente, self.carteira) elif self.format_convenio in (7, 8): content = "000000%s%s%s" % (self.convenio, self.nosso_numero, self.carteira) elif self.format_convenio == 6: if self.format_nnumero == 1: content = "%s%s%s%s%s" % (self.convenio, self.nosso_numero, self.agencia_cedente, self.conta_cedente, self.carteira) if self.format_nnumero == 2: content = "%s%s%s" % (self.convenio, self.nosso_numero, '21' ) # numero do serviço return content
class BoletoSicoob(BoletoData): '''Implementa Boleto Sicoob Gera Dados necessários para criação de boleto para o banco Sicoob ''' agencia_cedente = CustomProperty('agencia_cedente', 4) conta_cedente = CustomProperty('conta_cedente', 6) codigo_beneficiario = CustomProperty('codigo_beneficiario', 7) nosso_numero = CustomProperty('nosso_numero', 7) carteira = CustomProperty('carteira', 1) def __init__(self): super(BoletoSicoob, self).__init__() self.codigo_banco = "756" self.logo_image = "logo_sicoob.jpg" self.especie_documento = 'DM' self.label_cedente = 'Coop Contr/Cód Beneficiário' self.local_pagamento = 'Pagável Preferencialmente nas Cooperativas ' +\ 'da Rede Sicoob ou Qualquer Banco até o Vencimento.' @property def modalidade(self): return '01' if self.carteira == '1' else '03' @property def dv_nosso_numero(self): composto = "%4s%10s%7s" % (self.agencia_cedente, self.codigo_beneficiario.zfill(10), self.nosso_numero) constante = '319731973197319731973' soma = 0 for i in range(21): soma += int(composto[i]) * int(constante[i]) resto = soma % 11 return '0' if (resto == 1 or resto == 0) else 11 - resto @property def agencia_conta_cedente(self): return "%s/%s" % (self.agencia_cedente, self.codigo_beneficiario.zfill(10)) def format_nosso_numero(self): return "%8s-%1s" % (self.nosso_numero, self.dv_nosso_numero) @property def codigo_dv_banco(self): return self.codigo_banco @property def campo_livre(self): content = "%1s%4s%2s%7s%7s%1s%3s" % (self.carteira, self.agencia_cedente.strip(), self.modalidade, self.codigo_beneficiario, self.nosso_numero[:7], self.dv_nosso_numero, '000') return content