/** * */ package net.conselldemallorca.helium.core.model.dao; import java.util.HashMap; import java.util.List; import java.util.Map; import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus; import net.conselldemallorca.helium.core.model.hibernate.SequenciaAny; import net.conselldemallorca.helium.core.model.hibernate.SequenciaDefaultAny; import net.conselldemallorca.helium.core.util.GlobalProperties; import org.hibernate.criterion.Restrictions; import org.jbpm.jpdl.el.ELException; import org.jbpm.jpdl.el.ExpressionEvaluator; import org.jbpm.jpdl.el.VariableResolver; import org.jbpm.jpdl.el.impl.ExpressionEvaluatorImpl; import org.springframework.stereotype.Component; /** * Dao pels objectes tipus d'expedient * * @author Limit Tecnologies <limit@limit.es> */ @Component public class ExpedientTipusDao extends HibernateGenericDao<ExpedientTipus, Long> { public ExpedientTipusDao() { super(ExpedientTipus.class); } public List<ExpedientTipus> findAmbEntorn(Long entornId) { return findOrderedByCriteria( new String[] {"codi"}, true, Restrictions.eq("entorn.id", entornId)); } public List<ExpedientTipus> findAmbEntornOrdenat(Long entornId, String ordre) { return findOrderedByCriteria( new String[] {ordre}, true, Restrictions.eq("entorn.id", entornId)); } public List<ExpedientTipus> findAmbSistraTramitCodi(String tramitCodi) { return findByCriteria( Restrictions.eq("sistraTramitCodi", tramitCodi)); } public ExpedientTipus findAmbEntornICodi( Long entornId, String codi) { List<ExpedientTipus> tipus = findByCriteria( Restrictions.eq("entorn.id", entornId), Restrictions.eq("codi", codi)); if (tipus.size() > 0) return tipus.get(0); return null; } public String getNumeroExpedientActual( Long expedientTipusId, int any, long increment) { ExpedientTipus expedientTipus = getById(expedientTipusId, false); long seq = expedientTipus.getSequencia(); return getNumeroExpedientExpressio( expedientTipus, expedientTipus.getExpressioNumero(), seq, increment, any, expedientTipus.isReiniciarCadaAny(), false); } public String getNumeroExpedientDefaultActual( Long expedientTipusId, int any, long increment) { ExpedientTipus expedientTipus = getById(expedientTipusId, false); long seq = expedientTipus.getSequenciaDefault(); return getNumeroExpedientExpressio( expedientTipus, getNumexpExpression(), seq, increment, any, expedientTipus.isReiniciarCadaAny(), true); } private String getNumeroExpedientExpressio( ExpedientTipus expedientTipus, String expressio, long seq, long increment, int any, boolean reiniciarCadaAny, boolean numeroDefault) { if (reiniciarCadaAny) { if (any != 0) { if (numeroDefault) { if (expedientTipus.getSequenciaDefaultAny().containsKey(any)) { seq = expedientTipus.getSequenciaDefaultAny().get(any).getSequenciaDefault() + increment; } else { // TODO: podriem comprovar, segons el format del número per defecte si hi ha expedients ja creats de // l'any, i d'aquesta manera assignar com a número inicial el major utilitzat + 1 SequenciaDefaultAny sda = new SequenciaDefaultAny(expedientTipus, any, 1L); expedientTipus.getSequenciaDefaultAny().put(any, sda); saveOrUpdate(expedientTipus); seq = 1; } } else { if (expedientTipus.getSequenciaAny().containsKey(any)) { seq = expedientTipus.getSequenciaAny().get(any).getSequencia() + increment; } else { SequenciaAny sa = new SequenciaAny(expedientTipus, any, 1L); expedientTipus.getSequenciaAny().put(any, sa); saveOrUpdate(expedientTipus); seq = 1; } } } } else { seq = seq + increment; } if (expressio != null) { try { final Map<String, Object> context = new HashMap<String, Object>(); context.put("entorn_cod", expedientTipus.getEntorn().getCodi()); context.put("tipexp_cod", expedientTipus.getCodi()); context.put("any", any); context.put("seq", seq); ExpressionEvaluator evaluator = new ExpressionEvaluatorImpl(); String resultat = (String)evaluator.evaluate( expressio, String.class, new VariableResolver() { public Object resolveVariable(String name) throws ELException { return context.get(name); } }, null); return resultat; } catch (Exception ex) { // logger.error("Error evaluant l'expressió per calcular el número d'expedient", ex); return "#invalid expression#"; } } else { return new Long(seq).toString(); } } private String getNumexpExpression() { return GlobalProperties.getInstance().getProperty("app.numexp.expression"); } }