1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.gl.batch.service.impl;
20
21 import java.util.Collection;
22 import java.util.Date;
23 import java.util.Iterator;
24
25 import org.kuali.kfs.gl.GeneralLedgerConstants;
26 import org.kuali.kfs.gl.batch.service.AccountBalanceCalculator;
27 import org.kuali.kfs.gl.batch.service.AccountingCycleCachingService;
28 import org.kuali.kfs.gl.batch.service.PostTransaction;
29 import org.kuali.kfs.gl.businessobject.AccountBalance;
30 import org.kuali.kfs.gl.businessobject.Transaction;
31 import org.kuali.kfs.sys.KFSConstants;
32 import org.kuali.kfs.sys.service.ReportWriterService;
33 import org.kuali.rice.krad.service.PersistenceStructureService;
34 import org.springframework.transaction.annotation.Transactional;
35
36 @Transactional
37 public class PostAccountBalance implements PostTransaction, AccountBalanceCalculator {
38 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PostAccountBalance.class);
39
40 private AccountingCycleCachingService accountingCycleCachingService;
41 private PersistenceStructureService persistenceStructureService;
42
43
44
45
46 public PostAccountBalance() {
47 super();
48 }
49
50
51
52
53
54
55
56
57
58
59
60 public String post(Transaction t, int mode, Date postDate, ReportWriterService posterReportWriterService) {
61 LOG.debug("post() started");
62
63
64
65
66 if ((t.getFinancialBalanceTypeCode().equals(t.getOption().getActualFinancialBalanceTypeCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getBudgetCheckingBalanceTypeCd())) || (t.getFinancialBalanceTypeCode().equals(t.getOption().getExtrnlEncumFinBalanceTypCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getIntrnlEncumFinBalanceTypCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getPreencumbranceFinBalTypeCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getCostShareEncumbranceBalanceTypeCd())) && (!t.getFinancialObjectTypeCode().equals(t.getOption().getFinObjectTypeFundBalanceCd()))) {
67
68 String returnCode = GeneralLedgerConstants.UPDATE_CODE;
69
70
71 AccountBalance ab = accountingCycleCachingService.getAccountBalance(t);
72
73 if (ab == null) {
74 returnCode = GeneralLedgerConstants.INSERT_CODE;
75 ab = new AccountBalance(t);
76 }
77
78 ab.setTimestamp(new java.sql.Date(postDate.getTime()));
79
80 if (!updateAccountBalanceReturn(t, ab)) {
81 return GeneralLedgerConstants.EMPTY_CODE;
82 }
83
84 if (returnCode.equals(GeneralLedgerConstants.INSERT_CODE)) {
85 accountingCycleCachingService.insertAccountBalance(ab);
86 } else {
87 accountingCycleCachingService.updateAccountBalance(ab);
88 }
89
90 return returnCode;
91 }
92 else {
93 return GeneralLedgerConstants.EMPTY_CODE;
94 }
95 }
96
97 public AccountBalance findAccountBalance(Collection balanceList, Transaction t) {
98
99
100 for (Iterator iter = balanceList.iterator(); iter.hasNext();) {
101 AccountBalance b = (AccountBalance) iter.next();
102
103 if (b.getUniversityFiscalYear().equals(t.getUniversityFiscalYear()) && b.getChartOfAccountsCode().equals(t.getChartOfAccountsCode()) && b.getAccountNumber().equals(t.getAccountNumber()) && b.getSubAccountNumber().equals(t.getSubAccountNumber()) && b.getObjectCode().equals(t.getFinancialObjectCode()) && b.getSubObjectCode().equals(t.getFinancialSubObjectCode())) {
104 return b;
105 }
106 }
107
108
109 AccountBalance b = new AccountBalance(t);
110 balanceList.add(b);
111
112 return b;
113 }
114
115 protected boolean updateAccountBalanceReturn(Transaction t, AccountBalance ab) {
116 if (t.getFinancialBalanceTypeCode().equals(t.getOption().getBudgetCheckingBalanceTypeCd())) {
117 ab.setCurrentBudgetLineBalanceAmount(ab.getCurrentBudgetLineBalanceAmount().add(t.getTransactionLedgerEntryAmount()));
118 }
119 else if (t.getFinancialBalanceTypeCode().equals(t.getOption().getActualFinancialBalanceTypeCd())) {
120 if (t.getObjectType().getFinObjectTypeDebitcreditCd().equals(t.getTransactionDebitCreditCode()) || ((!t.getBalanceType().isFinancialOffsetGenerationIndicator()) && KFSConstants.GL_BUDGET_CODE.equals(t.getTransactionDebitCreditCode()))) {
121 ab.setAccountLineActualsBalanceAmount(ab.getAccountLineActualsBalanceAmount().add(t.getTransactionLedgerEntryAmount()));
122 }
123 else {
124 ab.setAccountLineActualsBalanceAmount(ab.getAccountLineActualsBalanceAmount().subtract(t.getTransactionLedgerEntryAmount()));
125 }
126 }
127 else if (t.getFinancialBalanceTypeCode().equals(t.getOption().getExtrnlEncumFinBalanceTypCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getIntrnlEncumFinBalanceTypCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getPreencumbranceFinBalTypeCd()) || t.getFinancialBalanceTypeCode().equals(t.getOption().getCostShareEncumbranceBalanceTypeCd())) {
128 if (t.getObjectType().getFinObjectTypeDebitcreditCd().equals(t.getTransactionDebitCreditCode()) || ((!t.getBalanceType().isFinancialOffsetGenerationIndicator()) && KFSConstants.GL_BUDGET_CODE.equals(t.getTransactionDebitCreditCode()))) {
129 ab.setAccountLineEncumbranceBalanceAmount(ab.getAccountLineEncumbranceBalanceAmount().add(t.getTransactionLedgerEntryAmount()));
130 }
131 else {
132 ab.setAccountLineEncumbranceBalanceAmount(ab.getAccountLineEncumbranceBalanceAmount().subtract(t.getTransactionLedgerEntryAmount()));
133 }
134 }
135 else {
136 return false;
137 }
138 return true;
139 }
140
141
142
143
144
145 public void updateAccountBalance(Transaction t, AccountBalance ab) {
146 updateAccountBalanceReturn(t, ab);
147 }
148
149 public String getDestinationName() {
150 return persistenceStructureService.getTableName(AccountBalance.class);
151 }
152
153 public void setAccountingCycleCachingService(AccountingCycleCachingService accountingCycleCachingService) {
154 this.accountingCycleCachingService = accountingCycleCachingService;
155 }
156
157 public void setPersistenceStructureService(PersistenceStructureService persistenceStructureService) {
158 this.persistenceStructureService = persistenceStructureService;
159 }
160 }