/*
* 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 static org.kuali.kfs.sys.KFSPropertyConstants.DOCUMENT;
import static org.kuali.kfs.sys.KFSPropertyConstants.NEW_MAINTAINABLE_OBJECT;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.ArKeyConstants;
import org.kuali.kfs.module.ar.ArPropertyConstants;
import org.kuali.kfs.module.ar.businessobject.Bill;
import org.kuali.kfs.module.ar.businessobject.PredeterminedBillingSchedule;
import org.kuali.kfs.module.ar.document.service.PredeterminedBillingScheduleMaintenanceService;
import org.kuali.kfs.module.ar.document.validation.impl.PredeterminedBillingScheduleRuleUtil;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
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.util.GlobalVariables;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* Methods for the Predetermined Billing Schedule maintenance document UI.
*/
public class PredeterminedBillingScheduleMaintainableImpl extends FinancialSystemMaintainable {
private static volatile PredeterminedBillingScheduleMaintenanceService predeterminedBillingScheduleMaintenanceService;
/**
* This method is called to check if the award already has bills set, and to validate on refresh
*
* @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) {
if (StringUtils.equals(ArConstants.AWARD_LOOKUP_IMPL, (String) fieldValues.get(KFSConstants.REFRESH_CALLER))) {
if (PredeterminedBillingScheduleRuleUtil.checkIfBillsExist(getPredeterminedBillingSchedule())) {
String pathToMaintainable = DOCUMENT + "." + NEW_MAINTAINABLE_OBJECT;
GlobalVariables.getMessageMap().addToErrorPath(pathToMaintainable);
GlobalVariables.getMessageMap().putError(KFSPropertyConstants.PROPOSAL_NUMBER, ArKeyConstants.ERROR_AWARD_PREDETERMINED_BILLING_SCHEDULE_EXISTS, new String[] { getPredeterminedBillingSchedule().getProposalNumber().toString() });
GlobalVariables.getMessageMap().removeFromErrorPath(pathToMaintainable);
}
}
else {
super.refresh(refreshCaller, fieldValues, document);
}
}
/**
* Not to copy over the Bills billed and billIdentifier values to prevent
* bad data and PK issues when saving new Bills.
*/
@Override
public void processAfterCopy(MaintenanceDocument document, Map<String, String[]> parameters) {
super.processAfterCopy(document, parameters);
// clear out Bill IDs so new ones will get generated for these bills
// reset billed indicator in case bill we're copying from was already billed
List<Bill> bills = getPredeterminedBillingSchedule().getBills();
if (ObjectUtils.isNotNull(bills)) {
for (Bill bill:bills) {
bill.setBilled(false);
bill.setBillIdentifier(null);
}
}
}
/**
* This method is called for refreshing the Agency before display to show the full name in case the agency number was changed by
* hand before any submit that causes a redisplay.
*/
@Override
public void processAfterRetrieve() {
PredeterminedBillingSchedule predeterminedBillingSchedule = getPredeterminedBillingSchedule();
predeterminedBillingSchedule.refreshNonUpdateableReferences();
super.processAfterRetrieve();
}
/**
* Gets the underlying Predetermined Billing Schedule.
*
* @return
*/
public PredeterminedBillingSchedule getPredeterminedBillingSchedule() {
return (PredeterminedBillingSchedule) getBusinessObject();
}
/**
* Override the getSections method on this maintainable so that the active field can be set to read-only when
* a CINV doc has been created with this Predetermined Billing Schedule and Bills
*/
@Override
public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
List<Section> sections = super.getSections(document, oldMaintainable);
Long proposalNumber = getPredeterminedBillingSchedule().getProposalNumber();
for (Section section : sections) {
String sectionId = section.getSectionId();
if (sectionId.equalsIgnoreCase(ArPropertyConstants.BILLS)) {
prepareBillsTab(section, proposalNumber);
}
}
return sections;
}
/**
* Sets the Bill in the passed in section to be readonly if it has been copied to a CG Invoice doc.
*
* @param section Bill section to review and possibly set readonly
* @param proposalNumber used to look for CG Invoice docs
*/
protected void prepareBillsTab(Section section, Long proposalNumber) {
for (Row row : section.getRows()) {
for (Field field : row.getFields()) {
if (field.getCONTAINER().equalsIgnoreCase(field.getFieldType())) {
for (Row containerRow : field.getContainerRows()) {
for (Field containerRowfield : containerRow.getFields()) {
// a record is no longer editable if the bill has been copied to a CINV doc
if (ObjectUtils.getNestedAttributePrimitive(containerRowfield.getPropertyName()).matches(ArPropertyConstants.BillFields.BILL_IDENTIFIER)) {
String billId = containerRowfield.getPropertyValue();
if (StringUtils.isNotEmpty(billId)) {
if (getPredeterminedBillingScheduleMaintenanceService().hasBillBeenCopiedToInvoice(proposalNumber, billId)) {
for (Field rowfield : row.getFields()) {
if (rowfield.getCONTAINER().equalsIgnoreCase(rowfield.getFieldType())) {
for (Row fieldContainerRow : rowfield.getContainerRows()) {
for (Field fieldContainerRowField : fieldContainerRow.getFields()) {
fieldContainerRowField.setReadOnly(true);
}
}
}
}
}
}
}
}
}
}
}
}
}
public static PredeterminedBillingScheduleMaintenanceService getPredeterminedBillingScheduleMaintenanceService() {
if (predeterminedBillingScheduleMaintenanceService == null) {
predeterminedBillingScheduleMaintenanceService = SpringContext.getBean(PredeterminedBillingScheduleMaintenanceService.class);
}
return predeterminedBillingScheduleMaintenanceService;
}
}