/** * 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.List; import br.gov.camara.edemocracia.portlets.priorizacao.UsuariosComMaisVotosPorPropostaException; import br.gov.camara.edemocracia.portlets.priorizacao.UsuariosComMaisVotosTotaisException; import br.gov.camara.edemocracia.portlets.priorizacao.model.Configuracao; 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.ConfiguracaoLocalServiceBaseImpl; 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.exception.PortalException; import com.liferay.portal.kernel.exception.SystemException; import com.liferay.portal.model.Group; import com.liferay.portal.service.GroupLocalServiceUtil; /** * The implementation of the configuracao 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.ConfiguracaoLocalService} interface. * </p> * * <p> * Never reference this interface directly. Always use {@link br.gov.camara.edemocracia.portlets.priorizacao.service.ConfiguracaoLocalServiceUtil} to access the configuracao 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.ConfiguracaoLocalServiceBaseImpl * @see br.gov.camara.edemocracia.portlets.priorizacao.service.ConfiguracaoLocalServiceUtil */ public class ConfiguracaoLocalServiceImpl extends ConfiguracaoLocalServiceBaseImpl { /** * Retorna a configuração definida na comunidade especificada * * @param groupId * @return * @throws SystemException * @throws PortalException */ public Configuracao getConfiguracaoPorGrupo(long groupId) throws SystemException, PortalException{ Configuracao config = configuracaoPersistence.fetchByG(groupId); if (config == null) { Group group = GroupLocalServiceUtil.getGroup(groupId); config = createConfiguracao(counterLocalService.increment()); config.setGroupId(groupId); config.setCompanyId(group.getCompanyId()); config.setMaximoVotos(20); config.setMaxVotosProposta(5); configuracaoPersistence.update(config, true); } return config; } /** * Atualiza a configuração da comunidade especificada * * @param groupId * @param maximoVotos * @param maxVotosProposta * @return * @throws SystemException * @throws PortalException */ public Configuracao updateConfiguracao(long groupId, int maximoVotos, int maxVotosProposta, boolean votacaoAberta) throws SystemException, PortalException{ Configuracao configuracao = getConfiguracaoPorGrupo(groupId); // Verifica se não haverá comprometimento dos votos já colocados if (maxVotosProposta < configuracao.getMaxVotosProposta()) { if (votoLocalService.existemUsuariosComMaisVotosPorProposta(groupId, maxVotosProposta)) throw new UsuariosComMaisVotosPorPropostaException(); } if (maximoVotos < configuracao.getMaximoVotos()) { if (votoLocalService.existemUsuariosComMaisVotos(groupId, maximoVotos)) throw new UsuariosComMaisVotosTotaisException(); } // Atualiza os dados de votos pendentes dos usuários por proposta int diferenca = maxVotosProposta - configuracao.getMaxVotosProposta(); if (diferenca != 0) { DynamicQuery qP = DynamicQueryFactoryUtil.forClass(Proposta.class); qP.add(PropertyFactoryUtil.forName("groupId").eq(groupId)); qP.setProjection(ProjectionFactoryUtil.property("propostaId")); DynamicQuery q = DynamicQueryFactoryUtil.forClass(Voto.class); q.add(PropertyFactoryUtil.forName("propostaId").in(qP)); @SuppressWarnings("unchecked") List<Voto> votos = dynamicQuery(q); for (Voto voto : votos) { voto.setVotosDisponiveis(voto.getVotosDisponiveis() + diferenca); votoLocalService.updateVoto(voto); } } configuracao.setMaximoVotos(maximoVotos); configuracao.setMaxVotosProposta(maxVotosProposta); configuracao.setVotacaoAberta(votacaoAberta); Configuracao config = configuracaoPersistence.update(configuracao, false); return config; } }