/*
* Criado em 05/01/2005
*
*/
package ecar.dao;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import comum.database.Dao;
import comum.database.HibernateUtil;
import comum.util.Data;
import comum.util.Pagina;
import ecar.exception.ECARException;
import ecar.pojo.ConfigExecFinanCef;
import ecar.pojo.EfItemEstContaEfiec;
import ecar.pojo.EfItemEstRealizadoEfier;
import ecar.pojo.ExercicioExe;
import ecar.pojo.FonteRecursoFonr;
import ecar.pojo.ItemEstruturaIett;
import ecar.pojo.RecursoRec;
/**
* @author felipev
*
*/
public class ItemEstruturaContaOrcamentoDao extends Dao {
/**
* Construtor. Chama o Session factory do Hibernate
* @param request
*/
public ItemEstruturaContaOrcamentoDao(HttpServletRequest request) {
super();
this.request = request;
}
/**
*
* @param itemEstrutura
* @param codFonr
* @return List
* @throws ECARException
*/
public List getAtivos(ItemEstruturaIett itemEstrutura, long codFonr) throws ECARException{
try{
// return this.getSession().createFilter(itemEstrutura.getEfItemEstContaEfiecs(), "where this.indAtivoEfiec = 'S' order by this.contaSistemaOrcEfiec asc").list();
return this.getSession().createFilter(itemEstrutura.getEfItemEstContaEfiecs(), "where this.indAtivoEfiec = 'S' and this.fonteRecursoFonr.codFonr = " + codFonr + " order by this.fonteRecursoFonr.sequenciaFonr asc, this.recursoRec.sequenciaRec asc").list();
} catch (HibernateException e){
this.logger.error(e);
throw new ECARException("erro.hibernateException");
}
}
/**
* Verifica a possibilidade de inclus�o de uma Conta para o item baseado na seguinte regra:
* Esta informa��o, mesmo que dispon�vel para mais de um n�vel dentro da estrutura somente poder� ser inclu�da
* em um dos n�veis dentro de um hierarquia de itens. Ou seja, se houver um ainforma��o inclu�da em um n�vel os
* itens "pais, av�s, etc" deste item e os "filhos, netos, etc" deste item n�o poder�o ter informa��o nesta fun��o
* @param itemEstrutura
* @return
* @throws ECARException
*/
public boolean verificaPossibilidadeInclusao(ItemEstruturaIett itemEstrutura) throws ECARException{
/*
try{
EstruturaEtt estrutura = itemEstrutura.getEstruturaEtt();
Query queryEstrutura = this.getSession().createQuery("select distinct conta.itemEstruturaIett.estruturaEtt " +
" from EfItemEstContaEfiec conta");
EstruturaEtt estruturaNiveis = (EstruturaEtt) queryEstrutura.uniqueResult();
if(estruturaNiveis == null)
return true;
else{
if(estruturaNiveis.equals(estrutura))
return true;
}
return false;
}catch(HibernateException e){
this.logger.error(e);
throw new ECARException(e);
}
*/
if(itemEstrutura.getEfItemEstContaEfiecs().size() > 0)
return true;
ItemEstruturaDao itemDao = new ItemEstruturaDao(request);
List lista = new ArrayList();
lista.addAll(itemDao.getAscendentes(itemEstrutura));
lista.addAll(itemDao.getDescendentes(itemEstrutura, true));
Iterator it = lista.iterator();
while(it.hasNext()){
ItemEstruturaIett itemLista = (ItemEstruturaIett) it.next();
if(itemLista.getEfItemEstContaEfiecs() != null &&
itemLista.getEfItemEstContaEfiecs().size() > 0)
return false;
}
return true;
}
/**
* M�todo que gera os campos HTML para cadastro da Estrutura da Conta, baseado nos registros
* da tabela de Estrutura Cont�bil
* @param conta Se for informada uma conta, recupera os valores gravados para esta conta
* @param disabled Indicativo mostrando se os campos devem estar desabilitados ou n�o
* @param request Procura no request a informa��o de valores para cada campo criado
* @return
* @throws ECARException
*/
public static String geraHTMLCadastroEstruturaConta(String conta, boolean disabled, HttpServletRequest request) throws ECARException {
StringBuilder retorno = new StringBuilder();
String strConta = conta;
List estruturasContabil = new ConfigExecFinanDao(request).listar(
ConfigExecFinanCef.class, new String[] { "seqApresentacaoCef","asc" });
retorno.append("");
if (estruturasContabil != null) {
Iterator it = estruturasContabil.iterator();
String camposConta[] = new String[estruturasContabil.size()];
if(strConta != null)
camposConta = strConta.split(" ");
int i = 0;
while (it.hasNext()) {
String strValor = "";
ConfigExecFinanCef estruturaContabil = (ConfigExecFinanCef) it
.next();
/* este try-catch serve para aassegurar que n�o ir� ocorrer uma exce��o ao ler valores ap�s
* ter sido criada uma nova estrutura cont�bil
*/
try{
if(camposConta[i] != null)
strValor = camposConta[i];
} catch ( ArrayIndexOutOfBoundsException ex){
strValor = "";
}
StringBuilder buffer = new StringBuilder();
StringBuilder campoHidden = new StringBuilder();
if("validaCategoria".equals(estruturaContabil.getConfigTipoDadoCtd().getIdRotinaCtd())) {
Query q = null;
q = HibernateUtil.currentSession().createQuery("from FonteRecursoFonr");
List<FonteRecursoFonr> categorias = (List<FonteRecursoFonr>)q.list();
for(FonteRecursoFonr categoria : categorias) {
buffer.append(categoria.getSiglaFonr() + ",");
}
String strBuffer = buffer.toString().substring(0, buffer.toString().lastIndexOf(","));
campoHidden.append("<input type='hidden' name='categorias' id='categorias' value='" + strBuffer + "'>");
}
if("validaFonte".equals(estruturaContabil.getConfigTipoDadoCtd().getIdRotinaCtd())) {
Query q = null;
q = HibernateUtil.currentSession().createQuery("from RecursoRec");
List<RecursoRec> fontes = (List<RecursoRec>)q.list();
for(RecursoRec fonte : fontes) {
buffer.append(fonte.getSiglaRec() + ",");
}
String strBuffer = buffer.toString().substring(0, buffer.toString().lastIndexOf(","));
campoHidden.append("<input type='hidden' name='fontes' id='fontes' value='" + strBuffer + "'>");
}
if(!"".equals(Pagina.getParamStr(request, "e" + estruturaContabil.getCodCef())))
strValor = Pagina.getParamStr(request, "e" + estruturaContabil.getCodCef());
retorno.append("<div class=\"tabelaaolado\">")
.append(estruturaContabil.getLabelCef() )
.append(" </br>")
.append("<input type=\"text\" size=\"")
.append(estruturaContabil.getNumCaracteresCef())
.append("\" maxlength=\"")
.append(estruturaContabil.getNumCaracteresCef())
.append("\" name=\"e")
.append(estruturaContabil.getCodCef())
.append("\" value=\"")
.append(strValor)
.append("\"");
if(disabled)
retorno.append( " disabled ");
retorno.append("></div>");
if(campoHidden.length() > 0) {
retorno.append(campoHidden.toString());
}
i++;
}
}
return retorno.toString();
}
/**
* M�todo que gera o label a ser usado na listagem de Contas do Or�amento, baseado nos registros
* da tabela de Estrutura Cont�bil
* @param request
* @return String com c�digo HTML
* @throws ECARException
*/
public static String geraLabelCadastroEstruturaConta(HttpServletRequest request) throws ECARException {
StringBuilder retorno = new StringBuilder();
List estruturasContabil = new ConfigExecFinanDao(request).listar(
ConfigExecFinanCef.class, new String[] { "seqApresentacaoCef","asc" });
if (estruturasContabil != null) {
Iterator it = estruturasContabil.iterator();
while (it.hasNext()) {
ConfigExecFinanCef estruturaContabil = (ConfigExecFinanCef) it
.next();
if(retorno.length() > 0)
retorno.append(" / ");
retorno.append(estruturaContabil.getLabelCef());
}
}
return retorno.toString();
}
/**
* M�todo que gera valida��o para os campos do cadastro da Estrutura da Conta, baseado nos registros
* da tabela de Estrutura Cont�bil
* @param request
* @return String com c�digo JavaScript
* @throws ECARException
*/
public static String geraValidacaoCadastroEstruturaConta(HttpServletRequest request) throws ECARException{
StringBuilder retorno = new StringBuilder();
List estruturasContabil = new ConfigExecFinanDao(request).listar(
ConfigExecFinanCef.class,
new String [] {"seqApresentacaoCef","asc"});
if(estruturasContabil != null){
Iterator it = estruturasContabil.iterator();
while ( it.hasNext() ){
ConfigExecFinanCef estruturaContabil = (ConfigExecFinanCef) it.next();
retorno.append("if (!")
.append(estruturaContabil.getConfigTipoDadoCtd().getIdRotinaCtd())
.append("(form.e")
.append(estruturaContabil.getCodCef())
.append(",'")
.append(estruturaContabil.getLabelCef())
.append("',true))\n")
.append(" return false;\n");
}
}
return retorno.toString();
}
/**
* Exclus�o de Contas do Or�amento de um Item
* Funcionamento: Verifica se a conta est� cadastrada alguma vez em EF_Item_Est_Realizado_EFIER.
* Se n�o estivar reliza exclus�o da conta do BD, se encontrar inativa a conta.
* @param codigosParaExcluir Array com os c�digos das contas a serem exclu�das
* @throws ECARException
*/
public void excluir(String[] codigosParaExcluir) throws ECARException{
Transaction tx = null;
try{
ArrayList objetos = new ArrayList();
super.inicializarLogBean();
tx = session.beginTransaction();
for (int i = 0; i < codigosParaExcluir.length; i++) {
EfItemEstContaEfiec conta = (EfItemEstContaEfiec) this.buscar(EfItemEstContaEfiec.class, Long.valueOf(codigosParaExcluir[i]));
EfItemEstRealizadoEfier realizado = new EfItemEstRealizadoEfier();
realizado.setContaSistemaOrcEfier(conta.getContaSistemaOrcEfiec());
if( this.pesquisar(realizado, null).size() == 0) {
session.delete(conta);
objetos.add(conta);
} else {
conta.setIndAtivoEfiec("N");
session.update(conta);
objetos.add(conta);
}
}
tx.commit();
if(super.logBean != null) {
super.logBean.setCodigoTransacao(Data.getHoraAtual(false));
super.logBean.setOperacao("ALT_EXC");
Iterator itObj = objetos.iterator();
while(itObj.hasNext()) {
super.logBean.setObj(itObj.next());
super.loggerAuditoria.info(logBean.toString());
}
}
} catch (HibernateException 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");
}
}
/**
* Grava uma conta fazendo uma verifica��o anteriormente para n�o permitir que a mesma conta (estrutura) seja
* gravada mais de uma vez para o mesmo item, fonte e recurso
* @param conta
* @throws ECARException
*/
public void salvar(EfItemEstContaEfiec conta) throws ECARException{
EfItemEstContaEfiec contaAux = new EfItemEstContaEfiec();
//Esses campos nao podem repetir no registro
contaAux.setContaSistemaOrcEfiec(conta.getContaSistemaOrcEfiec());
contaAux.setExercicioExe(conta.getExercicioExe());
contaAux.setFonteRecursoFonr(conta.getFonteRecursoFonr());
contaAux.setRecursoRec(conta.getRecursoRec());
//contaAux.setItemEstruturaIett(conta.getItemEstruturaIett());
if(this.pesquisar(contaAux, null).size() > 0)
throw new ECARException("itemEstrutura.contaOrcamento.inclusao.erro.jaExiste");
else
super.salvar(conta);
}
/**
* Grava uma lista de contas
* @param contas
* @author aleixo
* @since 0.1, 12/03/2007
* @version 0.2, 13/03/2007
* @throws ECARException
*/
public void salvar(List<EfItemEstContaEfiec> contas) throws ECARException{
Transaction tx = null;
try{
tx = session.beginTransaction();
for(EfItemEstContaEfiec conta : contas){
EfItemEstContaEfiec contaAux = new EfItemEstContaEfiec();
//Esses campos nao podem repetir no registro
contaAux.setContaSistemaOrcEfiec(conta.getContaSistemaOrcEfiec());
contaAux.setExercicioExe(conta.getExercicioExe());
contaAux.setFonteRecursoFonr(conta.getFonteRecursoFonr());
contaAux.setRecursoRec(conta.getRecursoRec());
contaAux.setItemEstruturaIett(conta.getItemEstruturaIett());
//Se encontrar algum, deixar este item em particular e passar para o pr�ximo, sem gerar exce��o.
//Pq o item j� existe.
if(!(this.pesquisar(contaAux, null).size() > 0))
session.save(conta);
}
tx.commit();
} catch (HibernateException 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");
}
}
/**
* Cria um objeto EfItemEstContaEfiec a partir de par�metros passados
* no objeto request
*
* @param request
* @param conta
* @throws ECARException
*/
public void setItemEstruturaContaOrcamento(HttpServletRequest request, EfItemEstContaEfiec conta) throws ECARException{
List estruturasContabil = new ConfigExecFinanDao(request).listar(
ConfigExecFinanCef.class, new String[] { "seqApresentacaoCef","asc" });
String estrutura = "";
if (estruturasContabil != null) {
Iterator it = estruturasContabil.iterator();
while(it.hasNext()){
ConfigExecFinanCef estruturaContabil = (ConfigExecFinanCef) it.next();
if(estrutura.length() > 0)
estrutura += " ";
estrutura += Pagina.getParamStr(request, "e" + estruturaContabil.getCodCef());
}
/*
* Por causa destes ifs neste m�todo os valores da Estrutura n�o s�o perdidos na altera��o. Motivo: na tela de alterar
* conta todos os campos, com a exce��o do Acumulado est�o desabilitados e por isso n�o s�o enviados por request.
* Quando fa�o essa compara��o, ao verificar que estes campos est�o vazios, mantenho os valores existentes originalmente
* no objeto conta ( no caso s�o os valores que vieram do banco ) e por isso n�o s�o perdidos mesmo que venha vazio no
* request.
*/
if(!"".equals(estrutura))
conta.setContaSistemaOrcEfiec(estrutura);
}
if(!"".equals(Pagina.getParamStr(request, "exercicioExe")))
conta.setExercicioExe( (ExercicioExe) this.buscar(ExercicioExe.class, Long.valueOf(Pagina.getParamStr(request, "exercicioExe"))));
if(!"".equals(Pagina.getParamStr(request, "fonteRecursoFonr")))
conta.setFonteRecursoFonr( (FonteRecursoFonr) this.buscar(FonteRecursoFonr.class, Long.valueOf(Pagina.getParamStr(request, "fonteRecursoFonr"))));
if(!"".equals(Pagina.getParamStr(request, "recursoRec")))
conta.setRecursoRec( (RecursoRec) this.buscar(RecursoRec.class, Long.valueOf(Pagina.getParamStr(request, "recursoRec"))));
conta.setIndAcumuladoEfiec(Pagina.getParamStr(request, "indAcumuladoEfiec"));
conta.setItemEstruturaIett( (ItemEstruturaIett) this.buscar(ItemEstruturaIett.class, Long.valueOf(Pagina.getParamStr(request, "codIett"))) );
conta.setIndAtivoEfiec("S");
}
/**
* Devolve um ItemEstruturaConta a partir de um item, exercicio, fonte e recurso.
* Se n�o encontrar, devolve um ItemEstruturaConta vazio (somente com os parametros informados).
* @param item
* @param exercicio
* @param fonte
* @param recurso
* @return EfItemEstContaEfiec
* @throws ECARException
*/
public EfItemEstContaEfiec getItemEstruturaConta(ItemEstruturaIett item,
ExercicioExe exercicio,
FonteRecursoFonr fonte,
RecursoRec recurso) throws ECARException {
EfItemEstContaEfiec efiec = new EfItemEstContaEfiec();
List lista = new ArrayList();
efiec.setItemEstruturaIett(item);
efiec.setExercicioExe(exercicio);
efiec.setFonteRecursoFonr(fonte);
efiec.setRecursoRec(recurso);
lista = pesquisar(efiec, null);
if (lista != null && lista.size() > 0)
return ((EfItemEstContaEfiec)lista.get(0));
else
return efiec;
}
/**
* Retorna as contas (registros) para o arquivo de exporta��o
* @param mesIni
* @param anoIni
* @param mesFim
* @param anoFim
* @return Lista de contas
* @throws ECARException
* @throws HibernateException
*/
public List getContasParaExportacao(String mesIni, String anoIni, String mesFim, String anoFim) throws ECARException, HibernateException{
try{
int diaFinal = Data.getUltimoDiaMes(Data.parseDate("01/" + mesFim + "/" + anoFim));
Date dataInicial = Data.parseDate("01/" + mesIni + "/" + anoIni);
Date dataFinal = Data.parseDate(String.valueOf(diaFinal) + "/" + mesFim + "/" + anoFim);
StringBuilder baseQuery = new StringBuilder("from EfItemEstContaEfiec conta ")
.append(" where (:dataIni >= conta.exercicioExe.dataInicialExe")
.append(" and :dataFim <= conta.exercicioExe.dataFinalExe)");
Query objQuery = this.getSession().createQuery(baseQuery.toString());
objQuery.setDate("dataIni", dataInicial);
objQuery.setDate("dataFim", dataFinal);
return objQuery.list();
} catch(Exception e){
this.logger.error(e);
throw new ECARException("integracaoFinanceira.exportarArquivo.consultaDados.erro");
}
}
/**
* M�todo que verifica se j� existe no banco algum registro que coincida com os novos dados do objeto a ser alterado.
* Caso exista algum registro que coincida ent�o o m�todo retornar� false.
* @param obj
* @author carlos
* @return false
* @throws ECARException
* @throws HibernateException
*/
public boolean consisteEfItemEstContaEfiec(EfItemEstContaEfiec obj) throws ECARException, HibernateException {
boolean retorno = true;
try
{
Criteria crits = session.createCriteria(EfItemEstContaEfiec.class);
crits.add(Restrictions.ne("codEfiec", (obj.getCodEfiec() == null? 0L: obj.getCodEfiec()))); // != codEfiec
crits.add(Restrictions.eq("contaSistemaOrcEfiec", obj.getContaSistemaOrcEfiec()));
crits.add(Restrictions.eq("exercicioExe.codExe", obj.getExercicioExe().getCodExe()));
crits.add(Restrictions.eq("recursoRec.codRec", obj.getRecursoRec().getCodRec()));
crits.add(Restrictions.eq("fonteRecursoFonr.codFonr", obj.getFonteRecursoFonr().getCodFonr()));
List<EfItemEstContaEfiec> lista = (List<EfItemEstContaEfiec>)crits.list();
if (lista.size() > 0) {
retorno = false;
}
return retorno;
}catch (Exception e) {
this.logger.error(e);
throw new ECARException("erro.hibernateException");
}
}
/**
* Retorna um objeto EfItemEstContaEfiec caso exista, do contr�rio devolve null
* @author carlos
* @param conta
* @param exercicio
* @return EfItemEstContaEfiec
* @throws ECARException
* @throws HibernateException
*/
public EfItemEstContaEfiec getEfItemEstContaEfiec(String conta, ExercicioExe exercicio) throws ECARException, HibernateException {
EfItemEstContaEfiec retorno = null;
try
{
Criteria crits = session.createCriteria(EfItemEstContaEfiec.class);
crits.add(Restrictions.eq("contaSistemaOrcEfiec", conta));
crits.add(Restrictions.eq("exercicioExe.codExe", exercicio.getCodExe()));
List<EfItemEstContaEfiec> lista = (List<EfItemEstContaEfiec>)crits.list();
if(lista.size() > 0) {
retorno = lista.get(0);
}
}catch (Exception e) {
this.logger.error(e);
throw new ECARException("erro.hibernateException");
}
return retorno;
}
}