1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.kuali.kfs.fp.document;
20
21 import java.math.BigDecimal;
22
23 import org.kuali.kfs.coa.businessobject.IndirectCostRecoveryAccount;
24 import org.kuali.kfs.fp.document.validation.impl.IndirectCostAdjustmentDocumentRuleConstants;
25 import org.kuali.kfs.sys.KFSConstants;
26 import org.kuali.kfs.sys.businessobject.AccountingLine;
27 import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
28 import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
29 import org.kuali.kfs.sys.businessobject.TargetAccountingLine;
30 import org.kuali.kfs.sys.context.SpringContext;
31 import org.kuali.kfs.sys.document.AccountingDocumentBase;
32 import org.kuali.kfs.sys.document.AmountTotaling;
33 import org.kuali.kfs.sys.document.Correctable;
34 import org.kuali.kfs.sys.document.service.DebitDeterminerService;
35 import org.kuali.rice.core.api.util.type.KualiDecimal;
36 import org.kuali.rice.coreservice.framework.parameter.ParameterService;
37 import org.kuali.rice.krad.document.Copyable;
38 import org.kuali.rice.krad.exception.InfrastructureException;
39 import org.kuali.rice.krad.util.GlobalVariables;
40 import org.kuali.rice.krad.util.ObjectUtils;
41
42 public class IndirectCostAdjustmentDocument extends AccountingDocumentBase implements Copyable, Correctable, AmountTotaling {
43
44
45
46
47 public IndirectCostAdjustmentDocument() {
48 super();
49 }
50
51
52
53
54 @Override
55 public String getSourceAccountingLinesSectionTitle() {
56 return KFSConstants.GRANT;
57 }
58
59
60
61
62 @Override
63 public String getTargetAccountingLinesSectionTitle() {
64 return KFSConstants.ICR;
65 }
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 @Override
81 public void addSourceAccountingLine(SourceAccountingLine line) {
82
83 super.addSourceAccountingLine(line);
84
85 if (GlobalVariables.getMessageMap().hasNoMessages()) {
86 if (line != null && ObjectUtils.isNotNull(line.getAccount()) && line.getAccount().getActiveIndirectCostRecoveryAccounts() != null && line.getAccount().getActiveIndirectCostRecoveryAccounts().size() > 0) {
87 for (IndirectCostRecoveryAccount icrAccount : line.getAccount().getActiveIndirectCostRecoveryAccounts()) {
88
89 KualiDecimal percentDecimal = new KualiDecimal(icrAccount.getAccountLinePercent().divide(new BigDecimal(100)));
90
91
92 TargetAccountingLine targetAccountingLine = null;
93 try {
94 targetAccountingLine = (TargetAccountingLine) getTargetAccountingLineClass().newInstance();
95 }
96 catch (Exception e) {
97 throw new InfrastructureException("unable to create a target accounting line", e);
98 }
99
100 String objectCode = SpringContext.getBean(ParameterService.class).getParameterValueAsString(IndirectCostAdjustmentDocument.class, IndirectCostAdjustmentDocumentRuleConstants.RECEIPT_OBJECT_CODE);
101 targetAccountingLine.setFinancialObjectCode(objectCode);
102 targetAccountingLine.setAccountNumber(icrAccount.getIndirectCostRecoveryAccountNumber());
103 targetAccountingLine.setChartOfAccountsCode(icrAccount.getIndirectCostRecoveryFinCoaCode());
104 targetAccountingLine.setDocumentNumber(line.getDocumentNumber());
105 targetAccountingLine.setPostingYear(line.getPostingYear());
106 targetAccountingLine.setAmount(line.getAmount().multiply(percentDecimal));
107
108
109 targetAccountingLine.refresh();
110
111 addTargetAccountingLine(targetAccountingLine);
112 }
113 }
114 }
115 }
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 @Override
141 public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) throws IllegalStateException {
142 AccountingLine accountingLine = (AccountingLine)postable;
143 DebitDeterminerService isDebitUtils = SpringContext.getBean(DebitDeterminerService.class);
144 if (!(accountingLine.isSourceAccountingLine() && isDebitUtils.isExpense(accountingLine)) && !(accountingLine.isTargetAccountingLine() && isDebitUtils.isIncome(accountingLine))) {
145 throw new IllegalStateException(isDebitUtils.getDebitCalculationIllegalStateExceptionMessage());
146 }
147
148 return isDebitUtils.isDebitConsideringType(this, accountingLine);
149 }
150 }