Trust-Code/odoo-brasil

View on GitHub
br_cnab/febraban/cnab_240/bancos/santander.py

Summary

Maintainability
C
1 day
Test Coverage
# -*- coding: utf-8 -*-
# © 2016 Danimar Ribeiro, Trustcode
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).

from ..cnab_240 import Cnab240
from decimal import Decimal


class Santander240(Cnab240):

    def __init__(self):
        super(Cnab240, self).__init__()
        from cnab240.bancos import santander
        self.bank = santander

    def _prepare_header(self):
        vals = super(Santander240, self)._prepare_header()
        vals['cedente_agencia_dv'] = 0  # Não obrigatório
        vals['codigo_transmissao'] = self.codigo_transmissao()
        vals['controlecob_numero'] = self.order.id
        vals['controlecob_data_gravacao'] = self.data_hoje()
        return vals

    def _prepare_segmento(self, line):
        vals = super(Santander240, self)._prepare_segmento(line)

        nosso_numero = self.nosso_numero(line.nosso_numero)
        vals['nosso_numero'] = nosso_numero
        vals['cedente_agencia_dv'] = 0  # Não obrigatório
        vals['cedente_conta_dv'] = int(vals['cedente_conta_dv'])
        vals['conta_cobranca'] = vals['cedente_conta']
        vals['conta_cobranca_dv'] = int(vals['cedente_conta_dv'])
        vals['forma_cadastramento'] = 1
        vals['codigo_multa'] = int(vals['codigo_multa'])
        vals['codigo_juros'] = int(vals['codigo_juros'])
        vals['juros_mora_taxa'] = vals['juros_mora_taxa'] * Decimal('1000')
        # Data da multa fica zerado, dai ele considera data de vencimento
        vals['data_multa'] = 0
        # tipo documento : 1- Tradicional , 2- Escritural
        vals['tipo_documento'] = 1
        especie = 2
        if vals['especie_titulo'] == '01':
            especie = 2
        elif vals['especie_titulo'] == '02':
            especie = 12
        elif vals['especie_titulo'] == '08':
            especie = 4
        vals['especie_titulo'] = especie

        return vals

    def codigo_transmissao(self):
        return int("%s%s" % (
            self.order.payment_mode_id.bank_account_id.bra_number,
            self.order.payment_mode_id.boleto_cnab_code.zfill(11)))

    def nosso_numero(self, nosso_numero_sem_dv):
        digito = self.modulo11(nosso_numero_sem_dv)
        return int("%s%s" % (nosso_numero_sem_dv, digito))

    @staticmethod
    def modulo11(num, base=9, r=0):
        if not isinstance(num, basestring):
            raise TypeError
        soma = 0
        fator = 2
        for c in reversed(num):
            soma += int(c) * fator
            if fator == base:
                fator = 1
            fator += 1
        if r == 0:
            soma = soma * 10
            digito = soma % 11
            if digito == 10:
                digito = 0
            return digito
        if r == 1:
            resto = soma % 11
            return resto