br.com.nordestefomento.jrimum.bopepo.campolivre.CLSicredi.java Source code

Java tutorial

Introduction

Here is the source code for br.com.nordestefomento.jrimum.bopepo.campolivre.CLSicredi.java

Source

/* 
 * Copyright 2008 JRimum Project
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at http://www.apache.org/licenses/LICENSE-2.0
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 * 
 * Created at: 03/10/2008 - 16:13:14
 *
 * ================================================================================
 *
 * Direitos autorais 2008 JRimum Project
 *
 * Licenciado sob a Licena Apache, Verso 2.0 ("LICENA"); voc no pode 
 * usar esse arquivo exceto em conformidade com a esta LICENA. Voc pode obter uma 
 * cpia desta LICENA em http://www.apache.org/licenses/LICENSE-2.0 A menos que 
 * haja exigncia legal ou acordo por escrito, a distribuio de software sob esta 
 * LICENA se dar COMO EST??, SEM GARANTIAS OU CONDIES DE QUALQUER TIPO, sejam 
 * expressas ou tcitas. Veja a LICENA para a redao especfica a reger permisses 
 * e limitaes sob esta LICENA.
 * 
 * Criado em: 03/10/2008 - 16:13:14
 * 
 */

package br.com.nordestefomento.jrimum.bopepo.campolivre;

import static br.com.nordestefomento.jrimum.utilix.ObjectUtil.isNotNull;
import static org.apache.commons.lang.StringUtils.isNotBlank;
import static org.apache.commons.lang.StringUtils.isNumeric;

import org.apache.commons.lang.StringUtils;

import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Agencia;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Titulo;
import br.com.nordestefomento.jrimum.utilix.Field;
import br.com.nordestefomento.jrimum.utilix.Filler;
import br.com.nordestefomento.jrimum.vallia.digitoverificador.Modulo;
import br.com.nordestefomento.jrimum.vallia.digitoverificador.TipoDeModulo;

/**
 * <p>
 * O campo livre definido pela <a href="http://www.sicredi.com.br/">Sicredi</a>.
 * </p>
 * 
 * <table border="1" cellpadding="0" cellspacing="0" style="border-collapse:
 * collapse" bordercolor="#111111" width="60%" id="campolivre">
 * <tr> <thead>
 * <th >Posio </th>
 * <th >Tamanho</th>
 * <th >Contedo</th>
 * </thead> </tr>
 * <tr>
 * <td >20-20</td>
 * <td >1</td>
 * <td >Cdigo nmerico correspondente ao tipo de cobrana: "3" - SICREDI</td>
 * </tr>
 * <tr>
 * <td >21-21</td>
 * <td >1</td>
 * <td >Cdigo nmerico correspondente ao tipo de carteira: "1" - carteira
 * simples</td>
 * </tr>
 * <tr>
 * <td >22-30</td>
 * <td >9</td>
 * <td >Nosso Nmero (sem dgito)</td>
 * </tr>
 * <tr>
 * <td >31-34</td>
 * <td >4</td>
 * <td >Cooperativa de crdito / agncia cedente</td>
 * </tr>
 * <tr>
 * <td >35-36</td>
 * <td >2</td>
 * <td >Unidade de atendimento / posto da agnica cedente</td>
 * </tr>
 * <tr>
 * <td >37-41</td>
 * <td >5</td>
 * <td >Cdigo do Cedente</td>
 * </tr>
 * <tr>
 * <td >42-42</td>
 * <td >1</td>
 * <td >Filler: 1 (um) quando o campo "valor do documento" diferente de 0
 * (zero), caso contrrio zero.</td>
 * </tr>
 * <tr>
 * <td >43-43</td>
 * <td >1</td>
 * <td >Zero Fixo</td>
 * </tr>
 * <tr>
 * <td >44-44</td>
 * <td >1</td>
 * <td >Dgito verificador do campo livre calculado por mdulo 11 com
 * aproveitamento total (resto igual a (0) zero ou (1) um o Dgito ser (0)
 * zero)</td>
 * </tr>
 * </table>
 * 
 * 
 * @see br.com.nordestefomento.jrimum.bopepo.campolivre.AbstractCampoLivre
 * 
 * @author <a href="http://gilmatryx.googlepages.com/">Gilmar P.S.L</a>
 * @author <a href="http://jrimum.nordestefomento.com.br/wprojeto">JRimum</a>
 */
class CLSicredi extends AbstractCLSicredi {

    /**
     * 
     */
    private static final long serialVersionUID = 7697120719706717353L;

    private static final Integer FIELDS_LENGTH = 9;

    private static final Modulo modulo11 = new Modulo(TipoDeModulo.MODULO11);

    /**
     * <p>
     * Cdigo nmerico correspondente ao tipo de cobrana: "3" - SICREDI.
     * </p>
     */
    private static final String COBRANCA = "3";

    /**
     * <p>
     * Cdigo nmerico correspondente ao tipo de carteira: "1" - carteira
     * simples.
     * </p>
     */
    private static final String CARTEIRA = "1";

    /**
     * <p>
     * Primeira posio do campo livre.
     * </p>
     */
    private static final Field<String> FIELD_COBRANCA = new Field<String>(COBRANCA, 1);

    /**
     * <p>
     * Segunda posio do campo livre.
     * </p>
     */
    private static final Field<String> FIELD_CARTEIRA = new Field<String>(CARTEIRA, 1);

    protected CLSicredi(Titulo titulo) {

        super(FIELDS_LENGTH, STRING_LENGTH);

        try {

            this.add(FIELD_COBRANCA);
            this.add(FIELD_CARTEIRA);

            this.add(new Field<String>(loadNossoNumero(titulo), 9, Filler.ZERO_LEFT));

            InnerCooperativaDeCredito cooperativa = loadCooperativaDeCredito(
                    titulo.getContaBancaria().getAgencia());

            this.add(new Field<String>(cooperativa.codigo, 4, Filler.ZERO_LEFT));
            this.add(new Field<String>(cooperativa.posto, 2, Filler.ZERO_LEFT));

            this.add(new Field<String>(componhaCodigoDoCedente(titulo.getContaBancaria().getNumeroDaConta()), 5,
                    Filler.ZERO_LEFT));

            if (titulo.getValor() != null && titulo.getValor().doubleValue() > 0) {
                this.add(new Field<String>("1", 1));

            } else {
                this.add(new Field<String>("0", 1));
            }

            this.add(new Field<String>("0", 1));
            this.add(new Field<String>(calculeDigitoVerificador(), 1));

        } catch (Exception e) {
            throw new CampoLivreException("Ocorreu um problema ao tentar gerar o campo livre Sicredi.", e);
        }
    }

    private String loadNossoNumero(Titulo titulo) {

        String nossoNumeroComposto = null;

        String nossoNumero = titulo.getNossoNumero();
        String dvNossoNumero = titulo.getDigitoDoNossoNumero();

        if (isNotNull(nossoNumero, "Nosso Nmero")) {

            if (isNotBlank(nossoNumero) && isNumeric(nossoNumero)) {

                if (nossoNumero.length() == 8) {
                    nossoNumeroComposto = nossoNumero;

                } else {
                    new IllegalArgumentException("Nosso nmero deve ter exatamente 8 dgitos: " + nossoNumero);
                }

            } else {
                new IllegalArgumentException("Nosso nmero deve conter somente nmeros e no: " + nossoNumero);
            }
        }

        if (isNotNull(dvNossoNumero, "Dgito Verificador do Nosso Nmero")) {

            if (isNotBlank(dvNossoNumero) && isNumeric(dvNossoNumero)) {

                Integer dvNN = Integer.valueOf(dvNossoNumero);

                if (dvNN >= 0 && dvNN <= 9) {
                    nossoNumeroComposto += dvNN.toString();

                } else {
                    new IllegalArgumentException(
                            "O dgito Verificador do Nosso Nmero deve ser um nmero natural no-negativo de 0 a 9, e no: ["
                                    + dvNN + "]");
                }

            } else {
                new IllegalArgumentException("Nosso nmero deve conter somente nmeros e no: " + nossoNumero);
            }
        }

        if (nossoNumeroComposto.length() != 9) {
            throw new IllegalStateException(
                    "Nosso nmero [" + nossoNumeroComposto + "] com tamanho diferente da especificao (9)");
        }

        return nossoNumeroComposto.toString();
    }

    InnerCooperativaDeCredito loadCooperativaDeCredito(Agencia agencia) {

        InnerCooperativaDeCredito cooperativa = null;

        if (isNotNull(agencia.getCodigo(), "Nmero da Agncia Sicredi")) {

            if (agencia.getCodigo() > 0) {

                if (String.valueOf(agencia.getCodigo()).length() <= 4) {

                    cooperativa = new InnerCooperativaDeCredito();

                    cooperativa.codigo = "" + agencia.getCodigo();

                } else {
                    new IllegalArgumentException(
                            "Nmero da Agncia Sicredi deve conter no mximo 4 dgitos (SEM O DIGITO VERIFICADOR) e no: "
                                    + agencia.getCodigo());
                }

            } else {
                new IllegalArgumentException(
                        "Nmero da Agncia Sicredi com valor invlido: " + agencia.getCodigo());
            }
        }

        if (isNotNull(agencia.getDigitoVerificador(), "Dgito da Agncia Sicredi")) {
            if (StringUtils.isNumeric(agencia.getDigitoVerificador())) {

                if (String.valueOf(agencia.getDigitoVerificador()).length() <= 2) {

                    Integer digitoDaAgencia = Integer.valueOf(agencia.getDigitoVerificador());

                    if (digitoDaAgencia >= 0) {
                        cooperativa.posto = digitoDaAgencia.toString();
                    } else {
                        new IllegalArgumentException(
                                "O dgito da Agncia Sicredi deve ser um nmero natural no-negativo, e no: ["
                                        + agencia.getDigitoVerificador() + "]");
                    }

                } else {
                    new IllegalArgumentException(
                            "Dgito da Agncia Sicredi deve conter no mximo 2 dgitos e no: "
                                    + agencia.getCodigo());
                }

            } else {
                new IllegalArgumentException("O dgito da Agncia Sicredi deve ser numrico, e no: ["
                        + agencia.getDigitoVerificador() + "]");
            }
        }

        return cooperativa;
    }

    String componhaCodigoDoCedente(NumeroDaConta conta) {// 5digitos sem dv

        final String msg = "<<<ATENO>>> O dgito da Conta/Cdigo do Cedente Sicredi deve ser fornecido somente quando o nmero da (Conta/Cdigo do Cedente) "
                + "for composto de 1 a 4 dgitos, e no: [" + conta.getDigitoDaConta() + "]";

        StringBuilder codigoDoCedente = new StringBuilder();

        if (isNotNull(conta.getCodigoDaConta(), "Nmero da Conta/Cdigo do Cedente Sicredi")) {

            if (conta.getCodigoDaConta() > 0) {

                if (conta.getCodigoDaConta().toString().length() <= 5) {

                    codigoDoCedente.append(conta.getCodigoDaConta().toString());

                    if (conta.getCodigoDaConta().toString().length() < 5) {// ComDigito

                        if (isNotBlank(conta.getDigitoDaConta())) {

                            if (isNumeric(conta.getDigitoDaConta())) {

                                Integer digitoDaConta = Integer.valueOf(conta.getDigitoDaConta());

                                if (digitoDaConta >= 0) {
                                    codigoDoCedente.append(digitoDaConta);
                                } else {
                                    new IllegalArgumentException(
                                            "O dgito da Conta/Cdigo do Cedente Sicredi deve ser um nmero natural no-negativo, e no: ["
                                                    + conta.getDigitoDaConta() + "]");
                                }

                            } else {
                                throw new CampoLivreException(new IllegalArgumentException(
                                        "O dgito da Conta/Cdigo do Cedente Sicredi deve ser numrico, e no: ["
                                                + conta.getDigitoDaConta() + "]"));
                            }
                        } else {
                            System.out.println(msg);
                        }
                    }

                } else {
                    new IllegalArgumentException(
                            "Nmero da Conta/Cdigo do Cedente Sicredi deve conter no mximo 6 dgitos (SEM O DIGITO VERIFICADOR) e no: "
                                    + conta.getCodigoDaConta());
                }

            } else {
                new IllegalArgumentException("Nmero da Conta/Cdigo do Cedente Sicredi com valor invlido: "
                        + conta.getCodigoDaConta());
            }
        }

        return codigoDoCedente.toString();
    }

    private String calculeDigitoVerificador() {

        Integer dv = 0;

        this.setStringLength(STRING_LENGTH - 1);
        this.setFieldsLength(FIELDS_LENGTH - 1);

        String campoLivreSemDv = this.write();

        this.setFieldsLength(FIELDS_LENGTH);
        this.setStringLength(STRING_LENGTH);

        int resto = modulo11.calcule(campoLivreSemDv);

        if (resto != 0 && resto != 1) {

            dv = modulo11.valor() - resto;
        } else
            dv = resto;

        return "" + dv;
    }

    class InnerCooperativaDeCredito {

        String codigo;

        String posto;

    }
}