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    
021    import javax.servlet.http.HttpServletRequest;
022    import javax.servlet.http.HttpServletResponse;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.apache.struts.action.ActionForm;
026    import org.apache.struts.action.ActionForward;
027    import org.apache.struts.action.ActionMapping;
028    import org.kuali.kfs.module.endow.EndowConstants;
029    import org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine;
030    import org.kuali.kfs.module.endow.document.AssetDecreaseDocument;
031    import org.kuali.kfs.module.endow.document.EndowmentTaxLotLinesDocument;
032    import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocument;
033    import org.kuali.kfs.module.endow.document.EndowmentTransactionLinesDocumentBase;
034    import org.kuali.kfs.module.endow.document.SecurityTransferDocument;
035    import org.kuali.kfs.module.endow.document.validation.event.DeleteTaxLotLineEvent;
036    import org.kuali.kfs.module.endow.document.validation.event.RefreshTransactionLineEvent;
037    import org.kuali.kfs.sys.KFSConstants;
038    import org.kuali.kfs.sys.businessobject.FinancialSystemDocumentHeader;
039    import org.kuali.kfs.sys.context.SpringContext;
040    import org.kuali.kfs.sys.document.AmountTotaling;
041    import org.kuali.rice.kns.service.KualiRuleService;
042    import org.kuali.rice.kns.util.KNSConstants;
043    
044    public abstract class EndowmentTaxLotLinesDocumentActionBase extends EndowmentTransactionLinesDocumentActionBase {
045    
046        /**
047         * Updates the tax lots for the given transaction line.
048         * 
049         * @param isSource
050         * @param etlDocument
051         * @param transLine
052         */
053        protected abstract void updateTransactionLineTaxLots(boolean isUpdate, boolean isSource, EndowmentTransactionLinesDocument etlDocument, EndowmentTransactionLine transLine);
054    
055        /**
056         * Updates the tax lots for the given document.
057         * 
058         * @param isSource
059         * @param etlDocument
060         */
061        protected void updateTaxLots(EndowmentTransactionLinesDocument etlDocument) {
062    
063    
064            if (etlDocument.getSourceTransactionLines() != null) {
065                for (int i = 0; i < etlDocument.getSourceTransactionLines().size(); i++) {
066                    EndowmentTransactionLine endowmentTransactionLine = (EndowmentTransactionLine) etlDocument.getSourceTransactionLines().get(i);
067                    boolean rulePassed = true;
068                    // check any business rules
069                    rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new RefreshTransactionLineEvent(EXISTING_SOURCE_TRAN_LINE_PROPERTY_NAME, etlDocument, endowmentTransactionLine, i));
070    
071                    if (rulePassed) {
072                        updateTransactionLineTaxLots(true, true, etlDocument, endowmentTransactionLine);
073                    }
074    
075                }
076            }
077    
078            if (etlDocument.getTargetTransactionLines() != null) {
079                for (int i = 0; i < etlDocument.getTargetTransactionLines().size(); i++) {
080                    EndowmentTransactionLine endowmentTransactionLine = (EndowmentTransactionLine) etlDocument.getTargetTransactionLines().get(i);
081                    boolean rulePassed = true;
082                    // check any business rules
083                    rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new RefreshTransactionLineEvent(EXISTING_TARGET_TRAN_LINE_PROPERTY_NAME, etlDocument, endowmentTransactionLine, i));
084    
085                    if (rulePassed) {
086                        updateTransactionLineTaxLots(true, false, etlDocument, endowmentTransactionLine);
087                    }
088                }
089            }
090        }
091    
092        /**
093         * Refreshes the tax lots for the selected target transaction line.
094         * 
095         * @param mapping
096         * @param form
097         * @param request
098         * @param response
099         * @return
100         * @throws Exception
101         */
102        public ActionForward refreshTargetTaxLots(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
103            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
104            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
105            int selectedLine = this.getSelectedLine(request);
106            EndowmentTransactionLine transLine = endowmentDocument.getTargetTransactionLines().get(selectedLine);
107    
108            boolean rulePassed = true;
109    
110            // check any business rules
111            rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new RefreshTransactionLineEvent(EXISTING_TARGET_TRAN_LINE_PROPERTY_NAME, endowmentDocument, transLine, selectedLine));
112    
113            if (rulePassed) {
114                updateTransactionLineTaxLots(false, false, endowmentDocument, transLine);
115            }
116    
117            if (endowmentDocument instanceof AmountTotaling)
118                ((FinancialSystemDocumentHeader) documentForm.getDocument().getDocumentHeader()).setFinancialDocumentTotalAmount(((AmountTotaling) endowmentDocument).getTotalDollarAmount());
119    
120            return mapping.findForward(KFSConstants.MAPPING_BASIC);
121        }
122    
123        /**
124         * Refreshes the tax lots for the selected source transaction line.
125         * 
126         * @param mapping
127         * @param form
128         * @param request
129         * @param response
130         * @return
131         * @throws Exception
132         */
133        public ActionForward refreshSourceTaxLots(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
134            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
135            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
136            int selectedLine = this.getSelectedLine(request);
137            EndowmentTransactionLine transLine = endowmentDocument.getSourceTransactionLines().get(selectedLine);
138    
139            boolean rulePassed = true;
140            // check any business rules
141            rulePassed &= SpringContext.getBean(KualiRuleService.class).applyRules(new RefreshTransactionLineEvent(EXISTING_SOURCE_TRAN_LINE_PROPERTY_NAME, endowmentDocument, transLine, selectedLine));
142    
143            if (rulePassed) {
144                updateTransactionLineTaxLots(false, true, endowmentDocument, transLine);
145            }
146    
147            if (endowmentDocument instanceof AmountTotaling)
148                ((FinancialSystemDocumentHeader) documentForm.getDocument().getDocumentHeader()).setFinancialDocumentTotalAmount(((AmountTotaling) endowmentDocument).getTotalDollarAmount());
149    
150    
151            return mapping.findForward(KFSConstants.MAPPING_BASIC);
152        }
153    
154        /**
155         * @see org.kuali.kfs.module.endow.document.web.struts.EndowmentTransactionLinesDocumentActionBase#insertTransactionLine(boolean,
156         *      org.kuali.kfs.module.endow.document.web.struts.EndowmentTransactionLinesDocumentFormBase,
157         *      org.kuali.kfs.module.endow.businessobject.EndowmentTransactionLine)
158         */
159        @Override
160        protected void insertTransactionLine(boolean isSource, EndowmentTransactionLinesDocumentFormBase etlDocumentForm, EndowmentTransactionLine line) {
161            EndowmentTransactionLinesDocumentBase etlDoc = etlDocumentForm.getEndowmentTransactionLinesDocumentBase();
162    
163            super.insertTransactionLine(isSource, etlDocumentForm, line);
164    
165            updateTransactionLineTaxLots(false, isSource, etlDoc, line);
166        }
167    
168        /**
169         * Deletes a source tax lot line.
170         * 
171         * @param mapping
172         * @param form
173         * @param request
174         * @param response
175         * @return
176         * @throws Exception
177         */
178        public ActionForward deleteSourceTaxLotLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
179            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
180            EndowmentTaxLotLinesDocument etlDoc = (EndowmentTaxLotLinesDocument) etlForm.getEndowmentTransactionLinesDocumentBase();
181    
182            int transLineindex = getLineToDelete(request);
183            int taxLotIndex = getTaxLotToDelete(request);
184            String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + EndowConstants.EXISTING_SOURCE_TRAN_LINE_PROPERTY_NAME + "[" + transLineindex + "]";
185            EndowmentTransactionLine transLine = (EndowmentTransactionLine) etlDoc.getSourceTransactionLines().get(transLineindex);
186            boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new DeleteTaxLotLineEvent(errorPath, etlDoc, transLine.getTaxLotLines().get(taxLotIndex), transLine, transLineindex, taxLotIndex));
187    
188            // if the rule evaluation passed, let's delete it
189            if (rulePassed) {
190                deleteTaxLot(true, etlForm, transLineindex, taxLotIndex);
191                updateTransactionLineTaxLots(true, true, etlDoc, transLine);
192            }
193    
194            return mapping.findForward(KFSConstants.MAPPING_BASIC);
195        }
196    
197        /**
198         * Deletes a target tax lot line
199         * 
200         * @param mapping
201         * @param form
202         * @param request
203         * @param response
204         * @return
205         * @throws Exception
206         */
207        public ActionForward deleteTargetTaxLotLine(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
208            EndowmentTransactionLinesDocumentFormBase etlForm = (EndowmentTransactionLinesDocumentFormBase) form;
209            EndowmentTaxLotLinesDocument etlDoc = (EndowmentTaxLotLinesDocument) etlForm.getEndowmentTransactionLinesDocumentBase();
210    
211            int transLineindex = getLineToDelete(request);
212            int taxLotIndex = getTaxLotToDelete(request);
213            String errorPath = KFSConstants.DOCUMENT_PROPERTY_NAME + "." + EndowConstants.EXISTING_TARGET_TRAN_LINE_PROPERTY_NAME + "[" + transLineindex + "]";
214            EndowmentTransactionLine transLine = (EndowmentTransactionLine) etlDoc.getTargetTransactionLines().get(transLineindex);
215            boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new DeleteTaxLotLineEvent(errorPath, etlDoc, transLine.getTaxLotLines().get(taxLotIndex), transLine, transLineindex, taxLotIndex));
216    
217            // if the rule evaluation passed, let's delete it
218            if (rulePassed) {
219                deleteTaxLot(false, etlForm, transLineindex, taxLotIndex);
220                updateTransactionLineTaxLots(true, false, etlDoc, transLine);
221            }
222    
223            return mapping.findForward(KFSConstants.MAPPING_BASIC);
224        }
225    
226        /**
227         * Deletes a tax lot.
228         * 
229         * @param isSource
230         * @param etlDocumentForm
231         * @param transLineindex
232         * @param taxLotIndex
233         */
234        private void deleteTaxLot(boolean isSource, EndowmentTransactionLinesDocumentFormBase etlDocumentForm, int transLineindex, int taxLotIndex) {
235            if (isSource) {
236                etlDocumentForm.getEndowmentTransactionLinesDocumentBase().getSourceTransactionLines().get(transLineindex).getTaxLotLines().remove(taxLotIndex);
237            }
238            else {
239                etlDocumentForm.getEndowmentTransactionLinesDocumentBase().getTargetTransactionLines().get(transLineindex).getTaxLotLines().remove(taxLotIndex);
240            }
241        }
242    
243        /**
244         * Gets the index of the tax lot line to be deleted.
245         * 
246         * @param request
247         * @return the index of the tax lot line to be deleted
248         */
249        protected int getTaxLotToDelete(HttpServletRequest request) {
250            int selectedTaxLot = -1;
251            String parameterName = (String) request.getAttribute(KNSConstants.METHOD_TO_CALL_ATTRIBUTE);
252            if (StringUtils.isNotBlank(parameterName)) {
253                String lotNumber = StringUtils.substringBetween(parameterName, ".taxLot", ".");
254                selectedTaxLot = Integer.parseInt(lotNumber);
255            }
256    
257            return selectedTaxLot;
258        }
259    
260        /**
261         * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#save(org.apache.struts.action.ActionMapping,
262         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
263         */
264        @Override
265        public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
266    
267            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
268            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
269    
270            // on AssetDecreaseDocument and SecurityTransferDocument we can delete tax lots and that would be overridden by this
271            // updateTaxLots call
272            if (getRefreshTaxLotsOnSaveOrSubmit()) {
273                updateTaxLots(endowmentDocument);
274            }
275    
276            return super.save(mapping, form, request, response);
277        }
278    
279        /**
280         * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#route(org.apache.struts.action.ActionMapping,
281         *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
282         */
283        @Override
284        public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
285    
286            EndowmentTransactionLinesDocumentFormBase documentForm = (EndowmentTransactionLinesDocumentFormBase) form;
287            EndowmentTransactionLinesDocument endowmentDocument = (EndowmentTransactionLinesDocument) documentForm.getDocument();
288    
289            // on AssetDecreaseDocument and SecurityTransferDocument we can delete tax lots and that would be overridden by this
290            // updateTaxLots call
291            if (getRefreshTaxLotsOnSaveOrSubmit()) {
292                updateTaxLots(endowmentDocument);
293            }
294    
295            return super.route(mapping, form, request, response);
296        }
297    
298        /**
299         * Tells whether the tax lot lines related to the transaction lines should be refreshed on save or submit. For documents that
300         * support tax lots deletion this method should return false. For documents that do not support tax lots deletion this method
301         * can return true so that the tax lots are updated on save or submit.
302         * 
303         * @return true or false depending on the document
304         */
305        abstract protected boolean getRefreshTaxLotsOnSaveOrSubmit();
306    }