001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.module.ld.service.impl; 017 018 import java.util.Collection; 019 import java.util.Iterator; 020 import java.util.Map; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.gl.Constant; 024 import org.kuali.kfs.module.ld.businessobject.AccountStatusCurrentFunds; 025 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry; 026 import org.kuali.kfs.module.ld.businessobject.LedgerBalance; 027 import org.kuali.kfs.module.ld.businessobject.LedgerEntry; 028 import org.kuali.kfs.module.ld.service.LaborInquiryOptionsService; 029 import org.kuali.kfs.module.ld.service.LaborLedgerBalanceService; 030 import org.kuali.kfs.module.ld.service.LaborLedgerPendingEntryService; 031 import org.kuali.kfs.sys.KFSPropertyConstants; 032 import org.kuali.kfs.sys.ObjectUtil; 033 import org.kuali.rice.kns.web.ui.Field; 034 import org.kuali.rice.kns.web.ui.Row; 035 036 /** 037 * The LaborInquiryOptionsService class is a service that will generate Pending Ledger and Consilidation options for balance 038 * inquiries. 039 */ 040 public class LaborInquiryOptionsServiceImpl implements LaborInquiryOptionsService { 041 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborInquiryOptionsServiceImpl.class); 042 043 private LaborLedgerPendingEntryService laborLedgerPendingEntryService; 044 private LaborLedgerBalanceService laborLedgerBalanceService; 045 046 /** 047 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationFieldName() 048 */ 049 public String getConsolidationFieldName() { 050 return Constant.CONSOLIDATION_OPTION; 051 } 052 053 /** 054 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationField(java.util.Collection) 055 */ 056 public Field getConsolidationField(Collection<Row> rows) { 057 for (Row row : rows) { 058 for (Field field : ((Collection<Field>) row.getFields())) { 059 if (field.getPropertyName().equals(getConsolidationFieldName())) { 060 return field; 061 } 062 } 063 } 064 return null; 065 } 066 067 /** 068 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getSelectedPendingEntryOption(java.util.Map) 069 */ 070 public String getSelectedPendingEntryOption(Map fieldValues) { 071 // truncate the non-property filed 072 String pendingEntryOption = (String) fieldValues.get(Constant.PENDING_ENTRY_OPTION); 073 fieldValues.remove(Constant.PENDING_ENTRY_OPTION); 074 075 return pendingEntryOption; 076 } 077 078 /** 079 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#getConsolidationOption(java.util.Map) 080 */ 081 public String getConsolidationOption(Map fieldValues) { 082 String consolidationOption = (String) fieldValues.get(getConsolidationFieldName()); 083 // truncate the non-property filed 084 fieldValues.remove(getConsolidationFieldName()); 085 return consolidationOption; 086 } 087 088 /** 089 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#isConsolidationSelected(java.util.Map, java.util.Collection) 090 */ 091 public boolean isConsolidationSelected(Map fieldValues, Collection<Row> rows) { 092 boolean isConsolidationSelected = isConsolidationSelected(fieldValues); 093 094 if (!isConsolidationSelected) { 095 Field consolidationField = getConsolidationField(rows); 096 consolidationField.setPropertyValue(Constant.DETAIL); 097 } 098 return isConsolidationSelected; 099 } 100 101 /** 102 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#isConsolidationSelected(java.util.Map) 103 */ 104 public boolean isConsolidationSelected(Map fieldValues) { 105 String consolidationOption = getConsolidationOption(fieldValues); 106 107 // detail option would be used 108 if (Constant.DETAIL.equals(consolidationOption)) { 109 return false; 110 } 111 112 // if the subAccountNumber is specified, detail option could be used 113 // if the subObjectCode is specified, detail option could be used 114 // if the objectTypeCode is specified, detail option could be used 115 if (isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.SUB_ACCOUNT_NUMBER) || isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.SUB_OBJECT_CODE) || isDetailDefaultFieldUsed(fieldValues, KFSPropertyConstants.OBJECT_TYPE_CODE)) { 116 return false; 117 } 118 return true; 119 } 120 121 /** 122 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateLedgerBalanceByPendingLedgerEntry(java.util.Collection, 123 * java.util.Map, java.lang.String, boolean) 124 */ 125 public void updateLedgerBalanceByPendingLedgerEntry(Collection<LedgerBalance> balanceCollection, Map fieldValues, String pendingEntryOption, boolean isConsolidated) { 126 // determine if search results need to be updated by pending ledger entries 127 if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) { 128 updateCollection(balanceCollection, fieldValues, false, isConsolidated, LedgerBalance.class); 129 } 130 else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) { 131 updateCollection(balanceCollection, fieldValues, true, isConsolidated, LedgerBalance.class); 132 } 133 } 134 135 /** 136 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateCurrentFundsByPendingLedgerEntry(java.util.Collection, 137 * java.util.Map, java.lang.String, boolean) 138 */ 139 public void updateCurrentFundsByPendingLedgerEntry(Collection<AccountStatusCurrentFunds> balanceCollection, Map fieldValues, String pendingEntryOption, boolean isConsolidated) { 140 // determine if search results need to be updated by pending ledger entries 141 if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) { 142 updateCollection(balanceCollection, fieldValues, false, isConsolidated, AccountStatusCurrentFunds.class); 143 } 144 else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) { 145 updateCollection(balanceCollection, fieldValues, true, isConsolidated, AccountStatusCurrentFunds.class); 146 } 147 } 148 149 /** 150 * @see org.kuali.kfs.module.ld.service.LaborInquiryOptionsService#updateByPendingLedgerEntry(java.util.Collection, 151 * java.util.Map, java.lang.String, boolean) 152 */ 153 public void updateLedgerEntryByPendingLedgerEntry(Collection<LedgerEntry> entryCollection, Map fieldValues, String pendingEntryOption) { 154 // determine if search results need to be updated by pending ledger entries 155 if (Constant.ALL_PENDING_ENTRY.equals(pendingEntryOption)) { 156 updateCollection(entryCollection, fieldValues, false, false, LedgerEntry.class); 157 } 158 else if (Constant.APPROVED_PENDING_ENTRY.equals(pendingEntryOption)) { 159 updateCollection(entryCollection, fieldValues, true, false, LedgerEntry.class); 160 } 161 } 162 163 /** 164 * update a given collection entry with the pending entry obtained from the given field values and isApproved 165 * 166 * @param entryCollection the given entry collection 167 * @param fieldValues the given field values 168 * @param isApproved indicate if the resulting pending entry has been approved 169 * @param isConsolidated indicate if the collection entries have been consolidated 170 */ 171 protected void updateCollection(Collection entryCollection, Map fieldValues, boolean isApproved, boolean isConsolidated, Class clazz) { 172 // go through the pending entries to update the balance collection 173 Iterator<LaborLedgerPendingEntry> pendingEntryIterator = laborLedgerPendingEntryService.findPendingLedgerEntriesForLedgerBalance(fieldValues, isApproved); 174 175 while (pendingEntryIterator.hasNext()) { 176 LaborLedgerPendingEntry pendingEntry = pendingEntryIterator.next(); 177 178 // if consolidated, change the following fields into the default values for consolidation 179 if (isConsolidated) { 180 pendingEntry.setSubAccountNumber(Constant.CONSOLIDATED_SUB_ACCOUNT_NUMBER); 181 pendingEntry.setFinancialSubObjectCode(Constant.CONSOLIDATED_SUB_OBJECT_CODE); 182 pendingEntry.setFinancialObjectTypeCode(Constant.CONSOLIDATED_OBJECT_TYPE_CODE); 183 } 184 185 if (LedgerBalance.class.isAssignableFrom(clazz)) { 186 try { 187 LedgerBalance ledgerBalance = laborLedgerBalanceService.findLedgerBalance(entryCollection, pendingEntry); 188 if (ledgerBalance == null) { 189 190 Object newLedgerBalance = clazz.newInstance(); 191 ObjectUtil.buildObject(newLedgerBalance, pendingEntry); 192 193 ledgerBalance = (LedgerBalance) newLedgerBalance; 194 entryCollection.add(ledgerBalance); 195 } 196 laborLedgerBalanceService.updateLedgerBalance(ledgerBalance, pendingEntry); 197 ledgerBalance.getDummyBusinessObject().setConsolidationOption(isConsolidated ? Constant.CONSOLIDATION : Constant.DETAIL); 198 ledgerBalance.getDummyBusinessObject().setPendingEntryOption(isApproved ? Constant.APPROVED_PENDING_ENTRY : Constant.ALL_PENDING_ENTRY); 199 } 200 catch (Exception e) { 201 LOG.error("cannot create a new object of type: " + clazz.getName() + "/n" + e); 202 } 203 } 204 else if (LedgerEntry.class.isAssignableFrom(clazz)) { 205 LedgerEntry ledgerEntry = new LedgerEntry(); 206 ObjectUtil.buildObject(ledgerEntry, pendingEntry); 207 208 ledgerEntry.getDummyBusinessObject().setConsolidationOption(isConsolidated ? Constant.CONSOLIDATION : Constant.DETAIL); 209 ledgerEntry.getDummyBusinessObject().setPendingEntryOption(isApproved ? Constant.APPROVED_PENDING_ENTRY : Constant.ALL_PENDING_ENTRY); 210 211 entryCollection.add(ledgerEntry); 212 } 213 else { 214 LOG.warn("The class, " + clazz.getName() + ", is unregistered with the method."); 215 return; 216 } 217 } 218 } 219 220 /** 221 * Determines if any of the fields that require a detail view are used 222 * 223 * @param fieldValues 224 * @param fieldName 225 */ 226 protected boolean isDetailDefaultFieldUsed(Map fieldValues, String fieldName) { 227 return StringUtils.isNotBlank((String) fieldValues.get(fieldName)); 228 } 229 230 /** 231 * Sets the laborLedgerBalanceService attribute value. 232 * 233 * @param laborLedgerBalanceService The laborLedgerBalanceService to set. 234 */ 235 public void setLaborLedgerBalanceService(LaborLedgerBalanceService laborLedgerBalanceService) { 236 this.laborLedgerBalanceService = laborLedgerBalanceService; 237 } 238 239 /** 240 * Sets the laborLedgerPendingEntryService attribute value. 241 * 242 * @param laborLedgerPendingEntryService The laborLedgerPendingEntryService to set. 243 */ 244 public void setLaborLedgerPendingEntryService(LaborLedgerPendingEntryService laborLedgerPendingEntryService) { 245 this.laborLedgerPendingEntryService = laborLedgerPendingEntryService; 246 } 247 }