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.gl.businessobject.options;
017
018 import java.text.ParseException;
019 import java.text.SimpleDateFormat;
020 import java.util.ArrayList;
021 import java.util.Date;
022 import java.util.Iterator;
023 import java.util.List;
024
025 import org.apache.commons.lang.StringUtils;
026 import org.kuali.kfs.gl.businessobject.OriginEntryFull;
027 import org.kuali.kfs.sys.KFSPropertyConstants;
028 import org.kuali.kfs.sys.context.SpringContext;
029 import org.kuali.rice.core.util.KeyLabelPair;
030 import org.kuali.rice.kns.lookup.keyvalues.KeyValuesBase;
031 import org.kuali.rice.kns.service.DataDictionaryService;
032 import org.kuali.rice.kns.util.KualiDecimal;
033
034 /**
035 * An extension of KeyValuesBase that
036 */
037 public class OriginEntryFieldFinder extends KeyValuesBase {
038
039 /**
040 * Returns a list of all field names and display field names for the Origin Entry class
041 * @return a List of key/value pair options
042 * @see org.kuali.rice.kns.lookup.keyvalues.KeyValuesFinder#getKeyValues()
043 */
044 public List getKeyValues() {
045 List activeLabels = new ArrayList();
046 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, "Fiscal Year"));
047 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, "Chart Code"));
048 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.ACCOUNT_NUMBER, "Account Number"));
049 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, "Sub-Account Number"));
050 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, "Object Code"));
051 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, "Sub-Object Code"));
052 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, "Balance Type"));
053 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, "Object Type"));
054 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, "Fiscal Period"));
055 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, "Document Type"));
056 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, "Origin code"));
057 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.DOCUMENT_NUMBER, "Document Number"));
058 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER, "Sequence Number"));
059 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC, "Description"));
060 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT, "Amount"));
061 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, "Debit Credit Indicator"));
062 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_DATE, "Transaction Date"));
063 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.ORGANIZATION_DOCUMENT_NUMBER, "Org Doc Number"));
064 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.PROJECT_CODE, "Project Code"));
065 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.ORGANIZATION_REFERENCE_ID, "Org Ref ID"));
066 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.REFERENCE_FIN_DOCUMENT_TYPE_CODE, "Ref Doc Type"));
067 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FIN_SYSTEM_REF_ORIGINATION_CODE, "Ref Origin code"));
068 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_DOCUMENT_REFERENCE_NBR, "Ref Doc Number"));
069 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE, "Reversal Date"));
070 activeLabels.add(new KeyLabelPair(KFSPropertyConstants.TRANSACTION_ENCUMBRANCE_UPDT_CD, "Enc Update Code"));
071 return activeLabels;
072 }
073
074 /**
075 * Given the property field name for a field, returns the display name
076 *
077 * @param fieldName the property field name for a field
078 * @return the display field name of that field
079 */
080 public String getFieldDisplayName(String fieldName) {
081 for (Iterator iter = getKeyValues().iterator(); iter.hasNext();) {
082 KeyLabelPair klp = (KeyLabelPair) iter.next();
083 if (klp.getKey().equals(fieldName)) {
084 return klp.getLabel();
085 }
086 }
087 return "Error";
088 }
089
090 /**
091 * Given the display name of a field, returns the property field name
092 *
093 * @param fieldDisplayName the display name of the field
094 * @return the property field name for that field
095 */
096 public String getFieldName(String fieldDisplayName) {
097 for (Iterator iter = getKeyValues().iterator(); iter.hasNext();) {
098 KeyLabelPair klp = (KeyLabelPair) iter.next();
099 if (klp.getLabel().equals(fieldDisplayName)) {
100 return (String) klp.getKey();
101 }
102 }
103 return "Error";
104 }
105
106 /**
107 * Given a field name and a value, determines if that value is valid for the field
108 *
109 * @param fieldName the name of a field to inquire on
110 * @param value the value that the field will potentially be set to
111 * @return true if the value is valid, false if otherwise
112 */
113 public boolean isValidValue(String fieldName, String value) {
114 if (StringUtils.isBlank(fieldName)) {
115 return false;
116 }
117 String fieldType = getFieldType(fieldName);
118 int fieldLength = getFieldLength(fieldName);
119
120 if (allowNull(fieldName) && (value == null || value.length() == 0)) {
121 return true;
122 }
123 if (!allowNull(fieldName) && (value == null || value.length() == 0)) {
124 return false;
125 }
126 if (value.length() > fieldLength) {
127 return false;
128 }
129 if ("KualiDecimal".equals(fieldType)) {
130 try {
131 KualiDecimal d = new KualiDecimal(value);
132 return true;
133 }
134 catch (NumberFormatException nfe) {
135 return false;
136 }
137 }
138 else if ("Integer".equals(fieldType)) {
139 try {
140 Integer d = new Integer(value);
141 return true;
142 }
143 catch (NumberFormatException nfe) {
144 return false;
145 }
146 }
147 else if ("Date".equals(fieldType)) {
148 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
149 try {
150 Date d = df.parse(value);
151 return true;
152 }
153 catch (ParseException e) {
154 return false;
155 }
156 }
157 return true;
158 }
159
160 /**
161 * Returns a String with the name of the type of the given field
162 *
163 * @param fieldName the name of the field to inquire on
164 * @return a String with the name of the class that field returns
165 */
166 public String getFieldType(String fieldName) {
167 if (fieldName.equals(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR)) {
168 return "Integer";
169 }
170 if (fieldName.equals(KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER)) {
171 return "Integer";
172 }
173 if (fieldName.equals(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT)) {
174 return "KualiDecimal";
175 }
176 if (fieldName.equals(KFSPropertyConstants.TRANSACTION_DATE)) {
177 return "Date";
178 }
179 if (fieldName.equals(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE)) {
180 return "Date";
181 }
182 return "String";
183 }
184
185 /**
186 * Returns whether the given field can be set to null or not
187 *
188 * @param fieldName the name of the field to inquire about
189 * @return true if it can be set to null, false otherwise
190 */
191 public boolean allowNull(String fieldName) {
192 if (fieldName.equals(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT)) {
193 return false;
194 }
195 return true;
196 }
197
198 /**
199 * Returns the length of a given field in Origin Entry
200 *
201 * @param fieldName the name of the Origin Entry field to get a length for
202 * @return the length of the field
203 */
204 public int getFieldLength(String fieldName) {
205 DataDictionaryService dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
206 int fieldLength = 0;
207 fieldLength = dataDictionaryService.getAttributeMaxLength(OriginEntryFull.class, fieldName);
208 return fieldLength;
209 }
210
211 }