/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.coa.document; import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.identity.OrgReviewRole; import org.kuali.kfs.coa.service.OrgReviewRoleService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.FinancialSystemMaintainable; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.kns.maintenance.Maintainable; import org.kuali.rice.kns.web.ui.Field; import org.kuali.rice.kns.web.ui.Row; import org.kuali.rice.kns.web.ui.Section; import org.kuali.rice.krad.bo.BusinessObject; import org.kuali.rice.krad.maintenance.MaintenanceLock; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.KRADConstants; public class OrgReviewRoleMaintainableImpl extends FinancialSystemMaintainable { private transient static OrgReviewRoleService orgReviewRoleService; @Override public boolean isExternalBusinessObject(){ return true; } @Override public List<MaintenanceLock> generateMaintenanceLocks() { return Collections.emptyList(); } @Override public void prepareBusinessObject(BusinessObject businessObject){ OrgReviewRole orr = (OrgReviewRole)businessObject; //Assuming that this is the condition when the document is loaded on edit or copy // The links on the lookup set barious variables, including the methodToCall on the "bo" class // and the delegate or role IDs being edited/copied if( (KRADConstants.MAINTENANCE_EDIT_METHOD_TO_CALL.equals(orr.getMethodToCall()) || KRADConstants.MAINTENANCE_COPY_METHOD_TO_CALL.equals(orr.getMethodToCall())) && (StringUtils.isNotEmpty(orr.getODelMId()) || StringUtils.isNotEmpty(orr.getORMId())) ){ // check if we have the information to create a delegation if(StringUtils.isNotEmpty(orr.getODelMId()) && !orr.isCreateDelegation()){ getOrgReviewRoleService().populateOrgReviewRoleFromDelegationMember(orr, orr.getORMId(), orr.getODelMId()); orr.setDelegate(true); if ( KRADConstants.MAINTENANCE_COPY_METHOD_TO_CALL.equals(orr.getMethodToCall()) ) { orr.setDelegationMemberId(""); } } else if(StringUtils.isNotEmpty(orr.getORMId())){ getOrgReviewRoleService().populateOrgReviewRoleFromRoleMember(orr, orr.getORMId()); if(orr.isCreateDelegation()) { orr.setDelegate(true); if ( KRADConstants.MAINTENANCE_COPY_METHOD_TO_CALL.equals(orr.getMethodToCall()) ) { orr.setDelegationMemberId(""); } } else { orr.setDelegate(false); if ( KRADConstants.MAINTENANCE_COPY_METHOD_TO_CALL.equals(orr.getMethodToCall()) ) { orr.setRoleMemberId(""); } } } // blank these out, since they are flags to init the object orr.setORMId(""); orr.setODelMId(""); } setBusinessObject(orr); } // public List<RoleResponsibilityAction> getRoleRspActions(String roleMemberId){ // return KimApiServiceLocator.getRoleService().getRoleMemberResponsibilityActions(roleMemberId); // } @Override public void processAfterEdit(MaintenanceDocument document, Map<String,String[]> parameters){ super.processAfterEdit(document, parameters); OrgReviewRole orr = (OrgReviewRole)document.getOldMaintainableObject().getBusinessObject(); orr.setEdit(true); orr = (OrgReviewRole) document.getNewMaintainableObject().getBusinessObject(); orr.setEdit(true); if ( orr.isCreateDelegation() ) { orr.setPerson(null); orr.setRole(null); orr.setGroup(null); } } @Override public void processAfterCopy(MaintenanceDocument document, Map<String,String[]> parameters){ super.processAfterCopy(document, parameters); OrgReviewRole orr = (OrgReviewRole)document.getOldMaintainableObject().getBusinessObject(); if(orr.isDelegate() || orr.isCreateDelegation()) { orr.setDelegationMemberId(""); } else { orr.setRoleMemberId(""); } orr.setCopy(true); orr = (OrgReviewRole) document.getNewMaintainableObject().getBusinessObject(); if(orr.isDelegate() || orr.isCreateDelegation()) { orr.setDelegationMemberId(""); } else { orr.setRoleMemberId(""); } orr.setCopy(true); } /** * Override the getSections method on this maintainable so that the document type name field * can be set to read-only for * * KRAD Conversion: Inquirable performs conditionally preparing the fields for different role modes * or to display/hide fields on the inquiry. * The field definitions are NOT declared in data dictionary. */ @Override public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) { List<Section> sections = super.getSections(document, oldMaintainable); OrgReviewRole orr = (OrgReviewRole)document.getNewMaintainableObject().getBusinessObject(); String closestOrgReviewRoleParentDocumentTypeName = getOrgReviewRoleService().getClosestOrgReviewRoleParentDocumentTypeName(orr.getFinancialSystemDocumentTypeCode()); boolean isFSTransDoc = StringUtils.equals( orr.getFinancialSystemDocumentTypeCode(), KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT) || StringUtils.equals( KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT, closestOrgReviewRoleParentDocumentTypeName); boolean hasAccountingOrganizationHierarchy = isFSTransDoc || getOrgReviewRoleService().hasAccountingOrganizationHierarchy(orr.getFinancialSystemDocumentTypeCode()); boolean shouldReviewTypesFieldBeReadOnly = isFSTransDoc || getOrgReviewRoleService().hasOrganizationHierarchy(orr.getFinancialSystemDocumentTypeCode()) || (StringUtils.isNotBlank(closestOrgReviewRoleParentDocumentTypeName) && StringUtils.equals(closestOrgReviewRoleParentDocumentTypeName, KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT)); //If oldMaintainable is null, it means we are trying to get sections for the old part //If oldMaintainable is not null, it means we are trying to get sections for the new part //Refer to KualiMaintenanceForm lines 288-294 if(oldMaintainable!=null){ if(orr.isCreateRoleMember() || orr.isCopyRoleMember()){ for (Section section : sections) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { prepareFieldsForCreateRoleMemberMode(field); prepareFieldsCommon(field, shouldReviewTypesFieldBeReadOnly, hasAccountingOrganizationHierarchy ); } } } } else if(orr.isDelegate() && (orr.isCopy() || StringUtils.isBlank( orr.getDelegationMemberId() )) ){ for (Section section : sections) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { prepareFieldsForCreateDelegationMode(field); prepareFieldsCommon(field, shouldReviewTypesFieldBeReadOnly, hasAccountingOrganizationHierarchy ); } } } } else if(orr.isEditRoleMember()){ for (Section section : sections) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { prepareFieldsForEditRoleMember(field); prepareFieldsCommon(field, shouldReviewTypesFieldBeReadOnly, hasAccountingOrganizationHierarchy ); } } } } else if(orr.isEditDelegation()){ for (Section section : sections) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { prepareFieldsForEditDelegation(field); prepareFieldsCommon(field, shouldReviewTypesFieldBeReadOnly, hasAccountingOrganizationHierarchy ); } } } } } else if ( orr.isCreateRoleMember() || orr.isCopyRoleMember() || orr.isEditRoleMember()) { // If the member being edited is not a delegate, do not show the delegation type code for (Section section : sections) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ field.setFieldType(Field.HIDDEN); } } } } } return sections; } protected void prepareFieldsCommon(Field field, boolean shouldReviewTypesFieldBeReadOnly, boolean hasAccountingOrganizationHierarchy){ if ( field == null ) { throw new IllegalArgumentException( "The Field parameter may not be null." ); } if(!shouldReviewTypesFieldBeReadOnly) { return; // nothing to make read only } if(OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName())) { field.setReadOnly(true); } else if( !hasAccountingOrganizationHierarchy && (OrgReviewRole.FROM_AMOUNT_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.TO_AMOUNT_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.OVERRIDE_CODE_FIELD_NAME.equals(field.getPropertyName()))) { field.setReadOnly(true); } } protected void setCommonFieldsToReadOnlyOnEdit( Field field ) { if(OrgReviewRole.CHART_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ORG_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ROLE_NAME_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName()) || OrgReviewRole.GROUP_NAME_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName())){ field.setReadOnly(true); } } protected void prepareFieldsForEditRoleMember(Field field){ setCommonFieldsToReadOnlyOnEdit(field); //If the member being edited is not a delegate, do not show the delegation type code if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ field.setFieldType(Field.HIDDEN); } } protected void prepareFieldsForEditDelegation(Field field){ setCommonFieldsToReadOnlyOnEdit(field); if(OrgReviewRole.ACTION_POLICY_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ACTION_TYPE_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.PRIORITY_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.FORCE_ACTION_FIELD_NAME.equals(field.getPropertyName())){ field.setReadOnly(true); } } protected void prepareFieldsForCreateRoleMemberMode(Field field){ //If a role member (i.e. not a delegate) is being created, do not show the delegation type code if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ field.setFieldType(Field.HIDDEN); } } protected void prepareFieldsForCreateDelegationMode(Field field){ //TODO: in prepareBusinessObject, populate these fields for create delegation if(OrgReviewRole.CHART_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ORG_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ACTION_POLICY_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.ACTION_TYPE_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.PRIORITY_CODE_FIELD_NAME.equals(field.getPropertyName()) || OrgReviewRole.FORCE_ACTION_FIELD_NAME.equals(field.getPropertyName())){ field.setReadOnly(true); } } /** * * @see org.kuali.rice.kns.maintenance.Maintainable#saveBusinessObject() */ @Override public void saveBusinessObject() { getOrgReviewRoleService().saveOrgReviewRoleToKim((OrgReviewRole)getBusinessObject()); } protected OrgReviewRoleService getOrgReviewRoleService(){ if(orgReviewRoleService==null){ orgReviewRoleService = SpringContext.getBean( OrgReviewRoleService.class ); } return orgReviewRoleService; } @Override public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document) { super.refresh(refreshCaller, fieldValues, document); String docTypeName = ((OrgReviewRole)document.getNewMaintainableObject().getBusinessObject()).getFinancialSystemDocumentTypeCode(); if(StringUtils.isNotBlank(docTypeName) && !getOrgReviewRoleService().isValidDocumentTypeForOrgReview(docTypeName) ){ GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME, KFSKeyConstants.ERROR_DOCUMENT_ORGREVIEW_INVALID_DOCUMENT_TYPE, docTypeName); ((OrgReviewRole)document.getNewMaintainableObject().getBusinessObject()).setFinancialSystemDocumentTypeCode(""); } } }