/*
* 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.ar.document;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.ar.businessobject.InvoiceRecurrence;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.document.FinancialSystemMaintainable;
import org.kuali.kfs.sys.document.FinancialSystemMaintenanceDocument;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kim.api.identity.principal.Principal;
import org.kuali.rice.kim.api.services.IdentityManagementService;
import org.kuali.rice.krad.service.DocumentService;
public class InvoiceRecurrenceMaintainable extends FinancialSystemMaintainable {
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(InvoiceRecurrenceMaintainable.class);
private static final String INACTIVATING_NODE_NAME = "InvoiceRecurrenceIsInactivating";
private static final String INITIATED_BY_SYSTEM_USER = "InitiatedBySystemUser";
@Override
protected boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
// return true if the doc is flipping form Active to Inactive, false otherwise
if ( StringUtils.equalsIgnoreCase( INACTIVATING_NODE_NAME, nodeName) ) {
// go through some contortions to get the oldMaintainable to compare against
FinancialSystemMaintenanceDocument maintDoc = getParentMaintDoc();
// make sure all the needed objects are there
if ( maintDoc == null
|| maintDoc.getOldMaintainableObject() == null
|| maintDoc.getOldMaintainableObject().getBusinessObject() == null ) {
return false;
}
boolean oldIsActive = ((InvoiceRecurrence)maintDoc.getOldMaintainableObject().getBusinessObject()).isActive();
boolean newIsActive = ((InvoiceRecurrence)getBusinessObject()).isActive();
// return true if the invoicerecurrence is being deactivated, otherwise return false
return oldIsActive && !newIsActive;
}
// return true if the document was initiated by the SYSTEM_USER, false otherwise
if ( StringUtils.equalsIgnoreCase( INITIATED_BY_SYSTEM_USER, nodeName) ) {
FinancialSystemMaintenanceDocument maintDoc = getParentMaintDoc();
if ( maintDoc == null
|| maintDoc.getDocumentHeader() == null
|| maintDoc.getDocumentHeader().getWorkflowDocument() == null
|| StringUtils.isBlank( maintDoc.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId() ) ) {
return false;
}
String initiatorPrincipalId = maintDoc.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
Principal principal = SpringContext.getBean(IdentityManagementService.class).getPrincipal(initiatorPrincipalId);
return principal != null && StringUtils.equalsIgnoreCase(principal.getPrincipalName(), KFSConstants.SYSTEM_USER);
}
throw new UnsupportedOperationException("InvoiceRecurrenceMaintainable does not implement the answerSplitNodeQuestion method. Node name specified was: " + nodeName);
}
protected FinancialSystemMaintenanceDocument getParentMaintDoc() {
// how I wish for the ability to directly access the parent object
DocumentService documentService = SpringContext.getBean(DocumentService.class);
try {
return (FinancialSystemMaintenanceDocument) documentService.getByDocumentHeaderId(getDocumentNumber());
} catch (WorkflowException e) {
LOG.error( "Unable to retrieve maintenance document for use in split node routing - returning null",e);
}
return null;
}
@Override
public void processAfterRetrieve() {
super.processAfterRetrieve();
// Need to make sure that the customer invoice object has been loaded on the new object
((InvoiceRecurrence)getBusinessObject()).setCustomerInvoiceDocument( getBusinessObjectService().findBySinglePrimaryKey(CustomerInvoiceDocument.class, ((InvoiceRecurrence)getBusinessObject()).getInvoiceNumber() ));
}
}