Java tutorial
/* * 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; } }