/*
* 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.document.service;
import java.io.IOException;
import java.io.OutputStream;
import java.sql.Date;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.kuali.kfs.gl.businessobject.CorrectionChangeGroup;
import org.kuali.kfs.gl.businessobject.OriginEntryFull;
import org.kuali.kfs.gl.document.CorrectionDocumentUtils;
import org.kuali.kfs.gl.document.GeneralLedgerCorrectionProcessDocument;
import org.kuali.kfs.gl.document.web.CorrectionDocumentEntryMetadata;
import org.kuali.kfs.sys.batch.InitiateDirectory;
import org.kuali.rice.kns.web.ui.Column;
/**
* An interface declaring methods needed by the GLCP to function
*/
public interface CorrectionDocumentService extends InitiateDirectory{
public final static String CORRECTION_TYPE_MANUAL = "M";
public final static String CORRECTION_TYPE_CRITERIA = "C";
public final static String CORRECTION_TYPE_REMOVE_GROUP_FROM_PROCESSING = "R";
public final static String SYSTEM_DATABASE = "D";
public final static String SYSTEM_UPLOAD = "U";
/**
* When passed into {@link #retrievePersistedInputOriginEntries(CorrectionDocument, int)} and
* {@link #retrievePersistedOutputOriginEntries(CorrectionDocument, int)} as the int parameter, this will signify that there is
* no abort threshold (i.e. the methods should return all of the persisted rows, regardless of number of rows.
*/
public final static int UNLIMITED_ABORT_THRESHOLD = CorrectionDocumentUtils.RECORD_COUNT_FUNCTIONALITY_LIMIT_IS_UNLIMITED;
/**
* Returns a specific correction change group for a GLCP document
*
* @param docId the document id of a GLCP document
* @param i the number of the correction group within the document
* @return a CorrectionChangeGroup
*/
public CorrectionChangeGroup findByDocumentNumberAndCorrectionChangeGroupNumber(String docId, int i);
/**
* Finds CollectionChange records associated with a given document id and correction change group
*
* @param docId the document id of a GLCP document
* @param i the number of the correction group within the document
* @return a List of qualifying CorrectionChange records
*/
public List findByDocumentHeaderIdAndCorrectionGroupNumber(String docId, int i);
/**
* Finds Collection Criteria associated with the given GLCP document and group
*
* @param docId the document id of a GLCP document
* @param i the number of the correction group within the document
* @return a List of qualifying CorrectionCriteria
*/
public List findByDocumentNumberAndCorrectionGroupNumber(String docId, int i);
/**
* Retrieves a correction document by the document id
*
* @param docId the document id of the GLCP to find
* @return a CorrectionDocument if found
*/
public GeneralLedgerCorrectionProcessDocument findByCorrectionDocumentHeaderId(String docId);
/**
* Returns metadata to help render columns in the GLCP. Do not modify this list or the contents in this list.
*
* @param docId the document id of a GLCP document
* @return a List of Columns to render
*/
public List<Column> getTableRenderColumnMetadata(String docId);
/**
* This method persists an Iterator of input origin entries for a document that is in the initiated or saved state
*
* @param document an initiated or saved document
* @param entries an Iterator of origin entries
*/
public void persistInputOriginEntriesForInitiatedOrSavedDocument(GeneralLedgerCorrectionProcessDocument document, Iterator<OriginEntryFull> entries);
/**
* Removes input origin entries that were saved to the database associated with the given document
*
* @param document a GLCP document
*/
public void removePersistedInputOriginEntries(GeneralLedgerCorrectionProcessDocument document);
/**
* Removes input origin entries that were saved to the database associated with the given document
*
* @param docId the document id of a GLCP document
*/
public void removePersistedInputOriginEntries(String docId);
/**
* Retrieves input origin entries that have been persisted for this document
*
* @param document the document
* @param abortThreshold if the file exceeds this number of rows, then null is returned. {@link UNLIMITED_ABORT_THRESHOLD}
* signifies that there is no limit
* @return the list, or null if there are too many origin entries
* @throws RuntimeException several reasons, primarily relating to underlying persistence layer problems
*/
public List<OriginEntryFull> retrievePersistedInputOriginEntries(GeneralLedgerCorrectionProcessDocument document, int abortThreshold);
/**
* Returns true if the system is storing input origin entries for this class. Note that this does not mean that there's at least
* one input origin entry record persisted for this document, but merely returns true if and only if the underlying persistence
* mechanism has a record of this document's origin entries. See the docs for the implementations of this method for more
* implementation specific details.
*
* @param document a GLCP document
* @return Returns true if system should store origin entries, false otherwise
*/
public boolean areInputOriginEntriesPersisted(GeneralLedgerCorrectionProcessDocument document);
/**
* Writes out the persisted input origin entries in an {@link OutputStream} in a flat file format
*
* @param document a GLCP document
* @param out an open and ready output stream
* @throws IOException thrown if errors were encountered writing to the Stream
* @throws RuntimeException several reasons, including if the entries are not persisted
*/
public void writePersistedInputOriginEntriesToStream(GeneralLedgerCorrectionProcessDocument document, OutputStream out) throws IOException;
/**
* This method persists an Iterator of input origin entries for a document that is in the initiated or saved state
*
* @param document an initiated or saved document
* @param entries an Iterator of OriginEntries to persist
*/
public void persistOutputOriginEntriesForInitiatedOrSavedDocument(GeneralLedgerCorrectionProcessDocument document, Iterator<OriginEntryFull> entries);
/**
* Removes all output origin entries persisted in the database created by the given document
*
* @param document a GLCP document
*/
public void removePersistedOutputOriginEntries(GeneralLedgerCorrectionProcessDocument document);
/**
* Removes all output origin entries persisted in the database created by the given document
*
* @param docId the document id of a GLCP document
*/
public void removePersistedOutputOriginEntries(String docId);
/**
* Retrieves output origin entries that have been persisted for this document
*
* @param document the document
* @param abortThreshold if the file exceeds this number of rows, then null is returned. {@link UNLIMITED_ABORT_THRESHOLD}
* signifies that there is no limit
* @return the list, or null if there are too many origin entries
* @throws RuntimeException several reasons, primarily relating to underlying persistence layer problems
*/
public List<OriginEntryFull> retrievePersistedOutputOriginEntries(GeneralLedgerCorrectionProcessDocument document, int abortThreshold);
/**
* Retrieves input origin entries that have been persisted for this document in an iterator. Implementations of this method may
* choose to implement this method in a way that consumes very little memory.
*
* @param document the document
* @return the iterator
* @throws RuntimeException several reasons, primarily relating to underlying persistence layer problems
*/
public Iterator<OriginEntryFull> retrievePersistedInputOriginEntriesAsIterator(GeneralLedgerCorrectionProcessDocument document);
/**
* Retrieves output origin entries that have been persisted for this document in an iterator. Implementations of this method may
* choose to implement this method in a way that consumes very little memory.
*
* @param document the document
* @return the iterator
* @throws RuntimeException several reasons, primarily relating to underlying persistence layer problems
*/
public Iterator<OriginEntryFull> retrievePersistedOutputOriginEntriesAsIterator(GeneralLedgerCorrectionProcessDocument document);
/**
* Returns true if the system is storing output origin entries for this class. Note that this does not mean that there's at
* least one output origin entry record persisted for this document, but merely returns true if and only if the underlying
* persistence mechanism has a record of this document's origin entries. See the docs for the implementations of this method for
* more implementation specific details.
*
* @param document a GLCP document to query
* @return true if origin entries are stored to the system, false otherwise
*/
public boolean areOutputOriginEntriesPersisted(GeneralLedgerCorrectionProcessDocument document);
/**
* Writes out the persisted output origin entries in an {@link OutputStream} in a flat file format\
*
* @param document a GLCP document
* @param out axn open and ready output stream
* @throws IOException thrown if IOExceptions occurred in writing the persisted origin entries
* @throws RuntimeException several reasons, including if the entries are not persisted
*/
public void writePersistedOutputOriginEntriesToStream(GeneralLedgerCorrectionProcessDocument document, OutputStream out) throws IOException;
/**
* Saves the input and output origin entry groups for a document prior to saving the document
*
* @param document a GLCP document
* @param correctionDocumentEntryMetadata metadata about this GLCP document
*/
public void persistOriginEntryGroupsForDocumentSave(GeneralLedgerCorrectionProcessDocument document, CorrectionDocumentEntryMetadata correctionDocumentEntryMetadata);
/**
* Retrieves all of the documents that were finalized on a certain date
*
* @param date the date to find GLCP documents finalized on
* @return a collection of documents
*/
public Collection<GeneralLedgerCorrectionProcessDocument> getCorrectionDocumentsFinalizedOn(Date date);
public String generateOutputOriginEntryFileName(String docId);
public String createOutputFileForProcessing(String docId, java.util.Date today);
public String getBatchFileDirectoryName();
public String getGlcpDirectoryName();
/**
* Generate a text report for the given correction document
*
* @param document GLCP document to report on
*/
public void generateCorrectionReport(GeneralLedgerCorrectionProcessDocument document);
public void aggregateCorrectionDocumentReports(GeneralLedgerCorrectionProcessDocument document);
/**
* Finds any existing output files for the given document. Used to prevent double-processing.
*
* @param documentNumber
* @return
*/
public String[] findExistingCorrectionOutputFilesForDocument( String documentNumber );
}