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.purap.businessobject.options;
017    
018    import java.util.ArrayList;
019    import java.util.Arrays;
020    import java.util.Collection;
021    import java.util.Collections;
022    import java.util.Comparator;
023    import java.util.Iterator;
024    import java.util.List;
025    import java.util.Set;
026    
027    import org.kuali.kfs.module.purap.PurapConstants.PurchaseOrderStatuses;
028    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderStatus;
029    import org.kuali.kfs.module.purap.businessobject.Status;
030    import org.kuali.kfs.sys.context.SpringContext;
031    import org.kuali.rice.kns.service.KeyValuesService;
032    import org.kuali.rice.core.util.KeyLabelPair;
033    
034    /**
035     * Value Finder for Purchase Order Statuses.
036     */
037    public class PurchaseOrderStatusValuesFinder extends PurApStatusKeyValuesBase {
038    
039        /**
040         * Overide this method to sort the PO statuses for proper display. 
041         * 
042         * @see org.kuali.kfs.module.purap.businessobject.options.PurApStatusKeyValuesBase#getKeyValues()
043         */
044        public List getKeyValues() {
045            // get all PO statuses
046            KeyValuesService boService = SpringContext.getBean(KeyValuesService.class);
047            Collection<Status> statuses = boService.findAll(getStatusClass());
048            
049            Set<String> incompleteCodes = PurchaseOrderStatuses.INCOMPLETE_STATUSES;
050            Set<String> completeCodes = PurchaseOrderStatuses.COMPLETE_STATUSES;
051    
052            List<Status> incompleteStatus = new ArrayList<Status>();
053            List<Status> completeStatus = new ArrayList<Status>();
054            List<Status> unsorted = new ArrayList<Status>();
055            
056            for (Status status : statuses) {
057                if (incompleteCodes.contains(status.getStatusCode())) {
058                    incompleteStatus.add(status);
059                } else if (completeCodes.contains(status.getStatusCode())) {
060                    completeStatus.add(status);
061                } else {
062                    unsorted.add(status);
063                }
064            }
065            
066            Comparator<Status> comparator = new Status();
067            Collections.sort(incompleteStatus, comparator);
068            Collections.sort(completeStatus, comparator);
069            Collections.sort(unsorted, comparator);
070               
071            // generate output
072            List labels = new ArrayList();
073            
074            labels.add(new KeyLabelPair("INCOMPLETE", "INCOMPLETE STATUSES"));
075            for (Status status : incompleteStatus) {
076                labels.add(new KeyLabelPair(status.getStatusCode(), "- "+status.getStatusDescription()));
077            }
078    
079            labels.add(new KeyLabelPair("COMPLETE", "COMPLETE STATUSES"));
080            for (Status status : completeStatus) {
081                labels.add(new KeyLabelPair(status.getStatusCode(), "- "+status.getStatusDescription()));
082            }
083            
084            if (!unsorted.isEmpty())
085                labels.add(new KeyLabelPair("UNSORTED", "Unsorted Statuses"));
086            for (Status status : unsorted) {
087                labels.add(new KeyLabelPair(status.getStatusCode(), "- "+status.getStatusDescription()));
088            }
089            
090            
091            return labels;
092        }
093        
094        /**
095         * @see org.kuali.kfs.module.purap.businessobject.options.PurApStatusKeyValuesBase#getStatusClass()
096         */
097        @Override
098        public Class getStatusClass() {
099            return PurchaseOrderStatus.class;
100        }
101        
102        
103    }