/** * 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.impl; import java.util.Date; import java.util.List; import br.gov.camara.edemocracia.portlets.priorizacao.NoSuchVotoException; import br.gov.camara.edemocracia.portlets.priorizacao.TotalVotosExcedidoException; import br.gov.camara.edemocracia.portlets.priorizacao.VotacaoFechadaException; import br.gov.camara.edemocracia.portlets.priorizacao.VotosPorPropostaExcedidoException; import br.gov.camara.edemocracia.portlets.priorizacao.model.Configuracao; 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.Voto; import br.gov.camara.edemocracia.portlets.priorizacao.service.base.VotoLocalServiceBaseImpl; import com.liferay.portal.kernel.dao.orm.DynamicQuery; import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil; import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil; import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.model.User; import com.liferay.portal.service.UserLocalServiceUtil; /** * The implementation of the voto local service. * * <p> * All custom service methods should be put in this class. Whenever methods are * added, rerun ServiceBuilder to copy their definitions into the * {@link br.gov.camara.edemocracia.portlets.priorizacao.service.VotoLocalService} * interface. * </p> * * <p> * Never reference this interface directly. Always use * {@link br.gov.camara.edemocracia.portlets.priorizacao.service.VotoLocalServiceUtil} * to access the voto local service. * </p> * * <p> * This is a local service. Methods of this service will not have security * checks based on the propagated JAAS credentials because this service can only * be accessed from within the same VM. * </p> * * @author robson * @see br.gov.camara.edemocracia.portlets.priorizacao.service.base.VotoLocalServiceBaseImpl * @see br.gov.camara.edemocracia.portlets.priorizacao.service.VotoLocalServiceUtil */ public class VotoLocalServiceImpl extends VotoLocalServiceBaseImpl { /** * Conta os votos por identificador de proposta * * @param propostaId * @return * @throws SystemException */ @Override public int getVotosByPropostaId(long propostaId) throws SystemException { DynamicQuery dq = DynamicQueryFactoryUtil.forClass(Voto.class); dq.add(RestrictionsFactoryUtil.eq("propostaId", propostaId)); dq.setProjection(ProjectionFactoryUtil.sum("numeroVotos")); List<?> ret = dynamicQuery(dq); if (ret.isEmpty() || ret.get(0) == null) return 0; else return ((Number) ret.get(0)).intValue(); } /** * Conta os votos por usuário * * @param groupId * @param userId * @return * @throws SystemException */ public int getVotosByUsuarioId(long groupId, long userId) throws SystemException { DynamicQuery dqEixo = DynamicQueryFactoryUtil.forClass(Eixo.class); dqEixo.setProjection(ProjectionFactoryUtil.property("eixoId")); dqEixo.add(RestrictionsFactoryUtil.eq("groupId", groupId)); DynamicQuery dqProposta = DynamicQueryFactoryUtil .forClass(Proposta.class); dqProposta.setProjection(ProjectionFactoryUtil.property("propostaId")); dqProposta.add(PropertyFactoryUtil.forName("eixoId").in(dqEixo)); DynamicQuery dq = DynamicQueryFactoryUtil.forClass(Voto.class); dq.add(RestrictionsFactoryUtil.eq("userId", userId)); dq.add(PropertyFactoryUtil.forName("propostaId").in(dqProposta)); dq.setProjection(ProjectionFactoryUtil.sum("numeroVotos")); List<?> ret = dynamicQuery(dq); if (ret.isEmpty() || ret.get(0) == null) return 0; else return ((Number) ret.get(0)).intValue(); } /** * Retorna o número de votos disponíveis de um usuário * * @param groupId * @param userId * @return * @throws SystemException * @throws PortalException */ public int getVotosDisponiveisByUsuarioId(long groupId, long userId) throws SystemException, PortalException { Configuracao config = configuracaoLocalService .getConfiguracaoPorGrupo(groupId); int maximoDisponivel = config.getMaximoVotos(); int disponiveis = maximoDisponivel - getVotosByUsuarioId(groupId, userId); if (disponiveis < 0) return 0; else return disponiveis; } /** * Exclui um voto na propsota especificada * * @param propostaId * @param userId * @throws SystemException * @throws PortalException */ public void deleteVoto(long propostaId, long userId) throws SystemException, PortalException { User user = UserLocalServiceUtil.getUser(userId); if (user.isDefaultUser()) return; Proposta proposta = propostaLocalService.getProposta(propostaId); Configuracao config = configuracaoLocalService .getConfiguracaoPorGrupo(proposta.getGroupId()); if (!config.isVotacaoAberta()) { throw new VotacaoFechadaException(); } Voto voto = votoPersistence.fetchByP_U(propostaId, userId); if (voto == null || voto.getNumeroVotos() <= 0) return; voto.setNumeroVotos(voto.getNumeroVotos()-1); voto.setVotosDisponiveis(voto.getVotosDisponiveis()+1); voto.setData(new Date()); if (voto.getNumeroVotos() <= 0) { deleteVoto(voto); } else { updateVoto(voto); } } /** * Adiciona um voto * * @param propostaId * @param userName * @param userUuid * @param userId * @throws SystemException * @throws PortalException */ public void addVoto(long propostaId, long userId) throws SystemException, PortalException { User user = UserLocalServiceUtil.getUser(userId); if (user.isDefaultUser()) return; Proposta proposta = propostaLocalService.getProposta(propostaId); Configuracao config = configuracaoLocalService .getConfiguracaoPorGrupo(proposta.getGroupId()); if (!config.isVotacaoAberta()) { throw new VotacaoFechadaException(); } int totalVotos = getVotosDisponiveisByUsuarioId(proposta.getGroupId(), user.getUserId()); if (totalVotos <= 0) throw new TotalVotosExcedidoException(); Voto voto; try { voto = votoPersistence.findByP_U(propostaId, userId); } catch (NoSuchVotoException e) { voto = createVoto(counterLocalService.increment()); voto.setUserId(user.getUserId()); voto.setUserUuid(user.getUserUuid().trim()); voto.setPropostaId(propostaId); voto.setVotosDisponiveis(config.getMaxVotosProposta()); voto.setData(new Date()); } if (voto.getVotosDisponiveis() <= 0) throw new VotosPorPropostaExcedidoException(); voto.setUserName(user.getFullName().trim()); voto.setVotosDisponiveis(voto.getVotosDisponiveis() - 1); voto.setNumeroVotos(voto.getNumeroVotos() + 1); voto.setData(new Date()); votoPersistence.update(voto, false); } /** * Lista os votos do usuário na proposta especificada * * @param propostaId * @param userId * @return * @throws SystemException */ @Override public Voto getVotoPorPropostaIdUserId(long propostaId, long userId) throws SystemException { return votoPersistence.fetchByP_U(propostaId, userId); } /** * Verifica se há usuários que colocaram mais votos do que o informado pelo * parâmetro. * * Utilizado para verificar se é possível mudar a configuração * * @param * @param votosPorProposta * @return */ @Override public boolean existemUsuariosComMaisVotosPorProposta(long groupId, int votosPorProposta) throws SystemException { return votoFinder.countUserIdComMaisVotosPorProposta(groupId, votosPorProposta) > 0; } @Override public boolean existemUsuariosComMaisVotos(long groupId, int totalVotos) throws SystemException { return votoFinder.countUserIdComMaisVotosTotal(groupId, totalVotos) > 0; } /** * Lista todos os votos da proposta especificada * * @param propostaId * @return * @throws SystemException */ public List<Voto> getVotosPorPropostaId(long propostaId) throws SystemException{ return votoPersistence.findByP(propostaId); } }