/* * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * * This file is part of Entando Enterprise Edition software. * You can redistribute it and/or modify it * under the terms of the Entando's EULA * * See the file License for the specific language governing permissions * and limitations under the License * * * * Copyright 2013 Entando S.r.l. (http://www.entando.com) All rights reserved. * */ package com.agiletec.plugins.jpwtt.apsadmin.ticket; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.agiletec.aps.system.ApsSystemUtils; import com.agiletec.aps.system.services.authorization.IApsAuthority; import com.agiletec.aps.system.services.role.IRoleManager; import com.agiletec.aps.system.services.role.Role; import com.agiletec.aps.system.services.user.UserDetails; import com.agiletec.plugins.jpwtt.aps.system.services.JpWttSystemConstants; import com.agiletec.plugins.jpwtt.aps.system.services.ticket.ITicketManager; import com.agiletec.plugins.jpwtt.aps.system.services.ticket.model.Ticket; import com.agiletec.plugins.jpwtt.aps.system.services.ticket.model.TicketOperation; import com.agiletec.plugins.jpwtt.apsadmin.ticket.common.AbstractTicketAction; public class TicketAction extends AbstractTicketAction implements ITicketAction { @Override public String takeInCharge() { return this.saveOperation(TicketOperation.OPERATIONS_TAKEINCHARGE); } @Override public String update() { return this.saveOperation(TicketOperation.OPERATIONS_UPDATE); } @Override public String setAssignable() { return this.saveOperation(TicketOperation.OPERATIONS_SETASSIGNABLE); } @Override public String answer() { return this.saveOperation(TicketOperation.OPERATIONS_ANSWER); } @Override public String release() { return this.saveOperation(TicketOperation.OPERATIONS_RELEASE); } @Override public String close() { return this.saveOperation(TicketOperation.OPERATIONS_CLOSE); } @Override protected boolean isAccessAllowed(Ticket ticket) { UserDetails currentUser = this.getCurrentUser(); boolean allowed = false; int status = ticket.getStatus(); if (this.getAuthorizationManager().isAuthOnPermission(currentUser, JpWttSystemConstants.WTT_ADMIN_PERMISSION) || (Ticket.STATES_ASSIGNABLE==status && this.userHasRole(ticket.getWttRole())) || Ticket.STATES_ASSIGNED==status && currentUser.getUsername().equals(ticket.getWttOperator())) { allowed = true; } return allowed; } protected String entryOperation(int operationCode) { try { String code = this.getCode(); ITicketManager ticketManager = this.getTicketManager(); Ticket ticket = ticketManager.getTicket(code); if (ticket!=null) { this.setTicket(ticket); if (this.isOperationAllowed(ticket, operationCode)) { List<TicketOperation> ticketOperations = ticketManager.getTicketOperations(code); this.setTicketOperations(ticketOperations); } else { this.addActionError(this.getText("Errors.ticketOperation.notAllowed")); return "opNotAllowed"; } } else { this.addActionError(this.getText("Errors.ticketOperation.ticketNotFound")); return "ticketNotFound"; } } catch(Throwable t) { ApsSystemUtils.logThrowable(t, this, "view"); return FAILURE; } return SUCCESS; } protected String saveOperation(int operationCode) { try { String code = this.getCode(); ITicketManager ticketManager = this.getTicketManager(); Ticket ticket = ticketManager.getTicket(code); if (ticket!=null) { this.setTicket(ticket); boolean allowed = this.isOperationAllowed(ticket, operationCode); boolean validated = this.validateParameters(ticket, operationCode, allowed); if (!allowed) { return "opNotAllowed"; } else if (!validated) { return INPUT; } else { Ticket newTicket = this.createTicketForUpdate(ticket, operationCode); TicketOperation operation = this.createTicketOperation(operationCode); ticketManager.updateTicketWithOperation(newTicket, operation); this.addActionMessage(this.getText("Message.ticketOperation.completed")); } } else { this.addActionError(this.getText("Errors.ticketOperation.ticketNotFound")); return "ticketNotFound"; } } catch(Throwable t) { ApsSystemUtils.logThrowable(t, this, "view"); return FAILURE; } return SUCCESS; } public boolean isOperationAllowed(Ticket ticket, int operationCode) { boolean allowed = false; int status = ticket.getStatus(); String operator = ticket.getWttOperator(); UserDetails currentUser = this.getCurrentUser(); boolean isAdmin = this.getAuthorizationManager().isAuthOnPermission(currentUser, JpWttSystemConstants.WTT_ADMIN_PERMISSION); switch (operationCode) { case TicketOperation.OPERATIONS_SETASSIGNABLE: if (isAdmin && (Ticket.STATES_OPENED==status || Ticket.STATES_WORKING==status)) { allowed = true; } break; case TicketOperation.OPERATIONS_TAKEINCHARGE: if ((isAdmin && (Ticket.STATES_OPENED==status || Ticket.STATES_WORKING==status)) || (Ticket.STATES_ASSIGNABLE==status && this.userHasRole(ticket.getWttRole()))) { allowed = true; } break; case TicketOperation.OPERATIONS_ANSWER: case TicketOperation.OPERATIONS_UPDATE: case TicketOperation.OPERATIONS_CLOSE: if (Ticket.STATES_ASSIGNED==status && currentUser.getUsername().equals(operator)) { allowed = true; } break; case TicketOperation.OPERATIONS_RELEASE: if ((isAdmin && (Ticket.STATES_ASSIGNABLE==status || Ticket.STATES_ASSIGNED==status)) || (Ticket.STATES_ASSIGNED==status && currentUser.getUsername().equals(operator))) { allowed = true; } break; } return allowed; } protected boolean userHasRole(String roleName) { boolean hasPermission = false; if(roleName!=null) { IApsAuthority authority = this.getRoleManager().getRole(roleName); if (authority!=null) { hasPermission = this.getAuthorizationManager().isAuth(this.getCurrentUser(), authority); } } return hasPermission; } public boolean validateParameters(Ticket ticket, int operationCode, boolean allowed) { boolean validated = allowed; if (!allowed) { this.addActionError(this.getText("Errors.ticketOperation.notAllowed")); } else { switch (operationCode) { case TicketOperation.OPERATIONS_ANSWER: if (!this.validateAnswerParams(ticket)) { validated = false; } break; case TicketOperation.OPERATIONS_UPDATE: if (!this.validateUpdateParams()) { validated = false; } break; case TicketOperation.OPERATIONS_SETASSIGNABLE: if (!this.validateSetAssignableParams(ticket)) { validated = false; } break; } } return validated; } protected Ticket createTicketForUpdate(Ticket ticket, int operationCode) throws Exception { Ticket newTicket = (Ticket) ticket.clone(); switch (operationCode) { case TicketOperation.OPERATIONS_TAKEINCHARGE: newTicket.setStatus(Ticket.STATES_ASSIGNED); newTicket.setWttOperator(this.getCurrentUser().getUsername()); break; case TicketOperation.OPERATIONS_SETASSIGNABLE: newTicket.setStatus(Ticket.STATES_ASSIGNABLE); newTicket.setWttOperator(null); newTicket.setWttRole(this.getRoleName()); break; case TicketOperation.OPERATIONS_UPDATE: if (newTicket.getStatus()==Ticket.STATES_OPENED) { newTicket.setStatus(Ticket.STATES_WORKING); } int priority = this.getPriority()!=null ? this.getPriority().intValue() : 0; newTicket.setPriority(priority); int interventionType = this.getInterventionType()!=null ? this.getInterventionType().intValue() : 0; newTicket.setOpInterventionType(interventionType); break; case TicketOperation.OPERATIONS_CLOSE: newTicket.setStatus(Ticket.STATES_CLOSED); newTicket.setClosingDate(new Date()); if (this.getResolved()!=null) { newTicket.setResolved(this.getResolved().booleanValue()); } newTicket.setWttOperator(null); break; case TicketOperation.OPERATIONS_ANSWER: if (newTicket.getStatus()==Ticket.STATES_OPENED) { newTicket.setStatus(Ticket.STATES_WORKING); } break; case TicketOperation.OPERATIONS_RELEASE: newTicket.setStatus(Ticket.STATES_WORKING); newTicket.setClosingDate(null); newTicket.setResolved(false); newTicket.setWttOperator(null); break; } if (this.getPriority()!=null) { newTicket.setPriority(this.getPriority().intValue()); } return newTicket; } protected boolean validateUpdateParams() { boolean allowed = true; ITicketManager ticketManager = this.getTicketManager(); Integer interventionType = this.getInterventionType(); if (null!=interventionType && 0!=interventionType.intValue() && null==ticketManager.getInterventionType(interventionType)) { this.addFieldError("interventionType", this.getText("Errors.interventionType.notValid")); allowed = false; } Integer priority = this.getPriority(); if (null!=priority && 0!=priority.intValue() && null==ticketManager.getPriorities().get(priority)) { this.addFieldError("priority", this.getText("Errors.priority.notValid")); allowed = false; } return allowed; } protected boolean validateAnswerParams(Ticket ticket) { boolean allowed = false; String email = ticket.getEmail(); String message = this.getMessage(); if (null==email || email.length()==0) { this.addActionError(this.getText("Errors.ticketAnswer.mailNotFound")); } else if (message==null || message.length()==0) { this.addFieldError("message", this.getText("required", new String[] { "message" }));// TODO verificare parametro } else { allowed = true; } return allowed; } protected boolean validateSetAssignableParams(Ticket ticket) { boolean allowed = false; String roleName = this.getRoleName(); if (null!=roleName) { Role role = this.getRoleManager().getRole(roleName); if (null!=role && role.hasPermission(JpWttSystemConstants.WTT_OPERATOR_PERMISSION)) { allowed = true; } } if (!allowed) { this.addFieldError("roleName", this.getText("Errors.ticketSetAssiglable.roleNotFound")); } return allowed; } protected TicketOperation createTicketOperation(int operationCode) { TicketOperation operation = new TicketOperation(); operation.setTicketCode(this.getCode()); operation.setOperator(this.getCurrentUser().getUsername()); operation.setOperationCode(operationCode); operation.setDate(new Date()); if (TicketOperation.OPERATIONS_ANSWER==operationCode) { operation.setNote(this.getMessage()); } else if (TicketOperation.OPERATIONS_UPDATE==operationCode) { int priority = this.getPriority()!=null ? this.getPriority().intValue() : 0; operation.setPriority(priority); int interventionType = this.getInterventionType()!=null ? this.getInterventionType().intValue() : 0; operation.setInterventionType(interventionType); operation.setNote(this.getNote()); } else if (TicketOperation.OPERATIONS_SETASSIGNABLE==operationCode) { operation.setWttRole(this.getRoleName()); } return operation; } public List<Role> getRoles() { List<Role> roles = this.getRoleManager().getRolesWithPermission(JpWttSystemConstants.WTT_OPERATOR_PERMISSION); return roles; } public Role getRole(String roleName) { return this.getRoleManager().getRole(roleName); } public Map<Integer, String> getOperations() { if (null==this._operations) { this._operations = new HashMap<Integer, String>(); this._operations.put(TicketOperation.OPERATIONS_SETASSIGNABLE, "entryAssign"); this._operations.put(TicketOperation.OPERATIONS_TAKEINCHARGE, "takeInCharge"); this._operations.put(TicketOperation.OPERATIONS_UPDATE, "update"); this._operations.put(TicketOperation.OPERATIONS_ANSWER, "entryAnswer"); this._operations.put(TicketOperation.OPERATIONS_RELEASE, "reopen"); } return this._operations; } public Integer getInterventionType() { return _interventionType; } public void setInterventionType(Integer interventionType) { this._interventionType = interventionType; } public Integer getPriority() { return _priority; } public void setPriority(Integer priority) { this._priority = priority; } public String getNote() { return _note; } public void setNote(String note) { this._note = note; } public String getMessage() { return _message; } public void setMessage(String message) { this._message = message; } public Boolean getResolved() { return _resolved; } public void setResolved(Boolean resolved) { this._resolved = resolved; } public String getRoleName() { return _roleName; } public void setRoleName(String roleName) { this._roleName = roleName; } public IRoleManager getRoleManager() { return _roleManager; } public void setRoleManager(IRoleManager authorityManager) { this._roleManager = authorityManager; } private Integer _interventionType; private Integer _priority; private String _note; private String _message; private Boolean _resolved; private String _roleName; private Map<Integer, String> _operations; private IRoleManager _roleManager; }