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.ld.util;
017    
018    import java.math.BigDecimal;
019    import java.text.SimpleDateFormat;
020    import java.util.Collection;
021    import java.util.Date;
022    
023    import org.apache.commons.lang.StringUtils;
024    import org.kuali.kfs.gl.businessobject.CorrectionChangeGroup;
025    import org.kuali.kfs.gl.businessobject.CorrectionCriteria;
026    import org.kuali.kfs.gl.businessobject.OriginEntryFull;
027    import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry;
028    import org.kuali.kfs.module.ld.businessobject.options.LaborOriginEntryFieldFinder;
029    import org.kuali.rice.kns.util.KualiDecimal;
030    
031    /**
032     * This class provides utility methods for the Labor correction document
033     */
034    public class CorrectionDocumentUtils {
035        /**
036         * Returns whether an origin entry matches the passed in criteria. If both the criteria and actual value are both String types
037         * and are empty, null, or whitespace only, then they will match.
038         * 
039         * @param cc correction criteria to test against origin entry
040         * @param oe origin entry to test
041         * @return true if origin entry matches the passed in criteria
042         */
043        public static boolean laborEntryMatchesCriteria(CorrectionCriteria cc, OriginEntryFull oe) {
044            LaborOriginEntryFieldFinder loeff = new LaborOriginEntryFieldFinder();
045            LaborOriginEntry loe = (LaborOriginEntry) oe;
046            Object fieldActualValue = loe.getFieldValue(cc.getCorrectionFieldName());
047            String fieldTestValue = StringUtils.isBlank(cc.getCorrectionFieldValue()) ? "" : cc.getCorrectionFieldValue();
048            String fieldType = loeff.getFieldType(cc.getCorrectionFieldName());
049            String fieldActualValueString = org.kuali.kfs.gl.document.CorrectionDocumentUtils.convertToString(fieldActualValue, fieldType);
050    
051            if ("String".equals(fieldType) || "sw".equals(cc.getCorrectionOperatorCode()) || "ew".equals(cc.getCorrectionOperatorCode()) || "ct".equals(cc.getCorrectionOperatorCode())) {
052                return org.kuali.kfs.gl.document.CorrectionDocumentUtils.compareStringData(cc, fieldTestValue, fieldActualValueString);
053            }
054            int compareTo = 0;
055            try {
056                if (fieldActualValue == null) {
057                    return false;
058                }
059                if ("Integer".equals(fieldType)) {
060                    compareTo = ((Integer) fieldActualValue).compareTo(Integer.parseInt(fieldTestValue));
061                }
062                if ("KualiDecimal".equals(fieldType)) {
063                    compareTo = ((KualiDecimal) fieldActualValue).compareTo(new KualiDecimal(Double.parseDouble(fieldTestValue)));
064                }
065                if ("BigDecimal".equals(fieldType)) {
066                    compareTo = ((BigDecimal) fieldActualValue).compareTo(new BigDecimal(Double.parseDouble(fieldTestValue)));
067    
068                }
069                if ("Date".equals(fieldType)) {
070                    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
071                    compareTo = ((Date) fieldActualValue).compareTo(df.parse(fieldTestValue));
072                }
073            }
074            catch (Exception e) {
075                // any exception while parsing data return false
076                return false;
077            }
078            return org.kuali.kfs.gl.document.CorrectionDocumentUtils.compareTo(compareTo, cc.getCorrectionOperatorCode());
079        }
080    
081        /**
082         * Returns whether the labor entry matches any of the criteria groups
083         * 
084         * @param entry labor origin entry
085         * @param groups collection of correction change group
086         * @return true if labor origin entry matches any of the criteria groups
087         */
088        public static boolean doesLaborEntryMatchAnyCriteriaGroups(OriginEntryFull entry, Collection<CorrectionChangeGroup> groups) {
089            boolean anyGroupMatch = false;
090            for (CorrectionChangeGroup ccg : groups) {
091                int matches = 0;
092                for (CorrectionCriteria cc : ccg.getCorrectionCriteria()) {
093                    if (CorrectionDocumentUtils.laborEntryMatchesCriteria(cc, entry)) {
094                        matches++;
095                    }
096                }
097    
098                // If they all match, change it
099                if (matches == ccg.getCorrectionCriteria().size()) {
100                    anyGroupMatch = true;
101                    break;
102                }
103            }
104            return anyGroupMatch;
105        }
106    }