001    /*
002     * Copyright 2011 The Kuali Foundation.
003     * 
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     * http://www.opensource.org/licenses/ecl2.php
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.kfs.module.ar.document.validation.impl;
017    
018    import static org.kuali.kfs.sys.document.validation.impl.AccountingDocumentRuleBaseConstants.ERROR_PATH.DOCUMENT_ERROR_PREFIX;
019    
020    import java.util.Collection;
021    import java.util.HashMap;
022    import java.util.Map;
023    
024    import org.apache.commons.lang.StringUtils;
025    import org.kuali.kfs.module.ar.ArKeyConstants;
026    import org.kuali.kfs.module.ar.ArPropertyConstants;
027    import org.kuali.kfs.module.ar.document.CustomerInvoiceWriteoffDocument;
028    import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
029    import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService;
030    import org.kuali.kfs.sys.context.SpringContext;
031    import org.kuali.kfs.sys.document.validation.GenericValidation;
032    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
033    import org.kuali.rice.kew.exception.WorkflowException;
034    import org.kuali.rice.kim.bo.Person;
035    import org.kuali.rice.kns.exception.UnknownDocumentIdException;
036    import org.kuali.rice.kns.service.BusinessObjectService;
037    import org.kuali.rice.kns.util.GlobalVariables;
038    import org.kuali.rice.kns.util.ObjectUtils;
039    import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
040    import org.kuali.rice.kns.workflow.service.WorkflowDocumentService;
041    
042    public class CustomerInvoiceWriteoffNoOtherWriteoffInRouteForTheInvoiceValidation extends GenericValidation {
043    
044        private CustomerInvoiceWriteoffDocument customerInvoiceWriteoffDocument;
045        private BusinessObjectService businessObjectService;
046        private WorkflowDocumentService workflowDocumentService;
047        
048        public boolean validate(AttributedDocumentEvent event) {
049        
050            String invoiceDocumentNumber = customerInvoiceWriteoffDocument.getFinancialDocumentReferenceInvoiceNumber();
051            KualiWorkflowDocument workflowDocument;
052            boolean success = true;
053            
054            Map<String, String> fieldValues = new HashMap<String, String>();
055            fieldValues.put("financialDocumentReferenceInvoiceNumber", invoiceDocumentNumber);
056            
057            BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
058            Collection<CustomerInvoiceWriteoffDocument> customerInvoiceWriteoffDocuments = 
059                businessObjectService.findMatching(CustomerInvoiceWriteoffDocument.class, fieldValues);
060            
061            // no Writeoffs associated with the invoice are found
062            if (customerInvoiceWriteoffDocuments.isEmpty())
063                return true;
064            
065            Person user = GlobalVariables.getUserSession().getPerson();
066            
067            for(CustomerInvoiceWriteoffDocument customerInvoiceWriteoffDocument : customerInvoiceWriteoffDocuments) {
068                try {
069                    workflowDocument = SpringContext.getBean(WorkflowDocumentService.class).createWorkflowDocument(Long.valueOf(customerInvoiceWriteoffDocument.getDocumentNumber()), user);
070                }
071                catch (WorkflowException e) {
072                    throw new UnknownDocumentIdException("no document found for documentHeaderId '" + customerInvoiceWriteoffDocument.getDocumentNumber() + "'", e);
073                }
074                
075                if (!(workflowDocument.stateIsApproved() || workflowDocument.stateIsProcessed() || workflowDocument.stateIsCanceled() || workflowDocument.stateIsDisapproved())) {
076                    GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerCreditMemoDocumentFields.CREDIT_MEMO_DOCUMENT_REF_INVOICE_NUMBER, ArKeyConstants.ERROR_CUSTOMER_INVOICE_WRITEOFF_ONE_WRITEOFF_IN_ROUTE_PER_INVOICE);
077                    return false;
078                }
079            }
080            return true;
081        
082        }
083        
084        public CustomerInvoiceWriteoffDocument getCustomerInvoiceWriteoffDocument() {
085            return customerInvoiceWriteoffDocument;
086        }
087    
088        public void setCustomerInvoiceWriteoffDocument(CustomerInvoiceWriteoffDocument customerInvoiceWriteoffDocument) {
089            this.customerInvoiceWriteoffDocument = customerInvoiceWriteoffDocument;
090        }
091    
092        public WorkflowDocumentService getWorkflowDocumentService() {
093            return workflowDocumentService;
094        }
095    
096        public void setWorkflowDocumentService(WorkflowDocumentService workflowDocumentService) {
097            this.workflowDocumentService = workflowDocumentService;
098        }    
099    
100        public BusinessObjectService getBusinessObjectService() {
101            return businessObjectService;
102        }
103    
104        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
105            this.businessObjectService = businessObjectService;
106        }    
107    
108    }