/**
*
*/
package net.conselldemallorca.helium.webapp.v3.controller;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesDto;
import net.conselldemallorca.helium.v3.core.api.dto.DefinicioProcesExpedientDto;
import net.conselldemallorca.helium.v3.core.api.dto.EntornDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto.IniciadorTipusDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTascaDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTipusDto;
import net.conselldemallorca.helium.v3.core.api.dto.FormulariExternDto;
import net.conselldemallorca.helium.v3.core.api.dto.ParellaCodiValorDto;
import net.conselldemallorca.helium.v3.core.api.exception.TramitacioHandlerException;
import net.conselldemallorca.helium.v3.core.api.exception.TramitacioValidacioException;
import net.conselldemallorca.helium.v3.core.api.exception.ValidacioException;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientService;
import net.conselldemallorca.helium.v3.core.api.service.TascaService;
import net.conselldemallorca.helium.webapp.v3.helper.MissatgesHelper;
import net.conselldemallorca.helium.webapp.v3.helper.ObjectTypeEditorHelper;
import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomBooleanEditor;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* Controlador per iniciar un expedient
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/v3/expedient")
public class ExpedientIniciController extends BaseExpedientController {
public static final String CLAU_SESSIO_ANY = "iniciexp_any";
public static final String CLAU_SESSIO_TASKID = "iniciexp_taskId";
public static final String CLAU_SESSIO_TITOL = "iniciexp_titol";
public static final String CLAU_SESSIO_NUMERO = "iniciexp_numero";
public static final String CLAU_SESSIO_FORM_VALIDAT = "iniciexp_form_validat";
private static final String CLAU_SESSIO_FORM_COMMAND = "iniciexp_form_command";
public static final String CLAU_SESSIO_FORM_VALORS = "iniciexp_form_registres";
private static final String CLAU_SESSIO_PREFIX_REGISTRE = "ExpedientIniciarController_reg_";
@Autowired
private ExpedientService expedientService;
@Autowired
private TascaService tascaService;
@RequestMapping(value = "/iniciar", method = RequestMethod.GET)
public String iniciarGet(
HttpServletRequest request,
Model model) {
EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual();
List<ExpedientTipusDto> tipus = dissenyService.findExpedientTipusAmbEntorn(entorn);
Map<Long, DefinicioProcesExpedientDto> definicionsProces = new HashMap<Long, DefinicioProcesExpedientDto>();
Iterator<ExpedientTipusDto> it = tipus.iterator();
while (it.hasNext()) {
ExpedientTipusDto expedientTipus = it.next();
DefinicioProcesExpedientDto definicioProcesIniciExpedientDto = dissenyService.getDefinicioProcesByTipusExpedientById(expedientTipus.getId());
if (definicioProcesIniciExpedientDto != null)
definicionsProces.put(expedientTipus.getId(), definicioProcesIniciExpedientDto);
else
it.remove();
}
model.addAttribute("expedientTipus", tipus);
model.addAttribute("definicionsProces", definicionsProces);
return "v3/expedient/iniciar";
}
@RequestMapping(value = "/iniciar", method = RequestMethod.POST)
public String iniciarPost(
HttpServletRequest request,
@RequestParam(value = "expedientTipusId", required = true) Long expedientTipusId,
@RequestParam(value = "definicioProcesId", required = true) Long definicioProcesId,
Model model) {
netejarSessio(request);
request.getSession().setAttribute(ExpedientIniciController.CLAU_SESSIO_TASKID, "TIE_" + System.currentTimeMillis());
EntornDto entorn = SessionHelper.getSessionManager(request).getEntornActual();
ExpedientTipusDto expedientTipus = dissenyService.getExpedientTipusById(expedientTipusId);
// Si l'expedient requereix dades inicials redirigeix al pas per demanar aquestes dades
DefinicioProcesDto definicioProces = null;
if (definicioProcesId != null) {
definicioProces = dissenyService.getById(definicioProcesId);
} else {
definicioProces = dissenyService.findDarreraDefinicioProcesForExpedientTipus(expedientTipusId);
}
if (definicioProces.isHasStartTask()) {
return redirectByModal(request, "/v3/expedient/iniciarForm/" + expedientTipusId + "/" + definicioProces.getId());
} else if (expedientTipus.isDemanaNumero() || expedientTipus.isDemanaTitol() || expedientTipus.isSeleccionarAny()) {
return redirectByModal(request, "/v3/expedient/iniciarTitol/" + expedientTipusId + "/" + definicioProces.getId());
} else {
// Si no requereix cap pas addicional inicia l'expedient directament
try {
ExpedientDto iniciat = iniciarExpedient(entorn.getId(), expedientTipusId, definicioProces.getId());
MissatgesHelper.success(request, getMessage(request, "info.expedient.iniciat", new Object[] { iniciat.getIdentificador() }));
ExpedientIniciController.netejarSessio(request);
return modalUrlTancar();
} catch (ValidacioException ex) {
MissatgesHelper.error(
request,
getMessage(request, "error.validacio.tasca") + " : " + ex.getCause().getMessage());
logger.error("No s'ha pogut iniciar l'expedient", ex);
} catch (TramitacioValidacioException ex) {
MissatgesHelper.error(
request,
getMessage(request, "error.validacio.tasca") + " : " + ex.getCause().getMessage());
logger.error("No s'ha pogut iniciar l'expedient", ex);
} catch (TramitacioHandlerException ex) {
MissatgesHelper.error(
request,
getMessage(request, "error.validacio.tasca") + " : " + ex.getPublicMessage());
logger.error("No s'ha pogut iniciar l'expedient", ex);
} catch (Exception ex) {
MissatgesHelper.error(
request,
getMessage(request, "error.iniciar.expedient") + ": " +
(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
logger.error("No s'ha pogut iniciar l'expedient", ex);
}
}
return iniciarGet(request, model);
}
@RequestMapping(value = "/tasca/{expedientTipusId}/{definicioProcesId}/{tascaId}/formExtern", method = RequestMethod.GET)
@ResponseBody
public FormulariExternDto formExtern(
HttpServletRequest request,
@PathVariable Long expedientTipusId,
@PathVariable Long definicioProcesId,
@PathVariable String tascaId,
Model model) {
return tascaService.formulariExternObrirTascaInicial(
tascaId,
expedientTipusId,
definicioProcesId);
// try {
// FormulariExternDto formExtern = tascaService.iniciarFormulariExtern(
// tascaId,
// expedientTipusId,
// definicioProcesId);
// String[] resposta = new String[] {
// formExtern.getUrl(),
// Integer.toString(formExtern.getWidth()),
// Integer.toString(formExtern.getHeight())};
// return resposta;
// } catch (Exception ex) {
// logger.error("No s'ha pogut iniciar el formulari extern", ex);
// }
// return null;
}
@SuppressWarnings("unchecked")
public static void netejarSessio(HttpServletRequest request) {
Enumeration<String> atributs = request.getSession().getAttributeNames();
while (atributs.hasMoreElements()) {
String atribut = atributs.nextElement();
if (atribut.startsWith(ExpedientIniciController.CLAU_SESSIO_PREFIX_REGISTRE))
request.getSession().removeAttribute(atribut);
}
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_TASKID);
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_NUMERO);
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_TITOL);
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_FORM_VALIDAT);
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_FORM_COMMAND);
request.getSession().removeAttribute(ExpedientIniciController.CLAU_SESSIO_FORM_VALORS);
}
public List<ParellaCodiValorDto> getAnysSeleccionables() {
List<ParellaCodiValorDto> anys = new ArrayList<ParellaCodiValorDto>();
int anyActual = Calendar.getInstance().get(Calendar.YEAR);
for (int i = 0; i < 10; i++) {
anys.add(new ParellaCodiValorDto(String.valueOf(anyActual - i), anyActual - i));
}
return anys;
}
private synchronized ExpedientDto iniciarExpedient(Long entornId, Long expedientTipusId, Long definicioProcesId) {
return expedientService.create(entornId, null, expedientTipusId, definicioProcesId, null, null, null, null, null, null, null, false, null, null, null, null, null, null, false, null, null, false, null, null, IniciadorTipusDto.INTERN, null, null, null, null);
}
protected ExpedientTascaDto obtenirTascaInicial(Long entornId, Long expedientTipusId, Long definicioProcesId, Map<String, Object> valors, HttpServletRequest request) {
ExpedientTascaDto tasca = expedientService.getStartTask(entornId, expedientTipusId, definicioProcesId, valors);
tasca.setId((String) request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_TASKID));
Object validat = request.getSession().getAttribute(ExpedientIniciController.CLAU_SESSIO_FORM_VALIDAT);
tasca.setValidada(validat != null);
return tasca;
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
Long.class,
new CustomNumberEditor(Long.class, true));
binder.registerCustomEditor(
Double.class,
new CustomNumberEditor(Double.class, true));
binder.registerCustomEditor(
BigDecimal.class,
new CustomNumberEditor(
BigDecimal.class,
new DecimalFormat("#,##0.00"),
true));
binder.registerCustomEditor(
Boolean.class,
// new CustomBooleanEditor(false));
new CustomBooleanEditor(true));
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
// binder.registerCustomEditor(
// TerminiDto.class,
// new TerminiTypeEditorHelper());
binder.registerCustomEditor(
Object.class,
new ObjectTypeEditorHelper());
}
private static final Log logger = LogFactory.getLog(ExpedientIniciController.class);
}