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.ar.document;
017    
018    import java.util.ArrayList;
019    import java.util.HashMap;
020    import java.util.LinkedHashMap;
021    import java.util.List;
022    import java.util.Map;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.log4j.Logger;
026    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
027    import org.kuali.kfs.fp.document.GeneralErrorCorrectionDocument;
028    import org.kuali.kfs.gl.service.EntryService;
029    import org.kuali.kfs.module.ar.ArConstants;
030    import org.kuali.kfs.module.ar.businessobject.AccountsReceivableDocumentHeader;
031    import org.kuali.kfs.module.ar.businessobject.CashControlDetail;
032    import org.kuali.kfs.module.ar.businessobject.PaymentMedium;
033    import org.kuali.kfs.module.ar.document.service.CashControlDocumentService;
034    import org.kuali.kfs.sys.KFSConstants;
035    import org.kuali.kfs.sys.KFSParameterKeyConstants;
036    import org.kuali.kfs.sys.businessobject.AccountingLine;
037    import org.kuali.kfs.sys.businessobject.Bank;
038    import org.kuali.kfs.sys.businessobject.ElectronicPaymentClaim;
039    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry;
040    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper;
041    import org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail;
042    import org.kuali.kfs.sys.context.SpringContext;
043    import org.kuali.kfs.sys.document.AmountTotaling;
044    import org.kuali.kfs.sys.document.ElectronicPaymentClaiming;
045    import org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource;
046    import org.kuali.kfs.sys.document.GeneralLedgerPostingDocument;
047    import org.kuali.kfs.sys.document.GeneralLedgerPostingDocumentBase;
048    import org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.GENERAL_LEDGER_PENDING_ENTRY_CODE;
049    import org.kuali.kfs.sys.service.BankService;
050    import org.kuali.kfs.sys.service.ElectronicPaymentClaimingService;
051    import org.kuali.kfs.sys.service.UniversityDateService;
052    import org.kuali.rice.kew.exception.WorkflowException;
053    import org.kuali.rice.kns.datadictionary.DocumentEntry;
054    import org.kuali.rice.kns.document.Document;
055    import org.kuali.rice.kns.service.BusinessObjectService;
056    import org.kuali.rice.kns.service.DataDictionaryService;
057    import org.kuali.rice.kns.service.DocumentService;
058    import org.kuali.rice.kns.service.ParameterService;
059    import org.kuali.rice.kns.util.KualiDecimal;
060    import org.kuali.rice.kns.web.format.CurrencyFormatter;
061    
062    /**
063     * @author Kuali Nervous System Team (kualidev@oncourse.iu.edu)
064     */
065    public class CashControlDocument extends GeneralLedgerPostingDocumentBase implements AmountTotaling, GeneralLedgerPendingEntrySource, ElectronicPaymentClaiming, GeneralLedgerPostingDocument {
066        protected static final String NODE_ASSOCIATED_WITH_ELECTRONIC_PAYMENT = "AssociatedWithElectronicPayment";
067        protected static Logger LOG = org.apache.log4j.Logger.getLogger(CashControlDocument.class);
068    
069        protected String referenceFinancialDocumentNumber;
070        protected Integer universityFiscalYear;
071        protected String universityFiscalPeriodCode;
072        protected String customerPaymentMediumCode;
073        protected KualiDecimal cashControlTotalAmount = KualiDecimal.ZERO;
074        protected String lockboxNumber;
075        protected String bankCode;
076    
077        protected Bank bank;
078        protected PaymentMedium customerPaymentMedium;
079        protected AccountingPeriod universityFiscalPeriod;
080        protected AccountsReceivableDocumentHeader accountsReceivableDocumentHeader;
081    
082        protected List<CashControlDetail> cashControlDetails;
083    
084        protected List<GeneralLedgerPendingEntry> generalLedgerPendingEntries;
085        protected final static String GENERAL_LEDGER_POSTING_HELPER_BEAN_ID = "kfsGenericGeneralLedgerPostingHelper";
086        protected List<ElectronicPaymentClaim> electronicPaymentClaims;
087    
088        /**
089         * Default constructor.
090         */
091        public CashControlDocument() {
092            super();
093            accountsReceivableDocumentHeader = new AccountsReceivableDocumentHeader();
094            customerPaymentMedium = new PaymentMedium();
095    
096            // Set the university fiscal year to the current values
097            UniversityDateService universityDateService = SpringContext.getBean(UniversityDateService.class);
098            universityFiscalYear = universityDateService.getCurrentUniversityDate().getUniversityFiscalYear();
099            universityFiscalPeriod = universityDateService.getCurrentUniversityDate().getAccountingPeriod();
100    
101            cashControlDetails = new ArrayList<CashControlDetail>();
102            generalLedgerPendingEntries = new ArrayList<GeneralLedgerPendingEntry>();
103            electronicPaymentClaims = new ArrayList<ElectronicPaymentClaim>();
104            // retrieve value from param table and set to default
105            try {
106                DataDictionaryService ddService = SpringContext.getBean(DataDictionaryService.class);
107                DocumentEntry docEntry = ddService.getDataDictionary().getDocumentEntry(ddService.getValidDocumentClassByTypeName("CTRL").getCanonicalName());
108                String documentTypeCode = SpringContext.getBean(DataDictionaryService.class).getDocumentTypeNameByClass(this.getClass());
109                if (SpringContext.getBean(BankService.class).isBankSpecificationEnabled()) {
110                    bankCode = SpringContext.getBean(ParameterService.class).getParameterValue(Bank.class, KFSParameterKeyConstants.DEFAULT_BANK_BY_DOCUMENT_TYPE, documentTypeCode);
111                }
112            }
113            catch (Exception x) {
114                LOG.error("Problem occurred setting default bank code for cash control document", x);
115            }
116        }
117    
118        /**
119         * Gets the documentNumber attribute.
120         * 
121         * @return Returns the documentNumber
122         */
123        public String getDocumentNumber() {
124            return documentNumber;
125        }
126    
127        /**
128         * Sets the documentNumber attribute.
129         * 
130         * @param documentNumber The documentNumber to set.
131         */
132        public void setDocumentNumber(String documentNumber) {
133            this.documentNumber = documentNumber;
134        }
135    
136    
137        /**
138         * Gets the referenceFinancialDocumentNumber attribute.
139         * 
140         * @return Returns the referenceFinancialDocumentNumber
141         */
142        public String getReferenceFinancialDocumentNumber() {
143            return referenceFinancialDocumentNumber;
144        }
145    
146        /**
147         * Sets the referenceFinancialDocumentNumber attribute.
148         * 
149         * @param referenceFinancialDocumentNumber The referenceFinancialDocumentNumber to set.
150         */
151        public void setReferenceFinancialDocumentNumber(String referenceFinancialDocumentNumber) {
152            this.referenceFinancialDocumentNumber = referenceFinancialDocumentNumber;
153        }
154    
155    
156        /**
157         * Gets the universityFiscalYear attribute.
158         * 
159         * @return Returns the universityFiscalYear
160         */
161        public Integer getUniversityFiscalYear() {
162            return universityFiscalYear;
163        }
164    
165        /**
166         * Sets the universityFiscalYear attribute.
167         * 
168         * @param universityFiscalYear The universityFiscalYear to set.
169         */
170        public void setUniversityFiscalYear(Integer universityFiscalYear) {
171            this.universityFiscalYear = universityFiscalYear;
172        }
173    
174    
175        /**
176         * Gets the universityFiscalPeriodCode attribute.
177         * 
178         * @return Returns the universityFiscalPeriodCode
179         */
180        public String getUniversityFiscalPeriodCode() {
181            return universityFiscalPeriodCode;
182        }
183    
184        /**
185         * Sets the universityFiscalPeriodCode attribute.
186         * 
187         * @param universityFiscalPeriodCode The universityFiscalPeriodCode to set.
188         */
189        public void setUniversityFiscalPeriodCode(String universityFiscalPeriodCode) {
190            this.universityFiscalPeriodCode = universityFiscalPeriodCode;
191        }
192    
193    
194        /**
195         * Gets the customerPaymentMediumCode attribute.
196         * 
197         * @return Returns the customerPaymentMediumCode
198         */
199        public String getCustomerPaymentMediumCode() {
200            return customerPaymentMediumCode;
201        }
202    
203        /**
204         * Sets the customerPaymentMediumCode attribute.
205         * 
206         * @param customerPaymentMediumCode The customerPaymentMediumCode to set.
207         */
208        public void setCustomerPaymentMediumCode(String customerPaymentMediumCode) {
209            this.customerPaymentMediumCode = customerPaymentMediumCode;
210        }
211    
212    
213        /**
214         * Gets the cashControlTotalAmount attribute.
215         * 
216         * @return Returns the cashControlTotalAmount
217         */
218        public KualiDecimal getCashControlTotalAmount() {
219            return cashControlTotalAmount;
220        }
221    
222        /**
223         * Sets the cashControlTotalAmount attribute.
224         * 
225         * @param cashControlTotalAmount The cashControlTotalAmount to set.
226         */
227        public void setCashControlTotalAmount(KualiDecimal cashControlTotalAmount) {
228            this.cashControlTotalAmount = cashControlTotalAmount;
229        }
230    
231        /**
232         * Gets the universityFiscalPeriod attribute.
233         * 
234         * @return Returns the universityFiscalPeriod
235         */
236        public AccountingPeriod getUniversityFiscalPeriod() {
237            return universityFiscalPeriod;
238        }
239    
240        /**
241         * Sets the universityFiscalPeriod attribute.
242         * 
243         * @param universityFiscalPeriod The universityFiscalPeriod to set.
244         * @deprecated
245         */
246        public void setUniversityFiscalPeriod(AccountingPeriod universityFiscalPeriod) {
247            this.universityFiscalPeriod = universityFiscalPeriod;
248        }
249    
250        /**
251         * Gets the accountsReceivableDocumentHeader attribute.
252         * 
253         * @return Returns the accountsReceivableDocumentHeader.
254         */
255        public AccountsReceivableDocumentHeader getAccountsReceivableDocumentHeader() {
256            return accountsReceivableDocumentHeader;
257        }
258    
259        /**
260         * Sets the accountsReceivableDocumentHeader attribute value.
261         * 
262         * @param accountsReceivableDocumentHeader The accountsReceivableDocumentHeader to set.
263         */
264        public void setAccountsReceivableDocumentHeader(AccountsReceivableDocumentHeader accountsReceivableDocumentHeader) {
265            this.accountsReceivableDocumentHeader = accountsReceivableDocumentHeader;
266        }
267    
268        /**
269         * Gets the cashControlDetails attribute.
270         * 
271         * @return Returns the cashControlDetails.
272         */
273        public List<CashControlDetail> getCashControlDetails() {
274            return cashControlDetails;
275        }
276    
277        /**
278         * Sets the cashControlDetails attribute value.
279         * 
280         * @param cashControlDetails The cashControlDetails to set.
281         */
282        public void setCashControlDetails(List<CashControlDetail> cashControlDetails) {
283            this.cashControlDetails = cashControlDetails;
284        }
285    
286        /**
287         * This method adds a new cash control detail to the list
288         * 
289         * @param cashControlDetail
290         */
291        public void addCashControlDetail(CashControlDetail cashControlDetail) {
292            prepareCashControlDetail(cashControlDetail);
293            if (cashControlDetail.getFinancialDocumentLineAmount() != null) {
294                this.cashControlTotalAmount = this.cashControlTotalAmount.add(cashControlDetail.getFinancialDocumentLineAmount());
295            }
296            cashControlDetails.add(cashControlDetail);
297        }
298    
299        /**
300         * This method removes a cash control detail from the list
301         * 
302         * @param index
303         */
304        public void deleteCashControlDetail(int index) {
305            CashControlDetail cashControlDetail = cashControlDetails.remove(index);
306            this.cashControlTotalAmount = this.cashControlTotalAmount.subtract(cashControlDetail.getFinancialDocumentLineAmount());
307        }
308    
309        /**
310         * This is a helper method that automatically populates document specfic information into the cash control detail deposit
311         * (CashControlDetail) instance.
312         */
313        protected void prepareCashControlDetail(CashControlDetail cashControlDetail) {
314            cashControlDetail.setDocumentNumber(this.getDocumentNumber());
315        }
316    
317        /**
318         * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
319         */
320        @SuppressWarnings("unchecked")
321        protected LinkedHashMap toStringMapper() {
322            LinkedHashMap m = new LinkedHashMap();
323            m.put("documentNumber", this.documentNumber);
324            return m;
325        }
326    
327        /**
328         * Gets the customerPaymentMedium attribute.
329         * 
330         * @return Returns the customerPaymentMedium
331         */
332        public PaymentMedium getCustomerPaymentMedium() {
333            return customerPaymentMedium;
334        }
335    
336        /**
337         * Sets the customerPaymentMedium attribute value.
338         * 
339         * @param customerPaymentMedium The customerPaymentMedium to set.
340         */
341        public void setCustomerPaymentMedium(PaymentMedium customerPaymentMedium) {
342            this.customerPaymentMedium = customerPaymentMedium;
343        }
344    
345        /**
346         * @see org.kuali.kfs.sys.document.AmountTotaling#getTotalDollarAmount()
347         */
348        public KualiDecimal getTotalDollarAmount() {
349            return getCashControlTotalAmount();
350        }
351    
352        /**
353         * This method returns the advance deposit total amount as a currency formatted string.
354         * 
355         * @return String
356         */
357        public String getCurrencyFormattedTotalCashControlAmount() {
358            return (String) new CurrencyFormatter().format(getCashControlTotalAmount());
359        }
360    
361        /**
362         * Retrieves a specific cash control detail from the list, by array index
363         * 
364         * @param index the index of the cash control details to retrieve the cash control detail from
365         * @return a CashControlDetail
366         */
367        public CashControlDetail getCashControlDetail(int index) {
368            if (index >= cashControlDetails.size()) {
369                for (int i = cashControlDetails.size(); i <= index; i++) {
370                    cashControlDetails.add(new CashControlDetail());
371                }
372            }
373            return cashControlDetails.get(index);
374        }
375    
376        /**
377         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#addPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
378         */
379        public void addPendingEntry(GeneralLedgerPendingEntry entry) {
380            generalLedgerPendingEntries.add(entry);
381    
382        }
383    
384        /**
385         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#clearAnyGeneralLedgerPendingEntries()
386         */
387        public void clearAnyGeneralLedgerPendingEntries() {
388            generalLedgerPendingEntries = new ArrayList<GeneralLedgerPendingEntry>();
389    
390        }
391    
392        /**
393         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#customizeExplicitGeneralLedgerPendingEntry(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail,
394         *      org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntry)
395         */
396        public void customizeExplicitGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail postable, GeneralLedgerPendingEntry explicitEntry) {
397            if (explicitEntry.getFinancialDocumentTypeCode().equalsIgnoreCase(KFSConstants.FinancialDocumentTypeCodes.GENERAL_ERROR_CORRECTION)) {
398                explicitEntry.setTransactionLedgerEntryDescription(buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(postable));
399    
400                // Clearing fields that are already handled by the parent algorithm - we don't actually want
401                // these to copy over from the accounting lines b/c they don't belong in the GLPEs
402                // if the aren't nulled, then GECs fail to post
403                explicitEntry.setReferenceFinancialDocumentNumber(null);
404                explicitEntry.setReferenceFinancialSystemOriginationCode(null);
405                explicitEntry.setReferenceFinancialDocumentTypeCode(null);
406            }
407    
408        }
409    
410        /**
411         * Builds an appropriately formatted string to be used for the <code>transactionLedgerEntryDescription</code>. It is built
412         * using information from the <code>{@link AccountingLine}</code>. Format is "01-12345: blah blah blah".
413         * 
414         * @param line accounting line
415         * @param transactionalDocument submitted accounting document
416         * @return String formatted string to be used for transaction ledger entry description
417         */
418        protected String buildTransactionLedgerEntryDescriptionUsingRefOriginAndRefDocNumber(GeneralLedgerPendingEntrySourceDetail line) {
419            String description = "";
420            description = line.getReferenceOriginCode() + "-" + line.getReferenceNumber();
421    
422            if (StringUtils.isNotBlank(line.getFinancialDocumentLineDescription())) {
423                description += ": " + line.getFinancialDocumentLineDescription();
424            }
425            else {
426                description += ": " + getDocumentHeader().getDocumentDescription();
427            }
428    
429            if (description.length() > GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH) {
430                description = description.substring(0, GENERAL_LEDGER_PENDING_ENTRY_CODE.GLPE_DESCRIPTION_MAX_LENGTH - 3) + "...";
431            }
432    
433            return description;
434        }
435    
436        public boolean customizeOffsetGeneralLedgerPendingEntry(GeneralLedgerPendingEntrySourceDetail accountingLine, GeneralLedgerPendingEntry explicitEntry, GeneralLedgerPendingEntry offsetEntry) {
437            return false;
438        }
439    
440        /**
441         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#generateDocumentGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
442         */
443        public boolean generateDocumentGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
444            boolean success = true;
445            CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
446    
447            if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.CHECK)) {
448                success &= cashControlDocumentService.createCashReceiptGLPEs(this, sequenceHelper);
449                success &= cashControlDocumentService.createBankOffsetGLPEs(this, sequenceHelper);
450            }
451            else if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.WIRE_TRANSFER)) {
452                success &= cashControlDocumentService.createDistributionOfIncomeAndExpenseGLPEs(this, sequenceHelper);
453            }
454            else if (this.getCustomerPaymentMediumCode().equalsIgnoreCase(ArConstants.PaymentMediumCode.CREDIT_CARD)) {
455                success &= cashControlDocumentService.createGeneralErrorCorrectionGLPEs(this, sequenceHelper);
456            }
457    
458            return success;
459        }
460    
461        /**
462         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPendingEntryAmountForGeneralLedgerPostable(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
463         */
464        public KualiDecimal getGeneralLedgerPendingEntryAmountForDetail(GeneralLedgerPendingEntrySourceDetail postable) {
465            return postable.getAmount().abs();
466        }
467    
468        /**
469         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getGeneralLedgerPostables()
470         */
471        public List<GeneralLedgerPendingEntrySourceDetail> getGeneralLedgerPendingEntrySourceDetails() {
472            return new ArrayList<GeneralLedgerPendingEntrySourceDetail>();
473        }
474    
475    
476        /**
477         * The Cash Control document doesn't generate general ledger pending entries based off of the accounting lines on the document
478         * 
479         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#generateGeneralLedgerPendingEntries(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail,
480         *      org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySequenceHelper)
481         */
482        public boolean generateGeneralLedgerPendingEntries(GeneralLedgerPendingEntrySourceDetail glpeSourceDetail, GeneralLedgerPendingEntrySequenceHelper sequenceHelper) {
483            return true;
484        }
485    
486        /**
487         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#getPostingYear()
488         */
489        public Integer getPostingYear() {
490            return SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
491        }
492    
493        /**
494         * @see org.kuali.kfs.sys.document.GeneralLedgerPendingEntrySource#isDebit(org.kuali.kfs.sys.businessobject.GeneralLedgerPendingEntrySourceDetail)
495         */
496        public boolean isDebit(GeneralLedgerPendingEntrySourceDetail postable) {
497            AccountingLine accountingLine = (AccountingLine) postable;
498            return (accountingLine.getDebitCreditCode().equalsIgnoreCase(KFSConstants.GL_DEBIT_CODE));
499        }
500    
501        /**
502         * This method gets the glpes
503         * 
504         * @return a list of glpes
505         */
506        public List<GeneralLedgerPendingEntry> getGeneralLedgerPendingEntries() {
507            return generalLedgerPendingEntries;
508        }
509    
510        /**
511         * This method sets the glpes
512         * 
513         * @param generalLedgerPendingEntries
514         */
515        public void setGeneralLedgerPendingEntries(List<GeneralLedgerPendingEntry> generalLedgerPendingEntries) {
516            this.generalLedgerPendingEntries = generalLedgerPendingEntries;
517        }
518    
519        /**
520         * This method set glpes status to approved
521         */
522        public void changeGeneralLedgerPendingEntriesApprovedStatusCode() {
523            for (GeneralLedgerPendingEntry glpe : getGeneralLedgerPendingEntries()) {
524                glpe.setFinancialDocumentApprovedCode(KFSConstants.DocumentStatusCodes.APPROVED);
525            }
526        }
527    
528        /**
529         * This method gets an glpe by it's index in the list of glpes
530         * 
531         * @param index the glpe index
532         * @return the glpe
533         */
534        public GeneralLedgerPendingEntry getGeneralLedgerPendingEntry(int index) {
535            while (generalLedgerPendingEntries.size() <= index) {
536                generalLedgerPendingEntries.add(new GeneralLedgerPendingEntry());
537            }
538            return generalLedgerPendingEntries.get(index);
539        }
540    
541        public String getLockboxNumber() {
542            CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
543            this.lockboxNumber = cashControlDocumentService.getLockboxNumber(this);
544            return lockboxNumber;
545        }
546    
547        /**
548         * @see org.kuali.rice.kns.document.DocumentBase#populateDocumentForRouting()
549         */
550        @Override
551        public void populateDocumentForRouting() {
552    
553            CashControlDocumentService cashControlDocumentService = SpringContext.getBean(CashControlDocumentService.class);
554            this.lockboxNumber = cashControlDocumentService.getLockboxNumber(this);
555            super.populateDocumentForRouting();
556    
557        }
558    
559        /**
560         * @see org.kuali.kfs.sys.document.ElectronicPaymentClaiming#declaimElectronicPaymentClaims()
561         */
562        public void declaimElectronicPaymentClaims() {
563            SpringContext.getBean(ElectronicPaymentClaimingService.class).declaimElectronicPaymentClaimsForDocument(this);
564        }
565    
566        /**
567         * This method gets electronicPaymentClaims
568         * 
569         * @return electronicPaymentClaims
570         */
571        public List<ElectronicPaymentClaim> getElectronicPaymentClaims() {
572            return electronicPaymentClaims;
573        }
574    
575        /**
576         * This method sets electronicPaymentClaims
577         * 
578         * @param electronicPaymentClaims
579         * @deprecated
580         */
581        public void setElectronicPaymentClaims(List<ElectronicPaymentClaim> electronicPaymentClaims) {
582            this.electronicPaymentClaims = electronicPaymentClaims;
583        }
584    
585        public String getFinancialDocumentTypeCode() {
586            // TODO Auto-generated method stub
587            return null;
588        }
589    
590        public Document getReferenceFinancialDocument() {
591            DocumentService documentService = SpringContext.getBean(DocumentService.class);
592            Document document = null;
593            try {
594                document = documentService.getByDocumentHeaderId(getReferenceFinancialDocumentNumber());
595            }
596            catch (WorkflowException we) {
597    
598            }
599            return document;
600        }
601    
602        /**
603         * Gets the bankCode attribute.
604         * 
605         * @return Returns the bankCode.
606         */
607        public String getBankCode() {
608            return bankCode;
609        }
610    
611        /**
612         * Sets the bankCode attribute value.
613         * 
614         * @param bankCode The bankCode to set.
615         */
616        public void setBankCode(String bankCode) {
617            this.bankCode = bankCode;
618        }
619    
620    
621        /**
622         * Answers true when document payment medium is WIRE transfer
623         * 
624         * @see org.kuali.kfs.sys.document.FinancialSystemTransactionalDocumentBase#answerSplitNodeQuestion(java.lang.String)
625         */
626        @Override
627        public boolean answerSplitNodeQuestion(String nodeName) throws UnsupportedOperationException {
628            if (NODE_ASSOCIATED_WITH_ELECTRONIC_PAYMENT.equals(nodeName)) {
629                if (ArConstants.PaymentMediumCode.WIRE_TRANSFER.equals(getCustomerPaymentMediumCode())) {
630                    return true;
631                }
632                else {
633                    return false;
634                }
635            }
636            throw new UnsupportedOperationException("answerSplitNodeQuestion('" + nodeName + "') called, but no handler setup to deal with this nodeName.");
637        }
638    
639        /**
640         * This is a helper method added to support workflow attribute configuration. This method helps to avoid attribute name mismatch
641         * between ProcessingChartOfAccountCode and chartOfAccountsCode
642         * 
643         * @return ProcessingChartOfAccountCode
644         */
645        public String getChartOfAccountsCode() {
646            if (getAccountsReceivableDocumentHeader() != null) {
647                return getAccountsReceivableDocumentHeader().getProcessingChartOfAccountCode();
648            }
649            return null;
650        }
651    
652        /**
653         * This is a helper method added to support workflow attribute configuration. This method helps to avoid attribute name mismatch
654         * between ProcessingOrganizationCode and organizationCode
655         * 
656         * @return ProcessingOrganizationCode
657         */
658        public String getOrganizationCode() {
659            if (getAccountsReceivableDocumentHeader() != null) {
660                return getAccountsReceivableDocumentHeader().getProcessingOrganizationCode();
661            }
662            return null;
663        }
664    
665        public Bank getBank() {
666            return bank;
667        }
668    
669        public void setBank(Bank bank) {
670            this.bank = bank;
671        }
672    
673        public void recalculateTotals() {
674            KualiDecimal total = KualiDecimal.ZERO;
675            for (CashControlDetail cashControlDetail : getCashControlDetails()) {
676                total = total.add(cashControlDetail.getFinancialDocumentLineAmount());
677            }
678            cashControlTotalAmount = total;
679            getDocumentHeader().setFinancialDocumentTotalAmount(total);
680        }
681    
682        @Override
683        public void prepareForSave() {
684    
685            // remove all the cash control detail records from the db in prep for the save,
686            // where they'll get re-persisted. This is necessary to make sure that details
687            // deleted on the form are actually deleted, as OJB does a terrible job at this
688            // by itself.
689            deleteCashControlDetailsFromDB();
690            recalculateTotals();
691        }
692    
693        protected void deleteCashControlDetailsFromDB() {
694            BusinessObjectService boService = SpringContext.getBean(BusinessObjectService.class);
695            Map<String, String> pkMap = new HashMap<String, String>();
696            pkMap.put("documentNumber", getDocumentNumber());
697            boService.deleteMatching(CashControlDetail.class, pkMap);
698        }
699        
700        /**
701         * This is a method to check the count of gl entries according to the input fields and values
702         * 
703         * @return totalGLRecordsCreated returns the count of the gl entries
704         */    
705        public Integer getGeneralLedgerEntriesPostedCount() {
706            Map<String, Object> pkMap = new HashMap<String, Object>();
707            pkMap.put("documentNumber", this.getDocumentNumber());
708            pkMap.put("universityFiscalYear", this.getPostingYear().toString());
709            pkMap.put("universityFiscalPeriodCode", this.getPostingPeriodCode());
710            pkMap.put("chartOfAccountsCode", this.getChartOfAccountsCode());
711            
712            Integer totalGLRecordsCreated = SpringContext.getBean(EntryService.class).getEntryRecordCount(pkMap);
713            
714            return totalGLRecordsCreated;
715        }
716    }