/* * 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.module.cg.document; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.integration.ar.AccountsReceivableCustomer; import org.kuali.kfs.integration.ar.AccountsReceivableModuleBillingService; import org.kuali.kfs.integration.ar.AccountsReceivableModuleService; import org.kuali.kfs.module.cg.CGConstants; import org.kuali.kfs.module.cg.CGPropertyConstants; import org.kuali.kfs.module.cg.businessobject.Agency; import org.kuali.kfs.module.cg.businessobject.AgencyAddress; import org.kuali.kfs.module.cg.businessobject.Award; import org.kuali.kfs.module.cg.service.ContractsAndGrantsBillingService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kew.api.WorkflowDocument; import org.kuali.rice.kew.api.exception.WorkflowException; 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.DocumentHeader; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.util.ObjectUtils; /** * Methods for the Agency maintenance document UI. */ public class AgencyMaintainableImpl extends ContractsGrantsBillingMaintainable { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AgencyMaintainableImpl.class); private static final String CREATED_BY_AGENCY_DOC = "message.ar.createdByAgencyDocument"; private static volatile AccountsReceivableModuleBillingService accountsReceivableModuleBillingService; /** * Gets the underlying Agency. * * @return */ public Agency getAgency() { return (Agency) getBusinessObject(); } /** * This method overrides the parent method to create a new Customer document when Agency document goes to final * if CGB is enabled. * * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#doRouteStatusChange(org.kuali.rice.krad.bo.DocumentHeader) */ @Override public void doRouteStatusChange(DocumentHeader header) { super.doRouteStatusChange(header); if (getAccountsReceivableModuleBillingService().isContractsGrantsBillingEnhancementActive()) { WorkflowDocument workflowDoc = header.getWorkflowDocument(); Agency agency = getAgency(); String description = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(CREATED_BY_AGENCY_DOC); // Use the isProcessed() method so this code is only executed when the final approval occurs if (workflowDoc.isProcessed()) { try { if (this.businessObject != null) { // To save the agency and address before creating customer to copy over the address. SpringContext.getBean(BusinessObjectService.class).save(agency); for (AgencyAddress agencyAddress : agency.getAgencyAddresses()) { agencyAddress.setAgency(agency); SpringContext.getBean(BusinessObjectService.class).save(agencyAddress); } // To create customer only if "create new customer" was selected on the document. if (CGConstants.AGENCY_CREATE_NEW_CUSTOMER_CODE.equalsIgnoreCase(agency.getCustomerCreationOptionCode())) { String customerNumber = SpringContext.getBean(AccountsReceivableModuleService.class).createAndSaveCustomer(description, agency); agency.setCustomerCreationOptionCode(CGConstants.AGENCY_USE_EXISTING_CUSTOMER_CODE); agency.setCustomerNumber(customerNumber); } // If no customer was selected, clear out the link between the agency and the old customer else if (CGConstants.AGENCY_NO_CUSTOMER_CODE.equalsIgnoreCase(agency.getCustomerCreationOptionCode())) { agency.setCustomerCreationOptionCode(CGConstants.AGENCY_NO_CUSTOMER_CODE); agency.setCustomerNumber(null); agency.setCustomer(null); agency.setCustomerTypeCode(null); } // To set dunningCampaign value from Agency to all the awards in the agency. List<Award> awards = new ArrayList<Award>(); Map<String, Object> criteria = new HashMap<String, Object>(); criteria.put(KFSPropertyConstants.AGENCY_NUMBER, agency.getAgencyNumber()); awards = (List<Award>) SpringContext.getBean(BusinessObjectService.class).findMatching(Award.class, criteria); for (Award award : awards) { award.setDunningCampaign(agency.getDunningCampaign()); if (ObjectUtils.isNotNull(agency.getCustomer()) && ObjectUtils.isNotNull(agency.getCustomer().isStopWorkIndicator())) { award.setStopWorkIndicator(agency.getCustomer().isStopWorkIndicator()); } SpringContext.getBean(BusinessObjectService.class).save(award); } } } catch (WorkflowException ex) { throw new RuntimeException("Error creating Customer Document from Agency document.", ex); } } } } /** * Override the getSections method on this maintainable so that the document type name field can be set to read-only for */ @Override public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) { List<Section> sections = super.getSections(document, oldMaintainable); Agency oldAgency = (Agency) document.getOldMaintainableObject().getBusinessObject(); Agency agency = (Agency) document.getNewMaintainableObject().getBusinessObject(); for (Section section : sections) { String sectionId = section.getSectionId(); if (sectionId.equalsIgnoreCase(CGPropertyConstants.CUSTOMER)) { for (Row row : section.getRows()) { for (Field field : row.getFields()) { if (StringUtils.isNotEmpty(agency.getCustomerCreationOptionCode())) { if (agency.getCustomerCreationOptionCode().equals(CGConstants.AGENCY_USE_EXISTING_CUSTOMER_CODE)) { if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_NUMBER)) { field.setReadOnly(false); } else if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_TYPE_CODE)) { field.setReadOnly(true); if (ObjectUtils.isNotNull(agency.getCustomer())) { agency.setCustomerTypeCode(agency.getCustomer().getCustomerTypeCode()); } else { agency.setCustomerTypeCode(null); } } } else if (agency.getCustomerCreationOptionCode().equals(CGConstants.AGENCY_CREATE_NEW_CUSTOMER_CODE)) { if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_NUMBER)) { agency.setCustomerNumber(null); field.setReadOnly(true); } else if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_TYPE_CODE)) { field.setReadOnly(false); } } else if (agency.getCustomerCreationOptionCode().equals(CGConstants.AGENCY_NO_CUSTOMER_CODE)) { if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_NUMBER)) { agency.setCustomerNumber(null); field.setReadOnly(true); } else if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_TYPE_CODE)) { field.setReadOnly(true); agency.setCustomerTypeCode(null); } } } else { if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_NUMBER)) { agency.setCustomerNumber(null); field.setReadOnly(true); } else if (field.getPropertyName().equals(CGPropertyConstants.CUSTOMER_TYPE_CODE)) { agency.setCustomerTypeCode(null); field.setReadOnly(true); } } } } } } return sections; } /** * If the Contracts & Grants Billing (CGB) enhancement is disabled, we don't want to * process sections only related to CGB. * * @return Collection of section ids to ignore */ @Override protected Collection<?> getSectionIdsToIgnore() { if (!getAccountsReceivableModuleBillingService().isContractsGrantsBillingEnhancementActive()) { return SpringContext.getBean(ContractsAndGrantsBillingService.class).getAgencyContractsGrantsBillingSectionIds(); } else { return CollectionUtils.EMPTY_COLLECTION; } } /** * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#refresh(java.lang.String, java.util.Map, * org.kuali.rice.kns.document.MaintenanceDocument) */ @Override public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document) { Agency agency = getAgency(); String customerNumber = (String) fieldValues.get(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + "." + CGPropertyConstants.CUSTOMER_NUMBER); if (ObjectUtils.isNotNull(customerNumber)) { AccountsReceivableCustomer customer = SpringContext.getBean(AccountsReceivableModuleService.class).findCustomer(customerNumber); agency.setCustomerTypeCode(customer.getCustomerTypeCode()); } super.refresh(refreshCaller, fieldValues, document); } /** * Overridden to set the default values on the Agency document. * * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#processAfterNew(org.kuali.rice.kns.document.MaintenanceDocument, * java.util.Map) */ @Override public void processAfterNew(MaintenanceDocument document, Map<String, String[]> parameters) { super.processAfterNew(document, parameters); Agency agency = getAgency(); // Default Billing Frequency // Retrieve default value from the corresponding default value parameter String parameterDunningCampaignCode = getAccountsReceivableModuleBillingService().getDefaultDunningCampaignCode(); if (!StringUtils.isBlank(parameterDunningCampaignCode)) { agency.setDunningCampaign(parameterDunningCampaignCode); } } public static AccountsReceivableModuleBillingService getAccountsReceivableModuleBillingService() { if (accountsReceivableModuleBillingService == null) { accountsReceivableModuleBillingService = SpringContext.getBean(AccountsReceivableModuleBillingService.class); } return accountsReceivableModuleBillingService; } @Override public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) { super.processAfterCopy(document, parameters); Agency agency = (Agency) getBusinessObject(); List<AgencyAddress> agencyAddresses = agency.getAgencyAddresses(); for (AgencyAddress agencyAddress : agencyAddresses) { agencyAddress.setAgencyAddressIdentifier(null); } } }