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.pdp.web.struts;
017    
018    import java.text.MessageFormat;
019    import java.util.HashMap;
020    import java.util.List;
021    import java.util.Map;
022    import java.util.Properties;
023    
024    import javax.servlet.http.HttpServletRequest;
025    import javax.servlet.http.HttpServletResponse;
026    
027    import org.apache.commons.lang.StringUtils;
028    import org.apache.struts.action.ActionForm;
029    import org.apache.struts.action.ActionForward;
030    import org.apache.struts.action.ActionMapping;
031    import org.kuali.kfs.pdp.PdpKeyConstants;
032    import org.kuali.kfs.pdp.PdpParameterConstants;
033    import org.kuali.kfs.pdp.PdpPropertyConstants;
034    import org.kuali.kfs.pdp.businessobject.PaymentDetail;
035    import org.kuali.kfs.pdp.service.PaymentMaintenanceService;
036    import org.kuali.kfs.pdp.util.PdpPaymentDetailQuestionCallback;
037    import org.kuali.kfs.sys.KFSConstants;
038    import org.kuali.kfs.sys.context.SpringContext;
039    import org.kuali.rice.kim.bo.Person;
040    import org.kuali.rice.kns.question.ConfirmationQuestion;
041    import org.kuali.rice.kns.service.BusinessObjectService;
042    import org.kuali.rice.kns.service.KNSServiceLocator;
043    import org.kuali.rice.kns.service.KualiConfigurationService;
044    import org.kuali.rice.kns.util.ErrorMessage;
045    import org.kuali.rice.kns.util.GlobalVariables;
046    import org.kuali.rice.kns.util.KNSConstants;
047    import org.kuali.rice.kns.util.MessageMap;
048    import org.kuali.rice.kns.util.ObjectUtils;
049    import org.kuali.rice.kns.util.UrlFactory;
050    import org.kuali.rice.kns.web.struts.action.KualiAction;
051    
052    /**
053     * This class defines actions for Payment
054     */
055    public class PaymentDetailAction extends KualiAction {
056    
057        private PaymentMaintenanceService paymentMaintenanceService;
058        private BusinessObjectService businessObjectService;
059    
060        /**
061         * Constructs a PaymentDetailAction.java.
062         */
063        public PaymentDetailAction() {
064            setPaymentMaintenanceService(SpringContext.getBean(PaymentMaintenanceService.class));
065            setBusinessObjectService(SpringContext.getBean(BusinessObjectService.class));
066            
067        }
068    
069        /**
070         * This method confirms and cancels a payment.
071         * @param mapping
072         * @param form
073         * @param request
074         * @param response
075         * @return
076         * @throws Exception
077         */
078        public ActionForward confirmAndCancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
079    
080            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
081                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
082                    return performCancel( paymentDetailId, changeText, user);
083                }
084            };
085            
086            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_PAYMENT_QUESTION, PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_PAYMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.PAYMENT_SUCCESSFULLY_CANCELED, "confirmAndCancel", callback);
087        }
088        
089        /**
090         * This method cancels a payment.
091         * @param paymentDetailId the payment detail id.
092         * @param changeText the text of the change
093         * @param user the user that perfomed the change
094         * @return true if payment successfully canceled, false otherwise
095         */
096        private boolean performCancel(int paymentDetailId, String changeText, Person user) {
097    
098            Map keyMap = new HashMap();
099            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
100    
101            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
102            if (ObjectUtils.isNotNull(paymentDetail)) {
103                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
104                return paymentMaintenanceService.cancelPendingPayment(paymentGroupId, paymentDetailId, changeText, user);
105            }
106            else {
107                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
108                return false;
109            }
110        }
111    
112        /**
113         * This method confirms and holds a payment
114         * 
115         * @param mapping
116         * @param form
117         * @param request
118         * @param response
119         * @return
120         * @throws Exception
121         */
122        public ActionForward confirmAndHold(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
123            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
124                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
125                    return performHold( paymentDetailId, changeText, user);
126                }
127            };
128            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.HOLD_PAYMENT_QUESTION,  PdpKeyConstants.PaymentDetail.Confirmation.HOLD_PAYMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.PAYMENT_SUCCESSFULLY_HOLD, "confirmAndHold", callback);
129        }
130    
131        /**
132    
133         */
134        /**
135         * This method performs a hold on a payment.
136         * @param paymentDetailId the payment detail id
137         * @param changeText the text of the user change
138         * @param user the user that performed the change
139         * @return true if payment successfully held, false otherwise
140         */
141        private boolean performHold(int paymentDetailId, String changeText, Person user) {
142    
143            Map keyMap = new HashMap();
144            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
145    
146            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
147            if (ObjectUtils.isNotNull(paymentDetail)) {
148                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
149                return paymentMaintenanceService.holdPendingPayment(paymentGroupId, changeText, user);
150            }
151            else {
152                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
153                return false;
154            }
155        }
156    
157        /**
158         * This method confirms and removes a hold on a payment.
159         * 
160         * @param mapping
161         * @param form
162         * @param request
163         * @param response
164         * @return an ActionForward
165         * @throws Exception
166         */
167        public ActionForward confirmAndRemoveHold(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
168            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
169                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
170                    return performRemoveHold( paymentDetailId, changeText, user);
171                }
172            };
173            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.REMOVE_HOLD_PAYMENT_QUESTION,  PdpKeyConstants.PaymentDetail.Confirmation.REMOVE_HOLD_PAYMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.HOLD_SUCCESSFULLY_REMOVED_ON_PAYMENT, "confirmAndRemoveHold", callback);
174        }
175    
176        /**
177         * This method removes a hold on payment.
178         * @param paymentDetailId the payment detail id
179         * @param changeText the text of the user change
180         * @param user the user that performs the change
181         * @return true if hold successfully removed from payment, false otherwise
182         */
183        private boolean performRemoveHold(int paymentDetailId, String changeText, Person user) {
184    
185            Map keyMap = new HashMap();
186            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
187    
188            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
189            if (ObjectUtils.isNotNull(paymentDetail)) {
190                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
191                return paymentMaintenanceService.removeHoldPendingPayment(paymentGroupId, changeText, user);
192            }
193            else {
194                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
195                return false;
196            }
197        }
198    
199        /**
200         * This method confirms and sets the immediate flag.
201         * @param mapping
202         * @param form
203         * @param request
204         * @param response
205         * @return an ActionForward
206         * @throws Exception
207         */
208        public ActionForward confirmAndSetImmediate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
209    
210            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
211                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
212                     return performSetImmediate(paymentDetailId, changeText, user);
213                     
214                }
215            };
216            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.CHANGE_IMMEDIATE_PAYMENT_QUESTION,  PdpKeyConstants.PaymentDetail.Confirmation.CHANGE_IMMEDIATE_PAYMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.PAYMENT_SUCCESSFULLY_SET_AS_IMMEDIATE, "confirmAndSetImmediate", callback);
217        }
218    
219        /**
220         * This method sets the immediate flag
221         * @param paymentDetailId the payment detail id
222         * @param changeText the text of the change
223         * @param user the user that performed the change
224         * @return true if flag successfully set on payment, false otherwise
225         */
226        private boolean performSetImmediate(int paymentDetailId, String changeText, Person user) {
227            Map keyMap = new HashMap();
228            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
229    
230            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
231            if (ObjectUtils.isNotNull(paymentDetail)) {
232                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
233                paymentMaintenanceService.changeImmediateFlag(paymentGroupId, changeText, user);
234                return true;
235            }
236            else {
237                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
238                return false;
239            }
240           
241        }
242    
243        /**
244         * This method confirms and removes the immediate flag.
245         * @param mapping
246         * @param form
247         * @param request
248         * @param response
249         * @return
250         * @throws Exception
251         */
252        public ActionForward confirmAndRemoveImmediate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
253            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
254                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
255                     return performSetImmediate(paymentDetailId, changeText, user);
256                     
257                }
258            };
259            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.CHANGE_IMMEDIATE_PAYMENT_QUESTION,  PdpKeyConstants.PaymentDetail.Confirmation.CHANGE_IMMEDIATE_PAYMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.IMMEDIATE_SUCCESSFULLY_REMOVED_ON_PAYMENT, "confirmAndRemoveImmediate", callback);
260        }
261    
262        /**
263         * This method confirms and cancels a disbursement.
264         * @param mapping
265         * @param form
266         * @param request
267         * @param response
268         * @return an ActionForward
269         * @throws Exception
270         */
271        public ActionForward confirmAndCancelDisbursement(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
272            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
273                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
274                    return performCancelDisbursement( paymentDetailId, changeText, user);
275                }
276            };
277            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_DISBURSEMENT_QUESTION,  PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_DISBURSEMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.DISBURSEMENT_SUCCESSFULLY_CANCELED, "confirmAndRemoveHold", callback);
278        }
279    
280        /**
281         * This method cancels a disbursement
282         * @param paymentDetailId the payment detail id
283         * @param changeText the text entered by user
284         * @param user the user that canceled the disbursement
285         * @return true if disbursement successfully canceled, false otherwise
286         */
287        private boolean performCancelDisbursement(int paymentDetailId, String changeText, Person user) {
288            Map keyMap = new HashMap();
289            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
290    
291            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
292            if (ObjectUtils.isNotNull(paymentDetail)) {
293                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
294                return paymentMaintenanceService.cancelDisbursement(paymentGroupId, paymentDetailId, changeText, user);
295            }
296            else {
297                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
298                return false;
299            }
300        }
301    
302        /**
303         * This method confirms an reissues/cancels a disbursement.
304         * @param mapping
305         * @param form
306         * @param request
307         * @param response
308         * @return
309         * @throws Exception
310         */
311        public ActionForward confirmAndReIssueCancel(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
312            PdpPaymentDetailQuestionCallback callback = new PdpPaymentDetailQuestionCallback() {
313                public boolean doPostQuestion(int paymentDetailId, String changeText, Person user) {
314                    return performReIssueDisbursement( paymentDetailId, changeText, user);
315                }
316            };
317            return askQuestionWithInput(mapping, form, request, response,  PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_REISSUE_DISBURSEMENT_QUESTION, PdpKeyConstants.PaymentDetail.Confirmation.CANCEL_REISSUE_DISBURSEMENT_MESSAGE, PdpKeyConstants.PaymentDetail.Messages.DISBURSEMENT_SUCCESSFULLY_CANCELED, "confirmAndReissueCancel", callback);
318        }
319    
320        /**
321         * This method reissue/cancels a disbursement
322         * @param paymentDetailId the payment detail id
323         * @param changeText the text entered by the user 
324         * @param user the user that canceled the disbursement
325         * @return true if disbursement successfully reissued/canceled, false otherwise
326         */
327        private boolean performReIssueDisbursement(int paymentDetailId, String changeText, Person user) {
328            Map keyMap = new HashMap();
329            keyMap.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
330    
331            PaymentDetail paymentDetail = (PaymentDetail) businessObjectService.findByPrimaryKey(PaymentDetail.class, keyMap);
332            if (ObjectUtils.isNotNull(paymentDetail)) {
333                int paymentGroupId = paymentDetail.getPaymentGroupId().intValue();
334                return paymentMaintenanceService.cancelReissueDisbursement(paymentGroupId, changeText, user);
335            }
336            else {
337                GlobalVariables.getMessageMap().putError(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, PdpKeyConstants.PaymentDetail.ErrorMessages.ERROR_PAYMENT_NOT_FOUND);
338                return false;
339            }
340        }
341        
342        /**
343         * This method prompts for a reason to perform an action on a payment detail.
344         * 
345         * @param mapping
346         * @param form
347         * @param request
348         * @param response
349         * @param confirmationQuestion
350         * @param confirmationText
351         * @param caller
352         * @param callback
353         * @return
354         * @throws Exception
355         */
356        private ActionForward askQuestionWithInput(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, String confirmationQuestion, String confirmationText, String successMessage, String caller, PdpPaymentDetailQuestionCallback callback) throws Exception {
357            Object question = request.getParameter(KNSConstants.QUESTION_INST_ATTRIBUTE_NAME);
358            String reason = request.getParameter(KNSConstants.QUESTION_REASON_ATTRIBUTE_NAME);
359            String noteText = KFSConstants.EMPTY_STRING;
360            Person person = GlobalVariables.getUserSession().getPerson();
361            boolean actionStatus;
362            String message = KFSConstants.EMPTY_STRING;
363    
364            String paymentDetailId = request.getParameter(PdpParameterConstants.PaymentDetail.DETAIL_ID_PARAM);
365            if (paymentDetailId == null) {
366                paymentDetailId = request.getParameter(KNSConstants.QUESTION_CONTEXT);
367            }
368    
369            KualiConfigurationService kualiConfiguration = KNSServiceLocator.getKualiConfigurationService();
370            confirmationText = kualiConfiguration.getPropertyString(confirmationText);
371            confirmationText = MessageFormat.format(confirmationText, paymentDetailId);
372    
373            if (question == null) {
374              
375                // ask question if not already asked
376                return this.performQuestionWithInput(mapping, form, request, response, confirmationQuestion, confirmationText, KNSConstants.CONFIRMATION_QUESTION, caller, paymentDetailId);
377            }
378            else {
379                Object buttonClicked = request.getParameter(KNSConstants.QUESTION_CLICKED_BUTTON);
380                if ((confirmationQuestion.equals(question)) && ConfirmationQuestion.NO.equals(buttonClicked)) {
381                    actionStatus = false;
382                }
383                else {
384                    noteText = reason;
385                    int noteTextLength = (reason == null) ? 0 : noteText.length();
386                    int noteTextMaxLength = PdpKeyConstants.BatchConstants.Confirmation.NOTE_TEXT_MAX_LENGTH;
387    
388                    if (StringUtils.isBlank(reason)) {
389    
390                        if (reason == null) {
391                            // prevent a NPE by setting the reason to a blank string
392                            reason = KFSConstants.EMPTY_STRING;
393                        }
394                        return this.performQuestionWithInputAgainBecauseOfErrors(mapping, form, request, response, confirmationQuestion, confirmationText, KNSConstants.CONFIRMATION_QUESTION, KFSConstants.MAPPING_BASIC, paymentDetailId, reason, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_NOTE_EMPTY, KNSConstants.QUESTION_REASON_ATTRIBUTE_NAME, "");
395                    }
396                    else if (noteTextLength > noteTextMaxLength) {
397                        return this.performQuestionWithInputAgainBecauseOfErrors(mapping, form, request, response, confirmationQuestion, confirmationText, KNSConstants.CONFIRMATION_QUESTION, KFSConstants.MAPPING_BASIC, paymentDetailId, reason, PdpKeyConstants.BatchConstants.ErrorMessages.ERROR_NOTE_TOO_LONG, KNSConstants.QUESTION_REASON_ATTRIBUTE_NAME, "");
398                    }
399    
400                    actionStatus = callback.doPostQuestion(Integer.parseInt(paymentDetailId), noteText, person);
401                    if (actionStatus) {
402                        message = successMessage;
403                    }
404    
405                }
406            }
407    
408            String returnUrl = buildUrl(paymentDetailId, actionStatus, message, buildErrorMesageKeyList());
409            return new ActionForward(returnUrl, true);
410        }
411        
412        /**
413         * This method builds the forward url.
414         * 
415         * @param paymentDetailId the payment detail id
416         * @param success action status: true if success, false otherwise
417         * @param message the message for the user
418         * @return the build url
419         */
420        private String buildUrl(String paymentDetailId, boolean success, String message, String errorList) {
421            String basePath = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSConstants.APPLICATION_URL_KEY);
422    
423            Properties parameters = new Properties();
424            parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KFSConstants.SEARCH_METHOD);
425            parameters.put(KFSConstants.BACK_LOCATION, basePath + "/" + KFSConstants.MAPPING_PORTAL + ".do");
426            parameters.put(KNSConstants.DOC_FORM_KEY, "88888888");
427            parameters.put(KFSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, PaymentDetail.class.getName());
428            parameters.put(KFSConstants.HIDE_LOOKUP_RETURN_LINK, "true");
429            parameters.put(KFSConstants.SUPPRESS_ACTIONS, "false");
430            parameters.put(PdpPropertyConstants.PaymentDetail.PAYMENT_ID, paymentDetailId);
431            parameters.put(PdpParameterConstants.ACTION_SUCCESSFUL_PARAM, String.valueOf(success));
432            if (message != null && !message.equalsIgnoreCase(KFSConstants.EMPTY_STRING)) {
433                parameters.put(PdpParameterConstants.MESSAGE_PARAM, message);
434            }
435    
436            if (StringUtils.isNotEmpty(errorList)) {
437                parameters.put(PdpParameterConstants.ERROR_KEY_LIST_PARAM, errorList);
438            }
439    
440            String lookupUrl = UrlFactory.parameterizeUrl(basePath + "/" + KFSConstants.LOOKUP_ACTION, parameters);
441    
442            return lookupUrl;
443        }
444        
445        /**
446         * This method build a string list of error message keys out of the error map in GlobalVariables
447         * 
448         * @return a String representing the list of error message keys
449         */
450        private String buildErrorMesageKeyList() {
451            MessageMap errorMap = GlobalVariables.getMessageMap();
452            StringBuffer errorList = new StringBuffer();
453    
454            for (String errorKey : (List<String>) errorMap.getPropertiesWithErrors()) {
455                for (ErrorMessage errorMessage : (List<ErrorMessage>) errorMap.getMessages(errorKey)) {
456    
457                    errorList.append(errorMessage.getErrorKey());
458                    errorList.append(PdpParameterConstants.ERROR_KEY_LIST_SEPARATOR);
459                }
460            }
461            if (errorList.length() > 0) {
462                errorList.replace(errorList.lastIndexOf(PdpParameterConstants.ERROR_KEY_LIST_SEPARATOR), errorList.lastIndexOf(PdpParameterConstants.ERROR_KEY_LIST_SEPARATOR) + PdpParameterConstants.ERROR_KEY_LIST_SEPARATOR.length(), "");
463            }
464    
465            return errorList.toString();
466        }
467    
468        /**
469         * This method gets the payment maintenance service
470         * @return the paymentMaintenanceService
471         */
472        public PaymentMaintenanceService getPaymentMaintenanceService() {
473            return paymentMaintenanceService;
474        }
475    
476        /**
477         * This method sets the payment maintenance service
478         * @param paymentMaintenanceService
479         */
480        public void setPaymentMaintenanceService(PaymentMaintenanceService paymentMaintenanceService) {
481            this.paymentMaintenanceService = paymentMaintenanceService;
482        }
483    
484        /**
485         * This method gets the business object service
486         * @return the businessObjectService
487         */
488        public BusinessObjectService getBusinessObjectService() {
489            return businessObjectService;
490        }
491    
492        /**
493         * This method sets the business object service.
494         * @param businessObjectService
495         */
496        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
497            this.businessObjectService = businessObjectService;
498        }
499    
500    }
501