/*
* Created on 29/10/2004
*
*/
package ecar.dao;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;
import comum.database.Dao;
import comum.util.Data;
import comum.util.Util;
import ecar.enumerator.TipoOcorrencia;
import ecar.exception.ECARException;
import ecar.login.SegurancaECAR;
import ecar.pojo.ConfigExecFinanCef;
import ecar.pojo.ConfigSisExecFinanCsef;
import ecar.pojo.ConfigSisExecFinanCsefv;
import ecar.pojo.ConfiguracaoCfg;
import ecar.pojo.EfIettFonteTotEfieft;
import ecar.pojo.EfIettFonteTotEfieftPK;
import ecar.pojo.EfImportOcorrenciasEfio;
import ecar.pojo.EfItemEstContaEfiec;
import ecar.pojo.EfItemEstPrevisaoEfiep;
import ecar.pojo.EfItemEstPrevisaoEfiepPK;
import ecar.pojo.EfItemEstRealizadoEfier;
import ecar.pojo.EspecieEsp;
import ecar.pojo.ExercicioExe;
import ecar.pojo.FonteRecursoFonr;
import ecar.pojo.ImportacaoImp;
import ecar.pojo.ItemEstruturaIett;
import ecar.pojo.RecursoRec;
import ecar.pojo.UsuarioUsu;
import ecar.util.Dominios;
/**
* @author evandro, aleixo
*
*/
public class ConfigSisExecFinanDao extends Dao{
private static final int TAMANHO_CONTA_CONTABIL = 255;
private static final int TAMANHO_SIGLA_SISTEMA = 6;
private static final int TAMANHO_VALORES = 14;
private static final int TAMANHO_QTDE_REGISTROS = 6;
private static final String TR_HEADER = "00";
private static final String TR_REGISTRO = "01";
private static final String TR_REGISTRO_NAO_REVISTO = "02";
private static final String TR_TRAILER = "99";
private static final String FORMATO_DATAHORA = "ddMMyyyyHHmmss";
private static final int TAMANHO_DATAHORA = 14;
/**
* Construtor. Chama o Session factory do Hibernate
*
* @param request
*/
public ConfigSisExecFinanDao(HttpServletRequest request) {
super();
this.request = request;
}
/**
* Retorna uma lista dos sistemas cadastrados em ConfigSisExecFinanCsef que s�o ativos e possuem vers�o.
* @return List
* @throws ECARException
*/
public List getSistemasAtivos() throws ECARException{
ConfigSisExecFinanCsefvDao versaoDao = new ConfigSisExecFinanCsefvDao(null);
List retorno = new ArrayList();
List versoes = versaoDao.getCsefvOrderBySistema();
if(versoes != null && !versoes.isEmpty()){
Iterator itVersoes = versoes.iterator();
while(itVersoes.hasNext()){
ConfigSisExecFinanCsefv versao = (ConfigSisExecFinanCsefv) itVersoes.next();
if(!retorno.contains(versao.getConfigSisExecFinanCsef())){
retorno.add(versao.getConfigSisExecFinanCsef());
}
}
}
return retorno;
}
/**
* Gera o arquivo de exporta��o para integra��o financeira
* @param nomeArquivo
* @param codSistema
* @param mesAnoIni
* @param mesAnoFim
* @param configuracao
* @return String[]: posicao 0 --> caminho do arquivo gravado no servidor
* posicao 1 --> nome do arquivo gerado
* @throws ECARException
*/
public String[] gerarArquivoExportacaoTxt(String nomeArquivo, String codSistema, String mesAnoIni, String mesAnoFim, ConfiguracaoCfg configuracao) throws ECARException{
ItemEstruturaContaOrcamentoDao itemEstContaDao = new ItemEstruturaContaOrcamentoDao(null);
//nomeArquivo = Util.trocarEspacoPorCaracter(nomeArquivo, "_");
String caminho = configuracao.getRaizUpload() + configuracao.getUploadIntegracao();
if(!caminho.endsWith("/"))
caminho = caminho + "/";
String caminhoCompleto = "";
try{
String formato = "ddMMyyyyHHmmssSSS";
SimpleDateFormat formatter = new SimpleDateFormat(formato);
ConfigSisExecFinanCsef sistema = (ConfigSisExecFinanCsef) this.buscar(ConfigSisExecFinanCsef.class, Long.valueOf(codSistema));
nomeArquivo += "_" + sistema.getSiglaCsef() + "_" + formatter.format(new Date()) + "_export.txt";
caminhoCompleto = caminho + nomeArquivo;
File diretorio = new File(caminho);
if(!diretorio.isDirectory())
diretorio.mkdirs();
FileOutputStream arquivo = new FileOutputStream(caminhoCompleto);
String siglaSistema = sistema.getSiglaCsef();
int tam = siglaSistema.length();
for(int i = tam; i < TAMANHO_SIGLA_SISTEMA; i++){
siglaSistema += " ";
}
String maIni[] = mesAnoIni.split("/");
String maFim[] = mesAnoFim.split("/");
String dataHoraGeracao = (new SimpleDateFormat(FORMATO_DATAHORA)).format(new Date());
/*Gravar o HEADER - TR00 - no arquivo*/
String header = TR_HEADER + siglaSistema + maIni[0] + maIni[1] + maFim[0] + maFim[1] + dataHoraGeracao + "\n";
arquivo.write(header.getBytes(Dominios.ENCODING_DEFAULT));
arquivo.flush();
double[] totais = new double[6];
for(int i = 0; i < 6; i++){
totais[i] = 0;
}
long qtdeReg = 2; //TR00 e TR99 j� contam!!!
/*Verificar se existem contas em EfItemEstRealizadoEfier*/
List contasEfiec = itemEstContaDao.getContasParaExportacao(maIni[0], maIni[1], maFim[0], maFim[1]);
if(!contasEfiec.isEmpty()){
Iterator itContas = contasEfiec.iterator();
while(itContas.hasNext()){
EfItemEstContaEfiec conta = (EfItemEstContaEfiec) itContas.next();
String contaContabil = conta.getContaSistemaOrcEfiec();
if(contaContabil != null && !"".equals(contaContabil)){
tam = contaContabil.length();
for(int i = tam; i < TAMANHO_CONTA_CONTABIL; i++){
contaContabil += " ";
}
/* Registrar no arquivo um TR da conta para cada mes/ano do intervalo selecionado.
* Ou seja, se foi selecionado de 01/2006 a 05/2006, para cada conta deve-se escrever
* no arquivo um:
*
* 01Conta1 ... 012006
* 01Conta1 ... 022006
* ...
* 01Conta1 ... 052006
* 01Conta2 ... 012006
* 01Conta2 ... 022006
* ...
* 01Conta2 ... 052006
* .
* .
* .
* 01ContaN ... 012006
* 01ContaN ... 022006
* ...
* 01ContaN ... 052006
*/
int mes = Integer.parseInt(maIni[0]);
int ano = Integer.parseInt(maIni[1]);
int mesFim = Integer.parseInt(maFim[0]);
int anoFim = Integer.parseInt(maFim[1]);
/*Existe uma valida��o na tela que n�o permite gerar este arquivo com
* uma data final menor que a data inicial, portanto basta testar
* considerando que a data inicial � menor ou igual a data final. */
while(ano <= anoFim){
if(ano < anoFim){
while (mes <= 12){
qtdeReg++;
String registro = TR_REGISTRO + contaContabil + ((mes < 10) ? "0"+String.valueOf(mes) : String.valueOf(mes)) + ano + "\n";
arquivo.write(registro.getBytes());
arquivo.flush();
mes++;
}
mes = 1;
ano++;
}
else if (ano == anoFim) {
while(mes <= mesFim){
qtdeReg++;
String registro = TR_REGISTRO + contaContabil + ((mes < 10) ? "0"+String.valueOf(mes) : String.valueOf(mes)) + ano + "\n";
arquivo.write(registro.getBytes(Dominios.ENCODING_DEFAULT));
arquivo.flush();
mes++;
}
break; //Como ano == anoFim, quando terminar o loop dos meses, deve sair do loop mais externo.
}
}
}
}
}
/* Gravar TRAILER - TR99 - para totaliza��o */
String qtdeRegistros = Util.completarZerosEsquerda(Long.valueOf(qtdeReg), TAMANHO_QTDE_REGISTROS);
String totVal1 = Util.formataNumeroDecimalParaExportacao(totais[0], TAMANHO_VALORES);
String totVal2 = Util.formataNumeroDecimalParaExportacao(totais[1], TAMANHO_VALORES);
String totVal3 = Util.formataNumeroDecimalParaExportacao(totais[2], TAMANHO_VALORES);
String totVal4 = Util.formataNumeroDecimalParaExportacao(totais[3], TAMANHO_VALORES);
String totVal5 = Util.formataNumeroDecimalParaExportacao(totais[4], TAMANHO_VALORES);
String totVal6 = Util.formataNumeroDecimalParaExportacao(totais[5], TAMANHO_VALORES);
String total = TR_TRAILER + qtdeRegistros + totVal1 + totVal2 + totVal3 + totVal4 + totVal5 + totVal6 + "\n";
arquivo.write(total.getBytes(Dominios.ENCODING_DEFAULT));
arquivo.flush();
arquivo.close();
} catch (Exception e) {
Logger logger = Logger.getLogger(this.getClass());
logger.error(e);
}
String[] retorno = {caminhoCompleto, nomeArquivo};
return retorno;
}
/**
* Verifica, segundo Anexo 1 do pacote de Integra��o Financeira, o arquivo conforme
* regras estabelecidas neste anexo.
* @param arquivoGravado
* @param configuracao
* @param usuarioLogado
* @param request
* @return List[]: Posi��o 0 --> form-beans dos registros v�lidos.
* Posi��o 1 --> ocorr�ncias (EfImportOcorrenciasEfio) encontrados na cr�tica.
* @throws ECARException
* @throws Exception
*/
public List[] criticaArquivoImportado(File arquivoGravado,
ConfiguracaoCfg configuracao,
UsuarioUsu usuarioLogado,
HttpServletRequest request) throws ECARException, Exception {
ItemEstruturaContaOrcamentoDao itemEstContaDao = new ItemEstruturaContaOrcamentoDao(null);
ConfigSisExecFinanCsefvDao versaoDao = new ConfigSisExecFinanCsefvDao(null);
//Dados Importacao
ImportacaoImp dadosImportacao = new ImportacaoImp();
dadosImportacao.setDataHoraImp(new Date());
dadosImportacao.setNomeArquivoImp(arquivoGravado.getName());
Date inicioPeriodo = null;
Date fimPeriodo = null;
List registrosValidos = new ArrayList();
List<EfImportOcorrenciasEfio> ocorrencias = new ArrayList<EfImportOcorrenciasEfio>();
Long totalRegistros01 = 0L;
List sistemasExistentes = getSistemasAtivos();
List contasOrcamentarias = itemEstContaDao.listar(EfItemEstContaEfiec.class, new String[] {"contaSistemaOrcEfiec", "asc"});
ConfigSisExecFinanCsef sistemaValido = null;
boolean existeSistema = false;
//Inicializa��o do Total
BigDecimal[] total = new BigDecimal[6];
for(int i = 0; i < 6; i++)
total[i] = new BigDecimal("0");
if(contasOrcamentarias == null)
contasOrcamentarias = new ArrayList();
try{
BufferedReader in = new BufferedReader (new FileReader(arquivoGravado));
String linha="";
//Dados para TR00
String sistema = "";
String mesIni = "";
String anoIni = "";
String mesFim = "";
String anoFim = "";
String dataHoraGeracao = "";
String dataHoraCarga = "";
long registrosLidos = 0;
while ((linha=in.readLine()) != null) {
String tr = "";
try{
tr = linha.substring(0, 2);
}catch (StringIndexOutOfBoundsException siobe) {
//N�o conseguiu executar substring de 2 posi��es na linha
//ou seja, a linha tem zero ou s� um caracter.
relatarOcorrencia("TR deve ser v�lido - " + linha + " linha:" + registrosLidos,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.TR_INVALIDO),
dadosImportacao);
//this.logger.error(siobe); //N�o � necess�rio logar essa exce��o
continue;
}
if(TR_HEADER.equals(tr)){ //00
registrosLidos++;
sistema = linha.substring(2,8);
mesIni = linha.substring(8,10);
anoIni = linha.substring(10,14);
mesFim = linha.substring(14,16);
anoFim = linha.substring(16,20);
dataHoraGeracao = linha.substring(20,34);
inicioPeriodo = new SimpleDateFormat("MMyyyy").parse(mesIni + anoIni);
fimPeriodo = new SimpleDateFormat("MMyyyy").parse(mesFim + anoFim);
try{
dataHoraCarga = linha.substring(34,48);
}catch (StringIndexOutOfBoundsException siobe) {
//DataHora Carga inv�lida: O Arquivo n�o foi gerado para importa��o!!!
relatarOcorrencia("TR" + TR_HEADER + " linha:" + registrosLidos + " - Data/Hora da carga n�o informada.",
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.DATA_HORA_CARGA_INEXISTENTE),
dadosImportacao);
//this.logger.error(siobe); //N�o � necess�rio logar essa exce��o
continue;
}
//Verificar se o Sistema existe
sistema = sistema.trim();
Iterator itSis = sistemasExistentes.iterator();
while(itSis.hasNext()){
ConfigSisExecFinanCsef sis = (ConfigSisExecFinanCsef) itSis.next();
if(sistema.equals(sis.getSiglaCsef())){
sistemaValido = sis;
existeSistema = true;
break;
}
}
if(!existeSistema){
relatarOcorrencia("TR" + TR_HEADER + " linha:" + registrosLidos + " - Sistema inv�lido - " + sistema,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.SISTEMA_INVALIDO),
dadosImportacao);
}
validarMes(mesIni, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - M�s inicial da solicita��o", dadosImportacao);
validarAno(anoIni, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - Ano inicial da solicita��o", dadosImportacao);
validarMes(mesFim, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - M�s final da solicita��o", dadosImportacao);
validarAno(anoFim, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - Ano final da solicita��o", dadosImportacao);
validarDataHora(dataHoraGeracao, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - Data/hora da Gera��o deve ser v�lida - " + dataHoraGeracao, dadosImportacao);
validarDataHora(dataHoraCarga, ocorrencias, "TR" + TR_HEADER + " linha:" + registrosLidos + " - Data/hora da Carga deve ser v�lida - " + dataHoraCarga, dadosImportacao);
dadosImportacao.setDataHoraGeracaoSisOrigem(new SimpleDateFormat("ddMMyyyyHHmmss").parse(dataHoraGeracao));
}
else if(TR_REGISTRO.equals(tr)){ //01
totalRegistros01++;
registrosLidos++;
boolean houveOcorrencia = false;
//Dados para TR01
String conta = linha.substring(2,257).toUpperCase();
String mesTrRegistro = linha.substring(257, 259);
String anoTrRegistro = linha.substring(259,263);
int pos = 263;
int posFim = pos + TAMANHO_VALORES;
int numeroValores = 6;
String[] valores = new String[numeroValores];
int cont = 0;
while(cont < numeroValores){
valores[cont] = linha.substring(pos, posFim);
pos = posFim;
posFim = posFim + TAMANHO_VALORES;
cont++;
}
String indContabilidade = linha.substring(pos, pos + 1);
String valor1Registro = valores[0].trim();
String valor2Registro = valores[1].trim();
String valor3Registro = valores[2].trim();
String valor4Registro = valores[3].trim();
String valor5Registro = valores[4].trim();
String valor6Registro = valores[5].trim();
//Verifica se existe a acao descrita na descri��o da conta.
final int ACAO = 3;
boolean existeConta = false;
String[] decompoeConta = conta.trim().split(" ");
String projAtividade = decompoeConta[0];
String recursoCta = decompoeConta[2];
String fonteCta = decompoeConta[3];
Query q = this.session.createQuery("from ItemEstruturaIett iett where iett.estruturaEtt.codEtt = :codEtt and trim( iett.siglaIett ) = :siglaIett and iett.indAtivoIett = 'S'");
q.setLong("codEtt", ACAO);
q.setString("siglaIett", projAtividade);
//Se == 0, ent�o a sigla da acao (projeto atividade) n�o existe.
if(q.list().size() == 0) {
relatarOcorrencia("TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Item '" + projAtividade + "' n�o encontrado - conta:" + conta,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.ACAO_INEXISTENTE),
dadosImportacao,
conta);
houveOcorrencia = true;
}
//Verifica a existencia do recurso
q = this.session.createQuery("from FonteRecursoFonr where trim( siglaFonr ) = :siglaFonr");
q.setString("siglaFonr", recursoCta);
if(q.list().size() == 0) {
relatarOcorrencia("TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Item '" + recursoCta + "' n�o encontrado - conta:" + conta,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.FONTE_INEXISTENTE),
dadosImportacao,
conta);
houveOcorrencia = true;
}
//Verifica a existencia da fonte
q = this.session.createQuery("from RecursoRec where trim( siglaRec ) = :siglaRec");
q.setString("siglaRec", fonteCta);
if(q.list().size() == 0) {
relatarOcorrencia("TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Item '" + fonteCta + "' n�o encontrado - conta:" + conta,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.RECURSO_INEXISTENTE),
dadosImportacao,
conta);
houveOcorrencia = true;
}
//Se n�o houve nenhuma ocorr�ncia nos passos anteriores, analisa a exist�ncia da conta.
if(!houveOcorrencia) {
//Verifica se a conta existe no Sistema.
conta = conta.trim();
existeConta = false;
Iterator itConta = contasOrcamentarias.iterator();
while(itConta.hasNext()){
EfItemEstContaEfiec con = (EfItemEstContaEfiec) itConta.next();
if(conta.trim().equals(con.getContaSistemaOrcEfiec().trim())){
existeConta = true;
break;
}
}
if(!existeConta){
relatarOcorrencia("TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Conta n�o econtrada - conta:" + conta,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.CONTA_INEXISTENTE),
dadosImportacao,
conta);
houveOcorrencia = true;
}
}
houveOcorrencia = houveOcorrencia || !validarMes(mesTrRegistro, ocorrencias, "TR" + TR_REGISTRO + " linha:" + registrosLidos + " - M�s", dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarAno(anoTrRegistro, ocorrencias, "TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Ano", dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarSistemaMesAno(conta, sistemaValido, mesTrRegistro, anoTrRegistro, TR_REGISTRO + " linha:" + registrosLidos, ocorrencias, dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor1Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor1Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor2Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor2Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor3Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor3Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor4Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor4Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor5Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor5Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor6Registro, ocorrencias, TR_REGISTRO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor6Cfg(), dadosImportacao);
if(!"A".equals(indContabilidade) && !"F".equals(indContabilidade)){
relatarOcorrencia("TR" + TR_REGISTRO + " linha:" + registrosLidos + " - Flag indicador de contabilidade encerrada inv�lido - " + indContabilidade,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.FLAG_CONTABILIDADE_INVALIDO),
dadosImportacao);
houveOcorrencia = true;
}
if(!houveOcorrencia && !"".equals(dataHoraCarga)){
//Incluir dados na lista de registros v�lidos.
//Dados que entram neste IF est�o todos v�lidos!!!
EfItemEstRealizadoEfier registroValido = new EfItemEstRealizadoEfier();
registroValido.setDataInclusaoEfier(Data.getDataAtual());
registroValido.setUsuarioUsu(usuarioLogado);
registroValido.setContaSistemaOrcEfier(conta);
registroValido.setMesReferenciaEfier(Long.valueOf(mesTrRegistro));
registroValido.setAnoReferenciaEfier(Long.valueOf(anoTrRegistro));
registroValido.setDataHoraInfoEfier(Data.parseDate(dataHoraCarga, FORMATO_DATAHORA));
registroValido.setIndManualEfier("N");
registroValido.setImportacaoImp(dadosImportacao);
registroValido.setConfigSisExecFinanCsefv(versaoDao.getConfigSisExecFinanCsefv(Long.valueOf(anoTrRegistro), Long.valueOf(mesTrRegistro), sistemaValido));
registroValido.setValor1Efier(toBigDecimal(valor1Registro).doubleValue());
registroValido.setValor2Efier(toBigDecimal(valor2Registro).doubleValue());
registroValido.setValor3Efier(toBigDecimal(valor3Registro).doubleValue());
registroValido.setValor4Efier(toBigDecimal(valor4Registro).doubleValue());
registroValido.setValor5Efier(toBigDecimal(valor5Registro).doubleValue());
registroValido.setValor6Efier(toBigDecimal(valor6Registro).doubleValue());
registroValido.setIndContabilidadeEfier(indContabilidade);
registrosValidos.add(registroValido);
}
total[0] = total[0].add(toBigDecimal(valor1Registro));
total[1] = total[1].add(toBigDecimal(valor2Registro));
total[2] = total[2].add(toBigDecimal(valor3Registro));
total[3] = total[3].add(toBigDecimal(valor4Registro));
total[4] = total[4].add(toBigDecimal(valor5Registro));
total[5] = total[5].add(toBigDecimal(valor6Registro));
}
else if(TR_REGISTRO_NAO_REVISTO.equals(tr)){ //02
registrosLidos++;
String mesTrNaoPrevisto = linha.substring(2,4);
String anoTrNaoPrevisto = linha.substring(4,8);
int pos = 8;
int posFim = pos + TAMANHO_VALORES;
int numeroValores = 6;
String[] valores = new String[numeroValores];
int cont = 0;
while(cont < numeroValores){
valores[cont] = linha.substring(pos, posFim);
pos = posFim;
posFim = posFim + TAMANHO_VALORES;
cont++;
}
String valor1NaoPrevisto = valores[0].trim();
String valor2NaoPrevisto = valores[1].trim();
String valor3NaoPrevisto = valores[2].trim();
String valor4NaoPrevisto = valores[3].trim();
String valor5NaoPrevisto = valores[4].trim();
String valor6NaoPrevisto = valores[5].trim();
boolean houveOcorrencia = false;
houveOcorrencia = houveOcorrencia || !validarMes(mesTrNaoPrevisto, ocorrencias, "TR" + TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos + " - M�s", dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarAno(anoTrNaoPrevisto, ocorrencias, "TR" + TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos + " - Ano", dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarSistemaMesAno("", sistemaValido, mesTrNaoPrevisto, anoTrNaoPrevisto, TR_REGISTRO_NAO_REVISTO, ocorrencias, dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor1NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor1Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor2NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor2Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor3NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor3Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor4NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor4Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor5NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor5Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(valor6NaoPrevisto, ocorrencias, TR_REGISTRO_NAO_REVISTO + " linha:" + registrosLidos, configuracao.getFinanceiroDescValor6Cfg(), dadosImportacao);
if(!houveOcorrencia && !"".equals(dataHoraCarga)){
//Incluir dados na lista de registros v�lidos.
//Dados que entram neste IF est�o todos v�lidos!!!
EfItemEstRealizadoEfier registroValido = new EfItemEstRealizadoEfier();
registroValido.setDataInclusaoEfier(Data.getDataAtual());
registroValido.setUsuarioUsu(usuarioLogado);
registroValido.setMesReferenciaEfier(Long.valueOf(mesTrNaoPrevisto));
registroValido.setAnoReferenciaEfier(Long.valueOf(anoTrNaoPrevisto));
registroValido.setDataHoraInfoEfier(Data.parseDate(dataHoraCarga, FORMATO_DATAHORA));
registroValido.setIndManualEfier("N");
registroValido.setImportacaoImp(dadosImportacao);
registroValido.setConfigSisExecFinanCsefv(versaoDao.getConfigSisExecFinanCsefv(Long.valueOf(anoTrNaoPrevisto), Long.valueOf(mesTrNaoPrevisto), sistemaValido));
registroValido.setValor1Efier(toBigDecimal(valor1NaoPrevisto).doubleValue());
registroValido.setValor2Efier(toBigDecimal(valor2NaoPrevisto).doubleValue());
registroValido.setValor3Efier(toBigDecimal(valor3NaoPrevisto).doubleValue());
registroValido.setValor4Efier(toBigDecimal(valor4NaoPrevisto).doubleValue());
registroValido.setValor5Efier(toBigDecimal(valor5NaoPrevisto).doubleValue());
registroValido.setValor6Efier(toBigDecimal(valor6NaoPrevisto).doubleValue());
registrosValidos.add(registroValido);
}
total[0] = total[0].add(toBigDecimal(valor1NaoPrevisto));
total[1] = total[1].add(toBigDecimal(valor2NaoPrevisto));
total[2] = total[2].add(toBigDecimal(valor3NaoPrevisto));
total[3] = total[3].add(toBigDecimal(valor4NaoPrevisto));
total[4] = total[4].add(toBigDecimal(valor5NaoPrevisto));
total[5] = total[5].add(toBigDecimal(valor6NaoPrevisto));
}
else if(TR_TRAILER.equals(tr)){ //99
registrosLidos++;
String qtdeRegistros = linha.substring(2,8);
int pos = 8;
int posFim = pos + TAMANHO_VALORES;
int numeroValores = 6;
String[] valores = new String[numeroValores];
int cont = 0;
while(cont < numeroValores){
valores[cont] = linha.substring(pos, posFim);
pos = posFim;
posFim = posFim + TAMANHO_VALORES;
cont++;
}
String totalValor1 = valores[0].trim();
String totalValor2 = valores[1].trim();
String totalValor3 = valores[2].trim();
String totalValor4 = valores[3].trim();
String totalValor5 = valores[4].trim();
String totalValor6 = valores[5].trim();
boolean houveOcorrencia = false;
long qtde = StrToLong(qtdeRegistros);
if(qtde == -1){
relatarOcorrencia("TR" + TR_TRAILER + " linha:" + registrosLidos + " - Quantidade de registros deve ser num�rico - " + qtdeRegistros,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.QTDE_REGISTROS_INVALIDO),
dadosImportacao);
houveOcorrencia = true;
}
//Validar os registros lidos com os dados do trailer...(qtos registros foram lidos, totais de valores....)
//Caso ocorra diferen�a em algum dado, relatar ocorrencia.
houveOcorrencia = houveOcorrencia || !validarQtdeRegistrosLidos(qtde, registrosLidos, TR_TRAILER, ocorrencias, dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor1, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor1Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor2, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor2Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor3, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor3Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor4, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor4Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor5, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor5Cfg(), dadosImportacao);
houveOcorrencia = houveOcorrencia || !validarValor(totalValor6, ocorrencias, TR_TRAILER + " linha:" + registrosLidos, "Total do " + configuracao.getFinanceiroDescValor6Cfg(), dadosImportacao);
if(!houveOcorrencia && !"".equals(dataHoraCarga)){
BigDecimal[] totalTrailer = new BigDecimal[6];
for(int i = 0; i < 6; i++)
totalTrailer[i] = new BigDecimal("0");
totalTrailer[0] = toBigDecimal(totalValor1);
totalTrailer[1] = toBigDecimal(totalValor2);
totalTrailer[2] = toBigDecimal(totalValor3);
totalTrailer[3] = toBigDecimal(totalValor4);
totalTrailer[4] = toBigDecimal(totalValor5);
totalTrailer[5] = toBigDecimal(totalValor6);
for(int i = 0; i < 6; i++){
//houveOcorrencia = houveOcorrencia || validarTotaisLidos(totalTrailer[i], total[i], TR_TRAILER + " linha:" + registrosLidos, ocorrencias, dadosImportacao);
houveOcorrencia = validarTotaisLidos(totalTrailer[i], total[i], TR_TRAILER + " linha:" + registrosLidos, ocorrencias, dadosImportacao);
}
}
break; //Este break � porque o TR99 � o �ltimo registro lido. Se chegar ao TR99, acabou o n�mero de registros v�lidos.
}
else{
try{
int numero = Integer.valueOf(tr).intValue();
/* A vari�vel acima s� � utilizada para efeito de convers�o...
* Se caiu neste else e conseguiu converter, ent�o a msg � "TR deve ser v�lido,"
* se der exce��o, n�o � n�mero ent�o a msg � "TR deve ser numerico"*/
relatarOcorrencia("TR deve ser v�lido - " + tr + " linha:" + registrosLidos,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.TR_INVALIDO),
dadosImportacao);
}catch (NumberFormatException nfe) {
//N�o conseguiu converter de string para num�rico: N�o � um n�mero.
relatarOcorrencia("TR deve ser num�rico - " + tr + " linha:" + registrosLidos,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.TR_INVALIDO),
dadosImportacao);
//this.logger.error(nfe); N�o � necess�rio logar esta exce��o
}
}
}
} catch (Exception e) {
Logger logger = Logger.getLogger(this.getClass());
logger.error(e);
throw e;
}
List<ConfigSisExecFinanCsef> sistema = new ArrayList<ConfigSisExecFinanCsef>();
sistema.add(sistemaValido);
List<Date> periodo = new ArrayList<Date>();
periodo.add(inicioPeriodo);
periodo.add(fimPeriodo);
//dadosImportacao n�o precisar� ser passado para a pr�xima camada pois ele tem refer�ncia dentro do objeto 'ocorr�ncias'
dadosImportacao.setNumRegistrosValidosImp(registrosValidos.size());
dadosImportacao.setNumRegistrosInvalidosImp(totalRegistros01.intValue() - registrosValidos.size());
dadosImportacao.setUsuarioUsu(((SegurancaECAR) request.getSession().getAttribute("seguranca")).getUsuario());
//Agrupa as ocorrencias do tipo CONTA_INEXISTENTE
ocorrencias = agrupaOcorrenciasdoTipoContaInexistente(ocorrencias);
List[] retorno = {registrosValidos, ocorrencias, periodo, sistema};
request.getSession().setAttribute("dadosImportacao", dadosImportacao);
return retorno;
}
/**
* Agrupa as ocorrencias do tipo Contas Inexistentes em apenas uma ocorr�ncia por conta
* @param ocorrencias
* @return
* @throws Exception
*/
public List<EfImportOcorrenciasEfio> agrupaOcorrenciasdoTipoContaInexistente(List<EfImportOcorrenciasEfio> ocorrencias) throws Exception {
//Agrupa as contas inexistentes em apenas uma ocorrencia
List<EfImportOcorrenciasEfio> contasAgrupadas = new ArrayList<EfImportOcorrenciasEfio>();
List<EfImportOcorrenciasEfio> listaRetorno = new ArrayList<EfImportOcorrenciasEfio>();
TipoOcorrencia tipoOcorrencia = new TipoOcorrencia(TipoOcorrencia.CONTA_INEXISTENTE);
for(EfImportOcorrenciasEfio ocorrencia : ocorrencias) {
boolean existe = false;
if(ocorrencia.getTipoOcorrencia().equals(tipoOcorrencia)) {
for(EfImportOcorrenciasEfio obj : contasAgrupadas) {
if(obj.getConta().equals(ocorrencia.getConta())) {
existe = true;
break;
}
}
if(!existe) {
contasAgrupadas.add(ocorrencia);
}
} else {
listaRetorno.add(ocorrencia);
}
}
listaRetorno.addAll(contasAgrupadas);
return listaRetorno;
}
/**
* Insere uma ocorr�ncia com a data atual na lista de ocorrencias.
* @param mensagem
* @param ocorrencias
* @param tipoOcorrencia
* @param dadosImportacao
*/
public void relatarOcorrencia(String mensagem,
List<EfImportOcorrenciasEfio> ocorrencias,
TipoOcorrencia tipoOcorrencia,
ImportacaoImp dadosImportacao){
if(ocorrencias == null)
ocorrencias = new ArrayList<EfImportOcorrenciasEfio>();
EfImportOcorrenciasEfio ocorrencia = new EfImportOcorrenciasEfio();
ocorrencia.setDescricaoEfio(mensagem);
ocorrencia.setTipoOcorrencia(tipoOcorrencia);
ocorrencia.setImportacaoImp(dadosImportacao);
ocorrencias.add(ocorrencia);
}
/**
* Insere uma ocorr�ncia com a data atual na lista de ocorrencias.
* @param mensagem
* @param ocorrencias
* @param tipoOcorrencia
* @param dadosImportacao
* @param conta
* @throws Exception
*/
public void relatarOcorrencia(String mensagem,
List<EfImportOcorrenciasEfio> ocorrencias,
TipoOcorrencia tipoOcorrencia,
ImportacaoImp dadosImportacao,
String conta) throws Exception {
if(ocorrencias == null)
ocorrencias = new ArrayList<EfImportOcorrenciasEfio>();
EfImportOcorrenciasEfio ocorrencia = new EfImportOcorrenciasEfio();
ocorrencia.setDescricaoEfio(mensagem);
ocorrencia.setTipoOcorrencia(tipoOcorrencia);
ocorrencia.setImportacaoImp(dadosImportacao);
ocorrencia.setConta(conta);
ocorrencias.add(ocorrencia);
}
/**
* Transforma um valor em string para um long para importa��o.
* @param numero
* @return numero ou -1 se n�o conseguir tranformar.
*/
private long StrToLong(String numero) throws Exception {
long retorno = -1;
try{
retorno = Long.valueOf(numero.trim()).longValue();
}
catch (Exception e) {
throw e;
}
return retorno;
}
/**
* Valida m�s v�lido para importa��o
* @param strMes
* @param ocorrencias
* @param tokenMensagemOcorrencia
* @return
*/
private boolean validarMes(String strMes, List ocorrencias, String tokenMensagemOcorrencia,
ImportacaoImp dadosImportacao){
long mes = 0;
try
{
mes = StrToLong(strMes);
}catch(Exception e) {
relatarOcorrencia(tokenMensagemOcorrencia + " deve ser num�rico - " + strMes,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VALOR_INVALIDO),
dadosImportacao);
return false;
}
if(mes < 1 || mes > 12){
if(mes == -1){
relatarOcorrencia(tokenMensagemOcorrencia + " deve ser num�rico - " + strMes,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VALOR_INVALIDO),
dadosImportacao);
return false;
}
else{
relatarOcorrencia(tokenMensagemOcorrencia + " deve ser v�lido - " + strMes,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VALOR_INVALIDO),
dadosImportacao);
return false;
}
}
return true;
}
/**
* Valida um ano v�lido para importa��o
* @param strAno
* @param ocorrencias
* @param tokenMensagemOcorrencia
* @return
*/
private boolean validarAno(String strAno, List ocorrencias, String tokenMensagemOcorrencia, ImportacaoImp dadosImportados){
long ano = 0;
try
{
ano = StrToLong(strAno);
}catch(Exception e) {
return false;
}
if(ano == -1){
relatarOcorrencia(tokenMensagemOcorrencia + " deve ser num�rico - " + strAno,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VALOR_INVALIDO),
dadosImportados);
return false;
}
return true;
}
/**
* Valida campo de Datahora de importa��o
* @param strDataHora
* @param ocorrencias
* @param mensagemOcorrencia
*/
private void validarDataHora(String strDataHora,
List ocorrencias,
String mensagemOcorrencia,
ImportacaoImp dadosImportados){
//Verificar a data de carga: Se o m�todo retornar NULL, � porque n�o conseguiu converter para uma data v�lida.
if(Data.parseDate(strDataHora, FORMATO_DATAHORA) == null){
relatarOcorrencia(mensagemOcorrencia,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.FORMATO_DATA_HORA_INVALIDO),
dadosImportados);
}
else {
if(!verificaDataHoraImportacao(strDataHora))
relatarOcorrencia(mensagemOcorrencia,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.FORMATO_DATA_HORA_INVALIDO),
dadosImportados);
}
}
/**
* Valida um valor de importa��o.
* <br>
* Obs.: Se o valor estiver com um sinal de menos (-) na primeira posi��o do n�mero, o valor � validado como n�mero negativo.
* Ex.: Para a string -0000362418200, o valor ser� transformado para o n�mero -3.624.182,00, ou seja, um n�mero v�lido --> o retorno para este caso � <b>true</b>.
*
* @param strValor
* @param ocorrencias
* @param tr
* @param nomeValor
* @return
*/
private boolean validarValor(String strValor, List ocorrencias, String tr, String nomeValor, ImportacaoImp dadosImportados){
if(!"".equals(nomeValor.trim())){ //nomeValor vem da configuracao, se estiver vazio � pq n�o � para importar.
long valor = 0;
try
{
valor = StrToLong(strValor);
}catch(Exception e) {
relatarOcorrencia("TR" + tr + " - " + nomeValor + " deve ser num�rico - " + strValor,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VALOR_INVALIDO),
dadosImportados);
return false;
}
/*
if(valor == -1){
relatarOcorrencia("TR" + tr + " - " + nomeValor + " deve ser num�rico - " + strValor, ocorrencias, nomeArquivoImportado);
return false;
}
*/
}
return true;
}
/**
* Valida a quantidade de registros lidos.
* @param qtde
* @param qtdeRegistrosLidos
* @param tr
* @param ocorrencias
* @return
*/
private boolean validarQtdeRegistrosLidos(long qtde,
long qtdeRegistrosLidos,
String tr,
List ocorrencias,
ImportacaoImp dadosImportados){
if(qtde != qtdeRegistrosLidos){
relatarOcorrencia("TR" + tr + " - Quantidade de registros informados (" + String.valueOf(qtde) + ") � diferente da Quantidade de registros lidos (" + String.valueOf(qtdeRegistrosLidos) + ")",
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.INCONSISTENCIA_QTDE_REGISTROS_INFORMADOS_x_LIDOS),
dadosImportados);
return false;
}
return true;
}
/**
* Valida os totais lidos.
* @param totalTrailer
* @param totalRegistro
* @param tr
* @param ocorrencias
* @return
*/
private boolean validarTotaisLidos(BigDecimal totalTrailer,
BigDecimal totalRegistro,
String tr,
List ocorrencias,
ImportacaoImp dadosImportados){
if(totalTrailer.doubleValue() != totalRegistro.doubleValue()){
DecimalFormat nf = new DecimalFormat("#,###,###,###,###,###.00");
relatarOcorrencia("TR" + tr + " - Inconsist�ncia nos valores de totaliza��o -"
+ " calc: " + nf.format(totalRegistro)
+ " inf: " + nf.format(totalTrailer)
+ " dif: " + nf.format((totalRegistro.subtract(totalTrailer)))
, ocorrencias,
new TipoOcorrencia(TipoOcorrencia.INCONSISTENCIA_TOTALIZACAO),
dadosImportados);
return false;
}
return true;
}
/**
* Fun��o que valida se o sistema possui vers�o no M�s/Ano informado.
* @param sistema
* @param mes
* @param ano
* @param tr
* @param ocorrencias
* @return
*/
private boolean validarSistemaMesAno(String conta,
ConfigSisExecFinanCsef sistema,
String mes,
String ano,
String tr,
List ocorrencias,
ImportacaoImp dadosImportados) throws ECARException{
ConfigSisExecFinanCsefvDao versaoDao = new ConfigSisExecFinanCsefvDao(null);
Long mesLong = Long.valueOf(mes);
Long anoLong = Long.valueOf(ano);
ConfigSisExecFinanCsefv versao = versaoDao.getConfigSisExecFinanCsefv(anoLong, mesLong, sistema);
if(versao == null ||(versao != null && !"S".equals(versao.getIndAtivoCsefv()))){
relatarOcorrencia("TR" + tr + " - O Sistema n�o possui vers�o no M�s/Ano informado - " + sistema.getNomeCsef() + " (" + mes + "/" + ano + ")",
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.VERSAO_INEXISTENTE_MES_ANO),
dadosImportados);
return false;
}
/* Valida��o da conta para registros v�lidos */
if(tr.equals(TR_REGISTRO)){
List estruturasContabil = new ConfigExecFinanDao(request).getConfigExecFinanByVersao(versao);
int tamanhoConta = 0;
if (estruturasContabil != null) {
Iterator it = estruturasContabil.iterator();
while(it.hasNext()){
ConfigExecFinanCef estruturaContabil = (ConfigExecFinanCef) it.next();
/* Para cada campo da estrutura, na conta � adicionado um espa�o em branco.
* Portanto, deve-se somar ao tamanho, o numero de caracteres+1 */
tamanhoConta += estruturaContabil.getNumCaracteresCef().intValue() + 1;
}
tamanhoConta--; //Decremento o tamanho conta pq o �ltimo espa�o em branco (final) � retirado com trim().
}
if(conta.length() != tamanhoConta){
relatarOcorrencia("TR" + tr + " - A conta informada pode estar em leiaute de vers�o diferente." + conta,
ocorrencias,
new TipoOcorrencia(TipoOcorrencia.LAYOUT_INVALIDO),
dadosImportados);
return false;
}
}
return true;
}
/**
* Fun��o que transforma valores da importa��o de String para Double
* @param valor
* @return
*/
private Double valoresStringToDouble(String valor){
valor = valor.trim();
double inteiro = 0;
double decimal = 0;
if(!"".equals(valor)){
String parteInteira = valor.substring(0,valor.length() - 2);
String parteDecimal = valor.substring(valor.length() - 2, valor.length());
inteiro = new Double(parteInteira).doubleValue();
decimal = new Double("0." + parteDecimal).doubleValue();
inteiro = inteiro + decimal;
}
Double retorno = new Double(inteiro);
return retorno;
}
/**
* Verifica se uma data hora do arquivo de importa��o � v�lida.
* Para isso, a data hora deve estar no formato "ddMMyyyyHHmmss".
*
* @param dataHora
* @return
*/
private boolean verificaDataHoraImportacao(String dataHora){
if(dataHora.length() != TAMANHO_DATAHORA){
return false;
}
else {
try{
int dia = Integer.valueOf(dataHora.substring(0,2)).intValue();
int mes = Integer.valueOf(dataHora.substring(2,4)).intValue();
int ano = Integer.valueOf(dataHora.substring(4,8)).intValue();
int hora = Integer.valueOf(dataHora.substring(8,10)).intValue();
int minuto = Integer.valueOf(dataHora.substring(10,12)).intValue();
int segundo = Integer.valueOf(dataHora.substring(12,14)).intValue();
if(mes == 1 || mes == 3 || mes == 5 || mes == 7 || mes == 8 || mes == 10 || mes == 12){
if(dia < 1 || dia > 31){
return false;
}
}
else if(mes == 4 || mes == 6 || mes == 9|| mes == 11){
if(dia < 1 || dia > 30){
return false;
}
}
else if(mes == 2){
if((ano % 4) == 0 && (ano % 100) != 0){ //ano bissexto.
if(dia < 1 || dia > 29){
return false;
}
}
else{
if(dia < 1 || dia > 28){
return false;
}
}
}
else{
return false;
}
if(hora < 0 || hora > 23)
return false;
if(minuto < 0 || minuto > 59)
return false;
if(segundo < 0 || segundo > 59)
return false;
}
catch (NumberFormatException nfe) {
//this.logger.error(nfe); //N�o � necess�rio logar essa exce��o
return false;
}
}
return true;
}
/**
* Importa os dados do arquivo para a tabela EfItemEstRealizadoEfier.
* Grava as ocorrencias na tabela EfImportOcorrenciasEfio
* @param arquivoImportado
* @param configuracao
* @param usuarioLogado
* @param request
* @throws ECARException
* @throws HibernateException
* @throws Exception
*/
public void importarDadosArquivo(File arquivoImportado, ConfiguracaoCfg configuracao, UsuarioUsu usuarioLogado, HttpServletRequest request) throws ECARException, HibernateException, Exception {
ItemEstruturaRealizadoDao itemEstRealizadoDao = new ItemEstruturaRealizadoDao(null);
List[] critica = this.criticaArquivoImportado(arquivoImportado, configuracao, usuarioLogado, request);
List registrosValidos = critica[0];
List ocorrencias = critica[1];
List periodo = critica[2];
List sistema = critica[3];
Date inicio = (Date)periodo.get(0);
Date fim = (Date)periodo.get(1);
Transaction tx = null;
try{
tx = session.beginTransaction();
//Deleta ocorr�ncias antes de tudo
List listaExclusao = itemEstRealizadoDao.getItemEstRealizadoEfierToImportacao(inicio, fim, (ConfigSisExecFinanCsef)sistema.get(0));
if (listaExclusao != null) {
for(Iterator it = listaExclusao.iterator(); it.hasNext();) {
EfItemEstRealizadoEfier obj = (EfItemEstRealizadoEfier) it.next();
session.delete(obj);
}
}
if(!registrosValidos.isEmpty()){
Iterator itReg = registrosValidos.iterator();
while(itReg.hasNext()){
EfItemEstRealizadoEfier realizado = (EfItemEstRealizadoEfier) itReg.next();
session.save(realizado);
}
}
if(!ocorrencias.isEmpty()){
Iterator itOc = ocorrencias.iterator();
while(itOc.hasNext()){
EfImportOcorrenciasEfio oc = (EfImportOcorrenciasEfio) itOc.next();
session.save(oc);
}
}
tx.commit();
}
catch (HibernateException he) {
Logger logger = Logger.getLogger(this.getClass());
logger.error(he);
if(tx != null){
tx.rollback();
}
throw new ECARException("integracaoFinanceira.importarArquivo.importacao.erro");
}
catch (Exception e) {
Logger logger = Logger.getLogger(this.getClass());
logger.error(e);
if(tx != null){
tx.rollback();
}
throw new ECARException("integracaoFinanceira.importarArquivo.importacao.erro");
}
}
/**
* Recebe um array de contas a serem criadas no Sistema.
* @param contasInexistentes
* @author carlos
* @since 07/06/2007
* @throws ECARException
*/
public void criarContas(Object[] contasInexistentes) throws ECARException {
List<EfItemEstContaEfiec> todasContas = new ArrayList<EfItemEstContaEfiec>();
List<EfIettFonteTotEfieft> fontesTotEfieft = new ArrayList<EfIettFonteTotEfieft>();
Transaction tx = null;
try
{
//Abre transa��o
tx = session.beginTransaction();
Query q = null;
q = this.session.createQuery("from FonteRecursoFonr");
List<FonteRecursoFonr> fontesRecurso = (List<FonteRecursoFonr>)q.list();
q = this.session.createQuery("from ExercicioExe exe order by exe.dataInicialExe asc");
List<ExercicioExe> exercicios = (List<ExercicioExe>)q.list();
q = this.session.createQuery("from RecursoRec");
List<RecursoRec> recursos = (List<RecursoRec>)q.list();
final int ACAO = 3;
for(int indice=0; indice<contasInexistentes.length; indice++) {
String[] decompoeConta = ((String) contasInexistentes[indice]).trim().toUpperCase().split(" ");
String projAtividade = decompoeConta[0];
String obra = decompoeConta[1];
q = this.session.createQuery("from ItemEstruturaIett iett where iett.estruturaEtt.codEtt = :codEtt and trim( iett.siglaIett ) = :siglaIett and iett.indAtivoIett = 'S'");
q.setLong("codEtt", ACAO);
q.setString("siglaIett", projAtividade);
ItemEstruturaIett iett = (ItemEstruturaIett) q.list().get(0);
/************************************************/
//Verifica se j� existe objetos EfIettFonteTotEfieft para esse iett, caso contr�rio inclui o mesmo no banco.
ItemEstruturaFonteRecursoDao dao = new ItemEstruturaFonteRecursoDao(request);
//O ExercicioExe � apenas exigido no m�todo, mas n�o considerado na consulta, a linha referente
//ao ExercicioExe est� comentado no m�todo.
List fontesRecursos = dao.getFontesRecursosByExercicio(iett, new ExercicioExe());
if(fontesRecursos.size() == 0) {
//T� invertido, o Recurso responde pela Fonte do recurso e vice-versa
for(Iterator<FonteRecursoFonr> itFontes = fontesRecurso.iterator(); itFontes.hasNext();) {
FonteRecursoFonr fonte = itFontes.next();
EfIettFonteTotEfieft efTotEfieft = new EfIettFonteTotEfieft();
EfIettFonteTotEfieftPK efTotEfieftPK = new EfIettFonteTotEfieftPK();
efTotEfieftPK.setCodFonr(fonte.getCodFonr());
efTotEfieftPK.setCodIett(iett.getCodIett());
efTotEfieft.setComp_id(efTotEfieftPK);
efTotEfieft.setDataInclusaoEfieft(new Date());
efTotEfieft.setIndAtivoEfieft("S");
efTotEfieft.setItemEstruturaIett(iett);
efTotEfieft.setFonteRecursoFonr(fonte);
//Acrescenta o objeto na lista que ser� salva posteriormente no banco.
fontesTotEfieft.add(efTotEfieft);
}
}
int anoInicio = Integer.parseInt(new SimpleDateFormat("yyyy").format(iett.getDataInicioIett()));
int anoFim = anoInicio;
if(iett.getDataTerminoIett() != null) {
anoFim = Integer.parseInt(new SimpleDateFormat("yyyy").format((iett.getDataTerminoIett())));
}
//loop dos anos a serem gerados ocorr�ncias (contas)
for(int inicio=anoInicio; inicio<=anoFim; inicio++) {
List<EfItemEstContaEfiec> contas = new ArrayList<EfItemEstContaEfiec>();
int contador = (fontesRecurso.size() * recursos.size());
for(int i=1; i<=contador; i++) {
EfItemEstContaEfiec conta = new EfItemEstContaEfiec();
for(ExercicioExe exercicio : exercicios) {
int ano = Integer.parseInt(new SimpleDateFormat("yyyy").format(exercicio.getDataInicialExe()));
if(inicio == ano) {
conta.setExercicioExe(exercicio);
break;
}
}
conta.setIndAtivoEfiec("S");
conta.setIndAcumuladoEfiec("N");
conta.setFormaInclusao(Dominios.CONTA_FORMA_INCLUSAO_VIA_IMPORTACAO);
conta.setContaSistemaOrcEfiec(iett.getSiglaIett().trim() + " " + obra);
conta.setItemEstruturaIett(iett);
contas.add(conta);
}
for(Iterator<EfItemEstContaEfiec> itContas = contas.iterator(); itContas.hasNext();) {
EfItemEstContaEfiec conta = itContas.next();
for(Iterator<FonteRecursoFonr> itFontes = fontesRecurso.iterator(); itFontes.hasNext();) {
FonteRecursoFonr fonte = itFontes.next();
conta.setContaSistemaOrcEfiec(conta.getContaSistemaOrcEfiec() + " " + fonte.getSiglaFonr().trim());
conta.setFonteRecursoFonr(fonte);
//T� invertido, o Recurso responde pela Fonte do recurso e vice-versa
for(Iterator<RecursoRec> itRecursos = recursos.iterator(); itRecursos.hasNext();) {
RecursoRec recurso = itRecursos.next();
conta.setContaSistemaOrcEfiec(conta.getContaSistemaOrcEfiec().trim() + " " + recurso.getSiglaRec().trim());
conta.setRecursoRec(recurso);
if(itContas.hasNext() && itRecursos.hasNext()) {
conta = itContas.next();
conta.setFonteRecursoFonr(fonte);
conta.setContaSistemaOrcEfiec(conta.getContaSistemaOrcEfiec().trim() + " " + fonte.getSiglaFonr().trim());
} else if(itContas.hasNext() && itFontes.hasNext()) {
conta = itContas.next();
}
}
}
}
todasContas.addAll(contas);
}
ItemEstruturaPrevisaoDao iePrevisaoDao = new ItemEstruturaPrevisaoDao(request);
List<EfItemEstContaEfiec> listaPersistenciaContas = new ArrayList<EfItemEstContaEfiec>();
//Verifica se as contas a serem inseridas j� n�o existem no Sistema.
for(EfItemEstContaEfiec objConta : todasContas) {
q = this.session.createQuery("from EfItemEstContaEfiec where contaSistemaOrcEfiec = :conta and " +
"fonteRecursoFonr = :fonteRecursoFonr and " +
"exercicioExe = :exercicioExe and " +
"recursoRec = :recursoRec");
q.setString("conta", objConta.getContaSistemaOrcEfiec());
q.setLong("fonteRecursoFonr", objConta.getFonteRecursoFonr().getCodFonr());
q.setLong("exercicioExe", objConta.getExercicioExe().getCodExe());
q.setLong("recursoRec", objConta.getRecursoRec().getCodRec());
if(q.list().size() == 0) {
listaPersistenciaContas.add(objConta);
}
}
//Salva os objetos no banco
for(EfItemEstContaEfiec obj : listaPersistenciaContas) {
EfItemEstPrevisaoEfiep objEfiep = null;
try
{
objEfiep = iePrevisaoDao.buscar(obj.getItemEstruturaIett().getCodIett(),
obj.getFonteRecursoFonr().getCodFonr(), obj.getRecursoRec().getCodRec(), obj.getExercicioExe().getCodExe());
}catch (Exception e) {
//Significa que n�o achou registro e poder� ser inserido um novo objeto no banco.
objEfiep = new EfItemEstPrevisaoEfiep();
EfItemEstPrevisaoEfiepPK pk = new EfItemEstPrevisaoEfiepPK();
pk.setCodExe(obj.getExercicioExe().getCodExe());
pk.setCodFonr(obj.getFonteRecursoFonr().getCodFonr());
pk.setCodIett(obj.getItemEstruturaIett().getCodIett());
pk.setCodRec(obj.getRecursoRec().getCodRec());
objEfiep.setComp_id(pk);
objEfiep.setDataInclusaoEfiep(new Date());
objEfiep.setExercicioExe(obj.getExercicioExe());
objEfiep.setFonteRecursoFonr(obj.getFonteRecursoFonr());
objEfiep.setIndAtivoEfiep("S");
objEfiep.setItemEstruturaIett(obj.getItemEstruturaIett());
objEfiep.setRecursoRec(obj.getRecursoRec());
objEfiep.setValorAprovadoEfiep(new BigDecimal(0));
objEfiep.setValorRevisadoEfiep(new BigDecimal(0));
/*
* FIXME: Verificar esta regra
* Est� fixo, pois falta fazer na tela para informar a esp�cie e a fonte
* rec 3 = fonte 49
* rec 4 = fonte 50
* rec 5 = fonte 51
*/
if(objEfiep.getEspecieEsp() == null){
objEfiep.setEspecieEsp((EspecieEsp) buscar(EspecieEsp.class, Long.valueOf(0)));
objEfiep.setEspecieEsp(objEfiep.getEspecieEsp());
}
// if(objEfiep.getFonteFon() == null){
// if(objEfiep.getRecursoRec().getCodRec().longValue() == 3){
// objEfiep.setFonteFon((FonteFon) buscar(FonteFon.class, Long.valueOf(49)));
// }
// if(objEfiep.getRecursoRec().getCodRec().longValue() == 4){
// objEfiep.setFonteFon((FonteFon) buscar(FonteFon.class, Long.valueOf(50)));
// }
// if(objEfiep.getRecursoRec().getCodRec().longValue() == 5){
// objEfiep.setFonteFon((FonteFon) buscar(FonteFon.class, Long.valueOf(51)));
// }
// objEfiep.getComp_id().setCodFon(objEfiep.getFonteFon().getCodFon());
// }
session.save(objEfiep);
}
session.save(obj);
}
//Salva os objetos no banco
for(EfIettFonteTotEfieft obj : fontesTotEfieft) {
session.save(obj);
}
}
tx.commit();
} catch (ECARException e) {
if (tx != null)
try {
tx.rollback();
} catch (HibernateException r) {
this.logger.error(r);
throw new ECARException("erro.hibernateException");
}
this.logger.error(e);
throw e;
} catch (Exception e) {
if (tx != null)
try {
tx.rollback();
} catch (HibernateException r) {
this.logger.error(r);
throw new ECARException("erro.hibernateException");
}
this.logger.error(e);
throw new ECARException("erro.hibernateException");
}
}
/**
* Exclui um objeto passando a classe e a chave como par�metro. Primeiro carrega o objeto<br>
*
* @param obj
* @throws ECARException
*/
public void excluir (ConfigSisExecFinanCsef obj) throws ECARException {
try {
boolean excluir = true;
if ((contar(obj.getFonteRecursoFonrs()) > 0) || (contar(obj.getConfigSisExecFinanCsefvs()) > 0)) {
excluir = false;
throw new ECARException("integracaoFinanceira.sistema.exclusao.erro");
}
if (excluir)
super.excluir(obj);
} catch (ECARException e) {
this.logger.error(e);
throw e;
}
}
/**
*
* @param valor
* @return
*/
public static BigDecimal toBigDecimal(String valor) {
String inteiros = valor.substring(0, valor.length() - 2);
String decimais = valor.substring(valor.length() - 2);
String valorFormatado = inteiros + "." + decimais;
BigDecimal retorno = new BigDecimal(valorFormatado);
return retorno;
}
}