/**
*
*/
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.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import net.conselldemallorca.helium.core.model.dto.ParellaCodiValorDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientDto;
import net.conselldemallorca.helium.v3.core.api.dto.InstanciaProcesDto;
import net.conselldemallorca.helium.v3.core.api.dto.TerminiDto;
import net.conselldemallorca.helium.v3.core.api.dto.TerminiIniciatDto;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientService;
import net.conselldemallorca.helium.v3.core.api.service.TerminiService;
import net.conselldemallorca.helium.webapp.v3.command.ExpedientTerminiModificarCommand;
import net.conselldemallorca.helium.webapp.v3.command.ExpedientTerminiModificarCommand.TerminiModificacioTipus;
import net.conselldemallorca.helium.webapp.v3.helper.MissatgesHelper;
import net.conselldemallorca.helium.webapp.v3.helper.ObjectTypeEditorHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
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.ResponseBody;
import org.springframework.web.bind.support.SessionStatus;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
/**
* Controlador per a la pàgina d'informació de l'termini.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
@RequestMapping("/v3/expedient")
public class ExpedientTerminiV3Controller extends BaseExpedientController {
@Autowired
private ExpedientService expedientService;
@Autowired
private TerminiService terminiService;
@RequestMapping(value = "/{expedientId}/terminis", method = RequestMethod.GET)
public String terminis(
HttpServletRequest request,
@PathVariable Long expedientId,
Model model) {
ExpedientDto expedient = expedientService.findAmbId(expedientId);
List<InstanciaProcesDto> arbreProcessos = expedientService.getArbreInstanciesProces(Long.parseLong(expedient.getProcessInstanceId()));
Map<InstanciaProcesDto, List<TerminiDto>> terminis = new LinkedHashMap<InstanciaProcesDto, List<TerminiDto>>();
Map<String, List<TerminiIniciatDto>> iniciats = new LinkedHashMap<String, List<TerminiIniciatDto>>();
for (InstanciaProcesDto instanciaProces: arbreProcessos) {
List<TerminiDto> terminisInstanciaProces = null;
if (instanciaProces.getId().equals(expedient.getProcessInstanceId())) {
terminisInstanciaProces = terminiService.findTerminisAmbProcessInstanceId(instanciaProces.getId());
iniciats.put(instanciaProces.getId(), terminiService.findIniciatsAmbProcessInstanceId(instanciaProces.getId()));
}
terminis.put(instanciaProces, terminisInstanciaProces);
}
model.addAttribute("inicialProcesInstanceId", expedient.getProcessInstanceId());
model.addAttribute("terminis",terminis);
model.addAttribute("iniciats",iniciats);
return "v3/expedientTermini";
}
@RequestMapping(value = "/{expedientId}/terminis/{procesId}", method = RequestMethod.GET)
public String dadesProces(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable String procesId,
Model model) {
InstanciaProcesDto instanciaProces = expedientService.getInstanciaProcesById(procesId);
Map<InstanciaProcesDto, List<TerminiDto>> terminis = new LinkedHashMap<InstanciaProcesDto, List<TerminiDto>>();
Map<String, List<TerminiIniciatDto>> iniciats = new LinkedHashMap<String, List<TerminiIniciatDto>>();
terminis.put(instanciaProces, terminiService.findTerminisAmbProcessInstanceId(instanciaProces.getId()));
iniciats.put(instanciaProces.getId(), terminiService.findIniciatsAmbProcessInstanceId(instanciaProces.getId()));
model.addAttribute("inicialProcesInstanceId", procesId);
model.addAttribute("terminis",terminis);
model.addAttribute("iniciats",iniciats);
return "v3/procesTerminis";
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiIniciar", method = RequestMethod.GET)
@ResponseBody
public boolean terminiIniciar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
Model model) {
boolean response = false;
try {
terminiService.iniciar(terminiId,expedientId,new Date(),true);
MissatgesHelper.success(request, getMessage(request, "info.termini.iniciat"));
response = true;
} catch (Exception ex) {
MissatgesHelper.error(request, getMessage(request, "error.iniciar.termini"));
logger.error("No s'ha pogut iniciar el termini", ex);
}
return response;
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiPausar", method = RequestMethod.GET)
@ResponseBody
public boolean terminiPausar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
Model model) {
boolean response = false;
try {
terminiService.pausar(terminiId, new Date());
MissatgesHelper.success(request, getMessage(request, "info.termini.aturat"));
response = true;
} catch (Exception ex) {
MissatgesHelper.error(request, getMessage(request, "error.aturar.termini"));
logger.error("No s'ha pogut aturar el termini", ex);
}
return response;
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiContinuar", method = RequestMethod.GET)
@ResponseBody
public boolean terminiContinuar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
Model model) {
boolean response = false;
try {
terminiService.continuar(terminiId, new Date());
MissatgesHelper.success(request, getMessage(request, "info.termini.continuat"));
response = true;
} catch (Exception ex) {
MissatgesHelper.error(request, getMessage(request, "error.continuat.termini"));
logger.error("No s'ha pogut continuat el termini", ex);
}
return response;
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiCancelar", method = RequestMethod.GET)
@ResponseBody
public boolean terminiCancelar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
Model model) {
boolean response = false;
try {
terminiService.cancelar(terminiId, new Date());
MissatgesHelper.success(request, getMessage(request, "info.termini.cancelat"));
response = true;
} catch (Exception ex) {
MissatgesHelper.error(request, getMessage(request, "error.cancelat.termini"));
logger.error("No s'ha pogut cancel·lar el termini", ex);
}
return response;
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiModificar", method = RequestMethod.GET)
public String terminiModificar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
Model model) {
TerminiIniciatDto terminiIniciat = terminiService.findIniciatAmbId(terminiId);
ExpedientTerminiModificarCommand expedientTerminiModificarCommand = new ExpedientTerminiModificarCommand();
expedientTerminiModificarCommand.setTerminiId(terminiId);
expedientTerminiModificarCommand.setNom(terminiIniciat.getTermini().getNom());
expedientTerminiModificarCommand.setAnys(terminiIniciat.getAnys());
expedientTerminiModificarCommand.setMesos(terminiIniciat.getMesos());
expedientTerminiModificarCommand.setDies(terminiIniciat.getDies());
expedientTerminiModificarCommand.setDataInici(terminiIniciat.getDataInici());
expedientTerminiModificarCommand.setDataFi(terminiIniciat.getDataFi());
model.addAttribute(expedientTerminiModificarCommand);
model.addAttribute("listTerminis", valors12());
model.addAttribute("listTipus", getTipus(request));
return "v3/expedient/terminiModificar";
}
public List<ParellaCodiValorDto> getTipus(HttpServletRequest request) {
List<ParellaCodiValorDto> tipus = new ArrayList<ParellaCodiValorDto>();
tipus.add(new ParellaCodiValorDto(getMessage(request, "termini.durada"),TerminiModificacioTipus.DURADA));
tipus.add(new ParellaCodiValorDto(getMessage(request, "termini.data_fi"),TerminiModificacioTipus.DATA_FI));
tipus.add(new ParellaCodiValorDto(getMessage(request, "termini.data_ini"),TerminiModificacioTipus.DATA_INICI));
return tipus;
}
private List<ParellaCodiValorDto> valors12() {
List<ParellaCodiValorDto> resposta = new ArrayList<ParellaCodiValorDto>();
for (int i=0; i <= 12 ; i++)
resposta.add(new ParellaCodiValorDto(String.valueOf(i), i));
return resposta;
}
@RequestMapping(value = "/{expedientId}/{terminiId}/terminiModificar", method = RequestMethod.POST)
public String terminiModificar(
HttpServletRequest request,
@PathVariable Long expedientId,
@PathVariable Long terminiId,
@Valid @ModelAttribute ExpedientTerminiModificarCommand expedientTerminiModificarCommand,
BindingResult result,
SessionStatus status,
Model model) {
try {
Date inicio = null;
if (TerminiModificacioTipus.DURADA.name().equals(expedientTerminiModificarCommand.getTipus())) {
TerminiIniciatDto terminiIniciat = terminiService.findIniciatAmbId(terminiId);
inicio = terminiIniciat.getDataInici();
} else if (TerminiModificacioTipus.DATA_INICI.name().equals(expedientTerminiModificarCommand.getTipus())) {
inicio = expedientTerminiModificarCommand.getDataInici();
} else {
inicio = expedientTerminiModificarCommand.getDataFi();
}
terminiService.modificar(
terminiId,
expedientId,
inicio,
expedientTerminiModificarCommand.getAnys(),
expedientTerminiModificarCommand.getMesos(),
expedientTerminiModificarCommand.getDies(),
TerminiModificacioTipus.DATA_FI.name().equals(expedientTerminiModificarCommand.getTipus()));
MissatgesHelper.success(request, getMessage(request, "info.termini.modificat"));
} catch (Exception ex) {
MissatgesHelper.error(request, getMessage(request, "error.modificar.termini"));
logger.error("No s'ha pogut modificar el termini", ex);
}
return modalUrlTancar(false);
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
byte[].class,
new ByteArrayMultipartFileEditor());
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
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));
binder.registerCustomEditor(
Object.class,
new ObjectTypeEditorHelper());
}
private static final Logger logger = LoggerFactory.getLogger(ExpedientTerminiV3Controller.class);
}