/* * 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.gl.report; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; import java.util.TreeSet; import org.kuali.kfs.gl.batch.CollectorBatch; import org.kuali.kfs.gl.batch.service.impl.DocumentGroupData; import org.kuali.kfs.gl.batch.service.impl.OriginEntryTotals; import org.kuali.kfs.gl.businessobject.CollectorDetail; import org.kuali.kfs.gl.businessobject.DemergerReportData; import org.kuali.kfs.gl.businessobject.Transaction; import org.kuali.kfs.gl.service.ScrubberReportData; import org.kuali.kfs.sys.Message; import org.kuali.rice.krad.util.MessageMap; /** * This class aggregates all of the status information together from all of the collector-related processes. Note: this code assumes * that each batch is identified by a different collector batch name. */ public class CollectorReportData { private Map<String, String> emailSendingStatus; private Set<String> unparsableFileNames; private Map<String, List<Message>> validationErrorsForBatchName; private Map<String, CollectorBatch> addedBatches; private Map<String, Map<CollectorDetail, List<Message>>> detailScrubberErrors; private Map<String, Map<Transaction, List<Message>>> originEntryScrubberErrors; private Map<String, ScrubberReportData> scrubberReportDataForBatchName; private Map<String, DemergerReportData> demergerReportDataForBatchName; private Map<String, Integer> numDetailAccountValuesChangedForBatchName; private Map<String, Integer> numDetailDeletedForBatchName; private Map<String, Map<DocumentGroupData, OriginEntryTotals>> totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName; private Map<String, Integer> numInputDetailsForBatchName; private Map<String, Integer> numSavedDetailsForBatchName; private Map<String, Boolean> validationStatuses; private SortedMap<String, MessageMap> messageMapForFileName; private LedgerSummaryReport ledgerSummaryReport; private PreScrubberReportData preScrubberReportData; private int numPersistedBatches; private int numNotPersistedBatches; private int numNotPersistedOriginEntryRecords; private int numNotPersistedCollectorDetailRecords; private Collection<String> loadedfileNames; public CollectorReportData() { emailSendingStatus = new HashMap<String, String>(); unparsableFileNames = new TreeSet<String>(); validationErrorsForBatchName = new HashMap<String, List<Message>>(); addedBatches = new LinkedHashMap<String, CollectorBatch>(); detailScrubberErrors = new HashMap<String, Map<CollectorDetail, List<Message>>>(); originEntryScrubberErrors = new HashMap<String, Map<Transaction, List<Message>>>(); scrubberReportDataForBatchName = new HashMap<String, ScrubberReportData>(); demergerReportDataForBatchName = new HashMap<String, DemergerReportData>(); numDetailAccountValuesChangedForBatchName = new HashMap<String, Integer>(); numDetailDeletedForBatchName = new HashMap<String, Integer>(); totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName = new HashMap<String, Map<DocumentGroupData, OriginEntryTotals>>(); numInputDetailsForBatchName = new HashMap<String, Integer>(); numSavedDetailsForBatchName = new HashMap<String, Integer>(); validationStatuses = new HashMap<String, Boolean>(); ledgerSummaryReport = new LedgerSummaryReport(); preScrubberReportData = new PreScrubberReportData(0, 0, new TreeSet<String>(), new TreeSet<String>()); messageMapForFileName = new TreeMap<String, MessageMap>(); numPersistedBatches = 0; numNotPersistedBatches = 0; numNotPersistedOriginEntryRecords = 0; loadedfileNames = new ArrayList<String>(); } /** * Adds a batch to this report data object. If the batch (identified using batch.getBatchName()) has already been added, then an * exception is thrown. * * @param batch collector batch from xml input */ public void addBatch(CollectorBatch batch) { if (isBatchAdded(batch)) { throw new RuntimeException("Can't add a batch twice"); } addedBatches.put(batch.getBatchName(), batch); } /** * Returns whether a batch has already been added * * @param batch collector batch from xml input * @return true if batch has already been added */ public boolean isBatchAdded(CollectorBatch batch) { return addedBatches.containsKey(batch.getBatchName()); } /** * Returns the number of batches that have been added using the {@link #addBatch(CollectorBatch)} method * * @return number of added batches */ public int getNumberOfAddedBatches() { return addedBatches.size(); } /** * Throws exception if batch has not been added * * @param batch */ protected void throwExceptionIfBatchNotAdded(CollectorBatch batch) { if (!isBatchAdded(batch)) { throw new RuntimeException("Batch must be added first"); } } /** * Stores the errors encountered trying to scrub the InterDepartmentalBilling records in the given batch. This method must be * called after addBatch has been called with the same batch. Previously saved errors for this batch will be overwritten. * * @param batch collector batch from input xml * @param errorsMap contains a map of all errors encountered while trying to scrub InterDepartmentalBilling records */ public void setBatchDetailScrubberErrors(CollectorBatch batch, Map<CollectorDetail, List<Message>> errorsMap) { throwExceptionIfBatchNotAdded(batch); detailScrubberErrors.put(batch.getBatchName(), errorsMap); } /** * Stores the errors encountered trying to scrub the InterDepartmentalBilling records in the given batch. This method must be * called after addBatch has been called with the same batch. Previously saved errors for this batch will be overwritten. * * @param batch collector batch from input xml * @param errorsMap */ public void setBatchOriginEntryScrubberErrors(CollectorBatch batch, Map<Transaction, List<Message>> errorsMap) { throwExceptionIfBatchNotAdded(batch); originEntryScrubberErrors.put(batch.getBatchName(), errorsMap); } /** * Returns the scrubber errors related to a batch * * @param batch collector batch from input xml * @return Map returns a map containing a list of error messages for each transaction */ public Map<Transaction, List<Message>> getBatchOriginEntryScrubberErrors(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return originEntryScrubberErrors.get(batch.getBatchName()); } public void setScrubberReportData(CollectorBatch batch, ScrubberReportData scrubberReportData) { throwExceptionIfBatchNotAdded(batch); scrubberReportDataForBatchName.put(batch.getBatchName(), scrubberReportData); } public ScrubberReportData getScrubberReportData(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return scrubberReportDataForBatchName.get(batch.getBatchName()); } public void setDemergerReportData(CollectorBatch batch, DemergerReportData demergerReportData) { throwExceptionIfBatchNotAdded(batch); demergerReportDataForBatchName.put(batch.getBatchName(), demergerReportData); } public DemergerReportData getDemergerReportData(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return demergerReportDataForBatchName.get(batch.getBatchName()); } public void markUnparsableFileNames(String fileName) { unparsableFileNames.add(fileName); } public Set<String> getAllUnparsableFileNames() { return Collections.unmodifiableSet(unparsableFileNames); } public void setEmailSendingStatusForParsedBatch(CollectorBatch batch, String emailStatus) { throwExceptionIfBatchNotAdded(batch); emailSendingStatus.put(batch.getBatchName(), emailStatus); } public Iterator<CollectorBatch> getAddedBatches() { return addedBatches.values().iterator(); } public Map<String, String> getEmailSendingStatus() { return emailSendingStatus; } /** * Sets the number of times the details in a batch have had their account numbers changed * * @param batch collector batch from input xml */ public void setNumDetailAccountValuesChanged(CollectorBatch batch, Integer numDetailAccountValuesChanged) { throwExceptionIfBatchNotAdded(batch); numDetailAccountValuesChangedForBatchName.put(batch.getBatchName(), numDetailAccountValuesChanged); } public Integer getNumDetailAccountValuesChanged(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return numDetailAccountValuesChangedForBatchName.get(batch.getBatchName()); } public void setNumDetailDeleted(CollectorBatch batch, Integer numDetailDeleted) { throwExceptionIfBatchNotAdded(batch); numDetailDeletedForBatchName.put(batch.getBatchName(), numDetailDeleted); } public Integer getNumDetailDeleted(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return numDetailDeletedForBatchName.get(batch.getBatchName()); } /** * Stores the totals or all origin entries in the input group that match the document group (doc #, doc type, origination code) * of at least one origin entry in the error group, which is generated by the scrubber * * @param batch collector batch from input xml * @param totals a map such that the key is a document group (doc #, doc type, origination code) and the value is the totals of * the origin entry of all those */ public void setTotalsOnInputOriginEntriesAssociatedWithErrorGroup(CollectorBatch batch, Map<DocumentGroupData, OriginEntryTotals> totals) { throwExceptionIfBatchNotAdded(batch); totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName.put(batch.getBatchName(), totals); } /** * Returns the totals or all origin entries in the input group that match the document group (doc #, doc type, origination code) * of at least one origin entry in the error group, which is generated by the scrubber * * @param batch return a map such that the key is a document group (doc #, doc type, origination code) and the value is the * totals of the origin entry of all those */ public Map<DocumentGroupData, OriginEntryTotals> getTotalsOnInputOriginEntriesAssociatedWithErrorGroup(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return totalsOnInputOriginEntriesAssociatedWithErrorGroupForBatchName.get(batch.getBatchName()); } public void setNumInputDetails(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); numInputDetailsForBatchName.put(batch.getBatchName(), batch.getCollectorDetails().size()); } public Integer getNumInputDetails(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return numInputDetailsForBatchName.get(batch.getBatchName()); } public void setNumSavedDetails(CollectorBatch batch, Integer numSavedDetails) { throwExceptionIfBatchNotAdded(batch); numSavedDetailsForBatchName.put(batch.getBatchName(), numSavedDetails); } public Integer getNumSavedDetails(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return numSavedDetailsForBatchName.get(batch.getBatchName()); } public void incrementNumPersistedBatches() { numPersistedBatches++; } /** * Gets the numPersistedBatches attribute. * * @return Returns the numPersistedBatches. */ public int getNumPersistedBatches() { return numPersistedBatches; } public void incrementNumNonPersistedBatches() { numNotPersistedBatches++; } /** * Gets the numNotPersistedBatches attribute. * * @return Returns the numNotPersistedBatches. */ public int getNumNotPersistedBatches() { return numNotPersistedBatches; } public void incrementNumNotPersistedOriginEntryRecords(int records) { numNotPersistedOriginEntryRecords += records; } public int getNumNotPersistedOriginEntryRecords() { return numNotPersistedOriginEntryRecords; } public void incrementNumNotPersistedCollectorDetailRecords(int records) { numNotPersistedCollectorDetailRecords += records; } public int getNumNotPersistedCollectorDetailRecords() { return numNotPersistedCollectorDetailRecords; } /** * Marks whether or not a batch is valid or not * * @param batch collector batch from input xml * @param validStatus valid status fro batch */ public void markValidationStatus(CollectorBatch batch, boolean validStatus) { throwExceptionIfBatchNotAdded(batch); validationStatuses.put(batch.getBatchName(), Boolean.valueOf(validStatus)); } /** * Returns true if batch is valid; False if invalid * * @param batch collector batch from input xml * @return true if batch is valid */ public boolean isBatchValid(CollectorBatch batch) { throwExceptionIfBatchNotAdded(batch); return (Boolean) validationStatuses.get(batch.getBatchName()).booleanValue(); } /** * Gets the ledgerSummaryReport attribute. * @return Returns the ledgerSummaryReport. */ public LedgerSummaryReport getLedgerSummaryReport() { return ledgerSummaryReport; } public PreScrubberReportData getPreScrubberReportData() { return preScrubberReportData; } public MessageMap getMessageMapForFileName(String fileName) { MessageMap messageMap = messageMapForFileName.get(fileName); if (messageMap == null) { messageMap = new MessageMap(); messageMapForFileName.put(fileName, messageMap); } return messageMap; } public Collection<String> getLoadedfileNames() { return loadedfileNames; } }