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.ArConstants;
026    import org.kuali.kfs.module.ar.ArKeyConstants;
027    import org.kuali.kfs.module.ar.ArPropertyConstants;
028    import org.kuali.kfs.module.ar.document.CustomerCreditMemoDocument;
029    import org.kuali.kfs.module.ar.document.CustomerInvoiceWriteoffDocument;
030    import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
031    import org.kuali.kfs.module.ar.document.service.CustomerInvoiceDocumentService;
032    import org.kuali.kfs.sys.context.SpringContext;
033    import org.kuali.kfs.sys.document.validation.GenericValidation;
034    import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
035    import org.kuali.rice.kew.exception.WorkflowException;
036    import org.kuali.rice.kim.bo.Person;
037    import org.kuali.rice.kns.exception.UnknownDocumentIdException;
038    import org.kuali.rice.kns.service.BusinessObjectService;
039    import org.kuali.rice.kns.util.GlobalVariables;
040    import org.kuali.rice.kns.util.ObjectUtils;
041    import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument;
042    import org.kuali.rice.kns.workflow.service.WorkflowDocumentService;
043    
044    public class CustomerInvoiceWriteoffNoOtherCRMInRouteForTheInvoiceValidation extends GenericValidation {
045    
046        private CustomerInvoiceWriteoffDocument customerInvoiceWriteoffDocument;
047        private BusinessObjectService businessObjectService;
048        private WorkflowDocumentService workflowDocumentService;
049        
050        public boolean validate(AttributedDocumentEvent event) {
051        
052            String invoiceDocumentNumber = customerInvoiceWriteoffDocument.getFinancialDocumentReferenceInvoiceNumber();
053            KualiWorkflowDocument workflowDocument;
054            boolean success = true;
055            
056            Map<String, String> fieldValues = new HashMap<String, String>();
057            fieldValues.put("financialDocumentReferenceInvoiceNumber", invoiceDocumentNumber);
058            
059            BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
060            Collection<CustomerCreditMemoDocument> customerCreditMemoDocuments = 
061                businessObjectService.findMatching(CustomerCreditMemoDocument.class, fieldValues);
062            
063            // no CRMs associated with the invoice are found
064            if (customerCreditMemoDocuments.isEmpty())
065                return true;
066            
067            Person user = GlobalVariables.getUserSession().getPerson();
068            
069            for(CustomerCreditMemoDocument customerCreditMemoDocument : customerCreditMemoDocuments) {
070                try {
071                    workflowDocument = SpringContext.getBean(WorkflowDocumentService.class).createWorkflowDocument(Long.valueOf(customerCreditMemoDocument.getDocumentNumber()), user);
072                }
073                catch (WorkflowException e) {
074                    throw new UnknownDocumentIdException("no document found for documentHeaderId '" + customerCreditMemoDocument.getDocumentNumber() + "'", e);
075                }
076                
077                if (!(workflowDocument.stateIsApproved() || workflowDocument.stateIsProcessed() || workflowDocument.stateIsCanceled() || workflowDocument.stateIsDisapproved())) {
078                    GlobalVariables.getMessageMap().putError(ArPropertyConstants.CustomerCreditMemoDocumentFields.CREDIT_MEMO_DOCUMENT_REF_INVOICE_NUMBER, ArKeyConstants.ERROR_CUSTOMER_CREDIT_MEMO_DOCUMENT_ONE_CRM_IN_ROUTE_PER_INVOICE);
079                    return false;
080                }
081            }
082            return true;
083        
084        }
085        
086        public CustomerInvoiceWriteoffDocument getCustomerInvoiceWriteoffDocument() {
087            return customerInvoiceWriteoffDocument;
088        }
089    
090        public void setCustomerInvoiceWriteoffDocument(CustomerInvoiceWriteoffDocument customerInvoiceWriteoffDocument) {
091            this.customerInvoiceWriteoffDocument = customerInvoiceWriteoffDocument;
092        }
093    
094        public WorkflowDocumentService getWorkflowDocumentService() {
095            return workflowDocumentService;
096        }
097    
098        public void setWorkflowDocumentService(WorkflowDocumentService workflowDocumentService) {
099            this.workflowDocumentService = workflowDocumentService;
100        }    
101    
102        public BusinessObjectService getBusinessObjectService() {
103            return businessObjectService;
104        }
105    
106        public void setBusinessObjectService(BusinessObjectService businessObjectService) {
107            this.businessObjectService = businessObjectService;
108        }    
109    
110    }