/**
*
*/
package net.conselldemallorca.helium.webapp.mvc;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import net.conselldemallorca.helium.core.model.dto.ExecucioMassivaDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.dto.TascaDto;
import net.conselldemallorca.helium.core.model.dto.TascaLlistatDto;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.ExecucioMassiva.ExecucioMassivaTipus;
import net.conselldemallorca.helium.core.model.hibernate.TerminiIniciat;
import net.conselldemallorca.helium.core.model.service.DissenyService;
import net.conselldemallorca.helium.core.model.service.ExecucioMassivaService;
import net.conselldemallorca.helium.core.model.service.PersonaService;
import net.conselldemallorca.helium.core.model.service.TascaService;
import net.conselldemallorca.helium.core.model.service.TerminiService;
import net.conselldemallorca.helium.v3.core.api.exception.TramitacioException;
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.AdminService;
import net.conselldemallorca.helium.webapp.mvc.util.BaseController;
import net.conselldemallorca.helium.webapp.mvc.util.TramitacioMassiva;
/**
* Controlador per la gestió de tasques
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Controller
public class TascaController extends BaseController {
public static final String SESSIO_TRAMITACIO_MASSIVA = "HEL_TRAM_MASS";
public static final String VARIABLE_SESSIO_IDS_GRUP = "tasquesGrupIdsMassius";
private String TAG_FORM_INICI = "<!--helium:form-inici-->";
private String TAG_FORM_FI = "<!--helium:form-fi-->";
private TascaService tascaService;
private TerminiService terminiService;
private DissenyService dissenyService;
private PersonaService personaService;
private ExecucioMassivaService execucioMassivaService;
private AdminService adminService;
@Autowired
public TascaController(
TascaService tascaService,
TerminiService terminiService,
DissenyService dissenyService,
PersonaService personaService,
ExecucioMassivaService execucioMassivaService,
AdminService adminService) {
this.tascaService = tascaService;
this.terminiService = terminiService;
this.dissenyService = dissenyService;
this.personaService = personaService;
this.execucioMassivaService = execucioMassivaService;
this.adminService = adminService;
}
@ModelAttribute("prioritats")
public List<HashMap<String, Object>> populateEstats(HttpServletRequest request) {
List<HashMap<String, Object>> resposta = new ArrayList<HashMap<String,Object>>();
HashMap<String, Object> moltAlta = new HashMap<String, Object>();
moltAlta.put("value", 2);
moltAlta.put("label", getMessage("txt.m_alta") );
resposta.add(moltAlta);
HashMap<String, Object> alta = new HashMap<String, Object>();
alta.put("value", 1);
alta.put("label", getMessage("txt.alta") );
resposta.add(alta);
HashMap<String, Object> normal = new HashMap<String, Object>();
normal.put("value", 0);
normal.put("label", getMessage("txt.normal") );
resposta.add(normal);
HashMap<String, Object> baixa = new HashMap<String, Object>();
baixa.put("value", -1);
baixa.put("label", getMessage("txt.baixa") );
resposta.add(baixa);
HashMap<String, Object> moltBaixa = new HashMap<String, Object>();
moltBaixa.put("value", -2);
moltBaixa.put("label", getMessage("txt.m_baixa") );
resposta.add(moltBaixa);
return resposta;
}
@ModelAttribute("seleccioMassiva")
public List<TascaLlistatDto> populateSeleccioMassiva(
HttpServletRequest request,
@RequestParam(value = "id", required = false) String id) {
if (id != null) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
String[] ids = TramitacioMassiva.getTasquesTramitacioMassiva(request, id);
if (ids != null) {
List<TascaLlistatDto> tasquesTramitacioMassiva = tascaService.findTasquesPerTramitacioMassiva(
entorn.getId(),
null,
id);
for (Iterator<TascaLlistatDto> it = tasquesTramitacioMassiva.iterator(); it.hasNext();) {
TascaLlistatDto tasca = it.next();
boolean trobada = false;
for (String tascaId: ids) {
if (tascaId.equals(tasca.getId())) {
trobada = true;
break;
}
}
if (!trobada)
it.remove();
}
return tasquesTramitacioMassiva;
}
}
}
return null;
}
@RequestMapping(value = "/tasca/massivaSeleccio", method = RequestMethod.GET)
public String massivaSeleccio(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
if (!TramitacioMassiva.isTramitacioMassivaActiu(request, id)) {
TramitacioMassiva.netejarTramitacioMassiva(request);
}
List<TascaLlistatDto> tasquesTramitacioMassiva = null;
try {
tasquesTramitacioMassiva = tascaService.findTasquesPerTramitacioMassiva(
entorn.getId(),
null,
id);
} catch (net.conselldemallorca.helium.core.model.exception.IllegalStateException ex) {
logger.error(getMessage("error.tascaService.noDisponible"), ex);
return "redirect:/index.html";
}
model.addAttribute("terminisIniciats", findTerminisIniciatsPerTasques(tasquesTramitacioMassiva));
model.addAttribute("personaLlistat", tasquesTramitacioMassiva);
model.addAttribute(
"personaLlistatCount",
tascaService.countTasquesPersonalsEntorn(
entorn.getId(),
null));
model.addAttribute(
"grupLlistatCount",
tascaService.countTasquesGrupEntorn(
entorn.getId(),
null));
return "tasca/massivaSeleccio";
} else {
missatgeError(request, getMessage("error.no.entorn.selec"));
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/massivaTramitacio", method = RequestMethod.POST)
public String massivaTramitacio(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
@RequestParam(value = "tascaId", required = false) String[] tascaId,
@RequestParam(value = "inici", required = false) String inici,
@RequestParam(value = "correu", required = false) String correu,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
if (tascaId == null || tascaId.length == 0) {
missatgeError(request, getMessage("error.no.tasques.selec"));
return "redirect:/tasca/massivaSeleccio.html?id=" + id;
} else {
TramitacioMassiva.iniciarTramitacioMassiva(request, id, tascaId);
TramitacioMassiva.setParamsTramitatcio(request, inici, correu, id);
return "redirect:/tasca/info.html?id=" + id + "&massiva=s";
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec"));
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/info")
public String info(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
@RequestParam(value = "massiva", required = false) String massiva,
@RequestParam(value = "ini", required = false) String ini,
ModelMap model) throws Exception {
Entorn entorn = getEntornActiu(request);
TascaDto tasca = tascaService.getByIdSenseComprovacio(id);
Long tid = tasca.getExpedient().getTipus().getId();
if (entorn != null) {
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalIniciar(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
if (massiva == null || !massiva.equalsIgnoreCase("s")) {
TramitacioMassiva.netejarTramitacioMassiva(request);
model.remove("seleccioMassiva");
}
TascaDelegacioCommand command = new TascaDelegacioCommand();
command.setTaskId(id);
model.addAttribute(
"command",
command);
try {
model.addAttribute(
"tasca",
tascaService.getById(
entorn.getId(),
id,
null,
null,
false,
false));
} catch (Exception ex) {
logger.error("S'ha produït un error processant la seva petició", ex);
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "redirect:/tasca/personaLlistat.html";
}
if ("s".equals(ini)) {
if (tasca.isDelegacioOriginal()) {
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "redirect:/tasca/info.html?id="+id;
} else {
if (!tasca.getCamps().isEmpty()) {
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "redirect:/tasca/form.html?id="+id;
} else if(!tasca.getDocuments().isEmpty()) {
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "redirect:/tasca/documents.html?id="+id;
} else if (!tasca.getSignatures().isEmpty()) {
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "redirect:/tasca/signatures.html?id="+id;
}
}
}
Set<PersonaDto> destinataris = personaService.findPersonesAmbPermisosPerExpedientTipus(tid);
model.addAttribute(
"destinataris",
destinataris);
if (adminService.mesuraTemporalIsActive())
adminService.mesuraTemporalCalcular(
"Tasca INFO",
"tasques",
tasca.getExpedient().getTipus().getNom(),
tasca.getNomLimitat(),
null);
return "tasca/info";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/agafar")
public String agafar(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
TascaDto tasca = tascaService.getByIdSenseComprovacio(id);
if (entorn != null) {
try {
tascaService.agafar(entorn.getId(), id);
missatgeInfo(request, getMessage("info.tasca.disponible.personals") );
if(tasca.isDelegacioOriginal()){
return "redirect:/tasca/info.html?id="+id;
}else{
if (!tasca.getCamps().isEmpty()) {
return "redirect:/tasca/form.html?id="+id;
} else if(!tasca.getDocuments().isEmpty()) {
return "redirect:/tasca/documents.html?id="+id;
} else if (!tasca.getSignatures().isEmpty()) {
return "redirect:/tasca/signatures.html?id="+id;
}
}
} catch (Exception ex) {
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
logger.error("No s'ha pogut agafar la tasca", ex);
return "redirect:/tasca/grupLlistat.html";
}
return "redirect:/tasca/info.html?id=" + id;
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/tasca/agafarMassiu")
public String agafarMassiu(
HttpServletRequest request,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<Long> ids = (List<Long>)request.getSession().getAttribute(VARIABLE_SESSIO_IDS_GRUP);
Integer tasquesOK = 0;
String tasquesKO = "";
for (Long id: ids) {
String tascaId = id.toString();
TascaDto tasca = tascaService.getByIdSenseComprovacio(tascaId);
try {
tascaService.agafar(entorn.getId(), tascaId);
tasquesOK++;
} catch (Exception ex) {
logger.error("No s'ha pogut agafar la tasca " + tasca.getNom(), ex);
tasquesKO += tasca.getNom() + " (" + tasca.getExpedient().getTitol() + "),";
}
}
if (tasquesOK > 0) {
missatgeInfo(request, getMessage("tasca.gllistat.agafar.OK", new Object[] {tasquesOK}));
}
if (tasquesKO.length() > 0) {
missatgeError(request, getMessage("tasca.gllistat.agafar.KO") + " " + tasquesKO.substring(0, tasquesKO.length() - 1));
}
request.getSession().setAttribute(VARIABLE_SESSIO_IDS_GRUP, new ArrayList<Long>());
return "redirect:/tasca/grupLlistat.html";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/alliberar")
public String alliberar(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
try {
tascaService.alliberar(entorn.getId(), id, true);
missatgeInfo(request, getMessage("info.tasca.alliberada"));
} catch (Exception ex) {
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
logger.error("No s'ha pogut alliberar la tasca", ex);
}
return "redirect:/tasca/personaLlistat.html";
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@SuppressWarnings("unchecked")
@RequestMapping(value = "/tasca/grupIds")
public String tascaGrupMassiva(
HttpServletRequest request,
@RequestParam(value = "tascaId", required = true) Long tascaId,
@RequestParam(value = "checked", required = true) boolean checked,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
List<Long> ids = (List<Long>)request.getSession().getAttribute(VARIABLE_SESSIO_IDS_GRUP);
if (ids == null) {
ids = new ArrayList<Long>();
request.getSession().setAttribute(VARIABLE_SESSIO_IDS_GRUP, ids);
}
if (checked) {
ids.add(tascaId);
} else {
ids.remove(tascaId);
if (ids.size() == 1)
ids.clear();
}
}
return null;
}
@RequestMapping(value = "/tasca/completar")
public String completar(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
@RequestParam(value = "pipella", required = false) String pipella,
@RequestParam(value = "submit", required = false) String submit,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
boolean ok = accioCompletarTasca(
request,
entorn.getId(),
id,
submit);
if (ok) {
return "redirect:/tasca/personaLlistat.html";
} else {
if ("info".equals(pipella)) {
return "redirect:/tasca/info.html?id=" + id;
} else if ("form".equals(pipella)) {
return "redirect:/tasca/form.html?id=" + id;
} else if ("documents".equals(pipella)) {
return "redirect:/tasca/documents.html?id=" + id;
} else if ("signatures".equals(pipella)) {
return "redirect:/tasca/signatures.html?id=" + id;
} else {
return "redirect:/tasca/info.html?id=" + id;
}
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
@RequestMapping(value = "/tasca/formRecurs")
public String formRecurs(
HttpServletRequest request,
@RequestParam(value = "id", required = true) String id,
ModelMap model) {
Entorn entorn = getEntornActiu(request);
if (entorn != null) {
try {
TascaDto tasca = tascaService.getById(
entorn.getId(),
id,
null,
null,
false,
false);
byte[] contingut = dissenyService.getDeploymentResource(
tasca.getDefinicioProces().getId(),
tasca.getRecursForm());
String text = textFormRecursProcessat(tasca, new String(contingut, "UTF-8"));
model.addAttribute(
ArxiuView.MODEL_ATTRIBUTE_FILENAME,
tasca.getRecursForm().substring(tasca.getRecursForm().lastIndexOf("/") + 1));
model.addAttribute(
ArxiuView.MODEL_ATTRIBUTE_DATA,
text.getBytes());
return "arxiuView";
} catch (Exception ex) {
missatgeError(request, getMessage("error.proces.peticio"), ex.getLocalizedMessage());
logger.error("No s'ha pogut mostrar l'arxiu", ex);
return "redirect:/tasca/info.html?id=" + id;
}
} else {
missatgeError(request, getMessage("error.no.entorn.selec") );
return "redirect:/index.html";
}
}
private String textFormRecursProcessat(TascaDto tasca, String text) {
int indexFormInici = text.indexOf(TAG_FORM_INICI);
int indexFormFi = text.indexOf(TAG_FORM_FI);
if (indexFormInici != -1 && indexFormFi != -1) {
return text.substring(
indexFormInici + TAG_FORM_INICI.length(),
indexFormFi);
}
return null;
}
public class TascaPersonaFiltreCommand {
private String nom;
private String expedient;
private Long tipusExpedient;
private Date dataCreacioInici;
private Date dataCreacioFi;
private Integer prioritat;
private Date dataLimitInici;
private Date dataLimitFi;
private String columna = "3";
private String ordre = "2";
public TascaPersonaFiltreCommand() {}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getExpedient() {
return expedient;
}
public void setExpedient(String expedient) {
this.expedient = expedient;
}
public Long getTipusExpedient() {
return tipusExpedient;
}
public void setTipusExpedient(Long tipusExpedient) {
this.tipusExpedient = tipusExpedient;
}
public Date getDataCreacioInici() {
return dataCreacioInici;
}
public void setDataCreacioInici(Date dataCreacioInici) {
this.dataCreacioInici = dataCreacioInici;
}
public Date getDataCreacioFi() {
return dataCreacioFi;
}
public void setDataCreacioFi(Date dataCreacioFi) {
this.dataCreacioFi = dataCreacioFi;
}
public Integer getPrioritat() {
return prioritat;
}
public void setPrioritat(Integer prioritat) {
this.prioritat = prioritat;
}
public Date getDataLimitInici() {
return dataLimitInici;
}
public void setDataLimitInici(Date dataLimitInici) {
this.dataLimitInici = dataLimitInici;
}
public Date getDataLimitFi() {
return dataLimitFi;
}
public void setDataLimitFi(Date dataLimitFi) {
this.dataLimitFi = dataLimitFi;
}
public String getColumna() {
return columna;
}
public void setColumna(String columna) {
this.columna = columna;
}
public String getOrdre() {
return ordre;
}
public void setOrdre(String ordre) {
this.ordre = ordre;
}
}
public class TascaGrupFiltreCommand {
private String nom;
private String expedient;
private Long tipusExpedient;
private Date dataCreacioInici;
private Date dataCreacioFi;
private Integer prioritat;
private Date dataLimitInici;
private Date dataLimitFi;
private String columna = "3";
private String ordre = "2";
public TascaGrupFiltreCommand() {}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
public String getExpedient() {
return expedient;
}
public void setExpedient(String expedient) {
this.expedient = expedient;
}
public Long getTipusExpedient() {
return tipusExpedient;
}
public void setTipusExpedient(Long tipusExpedient) {
this.tipusExpedient = tipusExpedient;
}
public Date getDataCreacioInici() {
return dataCreacioInici;
}
public void setDataCreacioInici(Date dataCreacioInici) {
this.dataCreacioInici = dataCreacioInici;
}
public Date getDataCreacioFi() {
return dataCreacioFi;
}
public void setDataCreacioFi(Date dataCreacioFi) {
this.dataCreacioFi = dataCreacioFi;
}
public Integer getPrioritat() {
return prioritat;
}
public void setPrioritat(Integer prioritat) {
this.prioritat = prioritat;
}
public Date getDataLimitInici() {
return dataLimitInici;
}
public void setDataLimitInici(Date dataLimitInici) {
this.dataLimitInici = dataLimitInici;
}
public Date getDataLimitFi() {
return dataLimitFi;
}
public void setDataLimitFi(Date dataLimitFi) {
this.dataLimitFi = dataLimitFi;
}
public String getColumna() {
return columna;
}
public void setColumna(String columna) {
this.columna = columna;
}
public String getOrdre() {
return ordre;
}
public void setOrdre(String ordre) {
this.ordre = ordre;
}
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
Date.class,
new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), true));
}
private List<TerminiIniciat> findTerminisIniciatsPerTasques(List<TascaLlistatDto> tasques) {
List<TerminiIniciat> resposta = new ArrayList<TerminiIniciat>();
if (tasques != null) {
String[] taskInstanceIds = new String[tasques.size()];
int i = 0;
for (TascaLlistatDto tasca: tasques)
taskInstanceIds[i++] = tasca.getId();
List<TerminiIniciat> terminis = terminiService.findIniciatsAmbTaskInstanceIds(taskInstanceIds);
for (TascaLlistatDto tasca: tasques) {
boolean found = false;
for (TerminiIniciat termini: terminis) {
if (termini.getTaskInstanceId().equals(tasca.getId())) {
resposta.add(termini);
found = true;
break;
}
}
if (!found)
resposta.add(null);
}
}
return resposta;
}
// private boolean accioCompletarTasca(
// HttpServletRequest request,
// Long entornId,
// String id,
// String submit) {
// TascaDto tasca = tascaService.getById(
// entornId,
// id,
// null,
// null,
// false,
// false);
// String transicio = null;
// for (String outcome: tasca.getOutcomes()) {
// if (outcome != null && outcome.equals(submit)) {
// transicio = outcome;
// break;
// }
// }
// boolean massivaActiu = TramitacioMassiva.isTramitacioMassivaActiu(request, id);
// String[] tascaIds;
// if (massivaActiu)
// tascaIds = TramitacioMassiva.getTasquesTramitacioMassiva(request, id);
// else
// tascaIds = new String[]{id};
// boolean error = false;
// for (String tascaId: tascaIds) {
// try {
// tascaService.completar(entornId, tascaId, true, null, transicio);
// } catch (Exception ex) {
// String tascaIdLog = getIdTascaPerLogs(entornId, tascaId);
// if (ex.getCause() != null && ex.getCause() instanceof ValidationException) {
// missatgeError(
// request,
// getMessage("error.validacio.tasca") + " " + tascaIdLog + ": " + ex.getCause().getMessage());
// } else {
// missatgeError(
// request,
// getMessage("error.finalitzar.tasca") + " " + tascaIdLog,
// (ex.getCause() != null) ? ex.getCause().getMessage() : ex.getMessage());
// logger.error("No s'ha pogut finalitzar la tasca " + tascaIdLog, ex);
// }
// error = true;
// }
// }
// if (!error) {
// if (massivaActiu)
// missatgeInfo(request, getMessage("info.tasca.completades"));
// else
// missatgeInfo(request, getMessage("info.tasca.completat"));
// }
// return !error;
// }
private boolean accioCompletarTasca(
HttpServletRequest request,
Long entornId,
String id,
String submit) {
TascaDto tasca = tascaService.getById(
entornId,
id,
null,
null,
false,
false);
String transicio = null;
for (String outcome: tasca.getOutcomes()) {
if (outcome != null && outcome.equals(submit)) {
transicio = outcome;
break;
}
}
boolean resposta = true;
boolean massivaActiu = TramitacioMassiva.isTramitacioMassivaActiu(request, id);
String[] tascaIds;
if (massivaActiu) {
String[] parametresTram = TramitacioMassiva.getParamsTramitacioMassiva(request, id);
tascaIds = TramitacioMassiva.getTasquesTramitacioMassiva(request, id);
try {
TascaDto task = tascaService.getByIdSenseComprovacio(tascaIds[0]);
Long expTipusId = task.getExpedient().getTipus().getId();
// Restauram la primera tasca
// ------------------------------------------
//tascaService.completar(entornId, id, true, null, transicio);
if (tascaIds.length > 0) {
// Obtenim informació de l'execució massiva
// Data d'inici
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
Date dInici = new Date();
if (parametresTram[0] != null) {
try { dInici = sdf.parse(parametresTram[0]); } catch (ParseException pe) {};
}
// Enviar correu
Boolean bCorreu = false;
if (parametresTram[1] != null && parametresTram[1].equals("true")) bCorreu = true;
// Authentication auth = SecurityContextHolder.getContext().getAuthentication();
ExecucioMassivaDto dto = new ExecucioMassivaDto();
dto.setDataInici(dInici);
dto.setEnviarCorreu(bCorreu);
dto.setTascaIds(tascaIds);
dto.setExpedientTipusId(expTipusId);
dto.setTipus(ExecucioMassivaTipus.EXECUTAR_TASCA);
dto.setParam1("Completar");
Object[] params = new Object[2];
params[0] = entornId;
params[1] = transicio;
// params[2] = auth.getCredentials();
// List<String> rols = new ArrayList<String>();
// for (GrantedAuthority gauth : auth.getAuthorities()) {
// rols.add(gauth.getAuthority());
// }
// params[3] = rols;
dto.setParam2(execucioMassivaService.serialize(params));
execucioMassivaService.crearExecucioMassiva(dto);
missatgeInfo(request, getMessage("info.tasca.massiu.completar", new Object[] {tascaIds.length}));
}
} catch (Exception e) {
missatgeError(request, getMessage("error.no.massiu"));
resposta = false;
}
} else {
try {
tascaService.completar(entornId, id, true, null, transicio);
missatgeInfo(request, getMessage("info.tasca.completat"));
} catch (Exception ex) {
String tascaIdLog = getIdTascaPerLogs(entornId, id);
if (ex instanceof ValidacioException) {
missatgeError(
request,
getMessage("error.validacio.tasca") + " " + tascaIdLog + ": " + ex.getMessage());
} else if (ex instanceof TramitacioValidacioException) {
missatgeError(
request,
getMessage("error.validacio.tasca") + " " + tascaIdLog + ": " + ex.getMessage());
} else if (ex instanceof TramitacioHandlerException) {
missatgeError(
request,
getMessage("error.finalitzar.tasca") + " " + tascaIdLog + ": " + ((TramitacioHandlerException)ex).getPublicMessage());
} else if (ex instanceof TramitacioException) {
missatgeError(
request,
getMessage("error.finalitzar.tasca") + " " + tascaIdLog + ": " + ((TramitacioException)ex).getPublicMessage());
} else {
missatgeError(
request,
getMessage("error.finalitzar.tasca") + " " + tascaIdLog + ": " +
(ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
}
logger.error("No s'ha pogut finalitzar la tasca " + tascaIdLog, ex);
resposta = false;
}
}
return resposta;
}
private String getIdTascaPerLogs(Long entornId, String tascaId) {
TascaDto tascaActual = tascaService.getById(
entornId,
tascaId,
null,
null,
false,
false);
return tascaActual.getNom() + " - " + tascaActual.getExpedient().getIdentificador();
}
private static final Log logger = LogFactory.getLog(TascaController.class);
}