/* * 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.module.bc.document.service; import java.util.List; import org.kuali.kfs.coa.businessobject.Account; import org.kuali.kfs.coa.businessobject.SubAccount; import org.kuali.kfs.module.bc.BCConstants.MonthSpreadDeleteType; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionAccountOrganizationHierarchy; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionHeader; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionMonthly; import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionGeneralLedger; import org.kuali.kfs.module.bc.businessobject.SalarySettingExpansion; import org.kuali.kfs.module.bc.document.BudgetConstructionDocument; import org.kuali.kfs.module.bc.document.web.struts.MonthlyBudgetForm; import org.kuali.rice.core.api.util.type.KualiInteger; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kim.api.identity.Person; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.exception.ValidationException; /** * This defines the methods a BudgetDocumentService must implement */ public interface BudgetDocumentService { /** * Gets a BudgetConstructionHeader by the candidate key instead of primary key * * @param chartOfAccountsCode * @param accountNumber * @param subAccountNumber * @param fiscalYear * @return */ public BudgetConstructionHeader getByCandidateKey(String chartOfAccountsCode, String accountNumber, String subAccountNumber, Integer fiscalYear); /** * Performs all actions needed to validate and save a Budget Construction document to the database and workflow. * * @param document * @return * @throws WorkflowException * @throws ValidationException */ public Document saveDocument(BudgetConstructionDocument budgetConstructionDocument) throws WorkflowException, ValidationException; /** * Performs all actions needed to validate and save a Budget Construction document to the database only. * * @param document * @return * @throws ValidationException */ public Document saveDocumentNoWorkflow(BudgetConstructionDocument budgetConstructionDocument) throws ValidationException; /** * Performs all actions needed to validate and save a Budget Construction document to the database only. Whether or not the * monthly RI check is performed during validation is controlled using doMonthRICheck. Passing in false is a case used by the * monthlySpread deletion functionality. No need to perform monthly RI check if the action is to remove all the records * * @param bcDoc * @param doMonthRICheck * @return * @throws ValidationException */ public Document saveDocumentNoWorkFlow(BudgetConstructionDocument bcDoc, MonthSpreadDeleteType monthSpreadDeleteType, boolean doMonthRICheck) throws ValidationException; /** * Saves a single BudgetConstructionMonthly row * * @param budgetConstructionMonthly */ public void saveMonthlyBudget(MonthlyBudgetForm monthlyBudgetForm, BudgetConstructionMonthly budgetConstructionMonthly); /** * Sets benefits calculation flags in Budget Construction Document associated with the monthly screen * * @param bcDoc * @param budgetConstructionMonthly * @param pbglChangeAmount */ public void callForBenefitsCalcIfNeeded(BudgetConstructionDocument bcDoc, BudgetConstructionMonthly budgetConstructionMonthly, KualiInteger pbglChangeAmount); /** * Checks if annual and/or monthly benefits need calculated and calls the associated calculation method * * @param bcDoc */ public void calculateBenefitsIfNeeded(BudgetConstructionDocument bcDoc); /** * Explicitly calls both the annual and monthly benefits calculation methods * * @param bcDoc */ public void calculateBenefits(BudgetConstructionDocument bcDoc); // /** // * Calculates annual benefits for a budget construction document using the persisted data currently stored in the database. // * // * @param bcDoc // */ // public void calculateAnnualBenefits(BudgetConstructionDocument bcDoc); // // /** // * Calculates the monthly benefits for a budget construction document using the persisted data currently stored in the // database. // * // * @param bcDoc // */ // public void calculateMonthlyBenefits(BudgetConstructionDocument bcDoc); /** * Gets the salary detail lines request sum for a budget document expenditure accounting line * * @param salaryDetailLine * @return */ public KualiInteger getPendingBudgetConstructionAppointmentFundingRequestSum(PendingBudgetConstructionGeneralLedger salaryDetailLine); public List<BudgetConstructionAccountOrganizationHierarchy> getPushPullLevelList(BudgetConstructionDocument bcDoc, Person u); /** * update the pending budget construction GL record assocating with the given appointment funding. If there exists any pbgl * record, a new one will be created and stored * * @param appointmentFunding the given appointment funding * @param updateAmount the amount that can be used to update the amounts of the pending budget construction GL record */ public void updatePendingBudgetGeneralLedger(PendingBudgetConstructionAppointmentFunding appointmentFunding, KualiInteger updateAmount); /** * update the pending budget construction GL plug record assocating with the given appointment funding. If there exists any pbgl * plug record, a new one will be created and stored * * @param appointmentFunding the given appointment funding * @param updateAmount the amount that can be used to update the amounts of the pending budget construction GL plug record */ public void updatePendingBudgetGeneralLedgerPlug(PendingBudgetConstructionAppointmentFunding appointmentFunding, KualiInteger updateAmount); /** * get the budget document with the information provided by the given appointment funding * * @param appointmentFunding the given appointment funding * @return the budget document with the information provided by the given appointment funding */ public BudgetConstructionHeader getBudgetConstructionHeader(PendingBudgetConstructionAppointmentFunding appointmentFunding); /** * get the budget document with the information provided by the given appointment funding * * @param appointmentFunding the given appointment funding * @return the budget document with the information provided by the given appointment funding */ public BudgetConstructionDocument getBudgetConstructionDocument(PendingBudgetConstructionAppointmentFunding appointmentFunding); /** * get the budget document with the information provided by the given salary setting expansion * * @param salarySettingExpansion * @return the budget document with the information provided by the given salary setting expansion */ public BudgetConstructionDocument getBudgetConstructionDocument(SalarySettingExpansion salarySettingExpansion); /** * determine whether the given document is budgetable * * @param bcHeader the given budget document * @return true if the given document is budgetable; otherwise, false */ public boolean isBudgetableDocument(BudgetConstructionHeader bcHeader); /** * determine whether the given document is budgetable skipping the wages allowed check * * @param bcHeader the given budget document * @return true if the given document is budgetable; otherwise, false */ public boolean isBudgetableDocumentNoWagesCheck(BudgetConstructionHeader bcHeader); /** * determine whether the given document is budgetable * * @param document the given budget document * @return true if the given document is budgetable; otherwise, false */ public boolean isBudgetableDocument(BudgetConstructionDocument document); /** * determine whether the given document is budgetable skipping the wages allowed check * * @param document the given budget document * @return true if the given document is budgetable; otherwise, false */ public boolean isBudgetableDocumentNoWagesCheck(BudgetConstructionDocument document); /** * determine whether the given appointment funding is associated with a budgetable document * * @param appointmentFunding the given appointment funding * @return true if the given appointment funding is associated with a budgetable document; otherwise, false */ public boolean isAssociatedWithBudgetableDocument(PendingBudgetConstructionAppointmentFunding appointmentFunding); /** * determine whether the given account is budgetable for the specified budget year * * @param budgetYear the specified budget year * @param account the given account * @param isWagesCheck whether or not to include the no wages check * @return true if the given account is budgetable for the specified budget year; otherwise, false */ public boolean isBudgetableAccount(Integer budgetYear, Account account, boolean isWagesCheck); /** * determine whether the given subaccount is budgetable * * @param subAccount the given subaccount * @param subAccountNumber the sub account number associated with the given sub account. If sub account is null, the number can * be empty or the default. * @return true if the given subaccount is budgetable; otherwise, false */ public boolean isBudgetableSubAccount(SubAccount subAccount, String subAccountNumber); /** * Determine if account reports exists for the key passed in. * * @param chartOfAccountsCode * @param accountNumber * @return */ public boolean isAccountReportsExist(String chartOfAccountsCode, String accountNumber); /** * retrieve all pending budget construction GL records associated with the given budget contruction header * * @param budgetConstructionHeader the budget construction header associated with the pending budget construction GL records to * be retrieved * @return all pending budget construction GL records associated with the given budget contruction header */ public List<PendingBudgetConstructionGeneralLedger> retrievePendingBudgetConstructionGeneralLedger(BudgetConstructionHeader budgetConstructionHeader); /** * Returns a list of Pending Budget GL rows from the DB for the BudgetConstructionDocument that are associated with Salary * Setting including any 2PLG rows. * * @param bcDocument * @return */ public List<PendingBudgetConstructionGeneralLedger> getPBGLSalarySettingRows(BudgetConstructionDocument bcDocument); /** * Adds or Updates a Pending Budget GL row to a BudgetConstruction document with the passed in Pending Budget GL object. Any * inserts are added in the proper order in the list based on object code, sub-object code sort order * * @param bcDoc * @param sourceRow * @param isRevenue * @return */ public BudgetConstructionDocument addOrUpdatePBGLRow(BudgetConstructionDocument bcDoc, PendingBudgetConstructionGeneralLedger sourceRow, boolean isRevenue); /** * Adds or updates the 2PLG row in a BudgetConstructionDocument adding the updateAmount into any existing request amount * * @param bcDoc * @param updateAmount * @return */ public PendingBudgetConstructionGeneralLedger updatePendingBudgetGeneralLedgerPlug(BudgetConstructionDocument bcDoc, KualiInteger updateAmount); /** * Performs Budgetconstructiondocument validation as if saving, but does not perform the actual save. This is used to * immediately give feedback to the user when returning from Salary Setting in the event there are Monthly RI issues. * * @param document * @throws ValidationException */ public void validateDocument(Document document) throws ValidationException; /** * Populates references for a given Pending Budget GL row. * * @param line */ public void populatePBGLLine(PendingBudgetConstructionGeneralLedger line); /** * Retrieves the Account Organization Hierarchy for the primary key passed in. If not found, it attempts to build the hierarchy * and return that. Unsuccessful builds are caused by either overflows (cycles in the reports to structure) or a missing account * reports to mapping. In these cases an empty hierarchy list is returned. * * @param universityFiscalYear * @param chartOfAccountsCode * @param accountNumber * @return */ public List<BudgetConstructionAccountOrganizationHierarchy> retrieveOrBuildAccountOrganizationHierarchy(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber); /** * Persists a brand new (blank) Budget Construction Document and prepares it to accept revenue/expenditure lines. * * @param budgetConstructionDocument * @return * @throws WorkflowException */ public BudgetConstructionDocument instantiateNewBudgetConstructionDocument(BudgetConstructionDocument budgetConstructionDocument) throws WorkflowException; /** * Returns a list of labor objects that are Salary Setting detail related * * @param universityFiscalYear * @param chartOfAccountsCode * @return */ public List<String> getDetailSalarySettingLaborObjects(Integer universityFiscalYear, String chartOfAccountsCode); }