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.endow.document.web.struts;
017    
018    import static org.kuali.kfs.module.endow.EndowConstants.EXISTING_SOURCE_TRAN_LINE_PROPERTY_NAME;
019    import static org.kuali.kfs.module.endow.EndowConstants.EXISTING_TARGET_TRAN_LINE_PROPERTY_NAME;
020    import static org.kuali.kfs.module.endow.EndowConstants.NEW_SOURCE_TRAN_LINE_PROPERTY_NAME;
021    import static org.kuali.kfs.module.endow.EndowConstants.NEW_TARGET_TRAN_LINE_PROPERTY_NAME;
022    import static org.kuali.kfs.module.endow.EndowConstants.TRANSACTION_LINE_ERRORS;
023    
024    import java.util.List;
025    import java.util.Properties;
026    
027    import javax.servlet.http.HttpServletRequest;
028    import javax.servlet.http.HttpServletResponse;
029    
030    import org.apache.commons.lang.StringUtils;
031    import org.apache.struts.action.ActionForm;
032    import org.apache.struts.action.ActionForward;
033    import org.apache.struts.action.ActionMapping;
034    import org.apache.struts.upload.FormFile;
035    import org.kuali.kfs.module.endow.EndowKeyConstants;
036    import org.kuali.kfs.module.endow.EndowPropertyConstants;
037    import org.kuali.kfs.module.endow.businessobject.ClassCode;
038    import org.kuali.kfs.module.endow.businessobject.EndowmentSourceTransactionLine;
039    import org.kuali.kfs.module.endow.businessobject.EndowmentTargetTransactionLine;
040    import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionCode;
041    import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine;
042    import org.kuali.kfs.module.endow.businessobject.KEMID;
043    import org.kuali.kfs.module.endow.businessobject.KEMIDCurrentBalance;
044    import org.kuali.kfs.module.endow.businessobject.RegistrationCode;
045    import org.kuali.kfs.module.endow.businessobject.Security;
046    import org.kuali.kfs.module.endow.document.EndowmentSecurityDetailsDocumentBase;
047    import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument;
048    import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocumentBase;
049    import org.kuali.kfs.module.endow.document.service.ClassCodeService;
050    import org.kuali.kfs.module.endow.document.service.EndowmentTransactionCodeService;
051    import org.kuali.kfs.module.endow.document.service.KEMIDService;
052    import org.kuali.kfs.module.endow.document.service.RegistrationCodeService;
053    import org.kuali.kfs.module.endow.document.service.SecurityService;
054    import org.kuali.kfs.module.endow.document.validation.event.AddTransactionLineEvent;
055    import org.kuali.kfs.module.endow.document.validation.event.DeleteTransactionLineEvent;
056    import org.kuali.kfs.module.endow.exception.LineParserException;
057    import org.kuali.kfs.module.endow.util.LineParser;
058    import org.kuali.kfs.sys.KFSConstants;
059    import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
060    import org.kuali.kfs.sys.context.SpringContext;
061    import org.kuali.kfs.sys.document.AmountTotaling;
062    import org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentActionBase;
063    import org.kuali.rice.kew.exception.WorkflowException;
064    import org.kuali.rice.kns.service.KualiConfigurationService;
065    import org.kuali.rice.kns.service.KualiRuleService;
066    import org.kuali.rice.kns.util.GlobalVariables;
067    import org.kuali.rice.kns.util.KNSConstants;
068    import org.kuali.rice.kns.util.UrlFactory;
069    import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
070    import org.kuali.rice.kns.web.struts.form.KualiForm;
071    
072    public abstract class EndowmentTransactionLinesDocumentActionBase extends FinancialSystemTransactionalDocumentActionBase {
073    
074        private static final String SECURITY_SOURCE_REFRESH = "document.sourceTransactionSecurity.securityID";
075        private static final String SECURITY_TARGET_REFRESH = "document.targetTransactionSecurity.securityID";
076        private static final String REGISTRATION_SOURCE_REFRESH = "document.sourceTransactionSecurity.registrationCode";
077        private static final String REGISTRATION_TARGET_REFRESH = "document.targetTransactionSecurity.registrationCode";
078    
079        protected static org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(EndowmentTransactionLinesDocumentActionBase.class);
080    
081    
082        /**
083         * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#loadDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase)
084         */
085        @Override
086        protected void loadDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
087    
088            super.loadDocument(kualiDocumentFormBase);
089    
090            EndowmentTransactionLinesDocumentFormBase form = (EndowmentTransactionLinesDocumentFormBase) kualiDocumentFormBase;
091            EndowmentTransactionLinesDocumentBase document = form.getEndowmentTransactionLinesDocumentBase();
092    
093            // for documents that have Security Details section update referenced info
094            if (document != null && document instanceof EndowmentSecurityDetailsDocumentBase) {
095    
096                EndowmentSecurityDetailsDocumentBase securityDetailsDocumentBase = (EndowmentSecurityDetailsDocumentBase) document;
097    
098                // source
099                if (securityDetailsDocumentBase.getSourceTransactionSecurity() != null) {
100                    // update security and class code if security ID not empty
101                    if (securityDetailsDocumentBase.getSourceTransactionSecurity().getSecurityID() != null) {
102                        securityDetailsDocumentBase.getSourceTransactionSecurity().refreshReferenceObject(EndowPropertyConstants.TRANSACTION_SECURITY);
103                        securityDetailsDocumentBase.getSourceTransactionSecurity().getSecurity().refreshReferenceObject(EndowPropertyConstants.SECURITY_CLASS_CODE_REF);
104                    }
105                    // update registration code if registration code not empty
106                    if (securityDetailsDocumentBase.getSourceTransactionSecurity().getRegistrationCode() != null) {
107                        securityDetailsDocumentBase.getSourceTransactionSecurity().refreshReferenceObject(EndowPropertyConstants.TRANSACTION_REGISTRATION_CD);
108                    }
109                }
110                // target
111                if (securityDetailsDocumentBase.getTargetTransactionSecurity() != null) {
112                    // update security and class code if security ID not empty
113                    if (securityDetailsDocumentBase.getTargetTransactionSecurity().getSecurityID() != null) {
114                        securityDetailsDocumentBase.getTargetTransactionSecurity().refreshReferenceObject(EndowPropertyConstants.TRANSACTION_SECURITY);
115                        securityDetailsDocumentBase.getTargetTransactionSecurity().getSecurity().refreshReferenceObject(EndowPropertyConstants.SECURITY_CLASS_CODE_REF);
116                    }
117                    // update registration code if registration code not empty
118                    if (securityDetailsDocumentBase.getTargetTransactionSecurity().getRegistrationCode() != null) {
119                        securityDetailsDocumentBase.getTargetTransactionSecurity().refreshReferenceObject(EndowPropertyConstants.TRANSACTION_REGISTRATION_CD);
120                    }
121                }
122            }
123        }
124    
125        /**
126         * @param mapping
127         * @param form
128         * @param request
129         * @param response
130         * @return ActionForward
131         * @throws Exception
132         */
133        public ActionForward importSourceTransactionLines(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
134            importTransactionLines(true, form);
135            return mapping.findForward(KFSConstants.MAPPING_BASIC);
136        }
137    
138        /**
139         * @param mapping
140         * @param form
141         * @param request
142         * @param response
143         * @return ActionForward
144         * @throws Exception
145         */
146        public ActionForward importTargetTransactionLines(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
147    
148            importTransactionLines(false, form);
149            return mapping.findForward(KFSConstants.MAPPING_BASIC);
150        }
151    
152        /**
153         * Cancels import.
154         * 
155         * @param mapping
156         * @param form
157         * @param request
158         * @param response
159         * @return
160         * @throws Exception
161         */
162        public ActionForward cancelImport(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
163            return mapping.findForward(KFSConstants.MAPPING_BASIC);
164        }
165    
166    
167        /**
168         * @param mapping
169         * @param form
170         * @param request
171         * @param response
172         * @return ActionForward
173         * @throws Exception
174         */
175        public void importTransactionLines(boolean isSource, ActionForm form) throws Exception {
176            log.info("Importing item lines");
177    
178            EndowmentTransactionLinesDocumentFormBase tranLineForm = (EndowmentTransactionLinesDocumentFormBase) form;
179            EndowmentTransactionLinesDocument tranLineDocument = (EndowmentTransactionLinesDocument) tranLineForm.getDocument();
180            String documentNumber = tranLineDocument.getDocumentNumber();
181    
182            FormFile lineFile = (isSource ? tranLineForm.getTransactionSourceLinesImportFile() : tranLineForm.getTransactionLineImportFile());
183            Class lineClass = tranLineDocument.getTranLineClass(isSource);
184            List<EndowmentTransactionLine> importedTransactionLines = null;
185    
186            String errorPath = TRANSACTION_LINE_ERRORS;
187            LineParser lineParser = tranLineDocument.getLineParser();
188    
189            // Starting position of the imported items, equals the # of existing above-the-line items.
190            int itemLinePosition = 0;
191            int transactionLineSize = 0;
192            if (isSource) {
193                itemLinePosition = tranLineDocument.getNextSourceLineNumber();
194                transactionLineSize = tranLineDocument.getSourceTransactionLines().size();
195            }
196            else {
197                itemLinePosition = tranLineDocument.getNextTargetLineNumber();
198                transactionLineSize = tranLineDocument.getTargetTransactionLines().size();
199            }
200    
201            try {
202                importedTransactionLines = lineParser.importLines(lineFile, lineClass, documentNumber);
203    
204                // Validate imported items
205                boolean rulePassed = true;
206                int lineNumber = 1;
207                
208    //            for (EndowmentTransactionLine line : importedTransactionLines) {
209    //                 // Before the validation, set the item line number to the same as the line number in the import file (starting from
210    //                 // 1) So that the error message will use the correct line number if there're errors for the current item line.
211    //                 line.setTransactionLineNumber(++lineNumber);
212    //                 
213    //                 if (isSource) {
214    //                     // check any business rules
215    //                     rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddTransactionLineEvent(NEW_SOURCE_TRAN_LINE_PROPERTY_NAME, tranLineDocument, line));
216    //                 } 
217    //                 else                  {
218    //                     // check any business rules
219    //                     rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddTransactionLineEvent(NEW_TARGET_TRAN_LINE_PROPERTY_NAME, tranLineDocument, line));
220    //                 }
221    //            }
222    //
223                if (rulePassed) {
224                    // Add the lines to the collection 1 by one.
225                    for (EndowmentTransactionLine line : importedTransactionLines) {
226                        insertTransactionLine(isSource, tranLineForm, line);
227                    }
228                }
229            }
230            catch (LineParserException e) {
231                GlobalVariables.getMessageMap().putError(errorPath, e.getErrorKey(), e.getErrorParameters());
232            }
233        }
234    
235        /**
236         * This action executes an insert of an EndowmentTargetTransactionLine into a document only after validating the Transaction
237         * line and checking any appropriate business rules.
238         * 
239         * @param mapping
240         * @param form
241         * @param request
242         * @param response
243         * @return
244         * @throws Exception
245         */
246        public ActionForward insertTargetTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
247            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
248            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
249    
250            EndowmentTargetTransactionLine transLine = (EndowmentTargetTransactionLine) documentForm.getNewTargetTransactionLine();
251    
252            boolean rulePassed = true;
253    
254            // check any business rules
255            rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddTransactionLineEvent(NEW_TARGET_TRAN_LINE_PROPERTY_NAME, endowmentDocument, transLine));
256    
257            if (rulePassed) {
258                // add accountingLine
259    
260                // SpringContext.getBean(PersistenceService.class).refreshAllNonUpdatingReferences(transLine);
261                insertTransactionLine(false, documentForm, transLine);
262    
263                // clear the used newTargetLine
264                documentForm.setNewTargetTransactionLine(new EndowmentTargetTransactionLine());
265            }
266    
267            return mapping.findForward(KFSConstants.MAPPING_BASIC);
268        }
269    
270        /**
271         * This action executes an insert of an EndowmentTargetTransactionLine into a document only after validating the Transaction
272         * line and checking any appropriate business rules.
273         * 
274         * @param mapping
275         * @param form
276         * @param request
277         * @param response
278         * @return
279         * @throws Exception
280         */
281        public ActionForward insertSourceTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
282            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
283            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
284    
285            EndowmentSourceTransactionLine transLine = (EndowmentSourceTransactionLine) documentForm.getNewSourceTransactionLine();
286    
287            boolean rulePassed = true;
288    
289            // check any business rules
290            rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new AddTransactionLineEvent(NEW_SOURCE_TRAN_LINE_PROPERTY_NAME, endowmentDocument, transLine));
291    
292            if (rulePassed) {
293                // add accountingLine
294                // SpringContext.getBean(PersistenceService.class).refreshAllNonUpdatingReferences(transLine);
295                insertTransactionLine(true, documentForm, transLine);
296    
297                // clear the used newTargetLine
298                documentForm.setNewSourceTransactionLine(new EndowmentSourceTransactionLine());
299            }
300    
301            return mapping.findForward(KFSConstants.MAPPING_BASIC);
302        }
303    
304        /**
305         * Adds the given transactionLine to the appropriate form-related datastructures.
306         * 
307         * @param isSource
308         * @param etlDocumentForm
309         * @param line
310         */
311        protected void insertTransactionLine(boolean isSource, EndowmentTransactionLinesDocumentFormBase etlDocumentForm, EndowmentTransactionLine line) {
312            EndowmentTransactionLinesDocumentBase etlDoc = etlDocumentForm.getEndowmentTransactionLinesDocumentBase();
313    
314            if (isSource) {
315                // add it to the document
316                etlDoc.addSourceTransactionLine((EndowmentSourceTransactionLine) line);
317            }
318            else {
319                // add it to the document
320                etlDoc.addTargetTransactionLine((EndowmentTargetTransactionLine) line);
321            }
322    
323            // Update the doc total
324            if (etlDoc instanceof AmountTotaling)
325                ((FinancialSystemDocumentHeader) etlDocumentForm.getDocument().getDocumentHeader()).setFinancialDocumentTotalAmount(((AmountTotaling) etlDoc).getTotalDollarAmount());
326        }
327    
328        /**
329         * This action deletes an EndowmentSourceTransactionLine from a document.
330         * 
331         * @param mapping
332         * @param form
333         * @param request
334         * @param response
335         * @return
336         * @throws Exception
337         */
338        public ActionForward deleteSourceTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
339            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
340            EndowmentTransactionLinesDocument etlDoc = etlForm.getEndowmentTransactionLinesDocumentBase();
341    
342            int deleteIndex = getLineToDelete(request);
343            String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + EXISTING_SOURCE_TRAN_LINE_PROPERTY_NAME + "[" + deleteIndex + "]";
344            boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new DeleteTransactionLineEvent(errorPath, etlDoc, etlDoc.getSourceTransactionLine(deleteIndex)));
345    
346            // if the rule evaluation passed, let's delete it
347            if (rulePassed) {
348                deleteTransactionLine(true, etlForm, deleteIndex);
349            }
350            else {
351                String[] errorParams = new String[] { "source", Integer.toString(deleteIndex + 1) };
352                GlobalVariables.getMessageMap().putError(errorPath, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_DELETING_TRANSACTION_LINE, errorParams);
353            }
354    
355            return mapping.findForward(KFSConstants.MAPPING_BASIC);
356        }
357    
358        /**
359         * This action deletes an EndowmentTargetTransactionLine from a document.
360         * 
361         * @param mapping
362         * @param form
363         * @param request
364         * @param response
365         * @return
366         * @throws Exception
367         */
368        public ActionForward deleteTargetTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
369            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
370            EndowmentTransactionLinesDocument etlDoc = etlForm.getEndowmentTransactionLinesDocumentBase();
371    
372            int deleteIndex = getLineToDelete(request);
373            String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + EXISTING_TARGET_TRAN_LINE_PROPERTY_NAME + "[" + deleteIndex + "]";
374            boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new DeleteTransactionLineEvent(errorPath, etlDoc, etlDoc.getTargetTransactionLine(deleteIndex)));
375    
376            // if the rule evaluation passed, let's delete it
377            if (rulePassed) {
378                deleteTransactionLine(false, etlForm, deleteIndex);
379            }
380            else {
381                String[] errorParams = new String[] { "target", Integer.toString(deleteIndex + 1) };
382                GlobalVariables.getMessageMap().putError(errorPath, EndowKeyConstants.EndowmentTransactionDocumentConstants.ERROR_DELETING_TRANSACTION_LINE, errorParams);
383            }
384    
385            return mapping.findForward(KFSConstants.MAPPING_BASIC);
386        }
387    
388        /**
389         * Deletes a Transaction Line.
390         * 
391         * @param isSource
392         * @param etlDocumentForm
393         * @param index
394         */
395        protected void deleteTransactionLine(boolean isSource, EndowmentTransactionLinesDocumentFormBase etlDocumentForm, int index) {
396            if (isSource) {
397                // remove from document
398                etlDocumentForm.getEndowmentTransactionLinesDocumentBase().getSourceTransactionLines().remove(index);
399    
400            }
401            else {
402                // remove from document
403                etlDocumentForm.getEndowmentTransactionLinesDocumentBase().getTargetTransactionLines().remove(index);
404            }
405            // update the doc total
406            EndowmentTransactionLinesDocument tdoc = etlDocumentForm.getEndowmentTransactionLinesDocumentBase();
407            if (tdoc instanceof AmountTotaling) {
408                ((FinancialSystemDocumentHeader) etlDocumentForm.getDocument().getDocumentHeader()).setFinancialDocumentTotalAmount(((AmountTotaling) tdoc).getTotalDollarAmount());
409            }
410        }
411    
412    
413        /**
414         * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#refresh(org.apache.struts.action.ActionMapping,
415         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
416         */
417        @Override
418        public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
419            super.refresh(mapping, form, request, response);
420    
421            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
422            EndowmentTransactionLinesDocumentBase etlDoc = ((EndowmentTransactionLinesDocumentFormBase) form).getEndowmentTransactionLinesDocumentBase();
423    
424            // To Determine if the refresh is coming from Security lookup
425            if (request.getParameterMap().containsKey(SECURITY_SOURCE_REFRESH) || request.getParameterMap().containsKey(SECURITY_TARGET_REFRESH)) {
426                refreshSecurityDetails(mapping, form, request, response);
427            }
428    
429            // To Determine if the refresh is coming from Registration lookup
430            if (request.getParameterMap().containsKey(REGISTRATION_SOURCE_REFRESH) || request.getParameterMap().containsKey(REGISTRATION_TARGET_REFRESH)) {
431                refreshRegistrationDetails(mapping, form, request, response);
432            }
433    
434            // To determine if the refresh is coming from KEMID lookup
435            if (request.getParameterMap().containsKey("newSourceTransactionLine.kemid")) {
436                refreshKemid(etlForm, true);
437            }
438            if (request.getParameterMap().containsKey("newTargetTransactionLine.kemid")) {
439                refreshKemid(etlForm, false);
440            }
441    
442            // To determine if the refresh is coming from Etran Code lookup
443            if (request.getParameterMap().containsKey("newSourceTransactionLine.etranCode")) {
444                refreshEtranCode(etlForm, true);
445            }
446            if (request.getParameterMap().containsKey("newTargetTransactionLine.etranCode")) {
447                refreshEtranCode(etlForm, false);
448            }
449    
450    
451            // balance inquiry anchor is set before doing a balance inquiry
452            if (etlForm.getBalanceInquiryReturnAnchor() != null) {
453                etlForm.setAnchor(etlForm.getBalanceInquiryReturnAnchor());
454                etlForm.setBalanceInquiryReturnAnchor(null);
455            }
456    
457    
458            return mapping.findForward(KFSConstants.MAPPING_BASIC);
459        }
460    
461        /**
462         * Retrieves and sets the reference kemid object on newSourceTransactionLine or newTargetTransactionLine based on the kemid
463         * looked up value.
464         * 
465         * @param etlForm
466         * @param isSource
467         */
468        private void refreshKemid(EndowmentTransactionLinesDocumentFormBase etlForm, boolean isSource) {
469            KEMID kemid = null;
470    
471            if (isSource) {
472                kemid = SpringContext.getBean(KEMIDService.class).getByPrimaryKey(etlForm.getNewSourceTransactionLine().getKemid());
473                etlForm.getNewSourceTransactionLine().setKemidObj(kemid);
474            }
475            else {
476                kemid = SpringContext.getBean(KEMIDService.class).getByPrimaryKey(etlForm.getNewTargetTransactionLine().getKemid());
477                etlForm.getNewTargetTransactionLine().setKemidObj(kemid);
478            }
479    
480        }
481    
482        /**
483         * Retrieves and sets the reference endowment transaction code object on newSourceTransactionLine or newTargetTransactionLine
484         * based on the etranCode looked up value.
485         * 
486         * @param etlForm
487         * @param isSource
488         */
489        private void refreshEtranCode(EndowmentTransactionLinesDocumentFormBase etlForm, boolean isSource) {
490            EndowmentTransactionCode etranCode = null;
491    
492            if (isSource) {
493                etranCode = SpringContext.getBean(EndowmentTransactionCodeService.class).getByPrimaryKey(etlForm.getNewSourceTransactionLine().getEtranCode());
494                etlForm.getNewSourceTransactionLine().setEtranCodeObj(etranCode);
495            }
496            else {
497                etranCode = SpringContext.getBean(EndowmentTransactionCodeService.class).getByPrimaryKey(etlForm.getNewTargetTransactionLine().getEtranCode());
498                etlForm.getNewTargetTransactionLine().setEtranCodeObj(etranCode);
499            }
500    
501        }
502    
503        /**
504         * Retrieves and sets the reference Security object on Source or Target transactionsecurity based on the looked up value.
505         * 
506         * @param mapping
507         * @param form
508         * @param request
509         * @param response
510         * @return
511         * @throws Exception
512         */
513        public ActionForward refreshSecurityDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
514            EndowmentSecurityDetailsDocumentBase endowmentSecurityDetailsDocumentBase = (EndowmentSecurityDetailsDocumentBase) ((EndowmentTransactionLinesDocumentFormBase) form).getDocument();
515    
516            Security security;
517            if (request.getParameterMap().containsKey(SECURITY_SOURCE_REFRESH))
518                security = SpringContext.getBean(SecurityService.class).getByPrimaryKey(endowmentSecurityDetailsDocumentBase.getSourceTransactionSecurity().getSecurityID());
519            else
520                security = SpringContext.getBean(SecurityService.class).getByPrimaryKey(endowmentSecurityDetailsDocumentBase.getTargetTransactionSecurity().getSecurityID());
521    
522            ClassCode classCode = SpringContext.getBean(ClassCodeService.class).getByPrimaryKey(security.getSecurityClassCode());
523            security.setClassCode(classCode);
524            EndowmentTransactionCode endowmentTransactionCode = SpringContext.getBean(EndowmentTransactionCodeService.class).getByPrimaryKey(classCode.getSecurityEndowmentTransactionCode());
525            classCode.setEndowmentTransactionCode(endowmentTransactionCode);
526    
527            if (request.getParameterMap().containsKey(SECURITY_SOURCE_REFRESH))
528                endowmentSecurityDetailsDocumentBase.getSourceTransactionSecurity().setSecurity(security);
529            else
530                endowmentSecurityDetailsDocumentBase.getTargetTransactionSecurity().setSecurity(security);
531    
532            return null;
533        }
534    
535        /**
536         * Retrieves and sets the reference RegistrationCode object on Source or Target transactionsecurity based on the looked up
537         * value.
538         * 
539         * @param mapping
540         * @param form
541         * @param request
542         * @param response
543         * @return
544         * @throws Exception
545         */
546        public ActionForward refreshRegistrationDetails(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
547            EndowmentSecurityDetailsDocumentBase endowmentSecurityDetailsDocumentBase = (EndowmentSecurityDetailsDocumentBase) ((EndowmentTransactionLinesDocumentFormBase) form).getDocument();
548    
549            RegistrationCode registrationCode = null;
550            if (request.getParameterMap().containsKey(REGISTRATION_SOURCE_REFRESH))
551                registrationCode = SpringContext.getBean(RegistrationCodeService.class).getByPrimaryKey(endowmentSecurityDetailsDocumentBase.getSourceTransactionSecurity().getRegistrationCode());
552            else
553                registrationCode = SpringContext.getBean(RegistrationCodeService.class).getByPrimaryKey(endowmentSecurityDetailsDocumentBase.getTargetTransactionSecurity().getRegistrationCode());
554    
555            if (request.getParameterMap().containsKey(REGISTRATION_SOURCE_REFRESH))
556                endowmentSecurityDetailsDocumentBase.getSourceTransactionSecurity().setRegistrationCodeObj(registrationCode);
557            else
558                endowmentSecurityDetailsDocumentBase.getTargetTransactionSecurity().setRegistrationCodeObj(registrationCode);
559    
560            return null;
561        }
562    
563    
564        /**
565         * This method returns the balance inquiry for target transaction lines.
566         * 
567         * @param mapping
568         * @param form
569         * @param request
570         * @param response
571         * @return
572         * @throws Exception
573         */
574        public ActionForward performBalanceInquiryForTargetTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
575            return performBalanceInquiry(false, mapping, form, request, response);
576        }
577    
578        /**
579         * This method returns the balance inquiry for source transaction lines.
580         * 
581         * @param mapping
582         * @param form
583         * @param request
584         * @param response
585         * @return
586         * @throws Exception
587         */
588        public ActionForward performBalanceInquiryForSourceTransactionLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
589            return performBalanceInquiry(true, mapping, form, request, response);
590        }
591    
592        /**
593         * This method provides the KEMIDCurrentBalance as the default lookup object. If a different lookup is needed this method should
594         * be overriden.
595         * 
596         * @param isSource
597         * @param mapping
598         * @param form
599         * @param request
600         * @param response
601         * @return
602         * @throws Exception
603         */
604        public ActionForward performBalanceInquiry(boolean isSource, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
605            String boName = KEMIDCurrentBalance.class.getName();
606            return performBalanceInquiry(isSource, boName, mapping, form, request, response);
607        }
608    
609        /**
610         * This method is similar to org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase.performBalanceInquiry()
611         * 
612         * @param isRevenue
613         * @param mapping
614         * @param form
615         * @param request
616         * @param response
617         * @return
618         * @throws Exception
619         */
620        public ActionForward performBalanceInquiry(boolean isSource, String boName, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
621            final String docNumber;
622    
623            // get the selected line, setup parms and redirect to balance inquiry
624            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
625            EndowmentTransactionLinesDocumentBase etlDoc = ((EndowmentTransactionLinesDocumentFormBase) form).getEndowmentTransactionLinesDocumentBase();
626    
627    
628            // when we return from the lookup, our next request's method to call is going to be refresh
629            etlForm.registerEditableProperty(KNSConstants.DISPATCH_REQUEST_PARAMETER);
630    
631            EndowmentTransactionLine etLine;
632            if (isSource) {
633                etLine = etlDoc.getSourceTransactionLines().get(this.getSelectedLine(request));
634            }
635            else {
636                etLine = etlDoc.getTargetTransactionLines().get(this.getSelectedLine(request));
637            }
638    
639            // build out base path for return location, use config service
640            String basePath = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.APPLICATION_URL_KEY);
641    
642            // this hack sets the return anchor we want to return too after the inquiry
643            // do this here so it gets into the session stored form version
644            // refresh checks for this after and resets the anchor
645            if (form instanceof KualiForm && StringUtils.isNotEmpty(((KualiForm) form).getAnchor())) {
646                etlForm.setBalanceInquiryReturnAnchor(((KualiForm) form).getAnchor());
647            }
648    
649            // build out the actual form key that will be used to retrieve the form on refresh
650            String callerDocFormKey = GlobalVariables.getUserSession().addObject(form);
651    
652            // now add required parameters
653            Properties params = new Properties();
654            params.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.SEARCH_METHOD);
655            params.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, boName);
656            params.put(KFSConstants.DOC_FORM_KEY, GlobalVariables.getUserSession().addObject(form));
657            params.put(KFSConstants.HIDE_LOOKUP_RETURN_LINK, "true");
658            params.put(KFSConstants.RETURN_LOCATION_PARAMETER, basePath + mapping.getPath() + ".do");
659    
660            if (StringUtils.isNotBlank(etLine.getKemid())) {
661                params.put(EndowPropertyConstants.KEMID, etLine.getKemid());
662            }
663    
664            String lookupUrl = UrlFactory.parameterizeUrl(KFSConstants.LOOKUP_ACTION, params);
665    
666            this.setupDocumentExit();
667            return new ActionForward(lookupUrl, true);
668        }
669    
670    
671    }