/*
* 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.fp.document.service;
import java.util.List;
import java.util.Map;
import org.kuali.kfs.fp.businessobject.CashieringItemInProcess;
import org.kuali.kfs.fp.businessobject.Check;
import org.kuali.kfs.fp.businessobject.CoinDetail;
import org.kuali.kfs.fp.businessobject.CurrencyDetail;
import org.kuali.kfs.fp.businessobject.Deposit;
import org.kuali.kfs.fp.document.CashManagementDocument;
import org.kuali.kfs.fp.document.CashReceiptDocument;
import org.kuali.kfs.sys.businessobject.Bank;
import org.kuali.rice.core.api.util.type.KualiDecimal;
/**
* This service interface defines methods that a CashManagementService implementation must provide.
*
*/
public interface CashManagementService {
/**
* Creates and returns a CashManagementDocument, opening the CashDrawer associated with the given verification unit.
*
* @param campusCode
* @param docDescription
* @param annotation
* @return A properly initialized CashManagementDocument instance.
*/
public CashManagementDocument createCashManagementDocument(String campusCode, String docDescription, String annotation);
/**
* Uses the given information to lock the appropriate CashDrawer, create a Deposit, and associate it with the given
* CashManagementDocument and CashReceipts.
*
* @param cashManagementDoc
* @param depositTicketNumber
* @param bank
* @param selectedCashReceipts
* @param isFinalDeposit
*/
public void addDeposit(CashManagementDocument cashManagementDoc, String depositTicketNumber, Bank bank, List selectedCashReceipts, List selectedCashieringChecks, boolean isFinalDeposit);
/**
* Cancels the given Deposit, updating the related CashManagementDocument, CashReceipts, and CashDrawer as needed
*
* @param deposit
*/
public void cancelDeposit(Deposit deposit);
/**
* Cancels the given CashManagementDocument, canceling the Deposits it contains and closing the CashDrawer associated with the
* given verification unit. Called in response to a workflow CANCEL request, so this method doesn't invoke workflow itself.
*
* @param cmDoc
*/
public void cancelCashManagementDocument(CashManagementDocument cmDoc);
/**
* Finalizes the given CashManagementDocument, updating the status of the CashReceipt documents in the Deposits it contains and
* closing the CashDrawer associated with the given verification unit. Called in response to a workflow document status change,
* so this method doesn't invoke workflow itself.
*
* @param cmDoc
*/
public void finalizeCashManagementDocument(CashManagementDocument cmDoc);
/**
* Retrieves a CashManagementDocument instance associated with the cash receipt id provided.
*
* @param documentId The id of the cash receipt document associated with the cash management document.
* @return CashManagementDocument which contains the Deposit which contains the given CashReceipt, or null if the CashReceipt is
* not contained in a Deposit
*/
public CashManagementDocument getCashManagementDocumentForCashReceiptId(String documentId);
/**
* Returns a List of all CashReceipts associated with the given Deposit.
*
* @param deposit The deposit the cash receipts will be retrieved from.
* @return List the of CashReceipts associated with given deposit.
*/
public List retrieveCashReceipts(Deposit deposit);
/**
* Apply a cashiering transaction to a cash management document. This means:
* 0. check rules???
* 1. Updating the cash drawer with any incoming currency and coin
* 2. Moving any checks from the transaction to the CM document
* 3. Checking if any items in process were closed; if so, saving that info
* 4. Saving currency and coin records
* 5. Saving any new item in process
* 6. saving any checks
*
* @param cmDoc The transaction to apply to the cash management document.
* @param cashieringTransaction The transaction being applied to the cash management document.
*/
public void applyCashieringTransaction(CashManagementDocument cmDoc);
/**
* Retrieve the open cashiering items in process for the given cash management document.
*
* @param cmDoc The cash management document to retrieve the items in process for.
* @return A list of all open items in process.
*/
public List<CashieringItemInProcess> getOpenItemsInProcess(CashManagementDocument cmDoc);
/**
* Returns all items in process associated with this workgroup, closed within the past 30 days
*
* @param cmDoc The cash management document which is associated with the workgroup that the closed items in process would have also been associated with.
* @return A list of any items in process recently closed.
*/
public List<CashieringItemInProcess> getRecentlyClosedItemsInProcess(CashManagementDocument cmDoc);
/**
* Generates the master currency detail, which sounds bad, but which is really just okay.
* A master currency detail is the composite effect of all the transactions of a cash
* management document on a cash drawer.
*
* @param cmDoc The cash management document to generate the master record for.
* @return The master currency detail record. "Master" in the sense of "Platonic ideal" from which
* all else is a copy.
*/
public CurrencyDetail generateMasterCurrencyDetail(CashManagementDocument cmDoc);
/**
* This generates the "master" coin detail record - a composite of all the coin detail activity that occurred to the cash drawer.
*
* @param cmDoc The cash management document to generate the master record for.
* @return The master coin detail record. "Master" in the sense of "Platonic ideal" from which
* all else is a copy.
*/
public CoinDetail generateMasterCoinDetail(CashManagementDocument cmDoc);
/**
* Verifies if a given cash receipt is deposited as part of the given cash management document.
*
* @param cmDoc The cash management document to search through.
* @param crDoc The cash receipt to check the deposited status of.
* @return true If the given cash receipt document is deposited as part of the given cash management document, false if otherwise.
*/
public boolean verifyCashReceiptIsDeposited(CashManagementDocument cmDoc, CashReceiptDocument crDoc);
/**
* This method verifies that all cash receipts for the document are deposited.
*
* @param cmDoc The cash management document to verify.
* @return True if all CRs are deposited, false if otherwise.
*/
public boolean allVerifiedCashReceiptsAreDeposited(CashManagementDocument cmDoc);
/**
* This method turns the last interim deposit into the final deposit and locks the cash drawer.
*
* @param cmDoc The cash management document to take deposits from for finalization.
*/
public void finalizeLastInterimDeposit(CashManagementDocument cmDoc);
/**
* This method creates new cumulative currency and coin details for a document.
*
* @param cmDoc The cash management document the cumulative details will be associated with.
* @param cashieringSource The cashiering record source for the new details.
*/
public void createNewCashDetails(CashManagementDocument cmDoc, String cashieringSource);
/**
* Grab the currency and coin detail for final deposits.
*
* @param cmDoc The cash management document which has deposits to populate.
*/
public void populateCashDetailsForDeposit(CashManagementDocument cmDoc);
/**
* Retrieves from the database any undeposited cashiering transaction checks associated with the given cash management document.
*
* @param documentNumber The document number of a cash management document that cashiering transaction checks may be associated with.
* @return A list of checks associated with the document number given.
*/
public List<Check> selectUndepositedCashieringChecks(String documentNumber);
/**
* Retrieves from the database all deposited cashiering transaction checks associated with the given cash management document number.
*
* @param documentNumber The document number of a cash management document that cashiering transaction checks may be associated with.
* @return A list of deposited cashiering checks associated with the document number given.
*/
public List<Check> selectDepositedCashieringChecks(String documentNumber);
/**
* Retrieves from the database all cashiering transaction checks deposited for a given deposit.
*
* @param documentNumber The document number of a cash management document that cashiering transaction checks have been deposited for.
* @param depositLineNumber The line number of the deposit to find checks deposited for.
* @return A list of checks associated with the given deposit.
*/
public List<Check> selectCashieringChecksForDeposit(String documentNumber, Integer depositLineNumber);
/**
* Total up the amounts of all checks so far deposited as part of the given cash management document.
*
* @param documentNumber The id of a cash management document.
* @return The total of cashiering checks deposited so far as part of that document.
*/
public KualiDecimal calculateDepositedCheckTotal(String documentNumber);
/**
* Total up the amounts of all cashiering checks not yet deposited as part of the given cash management document.
*
* @param documentNumber The id of a cash management document.
* @return The total of cashiering checks not yet deposited as part of that document.
*/
public KualiDecimal calculateUndepositedCheckTotal(String documentNumber);
/**
* This method determines whether or not the given cash management document can be canceled.
*
* @param cmDoc The cash management document to be canceled.
* @return True if cancellation is possible, false if otherwise.
*/
public boolean allowDocumentCancellation(CashManagementDocument cmDoc);
/**
* Select the next available check line number for the given cash management document.
*
* @param documentNumber The document number of a cash management document.
* @return The next available check line number for cashiering checks.
*/
public Integer selectNextAvailableCheckLineNumber(String documentNumber);
/**
* This returns the currency and coin details for the final deposit, in a map keyed on the detail class
*
* This returns the currency and coin details for the final deposit, in a map keyed on the detail class.
*
* @param documentNumber The document number to find the final deposit cash details for.
* @return A map with the cash details in it.
*/
public Map<Class, Object> getCashDetailsForFinalDeposit(String documentNumber);
}