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.module.ld.document.service.impl; 017 018 import java.sql.Date; 019 020 import org.apache.commons.lang.StringUtils; 021 import org.kuali.kfs.coa.businessobject.ObjectCode; 022 import org.kuali.kfs.coa.service.ObjectCodeService; 023 import org.kuali.kfs.fp.document.YearEndDocument; 024 import org.kuali.kfs.fp.document.service.YearEndPendingEntryService; 025 import org.kuali.kfs.module.ld.LaborConstants; 026 import org.kuali.kfs.module.ld.businessobject.BenefitsCalculation; 027 import org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine; 028 import org.kuali.kfs.module.ld.businessobject.LaborLedgerPendingEntry; 029 import org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument; 030 import org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService; 031 import org.kuali.kfs.module.ld.service.LaborBenefitsCalculationService; 032 import org.kuali.kfs.module.ld.util.DebitCreditUtil; 033 import org.kuali.kfs.sys.KFSConstants; 034 import org.kuali.kfs.sys.KFSPropertyConstants; 035 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper; 036 import org.kuali.kfs.sys.service.HomeOriginationService; 037 import org.kuali.kfs.sys.service.OptionsService; 038 import org.kuali.rice.kns.bo.DocumentHeader; 039 import org.kuali.rice.kns.service.DataDictionaryService; 040 import org.kuali.rice.kns.service.DateTimeService; 041 import org.kuali.rice.kns.util.KualiDecimal; 042 043 /** 044 * Default implementation of the LaborPendingEntryConverterService 045 */ 046 public class LaborPendingEntryConverterServiceImpl implements LaborPendingEntryConverterService { 047 protected HomeOriginationService homeOriginationService; 048 protected LaborBenefitsCalculationService laborBenefitsCalculationService; 049 protected OptionsService optionsService; 050 protected ObjectCodeService objectCodeService; 051 protected DataDictionaryService dataDictionaryService; 052 protected DateTimeService dateTimeService; 053 protected YearEndPendingEntryService yearEndPendingEntryService; 054 055 /** 056 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getBenefitA21PendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper, org.kuali.rice.kns.util.KualiDecimal, java.lang.String) 057 */ 058 public LaborLedgerPendingEntry getBenefitA21PendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, KualiDecimal benefitAmount, String fringeBenefitObjectCode) { 059 LaborLedgerPendingEntry pendingEntry = getBenefitPendingEntry(document, accountingLine, sequenceHelper, benefitAmount, fringeBenefitObjectCode); 060 061 pendingEntry.setFinancialBalanceTypeCode(KFSConstants.BALANCE_TYPE_A21); 062 String debitCreditCode = DebitCreditUtil.getReverseDebitCreditCode(pendingEntry.getTransactionDebitCreditCode()); 063 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 064 065 return pendingEntry; 066 } 067 068 /** 069 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getBenefitA21ReversalPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper, org.kuali.rice.kns.util.KualiDecimal, java.lang.String) 070 */ 071 public LaborLedgerPendingEntry getBenefitA21ReversalPendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, KualiDecimal benefitAmount, String fringeBenefitObjectCode) { 072 LaborLedgerPendingEntry pendingEntry = getBenefitA21PendingEntry(document, accountingLine, sequenceHelper, benefitAmount, fringeBenefitObjectCode); 073 074 pendingEntry.setUniversityFiscalYear(accountingLine.getPayrollEndDateFiscalYear()); 075 pendingEntry.setUniversityFiscalPeriodCode(accountingLine.getPayrollEndDateFiscalPeriodCode()); 076 077 String debitCreditCode = DebitCreditUtil.getReverseDebitCreditCode(pendingEntry.getTransactionDebitCreditCode()); 078 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 079 080 return pendingEntry; 081 } 082 083 /** 084 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getBenefitClearingPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper, java.lang.String, java.lang.String, java.lang.String, org.kuali.rice.kns.util.KualiDecimal) 085 */ 086 public LaborLedgerPendingEntry getBenefitClearingPendingEntry(LaborLedgerPostingDocument document, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, String accountNumber, String chartOfAccountsCode, String benefitTypeCode, KualiDecimal clearingAmount) { 087 LaborLedgerPendingEntry pendingEntry = getDefaultPendingEntry(document); 088 089 pendingEntry.setChartOfAccountsCode(chartOfAccountsCode); 090 pendingEntry.setAccountNumber(accountNumber); 091 pendingEntry.setSubAccountNumber(KFSConstants.getDashSubAccountNumber()); 092 pendingEntry.setFinancialBalanceTypeCode(KFSConstants.BALANCE_TYPE_ACTUAL); 093 094 Integer fiscalYear = getOptionsService().getCurrentYearOptions().getUniversityFiscalYear(); 095 BenefitsCalculation benefitsCalculation = getLaborBenefitsCalculationService().getBenefitsCalculation(fiscalYear, chartOfAccountsCode, benefitTypeCode); 096 String objectCode = benefitsCalculation.getPositionFringeBenefitObjectCode(); 097 pendingEntry.setFinancialObjectCode(objectCode); 098 099 ObjectCode oc = getObjectCodeService().getByPrimaryId(fiscalYear, chartOfAccountsCode, objectCode); 100 pendingEntry.setFinancialObjectTypeCode(oc.getFinancialObjectTypeCode()); 101 102 pendingEntry.setFinancialSubObjectCode(KFSConstants.getDashFinancialSubObjectCode()); 103 pendingEntry.setTransactionLedgerEntrySequenceNumber(getNextSequenceNumber(sequenceHelper)); 104 105 String debitCreditCode = DebitCreditUtil.getDebitCreditCode(clearingAmount, false); 106 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 107 pendingEntry.setTransactionLedgerEntryAmount(clearingAmount.abs()); 108 109 pendingEntry.setProjectCode(KFSConstants.getDashProjectCode()); 110 pendingEntry.setPositionNumber(LaborConstants.getDashPositionNumber()); 111 pendingEntry.setEmplid(LaborConstants.getDashEmplId()); 112 pendingEntry.setTransactionTotalHours(null); 113 114 overrideEntryForYearEndIfNecessary(document, pendingEntry); 115 116 return pendingEntry; 117 } 118 119 /** 120 * Updates the given LLPE for year end documents 121 * @param document the document to check if it is YearEnd 122 * @param pendingEntry the pending entry to update 123 */ 124 protected void overrideEntryForYearEndIfNecessary(LaborLedgerPostingDocument document, LaborLedgerPendingEntry pendingEntry) { 125 // year end document should post to previous fiscal year and final period 126 if (document instanceof YearEndDocument) { 127 pendingEntry.setUniversityFiscalYear(getYearEndPendingEntryService().getPreviousFiscalYear()); 128 pendingEntry.setUniversityFiscalPeriodCode(getYearEndPendingEntryService().getFinalAccountingPeriod()); 129 } 130 } 131 132 /** 133 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getBenefitPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper, org.kuali.rice.kns.util.KualiDecimal, java.lang.String) 134 */ 135 public LaborLedgerPendingEntry getBenefitPendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper, KualiDecimal benefitAmount, String fringeBenefitObjectCode) { 136 LaborLedgerPendingEntry pendingEntry = getDefaultPendingEntry(document, accountingLine); 137 138 // if account doesn't accept fringe charges, use reports to account 139 if (!accountingLine.getAccount().isAccountsFringesBnftIndicator()) { 140 pendingEntry.setChartOfAccountsCode(accountingLine.getAccount().getReportsToChartOfAccountsCode()); 141 pendingEntry.setAccountNumber(accountingLine.getAccount().getReportsToAccountNumber()); 142 } 143 144 pendingEntry.setFinancialBalanceTypeCode(KFSConstants.BALANCE_TYPE_ACTUAL); 145 pendingEntry.setFinancialObjectCode(pickValue(fringeBenefitObjectCode, KFSConstants.getDashFinancialObjectCode())); 146 147 ObjectCode fringeObjectCode = getObjectCodeService().getByPrimaryId(accountingLine.getPayrollEndDateFiscalYear(), accountingLine.getChartOfAccountsCode(), fringeBenefitObjectCode); 148 pendingEntry.setFinancialObjectTypeCode(fringeObjectCode.getFinancialObjectTypeCode()); 149 150 pendingEntry.setFinancialSubObjectCode(KFSConstants.getDashFinancialSubObjectCode()); 151 pendingEntry.setTransactionLedgerEntryAmount(benefitAmount.abs()); 152 pendingEntry.setPositionNumber(LaborConstants.getDashPositionNumber()); 153 pendingEntry.setEmplid(LaborConstants.getDashEmplId()); 154 pendingEntry.setTransactionLedgerEntrySequenceNumber(getNextSequenceNumber(sequenceHelper)); 155 156 // year end document should post to previous fiscal year and final period 157 overrideEntryForYearEndIfNecessary(document, pendingEntry); 158 159 return pendingEntry; 160 } 161 162 /** 163 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getDefaultPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine) 164 */ 165 public LaborLedgerPendingEntry getDefaultPendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine) { 166 LaborLedgerPendingEntry pendingEntry = getDefaultPendingEntry(document); 167 168 pendingEntry.setChartOfAccountsCode(accountingLine.getChartOfAccountsCode()); 169 pendingEntry.setAccountNumber(accountingLine.getAccountNumber()); 170 pendingEntry.setFinancialObjectCode(accountingLine.getFinancialObjectCode()); 171 172 String subAccountNumber = pickValue(accountingLine.getSubAccountNumber(), KFSConstants.getDashSubAccountNumber()); 173 pendingEntry.setSubAccountNumber(subAccountNumber); 174 175 String subObjectCode = pickValue(accountingLine.getFinancialSubObjectCode(), KFSConstants.getDashFinancialSubObjectCode()); 176 pendingEntry.setFinancialSubObjectCode(subObjectCode); 177 178 String projectCode = pickValue(accountingLine.getProjectCode(), KFSConstants.getDashProjectCode()); 179 pendingEntry.setProjectCode(projectCode); 180 181 accountingLine.refreshReferenceObject(KFSPropertyConstants.OBJECT_CODE); 182 String objectTypeCode = accountingLine.getObjectCode().getFinancialObjectTypeCode(); 183 pendingEntry.setFinancialObjectTypeCode(objectTypeCode); 184 185 KualiDecimal transactionAmount = accountingLine.getAmount(); 186 String debitCreditCode = DebitCreditUtil.getDebitCreditCodeForExpenseDocument(accountingLine); 187 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 188 pendingEntry.setTransactionLedgerEntryAmount(transactionAmount.abs()); 189 190 pendingEntry.setPositionNumber(accountingLine.getPositionNumber()); 191 pendingEntry.setEmplid(accountingLine.getEmplid()); 192 pendingEntry.setPayrollEndDateFiscalYear(accountingLine.getPayrollEndDateFiscalYear()); 193 pendingEntry.setPayrollEndDateFiscalPeriodCode(accountingLine.getPayrollEndDateFiscalPeriodCode()); 194 pendingEntry.setTransactionTotalHours(accountingLine.getPayrollTotalHours()); 195 pendingEntry.setOrganizationReferenceId(accountingLine.getOrganizationReferenceId()); 196 197 return pendingEntry; 198 } 199 200 /** 201 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getDefaultPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument) 202 */ 203 public LaborLedgerPendingEntry getDefaultPendingEntry(LaborLedgerPostingDocument document) { 204 LaborLedgerPendingEntry pendingEntry = getSimpleDefaultPendingEntry(); 205 DocumentHeader documentHeader = document.getDocumentHeader(); 206 207 String documentTypeCode = getDataDictionaryService().getDocumentTypeNameByClass(document.getClass()); 208 pendingEntry.setFinancialDocumentTypeCode(documentTypeCode); 209 210 pendingEntry.setDocumentNumber(documentHeader.getDocumentNumber()); 211 pendingEntry.setTransactionLedgerEntryDescription(documentHeader.getDocumentDescription()); 212 pendingEntry.setOrganizationDocumentNumber(documentHeader.getOrganizationDocumentNumber()); 213 214 return pendingEntry; 215 } 216 217 /** 218 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getExpenseA21PendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper) 219 */ 220 public LaborLedgerPendingEntry getExpenseA21PendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) { 221 LaborLedgerPendingEntry pendingEntry = getExpensePendingEntry(document, accountingLine, sequenceHelper); 222 223 pendingEntry.setFinancialBalanceTypeCode(KFSConstants.BALANCE_TYPE_A21); 224 String debitCreditCode = DebitCreditUtil.getReverseDebitCreditCode(pendingEntry.getTransactionDebitCreditCode()); 225 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 226 227 return pendingEntry; 228 } 229 230 /** 231 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getExpenseA21ReversalPendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper) 232 */ 233 public LaborLedgerPendingEntry getExpenseA21ReversalPendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) { 234 LaborLedgerPendingEntry pendingEntry = getExpenseA21PendingEntry(document, accountingLine, sequenceHelper); 235 236 pendingEntry.setUniversityFiscalYear(accountingLine.getPayrollEndDateFiscalYear()); 237 pendingEntry.setUniversityFiscalPeriodCode(accountingLine.getPayrollEndDateFiscalPeriodCode()); 238 239 String debitCreditCode = DebitCreditUtil.getReverseDebitCreditCode(pendingEntry.getTransactionDebitCreditCode()); 240 pendingEntry.setTransactionDebitCreditCode(debitCreditCode); 241 242 return pendingEntry; 243 } 244 245 /** 246 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getExpensePendingEntry(org.kuali.kfs.module.ld.document.LaborLedgerPostingDocument, org.kuali.kfs.module.ld.businessobject.ExpenseTransferAccountingLine, org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper) 247 */ 248 public LaborLedgerPendingEntry getExpensePendingEntry(LaborLedgerPostingDocument document, ExpenseTransferAccountingLine accountingLine, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) { 249 LaborLedgerPendingEntry pendingEntry = getDefaultPendingEntry(document, accountingLine); 250 251 pendingEntry.setFinancialBalanceTypeCode(KFSConstants.BALANCE_TYPE_ACTUAL); 252 pendingEntry.setTransactionLedgerEntrySequenceNumber(getNextSequenceNumber(sequenceHelper)); 253 254 // year end document should post to previous fiscal year and final period 255 overrideEntryForYearEndIfNecessary(document, pendingEntry); 256 257 return pendingEntry; 258 } 259 260 /** 261 * @see org.kuali.kfs.module.ld.document.service.LaborPendingEntryConverterService#getSimpleDefaultPendingEntry() 262 */ 263 public LaborLedgerPendingEntry getSimpleDefaultPendingEntry() { 264 LaborLedgerPendingEntry pendingEntry = new LaborLedgerPendingEntry(); 265 266 pendingEntry.setUniversityFiscalYear(null); 267 pendingEntry.setUniversityFiscalPeriodCode(null); 268 269 String originationCode = getHomeOriginationService().getHomeOrigination().getFinSystemHomeOriginationCode(); 270 pendingEntry.setFinancialSystemOriginationCode(originationCode); 271 272 Date transactionDate = getDateTimeService().getCurrentSqlDate(); 273 pendingEntry.setTransactionDate(transactionDate); 274 275 pendingEntry.setFinancialDocumentReversalDate(null); 276 pendingEntry.setReferenceFinancialSystemOriginationCode(null); 277 pendingEntry.setReferenceFinancialDocumentNumber(null); 278 pendingEntry.setReferenceFinancialDocumentTypeCode(null); 279 280 return pendingEntry; 281 } 282 283 /** 284 * Pick one from target and backup values based on the availability of target value 285 * 286 * @param targetValue the given target value 287 * @param backupValue the backup value of the target value 288 * @return target value if it is not null; otherwise, return its backup 289 */ 290 protected String pickValue(String targetValue, String backupValue) { 291 return StringUtils.isNotBlank(targetValue) ? targetValue : backupValue; 292 } 293 294 /** 295 * This method gets the next sequence number and increments. 296 * 297 * @param sequenceHelper the given sequence helper 298 * @return the next sequence number and increments 299 */ 300 protected Integer getNextSequenceNumber(GeneralLedgerPendingEntrySequenceHelper sequenceHelper) { 301 Integer nextSequenceNumber = sequenceHelper.getSequenceCounter(); 302 sequenceHelper.increment(); 303 304 return nextSequenceNumber; 305 } 306 307 public HomeOriginationService getHomeOriginationService() { 308 return homeOriginationService; 309 } 310 311 public void setHomeOriginationService(HomeOriginationService homeOriginationService) { 312 this.homeOriginationService = homeOriginationService; 313 } 314 315 public LaborBenefitsCalculationService getLaborBenefitsCalculationService() { 316 return laborBenefitsCalculationService; 317 } 318 319 public void setLaborBenefitsCalculationService(LaborBenefitsCalculationService laborBenefitsCalculationService) { 320 this.laborBenefitsCalculationService = laborBenefitsCalculationService; 321 } 322 323 public OptionsService getOptionsService() { 324 return optionsService; 325 } 326 327 public void setOptionsService(OptionsService optionsService) { 328 this.optionsService = optionsService; 329 } 330 331 public ObjectCodeService getObjectCodeService() { 332 return objectCodeService; 333 } 334 335 public void setObjectCodeService(ObjectCodeService objectCodeService) { 336 this.objectCodeService = objectCodeService; 337 } 338 339 public DataDictionaryService getDataDictionaryService() { 340 return dataDictionaryService; 341 } 342 343 public void setDataDictionaryService(DataDictionaryService dataDictionaryService) { 344 this.dataDictionaryService = dataDictionaryService; 345 } 346 347 public DateTimeService getDateTimeService() { 348 return dateTimeService; 349 } 350 351 public void setDateTimeService(DateTimeService dateTimeService) { 352 this.dateTimeService = dateTimeService; 353 } 354 355 public YearEndPendingEntryService getYearEndPendingEntryService() { 356 return yearEndPendingEntryService; 357 } 358 359 public void setYearEndPendingEntryService(YearEndPendingEntryService yearEndPendingEntryService) { 360 this.yearEndPendingEntryService = yearEndPendingEntryService; 361 } 362 363 }