1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  package org.kuali.ole.pdp.service.impl;
21  
22  import java.sql.Date;
23  import java.util.ArrayList;
24  import java.util.Iterator;
25  import java.util.List;
26  
27  import org.apache.commons.lang.StringUtils;
28  import org.kuali.ole.coa.businessobject.AccountingPeriod;
29  import org.kuali.ole.coa.businessobject.OffsetDefinition;
30  import org.kuali.ole.coa.service.AccountingPeriodService;
31  import org.kuali.ole.coa.service.OffsetDefinitionService;
32  import org.kuali.ole.pdp.PdpConstants;
33  import org.kuali.ole.pdp.businessobject.GlPendingTransaction;
34  import org.kuali.ole.pdp.businessobject.PaymentAccountDetail;
35  import org.kuali.ole.pdp.businessobject.PaymentDetail;
36  import org.kuali.ole.pdp.businessobject.PaymentGroup;
37  import org.kuali.ole.pdp.dataaccess.PendingTransactionDao;
38  import org.kuali.ole.pdp.service.PendingTransactionService;
39  import org.kuali.ole.sys.OLEConstants;
40  import org.kuali.ole.sys.OLEKeyConstants;
41  import org.kuali.ole.sys.businessobject.Bank;
42  import org.kuali.ole.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
43  import org.kuali.ole.sys.context.SpringContext;
44  import org.kuali.ole.sys.service.BankService;
45  import org.kuali.ole.sys.service.FlexibleOffsetAccountService;
46  import org.kuali.rice.core.api.config.property.ConfigurationService;
47  import org.kuali.rice.core.api.datetime.DateTimeService;
48  import org.kuali.rice.core.api.util.type.KualiInteger;
49  import org.kuali.rice.krad.service.BusinessObjectService;
50  import org.springframework.transaction.annotation.Transactional;
51  
52  
53  
54  
55  @Transactional
56  public class PendingTransactionServiceImpl implements PendingTransactionService {
57      private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PendingTransactionServiceImpl.class);
58  
59      protected static String FDOC_TYP_CD_PROCESS_ACH = "ACHD";
60      protected static String FDOC_TYP_CD_PROCESS_CHECK = "CHKD";
61      protected static String FDOC_TYP_CD_CANCEL_REISSUE_ACH = "ACHR";
62      protected static String FDOC_TYP_CD_CANCEL_REISSUE_CHECK = "CHKR";
63      protected static String FDOC_TYP_CD_CANCEL_ACH = "ACHC";
64      protected static String FDOC_TYP_CD_CANCEL_CHECK = "CHKC";
65  
66      private PendingTransactionDao glPendingTransactionDao;
67      private AccountingPeriodService accountingPeriodService;
68      private DateTimeService dateTimeService;
69      private ConfigurationService kualiConfigurationService;
70      private BusinessObjectService businessObjectService;
71      private BankService bankService;
72  
73      public PendingTransactionServiceImpl() {
74          super();
75      }
76  
77      
78  
79  
80      public void generatePaymentGeneralLedgerPendingEntry(PaymentGroup paymentGroup) {
81          this.populatePaymentGeneralLedgerPendingEntry(paymentGroup, FDOC_TYP_CD_PROCESS_ACH, FDOC_TYP_CD_PROCESS_CHECK, false);
82      }
83  
84      
85  
86  
87      public void generateCancellationGeneralLedgerPendingEntry(PaymentGroup paymentGroup) {
88          this.populatePaymentGeneralLedgerPendingEntry(paymentGroup, FDOC_TYP_CD_CANCEL_ACH, FDOC_TYP_CD_CANCEL_CHECK, true);
89      }
90  
91      
92  
93  
94      public void generateReissueGeneralLedgerPendingEntry(PaymentGroup paymentGroup) {
95          this.populatePaymentGeneralLedgerPendingEntry(paymentGroup, FDOC_TYP_CD_CANCEL_REISSUE_ACH, FDOC_TYP_CD_CANCEL_REISSUE_CHECK, true);
96      }
97  
98      
99  
100 
101 
102 
103 
104 
105 
106     protected void populatePaymentGeneralLedgerPendingEntry(PaymentGroup paymentGroup, String achFdocTypeCode, String checkFdocTypeCod, boolean reversal) {
107         List<PaymentAccountDetail> accountListings = new ArrayList<PaymentAccountDetail>();
108         for (PaymentDetail paymentDetail : paymentGroup.getPaymentDetails()) {
109             accountListings.addAll(paymentDetail.getAccountDetail());
110         }
111 
112         GeneralLedgerPendingEntrySequenceHelper sequenceHelper = new GeneralLedgerPendingEntrySequenceHelper();
113         for (PaymentAccountDetail paymentAccountDetail : accountListings) {
114             GlPendingTransaction glPendingTransaction = new GlPendingTransaction();
115             glPendingTransaction.setSequenceNbr(new KualiInteger(sequenceHelper.getSequenceCounter()));
116 
117             if (StringUtils.isNotBlank(paymentAccountDetail.getPaymentDetail().getFinancialSystemOriginCode()) && StringUtils.isNotBlank(paymentAccountDetail.getPaymentDetail().getFinancialDocumentTypeCode())) {
118                 glPendingTransaction.setFdocRefTypCd(paymentAccountDetail.getPaymentDetail().getFinancialDocumentTypeCode());
119                 glPendingTransaction.setFsRefOriginCd(paymentAccountDetail.getPaymentDetail().getFinancialSystemOriginCode());
120             }
121             else {
122                 glPendingTransaction.setFdocRefTypCd(PdpConstants.PDP_FDOC_TYPE_CODE);
123                 glPendingTransaction.setFsRefOriginCd(PdpConstants.PDP_FDOC_ORIGIN_CODE);
124             }
125 
126             glPendingTransaction.setFinancialBalanceTypeCode(OLEConstants.BALANCE_TYPE_ACTUAL);
127 
128             Date transactionTimestamp = new Date(dateTimeService.getCurrentDate().getTime());
129             glPendingTransaction.setTransactionDt(transactionTimestamp);
130             AccountingPeriod fiscalPeriod = accountingPeriodService.getByDate(new java.sql.Date(transactionTimestamp.getTime()));
131             glPendingTransaction.setUniversityFiscalYear(fiscalPeriod.getUniversityFiscalYear());
132             glPendingTransaction.setUnivFiscalPrdCd(fiscalPeriod.getUniversityFiscalPeriodCode());
133 
134             glPendingTransaction.setAccountNumber(paymentAccountDetail.getAccountNbr());
135             glPendingTransaction.setSubAccountNumber(paymentAccountDetail.getSubAccountNbr());
136             glPendingTransaction.setChartOfAccountsCode(paymentAccountDetail.getFinChartCode());
137 
138             if (paymentGroup.getDisbursementType().getCode().equals(PdpConstants.DisbursementTypeCodes.ACH)) {
139                 glPendingTransaction.setFinancialDocumentTypeCode(achFdocTypeCode);
140             }
141             else if (paymentGroup.getDisbursementType().getCode().equals(PdpConstants.DisbursementTypeCodes.CHECK)) {
142                 glPendingTransaction.setFinancialDocumentTypeCode(checkFdocTypeCod);
143             }
144 
145             glPendingTransaction.setFsOriginCd(PdpConstants.PDP_FDOC_ORIGIN_CODE);
146             glPendingTransaction.setFdocNbr(paymentGroup.getDisbursementNbr().toString());
147 
148             Boolean relieveLiabilities = paymentGroup.getBatch().getCustomerProfile().getRelieveLiabilities();
149             if ((relieveLiabilities != null) && (relieveLiabilities.booleanValue()) && paymentAccountDetail.getPaymentDetail().getFinancialDocumentTypeCode() != null) {
150                 OffsetDefinition offsetDefinition = SpringContext.getBean(OffsetDefinitionService.class).getByPrimaryId(glPendingTransaction.getUniversityFiscalYear(), glPendingTransaction.getChartOfAccountsCode(), paymentAccountDetail.getPaymentDetail().getFinancialDocumentTypeCode(), glPendingTransaction.getFinancialBalanceTypeCode());
151                 glPendingTransaction.setFinancialObjectCode(offsetDefinition != null ? offsetDefinition.getFinancialObjectCode() : paymentAccountDetail.getFinObjectCode());
152                 glPendingTransaction.setFinancialSubObjectCode(OLEConstants.getDashFinancialSubObjectCode());
153             }
154             else {
155                 glPendingTransaction.setFinancialObjectCode(paymentAccountDetail.getFinObjectCode());
156                 glPendingTransaction.setFinancialSubObjectCode(paymentAccountDetail.getFinSubObjectCode());
157             }
158 
159             glPendingTransaction.setProjectCd(paymentAccountDetail.getProjectCode());
160             if (paymentAccountDetail.getPaymentDetail().getNetPaymentAmount().bigDecimalValue().signum() >= 0) {
161                  glPendingTransaction.setDebitCrdtCd(reversal ? OLEConstants.GL_CREDIT_CODE : OLEConstants.GL_DEBIT_CODE);
162             }
163             else {
164                  glPendingTransaction.setDebitCrdtCd(reversal ? OLEConstants.GL_DEBIT_CODE : OLEConstants.GL_CREDIT_CODE);
165               }
166             glPendingTransaction.setAmount(paymentAccountDetail.getAccountNetAmount().abs());
167 
168             String trnDesc = "";
169 
170             String payeeName = paymentGroup.getPayeeName();
171             if (StringUtils.isNotBlank(payeeName)) {
172                 trnDesc = payeeName.length() > 40 ? payeeName.substring(0, 40) : StringUtils.rightPad(payeeName, 40);
173             }
174 
175             if (reversal) {
176                 String poNbr = paymentAccountDetail.getPaymentDetail().getPurchaseOrderNbr();
177                 if (StringUtils.isNotBlank(poNbr)) {
178                     trnDesc += " " + (poNbr.length() > 9 ? poNbr.substring(0, 9) : StringUtils.rightPad(poNbr, 9));
179                 }
180 
181                 String invoiceNbr = paymentAccountDetail.getPaymentDetail().getInvoiceNbr();
182                 if (StringUtils.isNotBlank(invoiceNbr)) {
183                     trnDesc += " " + (invoiceNbr.length() > 14 ? invoiceNbr.substring(0, 14) : StringUtils.rightPad(invoiceNbr, 14));
184                 }
185 
186                 if (trnDesc.length() > 40) {
187                     trnDesc = trnDesc.substring(0, 40);
188                 }
189             }
190 
191             glPendingTransaction.setDescription(trnDesc);
192 
193             glPendingTransaction.setOrgDocNbr(paymentAccountDetail.getPaymentDetail().getOrganizationDocNbr());
194             glPendingTransaction.setOrgReferenceId(paymentAccountDetail.getOrgReferenceId());
195             glPendingTransaction.setFdocRefNbr(paymentAccountDetail.getPaymentDetail().getCustPaymentDocNbr());
196 
197             
198             SpringContext.getBean(FlexibleOffsetAccountService.class).updateOffset(glPendingTransaction);
199 
200             this.businessObjectService.save(glPendingTransaction);
201 
202             sequenceHelper.increment();
203 
204             if (bankService.isBankSpecificationEnabled()) {
205                 this.populateBankOffsetEntry(paymentGroup, glPendingTransaction, sequenceHelper);
206             }
207         }
208     }
209     
210     
211 
212 
213 
214 
215 
216 
217     protected void populateBankOffsetEntry(PaymentGroup paymentGroup, GlPendingTransaction glPendingTransaction, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
218         GlPendingTransaction bankPendingTransaction = new GlPendingTransaction();
219 
220         bankPendingTransaction.setSequenceNbr(new KualiInteger(sequenceHelper.getSequenceCounter()));
221         bankPendingTransaction.setFdocRefTypCd(null);
222         bankPendingTransaction.setFsRefOriginCd(null);
223         bankPendingTransaction.setFinancialBalanceTypeCode(OLEConstants.BALANCE_TYPE_ACTUAL);
224         bankPendingTransaction.setTransactionDt(glPendingTransaction.getTransactionDt());
225         bankPendingTransaction.setUniversityFiscalYear(glPendingTransaction.getUniversityFiscalYear());
226         bankPendingTransaction.setUnivFiscalPrdCd(glPendingTransaction.getUnivFiscalPrdCd());
227         bankPendingTransaction.setFinancialDocumentTypeCode(glPendingTransaction.getFinancialDocumentTypeCode());
228         bankPendingTransaction.setFsOriginCd(glPendingTransaction.getFsOriginCd());
229         bankPendingTransaction.setFdocNbr(glPendingTransaction.getFdocNbr());
230 
231         Bank bank = paymentGroup.getBank();
232         bankPendingTransaction.setChartOfAccountsCode(bank.getCashOffsetFinancialChartOfAccountCode());
233         bankPendingTransaction.setAccountNumber(bank.getCashOffsetAccountNumber());
234         if (StringUtils.isBlank(bank.getCashOffsetSubAccountNumber())) {
235             bankPendingTransaction.setSubAccountNumber(OLEConstants.getDashSubAccountNumber());
236         }
237         else {
238             bankPendingTransaction.setSubAccountNumber(bank.getCashOffsetSubAccountNumber());
239         }
240 
241         bankPendingTransaction.setFinancialObjectCode(bank.getCashOffsetObjectCode());
242         if (StringUtils.isBlank(bank.getCashOffsetSubObjectCode())) {
243             bankPendingTransaction.setFinancialSubObjectCode(OLEConstants.getDashFinancialSubObjectCode());
244         }
245         else {
246             bankPendingTransaction.setFinancialSubObjectCode(bank.getCashOffsetSubObjectCode());
247         }
248         bankPendingTransaction.setProjectCd(OLEConstants.getDashProjectCode());
249 
250         if (OLEConstants.GL_CREDIT_CODE.equals(glPendingTransaction.getDebitCrdtCd())) {
251             bankPendingTransaction.setDebitCrdtCd(OLEConstants.GL_DEBIT_CODE);
252         }
253         else {
254             bankPendingTransaction.setDebitCrdtCd(OLEConstants.GL_CREDIT_CODE);
255         }
256         bankPendingTransaction.setAmount(glPendingTransaction.getAmount());
257         
258         String description = kualiConfigurationService.getPropertyValueAsString(OLEKeyConstants.Bank.DESCRIPTION_GLPE_BANK_OFFSET);
259         bankPendingTransaction.setDescription(description);
260         bankPendingTransaction.setOrgDocNbr(glPendingTransaction.getOrgDocNbr());
261         bankPendingTransaction.setOrgReferenceId(null);
262         bankPendingTransaction.setFdocRefNbr(null);
263 
264         this.businessObjectService.save(bankPendingTransaction);
265 
266         sequenceHelper.increment();
267     }
268 
269     
270 
271 
272 
273 
274     protected BankService getBankService() {
275         return bankService;
276     }
277 
278     
279 
280 
281 
282 
283     public void setBankService(BankService bankService) {
284         this.bankService = bankService;
285     }
286 
287     
288 
289 
290 
291 
292     public void setGlPendingTransactionDao(PendingTransactionDao glPendingTransactionDao) {
293         this.glPendingTransactionDao = glPendingTransactionDao;
294     }
295 
296     
297 
298 
299 
300 
301     public void setAccountingPeriodService(AccountingPeriodService accountingPeriodService) {
302         this.accountingPeriodService = accountingPeriodService;
303     }
304 
305     
306 
307 
308 
309 
310     public void setDateTimeService(DateTimeService dateTimeService) {
311         this.dateTimeService = dateTimeService;
312     }
313 
314     
315 
316 
317 
318 
319     public void setConfigurationService(ConfigurationService kualiConfigurationService) {
320         this.kualiConfigurationService = kualiConfigurationService;
321     }
322 
323     
324 
325 
326     public void save(GlPendingTransaction tran) {
327         LOG.debug("save() started");
328 
329         this.businessObjectService.save(tran);
330     }
331 
332     
333 
334 
335     public Iterator<GlPendingTransaction> getUnextractedTransactions() {
336         LOG.debug("getUnextractedTransactions() started");
337 
338         return glPendingTransactionDao.getUnextractedTransactions();
339     }
340 
341     
342 
343 
344     public void clearExtractedTransactions() {
345         glPendingTransactionDao.clearExtractedTransactions();
346     }
347 
348     
349 
350 
351 
352 
353     public void setBusinessObjectService(BusinessObjectService businessObjectService) {
354         this.businessObjectService = businessObjectService;
355     }
356 
357 }