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    
017    package org.kuali.kfs.sys.businessobject;
018    
019    import java.util.LinkedHashMap;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.kuali.kfs.coa.businessobject.AccountingPeriod;
023    import org.kuali.kfs.fp.businessobject.AdvanceDepositDetail;
024    import org.kuali.kfs.fp.document.AdvanceDepositDocument;
025    import org.kuali.kfs.sys.KFSPropertyConstants;
026    import org.kuali.kfs.sys.context.SpringContext;
027    import org.kuali.rice.kew.exception.WorkflowException;
028    import org.kuali.rice.kns.bo.DocumentHeader;
029    import org.kuali.rice.kns.bo.PersistableBusinessObjectBase;
030    import org.kuali.rice.kns.service.DocumentService;
031    import org.kuali.rice.kns.util.ObjectUtils;
032    
033    /**
034     * This class is used to represent an electronic payment claim.
035     */
036    public class ElectronicPaymentClaim extends PersistableBusinessObjectBase {
037        
038        public final static class ClaimStatusCodes {
039            public final static String CLAIMED = "C";
040            public final static String UNCLAIMED = "U";
041        }
042    
043        private String documentNumber;
044        private Integer financialDocumentLineNumber;
045        private String referenceFinancialDocumentNumber;
046        private Integer financialDocumentPostingYear;
047        private String financialDocumentPostingPeriodCode;
048        private String paymentClaimStatusCode;
049        
050        private AdvanceDepositDocument generatingDocument;
051        private SourceAccountingLine generatingAccountingLine;
052        private AccountingPeriod financialDocumentPostingPeriod;
053        private DocumentHeader generatingDocumentHeader;
054    
055        /**
056         * Default constructor.  It constructs.
057         */
058        public ElectronicPaymentClaim() {}
059    
060        /**
061         * Gets the documentNumber attribute.
062         * 
063         * @return Returns the documentNumber
064         */
065        public String getDocumentNumber() {
066            return documentNumber;
067        }
068    
069        /**
070         * Sets the documentNumber attribute.
071         * 
072         * @param documentNumber The documentNumber to set.
073         */
074        public void setDocumentNumber(String documentNumber) {
075            this.documentNumber = documentNumber;
076        }
077    
078    
079        /**
080         * Gets the financialDocumentLineNumber attribute.
081         * 
082         * @return Returns the financialDocumentLineNumber
083         */
084        public Integer getFinancialDocumentLineNumber() {
085            return financialDocumentLineNumber;
086        }
087    
088        /**
089         * Sets the financialDocumentLineNumber attribute.
090         * 
091         * @param financialDocumentLineNumber The financialDocumentLineNumber to set.
092         */
093        public void setFinancialDocumentLineNumber(Integer financialDocumentLineNumber) {
094            this.financialDocumentLineNumber = financialDocumentLineNumber;
095        }
096    
097    
098        /**
099         * Gets the referenceFinancialDocumentNumber attribute.
100         * 
101         * @return Returns the referenceFinancialDocumentNumber
102         */
103        public String getReferenceFinancialDocumentNumber() {
104            return referenceFinancialDocumentNumber;
105        }
106    
107        /**
108         * Sets the referenceFinancialDocumentNumber attribute.
109         * 
110         * @param referenceFinancialDocumentNumber The referenceFinancialDocumentNumber to set.
111         */
112        public void setReferenceFinancialDocumentNumber(String referenceFinancialDocumentNumber) {
113            this.referenceFinancialDocumentNumber = referenceFinancialDocumentNumber;
114        }
115    
116    
117        /**
118         * Gets the financialDocumentPostingYear attribute.
119         * 
120         * @return Returns the financialDocumentPostingYear
121         */
122        public Integer getFinancialDocumentPostingYear() {
123            return financialDocumentPostingYear;
124        }
125    
126        /**
127         * Sets the financialDocumentPostingYear attribute.
128         * 
129         * @param financialDocumentPostingYear The financialDocumentPostingYear to set.
130         */
131        public void setFinancialDocumentPostingYear(Integer financialDocumentPostingYear) {
132            this.financialDocumentPostingYear = financialDocumentPostingYear;
133        }
134    
135    
136        /**
137         * Gets the financialDocumentPostingPeriodCode attribute.
138         * 
139         * @return Returns the financialDocumentPostingPeriodCode
140         */
141        public String getFinancialDocumentPostingPeriodCode() {
142            return financialDocumentPostingPeriodCode;
143        }
144    
145        /**
146         * Sets the financialDocumentPostingPeriodCode attribute.
147         * 
148         * @param financialDocumentPostingPeriodCode The financialDocumentPostingPeriodCode to set.
149         */
150        public void setFinancialDocumentPostingPeriodCode(String financialDocumentPostingPeriodCode) {
151            this.financialDocumentPostingPeriodCode = financialDocumentPostingPeriodCode;
152        }
153    
154        /**
155         * Gets the paymentClaimStatusCode attribute. 
156         * @return Returns the paymentClaimStatusCode.
157         */
158        public String getPaymentClaimStatusCode() {
159            return paymentClaimStatusCode;
160        }
161    
162        /**
163         * Sets the paymentClaimStatusCode attribute value.
164         * @param paymentClaimStatusCode The paymentClaimStatusCode to set.
165         */
166        public void setPaymentClaimStatusCode(String paymentClaimStatusCode) {
167            this.paymentClaimStatusCode = paymentClaimStatusCode;
168        }
169    
170        /**
171         * Gets the generatingDocument attribute. 
172         * @return Returns the generatingDocument.
173         */
174        public AdvanceDepositDocument getGeneratingDocument() {
175            final boolean docNumbersAreDifferentAndNotNull = (generatingDocumentHeader != null && !documentNumber.equals(this.generatingDocumentHeader.getDocumentNumber()));
176            if (StringUtils.isNotBlank(documentNumber) && (this.generatingDocument == null || docNumbersAreDifferentAndNotNull)) {
177                try {
178                    generatingDocument = (AdvanceDepositDocument)SpringContext.getBean(DocumentService.class).getByDocumentHeaderId(documentNumber);
179                }
180                catch (WorkflowException we) {
181                    throw new RuntimeException("Could not retrieve Document #"+documentNumber, we);
182                }
183            }
184            return this.generatingDocument;
185        }
186        
187        /**
188         * Gets the generatingDocumentHeader attribute. 
189         * @return Returns the generatingDocumentHeader.
190         */
191        public DocumentHeader getGeneratingDocumentHeader() {
192            return generatingDocumentHeader;
193        }
194    
195        /**
196         * Sets the generatingDocumentHeader attribute value.
197         * @param generatingDocumentHeader The generatingDocumentHeader to set.
198         * @deprecated
199         */
200        public void setGeneratingDocumentHeader(DocumentHeader generatingDocumentHeader) {
201            this.generatingDocumentHeader = generatingDocumentHeader;
202        }
203    
204        /**
205         * Returns the accounting line on the generating Advance Deposit document for the transaction which generated this record
206         * @return the accounting line that describes the transaction responsible for the creation of this record
207         */
208        public SourceAccountingLine getGeneratingAccountingLine() {
209            if (generatingAccountingLine == null) {
210                final AdvanceDepositDocument generatingDocument = getGeneratingDocument();
211                if (generatingDocument != null && generatingDocument.getSourceAccountingLines() != null) {
212                    int count = 0;
213                    
214                    while (generatingAccountingLine == null && count < generatingDocument.getSourceAccountingLines().size()) {
215                        if (generatingDocument.getSourceAccountingLine(count).getSequenceNumber().equals(getFinancialDocumentLineNumber())) {
216                            generatingAccountingLine = generatingDocument.getSourceAccountingLine(count);
217                        }
218                        count += 1;
219                    }
220                    
221                }
222            }
223            return generatingAccountingLine;
224        }
225        
226        /**
227         * Returns the AdvanceDepositDetail for the first deposit detail on this document
228         * @return the advance deposit detail that describes the transaction responsible for the creation of this record
229         */
230        public AdvanceDepositDetail getGeneratingAdvanceDepositDetail() {
231            final AdvanceDepositDocument generatingDocument = getGeneratingDocument();
232            if (generatingDocument != null && !ObjectUtils.isNull(generatingDocument.getAdvanceDeposits()) && !generatingDocument.getAdvanceDeposits().isEmpty()) {
233                return generatingDocument.getAdvanceDepositDetail(0);
234            }
235            return null;
236        }
237    
238        /**
239         * Gets the financialDocumentPostingPeriod attribute. 
240         * @return Returns the financialDocumentPostingPeriod.
241         */
242        public AccountingPeriod getFinancialDocumentPostingPeriod() {
243            return financialDocumentPostingPeriod;
244        }
245    
246        /**
247         * Sets the financialDocumentPostingPeriod attribute value.
248         * @param financialDocumentPostingPeriod The financialDocumentPostingPeriod to set.
249         */
250        public void setFinancialDocumentPostingPeriod(AccountingPeriod financialDocumentPostingPeriod) {
251            this.financialDocumentPostingPeriod = financialDocumentPostingPeriod;
252        }
253        
254        /**
255         * @see org.kuali.rice.kns.bo.BusinessObjectBase#toStringMapper()
256         */
257        protected LinkedHashMap toStringMapper() {
258            LinkedHashMap m = new LinkedHashMap();
259            m.put(KFSPropertyConstants.DOCUMENT_NUMBER, this.documentNumber);
260            if (this.financialDocumentLineNumber != null) {
261                m.put("financialDocumentLineNumber", this.financialDocumentLineNumber.toString());
262            }
263            return m;
264        }
265        
266        /**
267         * Returns the String representation for an Electronic Payment Claim record, to be used by the claimed
268         * checkbox
269         * @param claim a claim to get a String representation for
270         * @return the representation in the form of "{generating document number}::{generating document accounting line sequence number}"
271         */
272        public String getElectronicPaymentClaimRepresentation() {
273            StringBuilder representation = new StringBuilder();
274            representation.append(getDocumentNumber());
275            representation.append("::");
276            representation.append(getFinancialDocumentLineNumber());
277            return representation.toString();
278        }
279        
280        /**
281         * @return a descriptive version of the paymentClaimStatusCode field
282         */
283        public String getPaymentClaimStatus() {
284            return getPaymentClaimStatusCode().equals("C") ? "Claimed" : "Unclaimed";
285        }
286    }