/**
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*/
package br.gov.camara.edemocracia.portlets.priorizacao.service.persistence;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import br.gov.camara.edemocracia.portlets.priorizacao.PropostaDisplay;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Eixo;
import br.gov.camara.edemocracia.portlets.priorizacao.model.Proposta;
import br.gov.camara.edemocracia.portlets.priorizacao.model.impl.PropostaImpl;
import com.liferay.portal.kernel.dao.orm.SQLQuery;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.dao.orm.Type;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;
/**
* @author p_7339
*
*/
public class PropostaFinderImpl extends BasePersistenceImpl<Proposta> implements
PropostaFinder {
/**
* Lista todas as propostas de um eixo e a situação da votação
*
* @param userId
* @param eixoId
* @param podeVerVotos
* @param podeVotar
* @return
* @throws SystemException
*/
public List<PropostaDisplay> findPropostaDisplayByUserEixo(
final long userId, final long eixoId, final int votosDisponiveis, final boolean podeVerVotos,
boolean podeVotar) throws SystemException {
Session session = null;
try {
session = openSession();
SQLQuery q;
if (userId > 0) {
q = session
.createSQLQuery("SELECT {p.*}, "
+ "(SELECT SUM(vv.numeroVotos) FROM PR_Voto vv WHERE vv.propostaId = p.propostaId GROUP BY vv.propostaId) AS totalVotos, "
+ "v.numeroVotos, v.votosDisponiveis "
+ "FROM "
+ "PR_Proposta p LEFT OUTER JOIN PR_Voto v ON p.propostaId = v.propostaId AND v.userId = ? "
+ "WHERE p.eixoId = ?");
q.setLong(0, userId);
q.setLong(1, eixoId);
} else {
q = session
.createSQLQuery("SELECT {p.*}, "
+ "(SELECT SUM(vv.numeroVotos) FROM PR_Voto vv WHERE vv.propostaId = p.propostaId GROUP BY vv.propostaId) AS totalVotos, "
+ "0, 0 FROM PR_Proposta p "
+ "WHERE p.eixoId = ?");
q.setLong(0, eixoId);
podeVotar = false;
}
q.addEntity("p", PropostaImpl.class);
q.addScalar("totalVotos", Type.INTEGER);
q.addScalar("numeroVotos", Type.INTEGER);
q.addScalar("votosDisponiveis", Type.INTEGER);
ArrayList<PropostaDisplay> retorno = new ArrayList<PropostaDisplay>();
Map<Long, Eixo> eixos = new HashMap<Long, Eixo>();
@SuppressWarnings("unchecked")
List<Object[]> result = q.list();
for (Object[] linha : result) {
// Recupera a proposta, o eixo, a situação global da votação e a
// situação do usuário
Proposta proposta = (Proposta) linha[0];
Eixo eixo;
if (eixos.containsKey(proposta.getEixoId())) {
eixo = eixos.get(proposta.getEixoId());
} else {
eixo = EixoUtil.fetchByPrimaryKey(proposta.getEixoId());
eixos.put(proposta.getEixoId(), eixo);
}
int totalVotos = (linha[1] != null && podeVerVotos) ? (Integer) linha[1]
: 0;
int votosUsuario = linha[2] != null ? (Integer) linha[2] : 0;
boolean votoPermitido = podeVotar & (votosDisponiveis > 0);
boolean podeCancelar = podeVotar & (votosUsuario > 0);
if (votoPermitido
&& !(linha[3] == null || ((Integer) linha[3]) > 0)) {
votoPermitido = false;
}
retorno.add(new PropostaDisplay(proposta, eixo, totalVotos,
votosUsuario, votosDisponiveis, votoPermitido, podeCancelar));
}
return retorno;
} catch (Exception e) {
throw processException(e);
} finally {
closeSession(session);
}
}
}