package net.techreadiness.customer.action.organization;
import static net.techreadiness.security.CorePermissionCodes.CORE_CUSTOMER_ORGANIZATION_ACCESS;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.inject.Inject;
import net.techreadiness.annotation.CoreSecured;
import net.techreadiness.navigation.taskflow.org.OrgTaskFlowData;
import net.techreadiness.navigation.taskflow.org.OrgTaskFlowDefinition;
import net.techreadiness.service.ConfigService;
import net.techreadiness.service.OrganizationService;
import net.techreadiness.service.ScopeService;
import net.techreadiness.service.common.DataGridItemProvider;
import net.techreadiness.service.common.ViewDef;
import net.techreadiness.service.common.ViewDef.ViewDefTypeCode;
import net.techreadiness.service.exception.ServiceException;
import net.techreadiness.service.object.Contact;
import net.techreadiness.service.object.Org;
import net.techreadiness.service.object.OrgPart;
import net.techreadiness.service.object.Scope;
import net.techreadiness.ui.BaseAction;
import net.techreadiness.ui.tags.datagrid.DataGridState;
import net.techreadiness.ui.task.Task;
import net.techreadiness.ui.task.TaskFlowState;
import net.techreadiness.ui.util.ConversationScoped;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import com.google.common.collect.Lists;
public class DetailsAction extends BaseAction {
private static final long serialVersionUID = 1L;
private Long orgId;
private Map<String, String> org;
private boolean showTaskLinks;
private boolean reset;
private ViewDef viewDef;
private ViewDef contactsViewDef;
private ViewDef orgPartViewDef;
@Inject
private ConfigService configService;
@Inject
private OrganizationService orgService;
@Inject
private ScopeService scopeService;
@Inject
ContactByOrgItemProvider contactByOrgItemProvider;
@Inject
OrgPartItemProvider orgPartItemProvider;
@ConversationScoped
private DataGridState<Contact> contactDataGridState;
@ConversationScoped
private DataGridState<OrgPart> orgPartDataGridState;
private Scope orgPartScope;
@Inject
private OrgTaskFlowDefinition orgTaskFlow;
@Inject
private OrgTaskFlowData orgTaskFlowData;
@Override
@CoreSecured({ CORE_CUSTOMER_ORGANIZATION_ACCESS })
@Action(value = "details", results = { @Result(name = "success", location = "/org/details.jsp") })
public String execute() throws ServiceException {
if (org == null) {
Org o = orgService.getById(getServiceContext(), getOrgId());
org = o.getAsMap();
org.put("parentOrgName", o.getParentOrgName());
}
if (reset) {
contactDataGridState.getFilters().clear();
orgPartDataGridState.getFilters().clear();
}
orgPartScope = scopeService.getScopeWithOrgParts(getServiceContext());
contactByOrgItemProvider.setOrgId(getOrgId());
orgPartItemProvider.setOrgId(getOrgId());
orgPartItemProvider.setScopeId(getServiceContext().getScopeId());
viewDef = configService.getViewDefinition(getServiceContext(), ViewDefTypeCode.ORG);
contactsViewDef = configService.getViewDefinition(getServiceContext(), ViewDefTypeCode.CONTACT_DATAGRID);
orgPartViewDef = configService.getViewDefinition(getServiceContext(), ViewDefTypeCode.ORG_PART_DATAGRID);
return SUCCESS;
}
@Action(value = "detailsEditOrg", results = { @Result(name = "success", type = "redirectAction", params = { "namespace",
"/task/org", "actionName", "altOrgTaskFlowBegin" }) })
public String detailsEditOrg() throws ServiceException {
return routeToTask(OrgTaskFlowDefinition.TASK_UPDATE_ORG);
}
@Action(value = "detailsEditContact", results = { @Result(name = "success", type = "redirectAction", params = {
"namespace", "/task/org", "actionName", "altOrgTaskFlowBegin" }) })
public String detailsEditContacts() throws ServiceException {
return routeToTask(OrgTaskFlowDefinition.TASK_EDIT_CONTACTS);
}
@Action(value = "detailsAddContact", results = { @Result(name = "success", type = "redirectAction", params = {
"namespace", "/task/org", "actionName", "altOrgTaskFlowBegin" }) })
public String detailsAddContacts() throws ServiceException {
return routeToTask(OrgTaskFlowDefinition.TASK_EDIT_CONTACTS);
}
@Action(value = "detailsEditParticipation", results = { @Result(name = "success", type = "redirectAction", params = {
"namespace", "/task/org", "actionName", "altOrgTaskFlowBegin" }) })
public String detailsEditParticipations() throws ServiceException {
return routeToTask(OrgTaskFlowDefinition.TASK_PARICIPATIONS);
}
@Action(value = "detailsAddParticipation", results = { @Result(name = "success", type = "redirectAction", params = {
"namespace", "/task/org", "actionName", "altOrgTaskFlowBegin" }) })
public String detailsAddParticipations() throws ServiceException {
return routeToTask(OrgTaskFlowDefinition.TASK_PARICIPATIONS);
}
private String routeToTask(String taskName) {
Set<Org> orgs = new HashSet<>();
orgs.add(orgService.getById(getServiceContext(), getOrgId()));
Task task = orgTaskFlow.getTask(taskName);
TaskFlowState state = new TaskFlowState();
state.setTasks(Lists.newArrayList(task));
orgTaskFlowData.setTaskFlowState(state);
orgTaskFlowData.setOrgs(orgs);
return SUCCESS;
}
public DataGridItemProvider<Contact> getContactItemProvider() {
return contactByOrgItemProvider;
}
public DataGridItemProvider<Map<String, String>> getOrgPartItemProvider() {
return orgPartItemProvider;
}
public Long getOrgId() {
return orgId;
}
public void setOrgId(Long orgId) {
this.orgId = orgId;
}
public boolean isShowTaskLinks() {
return showTaskLinks;
}
public void setShowTaskLinks(boolean showTaskLinks) {
this.showTaskLinks = showTaskLinks;
}
public ViewDef getViewDef() {
return viewDef;
}
public void setViewDef(ViewDef viewDef) {
this.viewDef = viewDef;
}
public ViewDef getContactsViewDef() {
return contactsViewDef;
}
public ViewDef getOrgPartViewDef() {
return orgPartViewDef;
}
public void setOrgPartViewDef(ViewDef orgPartViewDef) {
this.orgPartViewDef = orgPartViewDef;
}
public void setContactsViewDef(ViewDef contactsViewDef) {
this.contactsViewDef = contactsViewDef;
}
public DataGridState<Contact> getContactDataGridState() {
return contactDataGridState;
}
public void setContactDataGridState(DataGridState<Contact> contactDataGridState) {
this.contactDataGridState = contactDataGridState;
}
public Map<String, String> getOrg() {
return org;
}
public void setOrg(Map<String, String> org) {
this.org = org;
}
public boolean isReset() {
return reset;
}
public void setReset(boolean reset) {
this.reset = reset;
}
public DataGridState<OrgPart> getOrgPartDataGridState() {
return orgPartDataGridState;
}
public void setOrgPartDataGridState(DataGridState<OrgPart> orgPartDataGridState) {
this.orgPartDataGridState = orgPartDataGridState;
}
public Scope getOrgPartScope() {
return orgPartScope;
}
}