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.gl.report; 017 018 import java.util.ArrayList; 019 import java.util.Collection; 020 import java.util.Collections; 021 import java.util.HashMap; 022 import java.util.Iterator; 023 import java.util.LinkedHashMap; 024 import java.util.List; 025 import java.util.Map; 026 import java.util.Set; 027 import java.util.SortedMap; 028 import java.util.TreeMap; 029 import java.util.TreeSet; 030 031 import org.kuali.kfs.gl.batch.CollectorBatch; 032 import org.kuali.kfs.gl.batch.service.impl.DocumentGroupData; 033 import org.kuali.kfs.gl.batch.service.impl.OriginEntryTotals; 034 import org.kuali.kfs.gl.businessobject.CollectorDetail; 035 import org.kuali.kfs.gl.businessobject.DemergerReportData; 036 import org.kuali.kfs.gl.businessobject.Transaction; 037 import org.kuali.kfs.gl.service.ScrubberReportData; 038 import org.kuali.kfs.sys.Message; 039 import org.kuali.rice.kns.util.MessageMap; 040 041 /** 042 * This class aggregates all of the status information together from all of the collector-related processes. Note: this code assumes 043 * that each batch is identified by a different collector batch name. 044 */ 045 public class CollectorReportData { 046 private Map<String, String> emailSendingStatus; 047 048 private Set<String> unparsableFileNames; 049 private Map<String, List<Message>> validationErrorsForBatchName; 050 private Map<String, CollectorBatch> addedBatches; 051 private Map<String, Map<CollectorDetail, List<Message>>> detailScrubberErrors; 052 private Map<String, Map<Transaction, List<Message>>> originEntryScrubberErrors; 053 private Map<String, ScrubberReportData> scrubberReportDataForBatchName; 054 private Map<String, DemergerReportData> demergerReportDataForBatchName; 055 private Map<String, Integer> numDetailAccountValuesChangedForBatchName; 056 057 private Map<String, Integer> numDetailDeletedForBatchName; 058 private Map<String, Map<DocumentGroupData, OriginEntryTotals>> totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName; 059 private Map<String, Integer> numInputDetailsForBatchName; 060 private Map<String, Integer> numSavedDetailsForBatchName; 061 private Map<String, Boolean> validationStatuses; 062 private SortedMap<String, MessageMap> messageMapForFileName; 063 064 private LedgerSummaryReport ledgerSummaryReport; 065 private PreScrubberReportData preScrubberReportData; 066 067 private int numPersistedBatches; 068 private int numNotPersistedBatches; 069 private int numNotPersistedOriginEntryRecords; 070 private int numNotPersistedCollectorDetailRecords; 071 private Collection<String> loadedfileNames; 072 073 public CollectorReportData() { 074 emailSendingStatus = new HashMap<String, String>(); 075 unparsableFileNames = new TreeSet<String>(); 076 validationErrorsForBatchName = new HashMap<String, List<Message>>(); 077 addedBatches = new LinkedHashMap<String, CollectorBatch>(); 078 detailScrubberErrors = new HashMap<String, Map<CollectorDetail, List<Message>>>(); 079 originEntryScrubberErrors = new HashMap<String, Map<Transaction, List<Message>>>(); 080 scrubberReportDataForBatchName = new HashMap<String, ScrubberReportData>(); 081 demergerReportDataForBatchName = new HashMap<String, DemergerReportData>(); 082 numDetailAccountValuesChangedForBatchName = new HashMap<String, Integer>(); 083 numDetailDeletedForBatchName = new HashMap<String, Integer>(); 084 totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName = new HashMap<String, Map<DocumentGroupData, OriginEntryTotals>>(); 085 numInputDetailsForBatchName = new HashMap<String, Integer>(); 086 numSavedDetailsForBatchName = new HashMap<String, Integer>(); 087 validationStatuses = new HashMap<String, Boolean>(); 088 ledgerSummaryReport = new LedgerSummaryReport(); 089 preScrubberReportData = new PreScrubberReportData(0, 0, new TreeSet<String>(), new TreeSet<String>()); 090 messageMapForFileName = new TreeMap<String, MessageMap>(); 091 numPersistedBatches = 0; 092 numNotPersistedBatches = 0; 093 numNotPersistedOriginEntryRecords = 0; 094 loadedfileNames = new ArrayList<String>(); 095 } 096 097 /** 098 * Adds a batch to this report data object. If the batch (identified using batch.getBatchName()) has already been added, then an 099 * exception is thrown. 100 * 101 * @param batch collector batch from xml input 102 */ 103 public void addBatch(CollectorBatch batch) { 104 if (isBatchAdded(batch)) { 105 throw new RuntimeException("Can't add a batch twice"); 106 } 107 addedBatches.put(batch.getBatchName(), batch); 108 } 109 110 /** 111 * Returns whether a batch has already been added 112 * 113 * @param batch collector batch from xml input 114 * @return true if batch has already been added 115 */ 116 public boolean isBatchAdded(CollectorBatch batch) { 117 return addedBatches.containsKey(batch.getBatchName()); 118 } 119 120 /** 121 * Returns the number of batches that have been added using the {@link #addBatch(CollectorBatch)} method 122 * 123 * @return number of added batches 124 */ 125 public int getNumberOfAddedBatches() { 126 return addedBatches.size(); 127 } 128 129 /** 130 * Throws exception if batch has not been added 131 * 132 * @param batch 133 */ 134 protected void throwExceptionIfBatchNotAdded(CollectorBatch batch) { 135 if (!isBatchAdded(batch)) { 136 throw new RuntimeException("Batch must be added first"); 137 } 138 } 139 140 /** 141 * Stores the errors encountered trying to scrub the InterDepartmentalBilling records in the given batch. This method must be 142 * called after addBatch has been called with the same batch. Previously saved errors for this batch will be overwritten. 143 * 144 * @param batch collector batch from input xml 145 * @param errorsMap contains a map of all errors encountered while trying to scrub InterDepartmentalBilling records 146 */ 147 public void setBatchDetailScrubberErrors(CollectorBatch batch, Map<CollectorDetail, List<Message>> errorsMap) { 148 throwExceptionIfBatchNotAdded(batch); 149 150 detailScrubberErrors.put(batch.getBatchName(), errorsMap); 151 } 152 153 /** 154 * Stores the errors encountered trying to scrub the InterDepartmentalBilling records in the given batch. This method must be 155 * called after addBatch has been called with the same batch. Previously saved errors for this batch will be overwritten. 156 * 157 * @param batch collector batch from input xml 158 * @param errorsMap 159 */ 160 public void setBatchOriginEntryScrubberErrors(CollectorBatch batch, Map<Transaction, List<Message>> errorsMap) { 161 throwExceptionIfBatchNotAdded(batch); 162 163 originEntryScrubberErrors.put(batch.getBatchName(), errorsMap); 164 } 165 166 /** 167 * Returns the scrubber errors related to a batch 168 * 169 * @param batch collector batch from input xml 170 * @return Map returns a map containing a list of error messages for each transaction 171 */ 172 public Map<Transaction, List<Message>> getBatchOriginEntryScrubberErrors(CollectorBatch batch) { 173 throwExceptionIfBatchNotAdded(batch); 174 175 return originEntryScrubberErrors.get(batch.getBatchName()); 176 } 177 178 public void setScrubberReportData(CollectorBatch batch, ScrubberReportData scrubberReportData) { 179 throwExceptionIfBatchNotAdded(batch); 180 181 scrubberReportDataForBatchName.put(batch.getBatchName(), scrubberReportData); 182 } 183 184 public ScrubberReportData getScrubberReportData(CollectorBatch batch) { 185 throwExceptionIfBatchNotAdded(batch); 186 187 return scrubberReportDataForBatchName.get(batch.getBatchName()); 188 } 189 190 public void setDemergerReportData(CollectorBatch batch, DemergerReportData demergerReportData) { 191 throwExceptionIfBatchNotAdded(batch); 192 193 demergerReportDataForBatchName.put(batch.getBatchName(), demergerReportData); 194 } 195 196 public DemergerReportData getDemergerReportData(CollectorBatch batch) { 197 throwExceptionIfBatchNotAdded(batch); 198 199 return demergerReportDataForBatchName.get(batch.getBatchName()); 200 } 201 202 public void markUnparsableFileNames(String fileName) { 203 unparsableFileNames.add(fileName); 204 } 205 206 public Set<String> getAllUnparsableFileNames() { 207 return Collections.unmodifiableSet(unparsableFileNames); 208 } 209 210 public void setEmailSendingStatusForParsedBatch(CollectorBatch batch, String emailStatus) { 211 throwExceptionIfBatchNotAdded(batch); 212 213 emailSendingStatus.put(batch.getBatchName(), emailStatus); 214 } 215 216 public Iterator<CollectorBatch> getAddedBatches() { 217 return addedBatches.values().iterator(); 218 } 219 220 public Map<String, String> getEmailSendingStatus() { 221 return emailSendingStatus; 222 } 223 224 /** 225 * Sets the number of times the details in a batch have had their account numbers changed 226 * 227 * @param batch collector batch from input xml 228 */ 229 public void setNumDetailAccountValuesChanged(CollectorBatch batch, Integer numDetailAccountValuesChanged) { 230 throwExceptionIfBatchNotAdded(batch); 231 232 numDetailAccountValuesChangedForBatchName.put(batch.getBatchName(), numDetailAccountValuesChanged); 233 } 234 235 public Integer getNumDetailAccountValuesChanged(CollectorBatch batch) { 236 throwExceptionIfBatchNotAdded(batch); 237 238 return numDetailAccountValuesChangedForBatchName.get(batch.getBatchName()); 239 } 240 241 public void setNumDetailDeleted(CollectorBatch batch, Integer numDetailDeleted) { 242 throwExceptionIfBatchNotAdded(batch); 243 244 numDetailDeletedForBatchName.put(batch.getBatchName(), numDetailDeleted); 245 } 246 247 public Integer getNumDetailDeleted(CollectorBatch batch) { 248 throwExceptionIfBatchNotAdded(batch); 249 250 return numDetailDeletedForBatchName.get(batch.getBatchName()); 251 } 252 253 /** 254 * Stores the totals or all origin entries in the input group that match the document group (doc #, doc type, origination code) 255 * of at least one origin entry in the error group, which is generated by the scrubber 256 * 257 * @param batch collector batch from input xml 258 * @param totals a map such that the key is a document group (doc #, doc type, origination code) and the value is the totals of 259 * the origin entry of all those 260 */ 261 public void setTotalsOnInputOriginEntriesAssociatedWithErrorGroup(CollectorBatch batch, Map<DocumentGroupData, OriginEntryTotals> totals) { 262 throwExceptionIfBatchNotAdded(batch); 263 264 totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName.put(batch.getBatchName(), totals); 265 } 266 267 /** 268 * Returns the totals or all origin entries in the input group that match the document group (doc #, doc type, origination code) 269 * of at least one origin entry in the error group, which is generated by the scrubber 270 * 271 * @param batch return a map such that the key is a document group (doc #, doc type, origination code) and the value is the 272 * totals of the origin entry of all those 273 */ 274 public Map<DocumentGroupData, OriginEntryTotals> getTotalsOnInputOriginEntriesAssociatedWithErrorGroup(CollectorBatch batch) { 275 throwExceptionIfBatchNotAdded(batch); 276 277 return totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName.get(batch.getBatchName()); 278 } 279 280 public void setNumInputDetails(CollectorBatch batch) { 281 throwExceptionIfBatchNotAdded(batch); 282 283 numInputDetailsForBatchName.put(batch.getBatchName(), batch.getCollectorDetails().size()); 284 } 285 286 public Integer getNumInputDetails(CollectorBatch batch) { 287 throwExceptionIfBatchNotAdded(batch); 288 289 return numInputDetailsForBatchName.get(batch.getBatchName()); 290 } 291 292 public void setNumSavedDetails(CollectorBatch batch, Integer numSavedDetails) { 293 throwExceptionIfBatchNotAdded(batch); 294 295 numSavedDetailsForBatchName.put(batch.getBatchName(), numSavedDetails); 296 } 297 298 public Integer getNumSavedDetails(CollectorBatch batch) { 299 throwExceptionIfBatchNotAdded(batch); 300 301 return numSavedDetailsForBatchName.get(batch.getBatchName()); 302 } 303 304 public void incrementNumPersistedBatches() { 305 numPersistedBatches++; 306 } 307 308 309 /** 310 * Gets the numPersistedBatches attribute. 311 * 312 * @return Returns the numPersistedBatches. 313 */ 314 public int getNumPersistedBatches() { 315 return numPersistedBatches; 316 } 317 318 public void incrementNumNonPersistedBatches() { 319 numNotPersistedBatches++; 320 } 321 322 /** 323 * Gets the numNotPersistedBatches attribute. 324 * 325 * @return Returns the numNotPersistedBatches. 326 */ 327 public int getNumNotPersistedBatches() { 328 return numNotPersistedBatches; 329 } 330 331 public void incrementNumNotPersistedOriginEntryRecords(int records) { 332 numNotPersistedOriginEntryRecords += records; 333 } 334 335 public int getNumNotPersistedOriginEntryRecords() { 336 return numNotPersistedOriginEntryRecords; 337 } 338 339 public void incrementNumNotPersistedCollectorDetailRecords(int records) { 340 numNotPersistedCollectorDetailRecords += records; 341 } 342 343 public int getNumNotPersistedCollectorDetailRecords() { 344 return numNotPersistedCollectorDetailRecords; 345 } 346 347 /** 348 * Marks whether or not a batch is valid or not 349 * 350 * @param batch collector batch from input xml 351 * @param validStatus valid status fro batch 352 */ 353 public void markValidationStatus(CollectorBatch batch, boolean validStatus) { 354 throwExceptionIfBatchNotAdded(batch); 355 356 validationStatuses.put(batch.getBatchName(), Boolean.valueOf(validStatus)); 357 } 358 359 /** 360 * Returns true if batch is valid; False if invalid 361 * 362 * @param batch collector batch from input xml 363 * @return true if batch is valid 364 */ 365 public boolean isBatchValid(CollectorBatch batch) { 366 throwExceptionIfBatchNotAdded(batch); 367 368 return (Boolean) validationStatuses.get(batch.getBatchName()).booleanValue(); 369 } 370 371 /** 372 * Gets the ledgerSummaryReport attribute. 373 * @return Returns the ledgerSummaryReport. 374 */ 375 public LedgerSummaryReport getLedgerSummaryReport() { 376 return ledgerSummaryReport; 377 } 378 379 public PreScrubberReportData getPreScrubberReportData() { 380 return preScrubberReportData; 381 } 382 383 public MessageMap getMessageMapForFileName(String fileName) { 384 MessageMap messageMap = messageMapForFileName.get(fileName); 385 if (messageMap == null) { 386 messageMap = new MessageMap(); 387 messageMapForFileName.put(fileName, messageMap); 388 } 389 return messageMap; 390 } 391 392 public Collection<String> getLoadedfileNames() { 393 return loadedfileNames; 394 } 395 }