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;
017    
018    import java.util.ArrayList;
019    import java.util.Arrays;
020    import java.util.Collections;
021    import java.util.HashMap;
022    import java.util.HashSet;
023    import java.util.List;
024    import java.util.Map;
025    import java.util.Set;
026    
027    import org.apache.commons.lang.StringUtils;
028    import org.kuali.kfs.module.purap.businessobject.AvailabilityMatrix;
029    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderAccount;
030    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderItem;
031    import org.kuali.kfs.module.purap.businessobject.PurchaseOrderVendorQuote;
032    import org.kuali.kfs.module.purap.document.PaymentRequestDocument;
033    import org.kuali.kfs.module.purap.document.PurchaseOrderDocument;
034    import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocumentBase;
035    import org.kuali.kfs.module.purap.document.RequisitionDocument;
036    import org.kuali.kfs.module.purap.document.VendorCreditMemoDocument;
037    import org.kuali.kfs.sys.KFSConstants;
038    import org.kuali.kfs.sys.KFSPropertyConstants;
039    import org.kuali.rice.core.util.JSTLConstants;
040    import org.kuali.rice.kns.util.KualiDecimal;
041    
042    /**
043     * Holds constants for PURAP.
044     */
045    public class PurapConstants extends JSTLConstants {
046    
047        public static final String PURAP_NAMESPACE = "KFS-PURAP";
048        
049        public static final KualiDecimal HUNDRED = new KualiDecimal(100);
050        
051    
052        public static final String B2B_PUNCHBACK_METHOD_TO_CALL = "returnFromShopping";
053    
054        public static final String PDP_PURAP_EXTRACT_FILE_NAME = "extr_fr_purap";
055    
056        public static class QuoteTypes {
057            public static final String COMPETITIVE = "COMP";
058            public static final String PRICE_CONFIRMATION = "CONF";
059        }
060    
061        public static class QuoteTypeDescriptions {
062            public static final String COMPETITIVE = "Competitive";
063            public static final String PRICE_CONFIRMATION = "Price Confirmation";
064        }
065    
066        public static class QuoteTransmitTypes {
067            public static final String PRINT = "PRINT";
068            public static final String FAX = "FAX";
069        }
070    
071        public static class QuoteStatusCode {
072            public static final String DELV = "DELV";
073            public static final String FUIP = "FUIP";
074            public static final String IIQ = "IIQ";
075            public static final String LEXP = "LEXP";
076            public static final String MULT = "MULT";
077            public static final String NORS = "NORS";
078            public static final String PTFE = "PTFE";
079            public static final String RECV = "RECV";
080            public static final String RIR = "RIR";
081            public static final String RECL = "RECL";
082            public static final String RNLB = "RNLB";
083            public static final String RNLN = "RNLN";
084            public static final String NOBD = "NOBD";
085            public static final String SQNA = "SQNA";
086            public static final String TINC = "TINC";
087        }
088        public static final String NOTE_TAB_WARNING = "noteWarning";
089    
090        public static final String QUESTION_INDEX = "questionIndex";
091        public static final String REMOVE_ACCOUNTS_QUESTION = "RemoveAccounts";
092        public static final String CLEAR_COMMODITY_CODES_QUESTION = "ClearCommodityCodes";
093        public static final String QUESTION_ROUTE_DOCUMENT_TO_COMPLETE = "Completing this document will remove it from your Action List.<br/><br/>  Are you sure you want to continue?";
094        public static final String QUESTION_REMOVE_ACCOUNTS = "question.document.purap.removeAccounts";
095        public static final String QUESTION_CLEAR_ALL_COMMODITY_CODES = "question.document.pur.clearCommodityCodes";
096        // TODO - This constant is referenced, but has no corresponding value in ApplicationResources.properties????
097        public static final String CONFIRM_CHANGE_DFLT_RVNG_ADDR = "confirm.change.dflt.rcvng.addr";
098        public static final String CONFIRM_CHANGE_DFLT_RVNG_ADDR_TXT = "Setting this receiving address to be default will unset the current default address. Do you want to proceed?";
099        
100        public static final String REQ_REASON_NOT_APO = "Requisition did not become an APO because: ";
101        public static final String REQ_UNABLE_TO_CREATE_NOTE = "Unable to create a note on this document.";
102        
103        public static final String TRADE_IN_OBJECT_CODE_FOR_CAPITAL_ASSET_OBJECT_SUB_TYPE = "7070";
104        public static final String TRADE_IN_OBJECT_CODE_FOR_CAPITAL_LEASE_OBJECT_SUB_TYPE = "7099";
105        
106        // PDF KFSConstants
107        public static final String IMAGE_TEMP_PATH = "PDF_IMAGE_TEMP_PATH";
108        public static final String PDF_DIRECTORY = "PDF_DIRECTORY";
109        public static final String STATUS_INQUIRY_URL = "PDF_STATUS_INQUIRY_URL";
110        public static final String PURCHASING_DIRECTOR_IMAGE_PREFIX = "PDF_DIRECTOR_IMAGE_PREFIX";
111        public static final String PURCHASING_DIRECTOR_IMAGE_EXTENSION = "PDF_DIRECTOR_IMAGE_EXTENSION";
112        public static final String CONTRACT_MANAGER_IMAGE_PREFIX = "PDF_IMAGE_PREFIX";
113        public static final String CONTRACT_MANAGER_IMAGE_EXTENSION = "PDF_IMAGE_EXTENSION";
114        public static final String LOGO_IMAGE_PREFIX = "PDF_LOGO_IMAGE_PREFIX";
115        public static final String LOGO_IMAGE_EXTENSION = "PDF_LOGO_IMAGE_EXTENSION";
116        public static final String PDF_IMAGES_AVAILABLE_INDICATOR = "PDF_IMAGES_AVAILABLE_IND";
117        public static final String PDF_IMAGE_LOCATION_URL = "PDF_IMAGE_LOCATION_URL";
118    
119        public static final String TAX_RECALCULATION_INFO = "TaxRecalculationQuestion";
120        public static final String TAX_RECALCULATION_QUESTION = "The postal code of the delivery address has changed.[br]Selecting \"Yes\" will submit the document without recalculating the taxes.[br]Selecting \"No\" will return you to the document so that the taxes can be recalculated.[br]The \"clear all\" button can be used to clear all tax amounts which will force taxes to be recalculated upon submission.";
121        
122        public static class RequisitionStatuses {
123            public static final String IN_PROCESS = "INPR";
124            public static final String CANCELLED = "CANC";
125            public static final String CLOSED = "CLOS";
126            public static final String AWAIT_CONTENT_REVIEW = "ACNT";
127            public static final String AWAIT_HAS_ACCOUNTING_LINES = "AHAL";
128            public static final String AWAIT_SUB_ACCT_REVIEW = "ASUB";
129            public static final String AWAIT_FISCAL_REVIEW = "AFIS";
130            public static final String AWAIT_CHART_REVIEW = "ACHA";
131            public static final String AWAIT_COMMODITY_CODE_REVIEW = "WCOM";
132            public static final String AWAIT_SEP_OF_DUTY_REVIEW = "ASOD";
133            public static final String DAPRVD_CONTENT = "DCNT";
134            public static final String DAPRVD_HAS_ACCOUNTING_LINES = "DHAL";
135            public static final String DAPRVD_SUB_ACCT = "DSUB";
136            public static final String DAPRVD_FISCAL = "DFIS";
137            public static final String DAPRVD_CHART = "DCHA";
138            public static final String DAPRVD_COMMODITY_CODE = "DCOM";
139            public static final String DAPRVD_SEP_OF_DUTY = "DSOD";
140            public static final String AWAIT_CONTRACT_MANAGER_ASSGN = "ACMR";
141            
142        }
143    
144        public static class POCostSources {
145            public static final String ESTIMATE = "EST";
146        }
147    
148        public static final class POTransmissionMethods {
149            public static final String FAX = "FAX";
150            public static final String PRINT = "PRIN";
151            public static final String NOPRINT = "NOPR";
152            public static final String ELECTRONIC = "ELEC";
153        }
154    
155        public static final String REQ_B2B_ALLOW_COPY_DAYS = "5";
156        public static final String B2B_VENDOR_CONTRACT_NOT_FOUND_ERROR_MESSAGE = "The vendor whose shopping cart you are attempting to return does not have an active contract for your organization.";
157        public static final String B2B_URL_STRING = "&channelUrl=b2b.do?methodToCall=shopCatalogs";
158        
159        public static class RequisitionSources {
160            public static final String STANDARD_ORDER = "STAN";
161            public static final String B2B = "B2B";
162        }
163    
164        // PURCHASE ORDER VENDOR CHOICE CODES
165        public static class VendorChoice {
166            public static final String CONTRACTED_PRICE = "CONT";
167            public static final String SMALL_ORDER = "SMAL";
168            public static final String PROFESSIONAL_SERVICE = "PROF";
169            public static final String SUBCONTRACT = "SUBC";
170        }
171    
172        public static String[] AUTO_CLOSE_EXCLUSION_VNDR_CHOICE_CODES = {VendorChoice.SUBCONTRACT};
173        
174        public static Integer APO_CONTRACT_MANAGER = new Integer(99);
175    
176        // Requisition/Purchase Order Tab Errors
177        public static final String DELIVERY_TAB_ERRORS = "document.delivery*";
178        public static final String DETAIL_TAB_ERRORS="document";
179        public static final String VENDOR_ERRORS = "document.vendor*,document.purchaseOrderVendorChoiceCode,document.alternateVendorName,document.shipmentReceivedDate";
180        public static final String ADDITIONAL_TAB_ERRORS = "document.requestor*,document.institution*,document.purchaseOrderTransmissionMethodCode,document.purchaseOrderCostSourceCode,document.purchaseOrderTotalLimit";
181        public static final String ITEM_TAB_ERRORS = "document.item*,newPurchasingItemLine*,itemQuantity,document.grandTotal,accountDistributionnewSourceLine*";
182        public static final String LINEITEM_TAB_ERRORS = "document.item*,newLineItemReceivingItemLine*";
183        public static final String ITEM_TAB_ERROR_PROPERTY = ITEM_TAB_ERRORS; // used to be "newPurchasingItemLine"
184        public static final String ACCOUNT_SUMMARY_TAB_ERRORS = "document.accountSummary*";
185        public static final String ACCOUNT_DISTRIBUTION_ERROR_KEY = "accountDistributionnewSourceLine";
186        public static final String RELATED_DOCS_TAB_ERRORS = "";
187        public static final String PAYMENT_HISTORY_TAB_ERRORS = "";
188        public static final String PAYMENT_INFO_ERRORS = "document.paymentInfo";
189        public static final String PAYMENT_INFO_TAB_ERRORS = "document.paymentInfo*,document.purchaseOrderBeginDate,document.purchaseOrderEndDate,document.finalPaymentAmount,document.initialPaymentAmount,document.recurringPaymentAmount";
190        public static final String CAPITAL_ASSET_TAB_ERRORS = "document.purchasingCapitalAsset*,newPurchasingItemCapitalAssetLine*,newPurchasingCapitalAssetLocationLine*";
191        public static final String SPLIT_PURCHASE_ORDER_TAB_ERRORS = "document.splitPurchaseOrder";
192        public static final String ASSIGN_SENSITIVE_DATA_TAB_ERRORS = "document.assignSensitiveData";
193        public static final String STIPULATIONS_TAB_ERRORS = "document.purchaseOrderVendorStipulation*,newPurchaseOrderVendorStipulationLine*";
194        // PO/Quotes Tab Constants
195        public static final String QUOTE_TAB_ERRORS = "document.quote*,quote*,purchaseOrderVendorQuotes*,newPurchaseOrderVendorQuote*,document.purchaseOrderVendorQuote*";
196        //PO Number Warning
197        public static final String WARNING_PURCHASEORDER_NUMBER_DONT_DISCLOSE = "warning.purchaseorder.number.dont.disclose";
198        
199        // Assign Contract Manager
200        public static final String ASSIGN_CONTRACT_MANAGER_DEFAULT_DESC = "Contract Manager Assigned";
201        public static final String ASSIGN_CONTRACT_MANAGER_TAB_ERRORS = "document.unassignedRequisition*";
202    
203        public static class PurchaseOrderStatuses {
204            public static final String IN_PROCESS = "INPR";
205            public static final String WAITING_FOR_VENDOR = "WVEN";
206            public static final String WAITING_FOR_DEPARTMENT = "WDPT";
207            public static final String OPEN = "OPEN";
208            public static final String CLOSED = "CLOS";
209            public static final String CANCELLED = "CANC";
210            public static final String PAYMENT_HOLD = "PHOL";
211            public static final String AWAIT_TAX_REVIEW = "WTAX";
212            public static final String AWAIT_BUDGET_REVIEW = "WBUD";
213            public static final String AWAIT_CONTRACTS_GRANTS_REVIEW = "WCG";
214            public static final String AWAIT_PURCHASING_REVIEW = "WPUR";
215            public static final String AWAIT_COMMODITY_CODE_REVIEW = "WCOM";
216            public static final String AWAIT_NEW_UNORDERED_ITEM_REVIEW = "WNUI";
217            public static final String DAPRVD_TAX = "DTAX";
218            public static final String DAPRVD_BUDGET = "DBUD";
219            public static final String DAPRVD_CONTRACTS_GRANTS = "DCG";
220            public static final String DAPRVD_PURCHASING = "DPUR";
221            public static final String DAPRVD_COMMODITY_CODE = "DCOM";
222            public static final String CXML_ERROR = "CXER";
223            public static final String PENDING_CXML = "CXPE";
224            public static final String PENDING_FAX = "FXPE";
225            public static final String FAX_ERROR = "FXER";
226            public static final String PENDING_PRINT = "PRPE";
227            public static final String QUOTE = "QUOT";
228            public static final String VOID = "VOID";
229            public static final String AMENDMENT = "AMND";
230    
231            public static final String RETIRED_VERSION = "RTVN";
232            public static final String CHANGE_IN_PROCESS = "CGIN";
233            public static final String CANCELLED_CHANGE = "CNCG";
234            public static final String DISAPPROVED_CHANGE = "DACG";
235            public static final String PENDING_VOID = "VOPE";
236            public static final String PENDING_PAYMENT_HOLD = "PHPE";
237            public static final String PENDING_RETRANSMIT = "RTPE";
238            public static final String PENDING_CLOSE = "CLPE";
239            public static final String PENDING_REOPEN = "ROPE";
240            public static final String PENDING_REMOVE_HOLD = "RHPE";
241    
242            public static final Set<String> INCOMPLETE_STATUSES = new HashSet<String>();
243            public static final Set<String> COMPLETE_STATUSES = new HashSet<String>();
244    
245            static {
246                INCOMPLETE_STATUSES.add(AWAIT_TAX_REVIEW);
247                INCOMPLETE_STATUSES.add(AWAIT_BUDGET_REVIEW);
248                INCOMPLETE_STATUSES.add(AWAIT_CONTRACTS_GRANTS_REVIEW);
249                INCOMPLETE_STATUSES.add(AWAIT_PURCHASING_REVIEW);
250                INCOMPLETE_STATUSES.add(AWAIT_NEW_UNORDERED_ITEM_REVIEW);
251                INCOMPLETE_STATUSES.add(AWAIT_COMMODITY_CODE_REVIEW);
252                INCOMPLETE_STATUSES.add(FAX_ERROR);
253                INCOMPLETE_STATUSES.add(QUOTE);
254                INCOMPLETE_STATUSES.add(CXML_ERROR);
255                INCOMPLETE_STATUSES.add(PENDING_CXML);
256                INCOMPLETE_STATUSES.add(IN_PROCESS);
257                INCOMPLETE_STATUSES.add(PAYMENT_HOLD);
258                INCOMPLETE_STATUSES.add(PENDING_FAX);
259                INCOMPLETE_STATUSES.add(PENDING_PRINT);
260                INCOMPLETE_STATUSES.add(WAITING_FOR_VENDOR);
261                INCOMPLETE_STATUSES.add(WAITING_FOR_DEPARTMENT);
262                
263                COMPLETE_STATUSES.add(AMENDMENT);
264                COMPLETE_STATUSES.add(CANCELLED);
265                COMPLETE_STATUSES.add(CHANGE_IN_PROCESS);
266                COMPLETE_STATUSES.add(CLOSED);
267                COMPLETE_STATUSES.add(PENDING_CLOSE);
268                COMPLETE_STATUSES.add(CANCELLED_CHANGE);
269                COMPLETE_STATUSES.add(CXML_ERROR);
270                COMPLETE_STATUSES.add(DISAPPROVED_CHANGE);
271                COMPLETE_STATUSES.add(DAPRVD_BUDGET);
272                COMPLETE_STATUSES.add(DAPRVD_CONTRACTS_GRANTS);
273                COMPLETE_STATUSES.add(DAPRVD_COMMODITY_CODE);
274                COMPLETE_STATUSES.add(DAPRVD_PURCHASING);
275                COMPLETE_STATUSES.add(DAPRVD_TAX);
276                COMPLETE_STATUSES.add(OPEN);
277                COMPLETE_STATUSES.add(PAYMENT_HOLD);
278                COMPLETE_STATUSES.add(PENDING_PAYMENT_HOLD);
279                COMPLETE_STATUSES.add(PENDING_REMOVE_HOLD);
280                COMPLETE_STATUSES.add(PENDING_REOPEN);
281                COMPLETE_STATUSES.add(PENDING_RETRANSMIT);
282                COMPLETE_STATUSES.add(RETIRED_VERSION);
283                COMPLETE_STATUSES.add(VOID);
284                COMPLETE_STATUSES.add(PENDING_VOID);
285    
286            }
287            
288           
289            
290    
291            /**
292             * Do not include 'OPEN' status in this map. The 'OPEN' status is the default status that is set when no status exists for a
293             * particular pending transmission type code.
294             * 
295             * @see {@link org.kuali.module.purap.service.PurchaseOrderService#completePurchaseOrder(org.kuali.module.purap.document.PurchaseOrderDocument)}
296             */
297            private static final Map<String, String> getStatusesByTransmissionType() {
298                Map<String, String> statusByTrans = new HashMap<String, String>();
299                statusByTrans.put(PurapConstants.POTransmissionMethods.PRINT, PENDING_PRINT);
300                statusByTrans.put(PurapConstants.POTransmissionMethods.ELECTRONIC, PENDING_CXML);
301                statusByTrans.put(PurapConstants.POTransmissionMethods.FAX, PENDING_FAX);
302                return Collections.unmodifiableMap(statusByTrans);
303            }
304    
305            public static final Map<String, String> STATUSES_BY_TRANSMISSION_TYPE = getStatusesByTransmissionType();
306    
307        }
308    
309        public static final class ItemTypeCodes {
310            // ITEM TYPES
311            public static final String ITEM_TYPE_ITEM_CODE = "ITEM";
312            public static final String ITEM_TYPE_SERVICE_CODE = "SRVC";
313            public static final String ITEM_TYPE_FREIGHT_CODE = "FRHT";
314            public static final String ITEM_TYPE_SHIP_AND_HAND_CODE = "SPHD";
315            public static final String ITEM_TYPE_TRADE_IN_CODE = "TRDI";
316            public static final String ITEM_TYPE_ORDER_DISCOUNT_CODE = "ORDS";
317            public static final String ITEM_TYPE_MIN_ORDER_CODE = "MNOR";
318            public static final String ITEM_TYPE_MISC_CODE = "MISC";
319            public static final String ITEM_TYPE_PMT_TERMS_DISCOUNT_CODE = "DISC";
320            public static final String ITEM_TYPE_FEDERAL_TAX_CODE = "FDTX";
321            public static final String ITEM_TYPE_STATE_TAX_CODE = "STTX";
322            public static final String ITEM_TYPE_FEDERAL_GROSS_CODE = "FDGR";
323            public static final String ITEM_TYPE_STATE_GROSS_CODE = "STGR";
324            public static final String ITEM_TYPE_RESTCK_FEE_CODE = "RSTO";
325            public static final String ITEM_TYPE_MISC_CRDT_CODE = "MSCR";
326            public static final String ITEM_TYPE_UNORDERED_ITEM_CODE = "UNOR";
327            public static final String ITEM_TYPE_SHIPPING_CODE = "SHIP";
328    
329            public static final Set<String> EXCLUDED_ITEM_TYPES = new HashSet<String>();
330            static {
331                EXCLUDED_ITEM_TYPES.add(ITEM_TYPE_UNORDERED_ITEM_CODE);
332            }
333        }
334    
335        // Item constants
336        public static final int DOLLAR_AMOUNT_MIN_SCALE = 2;
337        public static final int UNIT_PRICE_MAX_SCALE = 4;
338        public static final int PREQ_DESC_LENGTH = 500;
339        public static final String PREQ_DISCOUNT_MULT = "-0.01";
340        
341        public static final String REQUISITION_DOCUMENT_TYPE = "REQS";
342        public static final String RECEIVING_THRESHOLD_DOCUMENT_TYPE = "THLD";
343    
344        public static class PurchaseOrderDocTypes {
345            public static final String PURCHASE_ORDER_REOPEN_DOCUMENT = "POR";
346            public static final String PURCHASE_ORDER_CLOSE_DOCUMENT = "POC";
347            public static final String PURCHASE_ORDER_DOCUMENT = "PO";
348            public static final String PURCHASE_ORDER_RETRANSMIT_DOCUMENT = "PORT";
349            public static final String PURCHASE_ORDER_PRINT_DOCUMENT = "PurchaseOrderPrintDocument";
350            public static final String PURCHASE_ORDER_VOID_DOCUMENT = "POV";
351            public static final String PURCHASE_ORDER_PAYMENT_HOLD_DOCUMENT = "POPH";
352            public static final String PURCHASE_ORDER_REMOVE_HOLD_DOCUMENT = "PORH";
353            public static final String PURCHASE_ORDER_AMENDMENT_DOCUMENT = "POA";
354            public static final String PURCHASE_ORDER_SPLIT_DOCUMENT = "POSP";
355        }
356    
357        public static class PODocumentsStrings {
358            public static final String CLOSE_QUESTION = "POClose";
359            public static final String CLOSE_CONFIRM = "POCloseConfirm";
360            public static final String CLOSE_NOTE_PREFIX = "Note entered while closing a Purchase Order :";
361    
362            public static final String REOPEN_PO_QUESTION = "ReopenPO";
363            public static final String CONFIRM_REOPEN_QUESTION = "ConfirmReopen";
364            public static final String REOPEN_NOTE_PREFIX = "Note entered while reopening a Purchase Order : ";
365    
366            public static final String VOID_QUESTION = "POVoid";
367            public static final String VOID_CONFIRM = "POVoidConfirm";
368            public static final String VOID_NOTE_PREFIX = "Note entered while voiding a Purchase Order :";
369    
370            public static final String PAYMENT_HOLD_QUESTION = "POPaymentHold";
371            public static final String PAYMENT_HOLD_CONFIRM = "POPaymentHoldConfirm";
372            public static final String PAYMENT_HOLD_NOTE_PREFIX = "Note entered while putting a Purchase Order on payment hold :";
373    
374            public static final String REMOVE_HOLD_QUESTION = "PORemoveHold";
375            public static final String REMOVE_HOLD_CONFIRM = "PORemoveHoldConfirm";
376            public static final String REMOVE_HOLD_NOTE_PREFIX = "Note entered while removing a Purchase Order from payment hold :";
377            public static final String REMOVE_HOLD_FYI = "This document was taken off Payment Hold status.";
378    
379            public static final String AMENDMENT_PO_QUESTION = "AmendmentPO";
380            public static final String CONFIRM_AMENDMENT_QUESTION = "ConfirmAmendment";
381            public static final String AMENDMENT_NOTE_PREFIX = "Note entered while amending a Purchase Order : ";
382            
383            public static final String SPLIT_QUESTION = "POSplit";
384            public static final String SPLIT_CONFIRM = "POSplitConfirm";
385            public static final String SPLIT_NOTE_PREFIX_OLD_DOC = "Note entered while splitting this Purchase Order : ";
386            public static final String SPLIT_NOTE_PREFIX_NEW_DOC = "Note entered while being split from Purchase Order ";
387            public static final String SPLIT_ADDL_CHARGES_WARNING_LABEL = "WARNING";
388            public static final String SPLIT_ADDL_CHARGES_WARNING = "* ADDITIONAL CHARGES EXIST *";
389            public static final String SPLIT_NOTE_TEXT = "splitNoteText";
390            public static final String ITEMS_MOVING_TO_SPLIT = "movingPOItems";
391            public static final String ITEMS_REMAINING = "remainingPOItems";
392            public static final String LINE_ITEMS_REMAINING = "remainingPOLineItems";
393    
394            public static final String CONFIRM_AWARD_QUESTION = "POConfirmAward";
395            public static final String CONFIRM_AWARD_RETURN = "completeQuote";
396    
397            public static final String CONFIRM_CANCEL_QUESTION = "POCancelQuote";
398            public static final String CONFIRM_CANCEL_RETURN = "cancelQuote";
399    
400            public static final String SINGLE_CONFIRMATION_QUESTION = "singleConfirmationQuestion";
401    
402            public static final String MANUAL_STATUS_CHANGE_QUESTION = "manualStatusChangeQuestion";
403            public static final String OPEN_STATUS = "Open";
404            
405            public static final String POSTAL_CODE = "Postal Code";
406            public static final String ALTERNATE_PAYEE_VENDOR = "Alternate Payee Vendor";
407        }
408    
409        public static final String PO_OVERRIDE_NOT_TO_EXCEED_QUESTION = "OverrideNotToExceed";
410        public static final String FIX_CAPITAL_ASSET_WARNINGS = "FixCapitalAssetWarnings";
411        public static final String PO_NEXT_FY_WARNING = "NextFiscalYearWarning";
412    
413        // ACCOUNTS PAYABLE
414        public static final String AP_OVERRIDE_INVOICE_NOMATCH_QUESTION = "OverrideInvoiceNoMatch";
415    
416        public static class AccountsPayableDocumentStrings {
417            public static final String CANCEL_NOTE_PREFIX = "Note entered while canceling document: ";
418        }
419    
420        // PAYMENT REQUEST
421        public static final String PAYMENT_REQUEST_ACTION_NAME = "PaymentRequest";
422        public static final String PREQ_PAY_DATE_DAYS = "days";
423        public static final String PREQ_PAY_DATE_DATE = "date";
424        public static final int PREQ_PAY_DATE_EMPTY_TERMS_DEFAULT_DAYS = 28;
425        public static final int PREQ_PAY_DATE_DAYS_BEFORE_WARNING = 60;
426    
427        //TAB ERROR KEYS
428        public static final String PAYMENT_REQUEST_INIT_TAB_ERRORS = "document.purchaseOrderIdentifier,document.invoiceNumber,document.invoiceDate,document.vendorInvoiceAmount,document.specialHandlingInstructionLine1Text,document.specialHandlingInstructionLine2Text,document.specialHandlingInstructionLine3Text";
429        public static final String PAYMENT_REQUEST_TAX_TAB_ERRORS = "document.tax*";
430        public static final String PAYMENT_REQUEST_INVOICE_TAB_ERRORS = "document.paymentRequestPayDate,document.bank*,bankCode";
431        public static final String RECEIVING_LINE_INIT_TAB_ERRORS = "document.purchaseOrderIdentifier,document.shipmentReceivedDate,document.shipmentPackingSlipNumber,document.shipmentBillOfLadingNumber,document.carrierCode";
432        public static final String BULK_RECEIVING_INIT_TAB_ERRORS = "document.purchaseOrderIdentifier,document.shipmentReceivedDate,document.shipmentPackingSlipNumber,document.shipmentBillOfLadingNumber,document.carrierCode";
433        public static final String BULK_RECEIVING_VENDOR_TAB_ERRORS = "document.vendor*,document.alternate*,document.goodsDelivered*,document.shipmentReceivedDate,document.shipmentPackingSlipNumber,document.shipmentBillOfLadingNumber,document.carrierCode,document.shipmentReferenceNumber,document.shipmentWeight,document.noOfCartons,document.trackingNumber";
434        public static final String BULK_RECEIVING_DELIVERY_TAB_ERRORS = "document.delivery*,document.institution*,document.requestor,document.preparer";
435        public static final String REJECT_DOCUMENT_TAB_ERRORS = "document.vendorDunsNumber,document.vendor*,document.invoice*";
436        
437        // Weird PaymentTermsType is due on either the 10th or 25th with no discount
438        public static final String PMT_TERMS_TYP_NO_DISCOUNT_CD = "00N2T";
439    
440        public static final String PURAP_AP_SHOW_CONTINUATION_ACCOUNT_WARNING_FISCAL_OFFICERS = "SHOW_CONTINUATION_ACCOUNT_WARNING_FISCAL_OFFICERS_IND";
441        public static final String PURAP_AP_SHOW_CONTINUATION_ACCOUNT_WARNING_AP_USERS = "SHOW_CONTINUATION_ACCOUNT_WARNING_AP_USERS_IND";
442    
443        public static final class PaymentRequestIndicatorText {
444            public static final String HOLD = "HOLD";
445            public static final String REQUEST_CANCEL = "REQUEST CANCEL";
446        }
447        
448        public static class AccountsPayableSharedStatuses {
449            public static final String IN_PROCESS = "INPR";
450            public static final String AWAITING_ACCOUNTS_PAYABLE_REVIEW = "APAD"; // Waiting for Accounts Payable approval
451        }
452        
453        public static final class PaymentRequestStatuses {
454            public static final String INITIATE = "INIT";
455            public static final String IN_PROCESS = "INPR";
456            public static final String CANCELLED_IN_PROCESS = "CIPR";
457            public static final String CANCELLED_POST_AP_APPROVE = "CANC";
458            public static final String DEPARTMENT_APPROVED = "DPTA";
459            public static final String AUTO_APPROVED = "AUTO";
460            public static final String AWAITING_ACCOUNTS_PAYABLE_REVIEW = "APAD"; // Waiting for Accounts Payable approval
461            public static final String AWAITING_RECEIVING_REVIEW = "ARVR"; // Waiting for Receiving approval 
462            public static final String AWAITING_SUB_ACCT_MGR_REVIEW = "ASAA"; // Waiting for Sub Acct Manager approval
463            public static final String AWAITING_FISCAL_REVIEW = "AFOA"; // Waiting for Fiscal Officer approval
464            public static final String AWAITING_ORG_REVIEW = "ACHA"; // Waiting for Chart/Org approval
465            public static final String AWAITING_TAX_REVIEW = "ATAX"; // Waiting for Vendor Tax approval
466            public static final String PENDING_E_INVOICE = "PEIN";
467    
468            // keep these in the order of potential routing
469            // Note it doesn't make much sense to compare auto_approved and dept_approved but this is
470            // easier than two enums plus this should primarily be used for user enterred areas
471            public enum STATUS_ORDER {
472                CANCELLED_IN_PROCESS(PurapConstants.PaymentRequestStatuses.CANCELLED_IN_PROCESS, false), 
473                CANCELLED_POST_AP_APPROVE(PurapConstants.PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, false), 
474                INITIATE(PurapConstants.PaymentRequestStatuses.INITIATE, true), 
475                IN_PROCESS(PurapConstants.PaymentRequestStatuses.IN_PROCESS, true), 
476                AWAITING_ACCOUNTS_PAYABLE_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_ACCOUNTS_PAYABLE_REVIEW, false), 
477                AWAITING_RECEIVING_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_RECEIVING_REVIEW, false), 
478                AWAITING_SUB_ACCT_MGR_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_SUB_ACCT_MGR_REVIEW, false), 
479                AWAITING_FISCAL_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_FISCAL_REVIEW, false), 
480                AWAITING_ORG_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_ORG_REVIEW, false), 
481                AWAITING_TAX_REVIEW(PurapConstants.PaymentRequestStatuses.AWAITING_TAX_REVIEW, false), 
482                DEPARTMENT_APPROVED(PurapConstants.PaymentRequestStatuses.DEPARTMENT_APPROVED, false), 
483                AUTO_APPROVED(PurapConstants.PaymentRequestStatuses.AUTO_APPROVED, false), ;
484    
485                private String statusCode = new String();
486                private boolean fullEntryAllowed = false;
487    
488                STATUS_ORDER(String statusCode, boolean fullEntry) {
489                    this.statusCode = statusCode;
490                    this.fullEntryAllowed = fullEntry;
491                }
492    
493                public static STATUS_ORDER getByStatusCode(String statusCode) {
494                    for (STATUS_ORDER status : STATUS_ORDER.values()) {
495                        if (StringUtils.equals(status.statusCode, statusCode)) {
496                            return status;
497                        }
498                    }
499                    return null;
500                }
501    
502                public static boolean isFullDocumentEntryCompleted(String status) {
503                    if (StringUtils.isNotBlank(status)) {
504                        return !getByStatusCode(status).fullEntryAllowed;                    
505                    }
506                    return false;
507                }
508    
509                public static STATUS_ORDER getPreviousStatus(String statusCode) {
510                    STATUS_ORDER statusOrder = STATUS_ORDER.getByStatusCode(statusCode);
511                    if (statusOrder.ordinal() > 0) {
512                        return STATUS_ORDER.values()[statusOrder.ordinal() - 1];
513                    }
514                    return null;
515                }
516    
517                public static boolean isFirstFullEntryStatus(String statusCode) {
518                    // NOTE this won't work if there endsup being two ways to get to the first full entry status (i.e. like AUTO/DEPT
519                    // for final)
520                    return getByStatusCode(statusCode).fullEntryAllowed && !getPreviousStatus(statusCode).fullEntryAllowed;
521                }
522            }
523    
524    
525            public static final String[] PREQ_STATUSES_FOR_AUTO_APPROVE = { AWAITING_SUB_ACCT_MGR_REVIEW, AWAITING_FISCAL_REVIEW, AWAITING_ORG_REVIEW };
526    
527            public static final String[] STATUSES_ALLOWED_FOR_EXTRACTION = { AUTO_APPROVED, DEPARTMENT_APPROVED };
528    
529            public static final String[] STATUSES_POTENTIALLY_ACTIVE = { IN_PROCESS, DEPARTMENT_APPROVED, AUTO_APPROVED, AWAITING_ACCOUNTS_PAYABLE_REVIEW, AWAITING_RECEIVING_REVIEW, AWAITING_SUB_ACCT_MGR_REVIEW, AWAITING_FISCAL_REVIEW, AWAITING_ORG_REVIEW, AWAITING_TAX_REVIEW };
530            
531            public static final Set CANCELLED_STATUSES = new HashSet();
532            public static final Set STATUSES_DISALLOWING_HOLD = new HashSet();
533            public static final Set STATUSES_DISALLOWING_REMOVE_HOLD = new HashSet();
534            public static final Set STATUSES_DISALLOWING_REQUEST_CANCEL = new HashSet();
535            public static final Set STATUSES_DISALLOWING_REMOVE_REQUEST_CANCEL = new HashSet();
536            static {
537                CANCELLED_STATUSES.add(CANCELLED_IN_PROCESS);
538                CANCELLED_STATUSES.add(CANCELLED_POST_AP_APPROVE);
539    
540                STATUSES_DISALLOWING_HOLD.add(INITIATE);
541                STATUSES_DISALLOWING_HOLD.add(IN_PROCESS);
542                STATUSES_DISALLOWING_HOLD.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
543    
544                STATUSES_DISALLOWING_REMOVE_HOLD.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
545    
546                STATUSES_DISALLOWING_REQUEST_CANCEL.add(INITIATE);
547                STATUSES_DISALLOWING_REQUEST_CANCEL.add(IN_PROCESS);
548                STATUSES_DISALLOWING_REQUEST_CANCEL.add(DEPARTMENT_APPROVED);
549                STATUSES_DISALLOWING_REQUEST_CANCEL.add(AUTO_APPROVED);
550                STATUSES_DISALLOWING_REQUEST_CANCEL.add(AWAITING_ACCOUNTS_PAYABLE_REVIEW);
551                STATUSES_DISALLOWING_REQUEST_CANCEL.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
552    
553                STATUSES_DISALLOWING_REMOVE_REQUEST_CANCEL.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
554            }
555        }
556        
557        public static class LineItemReceivingDocumentStrings{
558            public static final String DUPLICATE_RECEIVING_LINE_QUESTION = "DuplicateReceivingLine";
559            public static final String VENDOR_DATE = "Vendor Date";
560            public static final String AWAITING_PO_OPEN_STATUS = "OutstandingTransactions";
561            public static final String JOIN_NODE = "Join";
562        }
563        
564        public static class LineItemReceivingStatuses{
565            public static final String IN_PROCESS = "INPR";
566            public static final String AWAITING_PO_OPEN_STATUS = "APOO";
567            public static final String COMPLETE = "CMPT";
568            public static final String CANCELLED = "CANC";
569        }
570    
571        public static class CorrectionReceivingDocumentStrings{
572            public static final String NOTE_QUESTION = "CorrectionReceivingNote";
573            public static final String NOTE_PREFIX = "Note entered while creating Correction Receiving: ";
574            public static final String CORRECTION_RECEIVING_DOCUMENT_TYPE_NAME = "CorrectionReceiving";
575            public static final String CORRECTION_RECEIVING_CREATION_NOTE_PARAMETER = "CorrectionReceivingNoteParameter"; 
576        }
577    
578        public static class BulkReceivingDocumentStrings{
579            public static final String DUPLICATE_BULK_RECEIVING_DOCUMENT_QUESTION = "DuplicateBulkReceiving";
580            public static final String VENDOR_DATE = "Vendor Date";
581            public static final String MESSAGE_BULK_RECEIVING_DEFAULT_DOC_DESCRIPTION = "Not associated with a PO";
582        }
583        
584        public static class PREQDocumentsStrings {
585            public static final String DUPLICATE_INVOICE_QUESTION = "PREQDuplicateInvoice";
586            public static final String HOLD_PREQ_QUESTION = "HoldPREQ";
587            public static final String CONFIRM_HOLD_QUESTION = "ConfirmHold";
588            public static final String HOLD_NOTE_PREFIX = "Note entered while placing Payment Request on hold : ";
589            public static final String REMOVE_HOLD_PREQ_QUESTION = "RemoveHoldPREQ";
590            public static final String CONFIRM_REMOVE_HOLD_QUESTION = "ConfirmRemoveHold";
591            public static final String REMOVE_HOLD_NOTE_PREFIX = "Note entered while removing a hold on Payment Request : ";
592            public static final String CANCEL_PREQ_QUESTION = "CancelPREQ";
593            public static final String CONFIRM_CANCEL_QUESTION = "ConfirmCancel";
594            public static final String CANCEL_NOTE_PREFIX = "Note entered while requesting cancel on Payment Request : ";
595            public static final String REMOVE_CANCEL_PREQ_QUESTION = "RemoveCancelPREQ";
596            public static final String CONFIRM_REMOVE_CANCEL_QUESTION = "ConfirmRemoveCancel";
597            public static final String REMOVE_CANCEL_NOTE_PREFIX = "Note entered while removing a request cancel on Payment Request : ";
598            public static final String PURCHASE_ORDER_ID = "Purchase Order Identifier";
599            public static final String INVOICE_DATE = "Invoice Date";
600            public static final String INVOICE_NUMBER = "Invoice Number";
601            public static final String IN_PROCESS = "In Process";
602            public static final String THRESHOLD_DAYS_OVERRIDE_QUESTION = "Threshold Days Override Question";
603            public static final String UNUSED_TRADE_IN_QUESTION = "There is an unused trade in amount from PO that you could apply to line item; are you sure you want to proceed ?";
604            public static final String EXPIRED_ACCOUNT_QUESTION = "There is an expired account on the document; do you want to continue ?";
605            public static final String ENCUMBER_NEXT_FISCAL_YEAR_QUESTION = "Encumber Next Fiscal Year Question";
606            public static final String ENCUMBER_PRIOR_FISCAL_YEAR_QUESTION = "Encumber Prior Fiscal Year Question";
607            public static final String VENDOR_INVOICE_AMOUNT = "Vendor Invoice Amount";
608            public static final String VENDOR_STATE = "State";
609            public static final String VENDOR_POSTAL_CODE = "Postal Code";
610        }
611    
612        public static final String BELOW_THE_LINES_PARAMETER = "ADDITIONAL_CHARGES_ITEM_TYPES";
613        public static final String ITEM_ALLOWS_ZERO = "ITEM_TYPES_ALLOWING_ZERO";
614        public static final String ITEM_ALLOWS_POSITIVE = "ITEM_TYPES_ALLOWING_POSITIVE";
615        public static final String ITEM_ALLOWS_NEGATIVE = "ITEM_TYPES_ALLOWING_NEGATIVE";
616        public static final String ITEM_REQUIRES_USER_ENTERED_DESCRIPTION = "ITEM_TYPES_REQUIRING_USER_ENTERED_DESCRIPTION";
617    
618        public static class ItemFields {
619            public static final String QUANTITY = "Quantity";
620            public static final String UNIT_OF_MEASURE = "Unit of Measure";
621            public static final String DESCRIPTION = "Description";
622            public static final String UNIT_COST = "Unit Cost";
623            public static final String INVOICE_QUANTITY = "Qty Invoiced";
624            public static final String OPEN_QUANTITY = "Open Qty";
625            public static final String INVOICE_EXTENDED_PRICE = "Total Inv Cost";
626            public static final String COMMODITY_CODE = "Commodity Code";
627        }
628    
629        // ELECTRONIC INVOICE REJECT DOCUMENT
630        public static final String ELECTROINC_INVOICE_REJECT_ACTION_NAME = "ElectronicInvoiceReject";
631        public static final String REJECT_DOCUMENT_RESEARCH_INCOMPETE = "errors.reject.docucument.research.incomplete";
632    
633        // CREDIT MEMO DOCUMENT
634        public static final String CREDIT_MEMO_ACTION_NAME = "VendorCreditMemo";
635    
636        public static class CreditMemoStatuses {
637            public static final String INITIATE = "INIT";
638            public static final String IN_PROCESS = "INPR";
639            public static final String CANCELLED_IN_PROCESS = "CIPR";
640            public static final String CANCELLED_PRIOR_TO_AP_APPROVAL = "VOID";
641            public static final String CANCELLED_POST_AP_APPROVE = "CANC";
642            public static final String COMPLETE = "CMPT";
643            public static final String AWAITING_ACCOUNTS_PAYABLE_REVIEW = "APAD"; // Waiting for Accounts Payable approval
644    
645            public enum STATUS_ORDER {
646                CANCELLED_IN_PROCESS(PurapConstants.CreditMemoStatuses.CANCELLED_IN_PROCESS, false), CANCELLED_PRIOR_TO_AP_APPROVAL(PurapConstants.CreditMemoStatuses.CANCELLED_PRIOR_TO_AP_APPROVAL, false), CANCELLED_POST_AP_APPROVE(PurapConstants.CreditMemoStatuses.CANCELLED_POST_AP_APPROVE, false), INITIATE(PurapConstants.CreditMemoStatuses.INITIATE, true), IN_PROCESS(PurapConstants.CreditMemoStatuses.IN_PROCESS, true), AWAITING_ACCOUNTS_PAYABLE_REVIEW(PurapConstants.CreditMemoStatuses.AWAITING_ACCOUNTS_PAYABLE_REVIEW, false), COMPLETE(PurapConstants.CreditMemoStatuses.COMPLETE, false), ;
647    
648                private String statusCode = new String();
649                private boolean fullEntryAllowed = false;
650    
651                STATUS_ORDER(String statusCode, boolean fullEntry) {
652                    this.statusCode = statusCode;
653                    this.fullEntryAllowed = fullEntry;
654                }
655    
656                public static STATUS_ORDER getByStatusCode(String statusCode) {
657                    for (STATUS_ORDER status : STATUS_ORDER.values()) {
658                        if (StringUtils.equals(status.statusCode, statusCode)) {
659                            return status;
660                        }
661                    }
662                    return null;
663                }
664    
665                public static boolean isFullDocumentEntryCompleted(String status) {
666                    return !getByStatusCode(status).fullEntryAllowed;
667                }
668    
669                public static STATUS_ORDER getPreviousStatus(String statusCode) {
670                    STATUS_ORDER statusOrder = STATUS_ORDER.getByStatusCode(statusCode);
671                    if (statusOrder.ordinal() > 0) {
672                        return STATUS_ORDER.values()[statusOrder.ordinal() - 1];
673                    }
674                    return null;
675                }
676    
677                public static boolean isFirstFullEntryStatus(String statusCode) {
678                    // NOTE this won't work if there endsup being two ways to get to the first full entry status (i.e. like AUTO/DEPT
679                    // for final)
680                    return getByStatusCode(statusCode).fullEntryAllowed && !getPreviousStatus(statusCode).fullEntryAllowed;
681                }
682            }
683    
684            public static final String[] STATUSES_ALLOWED_FOR_EXTRACTION = { AWAITING_ACCOUNTS_PAYABLE_REVIEW, COMPLETE };
685            
686            public static final String[] STATUSES_POTENTIALLY_ACTIVE = { IN_PROCESS, AWAITING_ACCOUNTS_PAYABLE_REVIEW };
687                   
688            public static final Set CANCELLED_STATUSES = new HashSet();
689            public static final Set STATUSES_DISALLOWING_HOLD = new HashSet();
690            public static final Set STATUSES_NOT_REQUIRING_ENTRY_REVERSAL = new HashSet();
691            static {
692                CANCELLED_STATUSES.add(CANCELLED_IN_PROCESS);
693                CANCELLED_STATUSES.add(CANCELLED_PRIOR_TO_AP_APPROVAL);
694                CANCELLED_STATUSES.add(CANCELLED_POST_AP_APPROVE);
695    
696                STATUSES_DISALLOWING_HOLD.add(INITIATE);
697                STATUSES_DISALLOWING_HOLD.add(IN_PROCESS);
698                STATUSES_DISALLOWING_HOLD.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
699    
700                STATUSES_NOT_REQUIRING_ENTRY_REVERSAL.add(INITIATE);
701                STATUSES_NOT_REQUIRING_ENTRY_REVERSAL.add(IN_PROCESS);
702                STATUSES_NOT_REQUIRING_ENTRY_REVERSAL.addAll(Arrays.asList(CANCELLED_STATUSES.toArray(new String[CANCELLED_STATUSES.size()])));
703            }
704        }
705    
706        public static class CMDocumentsStrings {
707            public static final String DUPLICATE_CREDIT_MEMO_QUESTION = "CMDuplicateInvoice";
708            public static final String HOLD_CM_QUESTION = "HoldCM";
709            public static final String HOLD_NOTE_PREFIX = "Note entered while placing Credit Memo on hold: ";
710            public static final String CANCEL_CM_QUESTION = "CancelCM";
711            public static final String REMOVE_HOLD_CM_QUESTION = "RemoveCM";
712            public static final String REMOVE_HOLD_NOTE_PREFIX = "Note entered while removing hold on Credit Memo: ";
713        }
714    
715        public static final class CREDIT_MEMO_TYPE_LABELS {
716            public static final String TYPE_PO = "PO";
717            public static final String TYPE_PREQ = "PREQ";
718            public static final String TYPE_VENDOR = "Vendor";
719    
720        }
721    
722        private static final HashMap<String, Class> uncopyableFields() {
723            HashMap<String, Class> fields = new HashMap<String, Class>();
724            fields.put(KFSConstants.VERSION_NUMBER, null);
725            fields.put("LOG", null);
726            fields.put(KFSPropertyConstants.GENERAL_LEDGER_PENDING_ENTRIES, null);
727            fields.put(PurapPropertyConstants.CAPITAL_ASSET_ITEM_IDENTIFIER, null);
728            fields.put(PurapPropertyConstants.CAPITAL_ASSET_SYSTEM_IDENTIFIER, null);
729            fields.put("serialVersionUID", null); 
730            return fields;
731        }
732    
733        /*
734         * Fields that shouldn't be copied by our reflective copy method. This should only contain fields that are known throughout
735         * objects not item/doc specific ones
736         */
737        public static final HashMap<String, Class> KNOWN_UNCOPYABLE_FIELDS = uncopyableFields();
738    
739        private static final HashMap<String, Class> uncopyableItemFields() {
740            HashMap<String, Class> fields = new HashMap<String, Class>();
741            fields.put(PurapPropertyConstants.ITEM_IDENTIFIER, null);
742            fields.put(PurapPropertyConstants.ACCOUNTS, null);
743            return fields;
744        }
745    
746        /*
747         * Fields that shouldn't be copied by our reflective copy method. This should only contain fields that are known throughout
748         * objects not item/doc specific ones
749         */
750        public static final HashMap<String, Class> ITEM_UNCOPYABLE_FIELDS = uncopyableItemFields();
751    
752        private static final HashMap<String, Class> uncopyablePREQItemFields() {
753            HashMap<String, Class> fields = new HashMap<String, Class>(ITEM_UNCOPYABLE_FIELDS);
754            fields.put(PurapPropertyConstants.QUANTITY, null);
755            fields.put(PurapPropertyConstants.EXTENDED_PRICE, null);
756            fields.put(PurapPropertyConstants.ITEM_TAX_AMOUNT, null);
757            fields.put(PurapPropertyConstants.ITEM_SALES_TAX_AMOUNT, null);
758            return fields;
759        }
760    
761        /*
762         * fields that shouldn't be copied on PREQ item
763         */
764        public static final HashMap<String, Class> PREQ_ITEM_UNCOPYABLE_FIELDS = uncopyablePREQItemFields();
765    
766        public static final Map<String, Class> uncopyableFieldsForPurchaseOrder() {
767            Map<String, Class> returnMap = new HashMap<String, Class>();
768            returnMap.put(KFSPropertyConstants.DOCUMENT_NUMBER, null);
769            returnMap.put(PurapPropertyConstants.ITEM_IDENTIFIER, PurchaseOrderItem.class);
770            returnMap.put(PurapPropertyConstants.ACCOUNT_IDENTIFIER, PurchaseOrderAccount.class);
771            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_VENDOR_QUOTE_IDENTIFIER, PurchaseOrderVendorQuote.class);
772            returnMap.put("relatedRequisitionViews", PurchasingAccountsPayableDocumentBase.class);
773            returnMap.put("relatedPurchaseOrderViews", PurchasingAccountsPayableDocumentBase.class);
774            returnMap.put("relatedPaymentRequestViews", PurchasingAccountsPayableDocumentBase.class);
775            returnMap.put("relatedCreditMemoViews", PurchasingAccountsPayableDocumentBase.class);
776            returnMap.put("paymentHistoryPaymentRequestViews", PurchasingAccountsPayableDocumentBase.class);
777            returnMap.put("paymentHistoryCreditMemoViews", PurchasingAccountsPayableDocumentBase.class);
778            return returnMap;
779        }
780    
781        public static final Map<String, Class> UNCOPYABLE_FIELDS_FOR_PO = uncopyableFieldsForPurchaseOrder();
782        
783        public static final Map<String, Class<?>> uncopyableFieldsForSplitPurchaseOrder() {
784            Map<String, Class<?>> returnMap = new HashMap<String, Class<?>>();
785            returnMap.put(KFSPropertyConstants.DOCUMENT_HEADER, null);
786            returnMap.put(PurapPropertyConstants.PURAP_DOC_ID, null);        // We need to have a new PO ID.
787            returnMap.put(PurapPropertyConstants.ITEMS, null);               // Items (including additional charges) are to be excluded from the copy.
788            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_VENDOR_QUOTES, null);
789            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_QUOTE_INITIALIZATION_DATE, null);
790            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_QUOTE_AWARDED_DATE, null);
791            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_QUOTE_DUE_DATE, null);
792            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_QUOTE_TYPE_CODE, null);
793            returnMap.put(PurapPropertyConstants.PURCHASE_ORDER_QUOTE_VENDOR_NOTE_TEXT, null);
794            return returnMap;
795        }
796        
797        public static final Map<String, Class<?>> UNCOPYABLE_FIELDS_FOR_SPLIT_PO = uncopyableFieldsForSplitPurchaseOrder();
798    
799        public static final String PURAP_ORIGIN_CODE = "01";
800    
801        public static final class PurapDocTypeCodes {
802            public static final String PAYMENT_REQUEST_DOCUMENT = "PREQ";
803            public static final String CREDIT_MEMO_DOCUMENT = "CM";
804            public static final String PO_DOCUMENT = "PO";
805            public static final String PO_AMENDMENT_DOCUMENT = "POA";
806            public static final String PO_CLOSE_DOCUMENT = "POC";
807            public static final String PO_REOPEN_DOCUMENT = "POR";
808            public static final String PO_VOID_DOCUMENT = "POV";
809        }
810    
811        public static final Integer PRORATION_SCALE = new Integer(6);
812        public static final Integer CREDITMEMO_PRORATION_SCALE = new Integer(20);
813    
814        
815        private static HashMap<String, String> getPurapParameterDetailTypeCodes() {
816            HashMap<String, String> map;
817            map = new HashMap<String, String>();
818            map.put("REQS", RequisitionDocument.class.getName());
819            map.put("PO", PurchaseOrderDocument.class.getName());
820            map.put("POC", PurchaseOrderDocument.class.getName());
821            map.put("POR", PurchaseOrderDocument.class.getName());
822            map.put("POA", PurchaseOrderDocument.class.getName());
823            map.put("POPH", PurchaseOrderDocument.class.getName());
824            map.put("PORH", PurchaseOrderDocument.class.getName());
825            map.put("PORT", PurchaseOrderDocument.class.getName());
826            map.put("POV", PurchaseOrderDocument.class.getName());
827            map.put("POSP", PurchaseOrderDocument.class.getName());
828            map.put("PREQ", PaymentRequestDocument.class.getName());
829            map.put("CM", VendorCreditMemoDocument.class.getName());
830              return map;
831        }
832    
833        public static final HashMap<String, String> PURAP_DETAIL_TYPE_CODE_MAP = getPurapParameterDetailTypeCodes();
834        
835        public static class CapitalAssetTabStrings {
836            public static final String SYSTEM_DEFINITION = "Definition: A system is any group of line items added together to create one or more identical assets. Systems are further defined as line items that work together to perform one function. Each of the line items must be necessary for the system to function.";
837            
838            public static final String INDIVIDUAL_ASSETS = "IND";
839            public static final String ONE_SYSTEM = "ONE";
840            public static final String MULTIPLE_SYSTEMS = "MUL";
841            public static final String INDIVIDUAL_ASSETS_DESC = "Each of the lines will be capitalized as INDIVIDUAL ASSETS.";
842            public static final String ONE_SYSTEM_DESC = "Line items are being added together to create ONE SYSTEM.";
843            public static final String MULTIPLE_SYSTEMS_DESC = "Any of the line items will be added together to create MULTIPLE SYSTEMS.";
844            public static final String ASSET_DATA = "Asset data is on Item Tab.";
845            
846            public static final String QUESTION_SYSTEM_SWITCHING = "question.document.pur.systemTypeSwitching";
847            public static final String SYSTEM_SWITCHING_QUESTION = "SystemSwitchingQuestion";
848        }
849    
850        public static class NamedDateFormats {
851            public static String CXML_DATE_FORMAT = "CXML_DATE_FORMAT";
852            public static String CXML_SIMPLE_DATE_FORMAT = "CXML_SIMPLE_DATE_FORMAT";
853            public static String CXML_SIMPLE_TIME_FORMAT = "CXML_SIMPLE_TIME_FORMAT";
854            public static String KUALI_DATE_FORMAT = "KUALI_DATE_FORMAT";
855            public static String KUALI_SIMPLE_DATE_FORMAT = "KUALI_SIMPLE_DATE_FORMAT";
856            public static String KUALI_SIMPLE_DATE_FORMAT_2 = "KUALI_SIMPLE_DATE_FORMAT_2";
857            
858        }
859        
860        /**
861         * Electronic Invoice Constants
862         */
863        public static class ElectronicInvoice {
864            public static String NO_FILES_PROCESSED_EMAIL_MESSAGE = "No invoice files were processed today. " + "The developers will send notification if this was an error with the load process.";
865    
866            public static String[] ITEM_TYPES_REQUIRES_DESCRIPTION = {PurapConstants.ItemTypeCodes.ITEM_TYPE_ITEM_CODE,
867                                                                      PurapConstants.ItemTypeCodes.ITEM_TYPE_MISC_CODE};
868            
869            // ELECTRONIC INVOICE REJECT REASON TYPE CODES
870            public static String REJECT_REASON_TYPE_FILE = "FILE";
871            public static String REJECT_REASON_TYPE_ORDER = "INVC";
872    
873            // ELECTRONIC INVOICE CXML DEPLOYMENT MODE CODE FOR PRODUCTION
874            public static String CXML_DEPLOYMENT_MODE_PRODUCTION = "production";
875    
876            // ELECTRONIC INVOICE SHIPPING DESCRIPTION
877            public static String SHIPPING_DESCRIPTION = "Electronic Invoice Shipping";
878            public static String DEFAULT_BELOW_LINE_ITEM_DESCRIPTION = "Electronically entered amount";
879            
880            public final static String DEFAULT_SHIPPING_DESCRIPTION = "Shipping";
881            public final static String DEFAULT_SPECIAL_HANDLING_DESCRIPTION = "Handling";
882            
883            public static String CXML_ADDRESS_SHIP_TO_ROLE_ID = "shipTo";
884            public static String CXML_ADDRESS_BILL_TO_ROLE_ID = "billTo";
885            public static String CXML_ADDRESS_REMIT_TO_ROLE_ID = "remitTo";
886            
887            // name of our default address name we use (null for first available)
888            public static String CXML_ADDRESS_SHIP_TO_NAME = null;
889            public static String CXML_ADDRESS_BILL_TO_NAME = null;
890            public static String CXML_ADDRESS_REMIT_TO_NAME = null;
891    
892            /**
893             * Here is a list of reject reason type codes
894             */
895            public final static String DUNS_INVALID = "INDU";
896            public final static String INVOICE_ID_EMPTY = "IIDE";
897            public final static String INVOICE_DATE_GREATER = "IDAG";
898            public final static String INVOICE_DATE_INVALID = "IDIV";
899            public final static String INFORMATION_ONLY = "INFO";
900            public final static String FILE_FORMAT_INVALID = "INFF";
901            public final static String HEADER_INVOICE_IND_ON = "HIIO";
902            public final static String INVOICE_ORDERS_NOT_FOUND = "NOIV";
903            public final static String DUNS_NOT_FOUND = "NODU";
904            public final static String ITEM_MAPPING_NOT_AVAILABLE = "IMNA";
905            public final static String DISCOUNT_SUMMARY_AMT_MISMATCH = "DSAM";
906            public final static String SPL_HANDLING_SUMMARY_AMT_MISMATCH = "SSAM";
907            public final static String SHIPPING_SUMMARY_AMT_MISMATCH = "SHSA";
908            public final static String ITEM_TYPE_NAME_NOT_AVAILABLE = "ITNA";
909            public final static String INVALID_NUMBER_FORMAT = "NFEX";
910            public final static String PO_ID_EMPTY = "POIE";
911            public final static String PO_ID_INVALID_FORMAT = "POII";
912            public final static String PO_NOT_EXISTS = "PONE";
913            public final static String PO_VENDOR_NOT_MATCHES_WITH_INVOICE_VENDOR = "PVNM";
914            public final static String PO_NOT_OPEN = "PONO";
915            public final static String NO_MATCHING_PO_ITEM = "IMLI";
916            public final static String DUPLIATE_INVOICE_LINE_ITEM = "ICSL";
917            public final static String INACTIVE_LINE_ITEM = "ILIA";
918            public final static String CATALOG_NUMBER_MISMATCH = "IICN";
919            public final static String UNIT_OF_MEASURE_MISMATCH = "IUOM";
920            public final static String OUTSTANDING_ENCUMBERED_QTY_AVAILABLE = "UEOQ";
921            public final static String INVOICE_QTY_EMPTY = "IIQE";
922            public final static String PO_ITEM_QTY_LESSTHAN_INVOICE_ITEM_QTY = "PILI";
923            public final static String OUTSTANDING_ENCUMBERED_AMT_AVAILABLE = "UEAA";
924            public final static String PO_ITEM_AMT_LESSTHAN_INVOICE_ITEM_AMT = "PAIA";
925            public final static String PO_COST_SOURCE_EMPTY = "CSEM";
926            public final static String INVOICE_AMT_GREATER_THAN_UPPER_VARIANCE = "AGUV";
927            public final static String INVOICE_AMT_LESSER_THAN_LOWER_VARIANCE = "ALLV";
928            public final static String SALES_TAX_AMT_LESSER_THAN_LOWER_VARIANCE = "STLV";
929            public final static String SALES_TAX_AMT_GREATER_THAN_UPPER_VARIANCE = "STUV";
930            public final static String TAX_SUMMARY_AMT_EXISTS = "STNV";
931            public final static String TAX_SUMMARY_AMT_MISMATCH = "TSAM";
932            public final static String INVOICE_ORDER_DUPLICATE = "EIDU";
933    
934            public final static String PREQ_WORKLOW_EXCEPTION = "PRWE";
935            public final static String PREQ_DISCOUNT_ERROR = "PRDE";
936            public final static String PREQ_ROUTING_FAILURE = "PRRF";
937            public final static String PREQ_ROUTING_VALIDATION_ERROR = "PRVE";
938            public final static String ERROR_ADDING_SCHEMA = "EASC";
939            
940    
941            public static class RejectDocumentFields{
942                public final static String INVOICE_FILE_NUMBER = "invoiceFileNumber";
943                public final static String INVOICE_FILE_DATE = "invoiceFileDate";
944                
945                //VendorID?
946                
947                public final static String VENDOR_DUNS_NUMBER = "vendorDunsNumber";
948                public final static String INVOICE_PO_ID = "invoiceOrderPurchaseOrderIdentifier";
949                public final static String INVOICE_ITEM_LINE_NUMBER = "invoiceItemLineNumber";
950                public final static String INVOICE_ITEM_QUANTITY = "invoiceItemQuantity";
951                public final static String INVOICE_ITEM_UOM = "invoiceItemUnitOfMeasureCode";
952                public final static String INVOICE_ITEM_CATALOG_NUMBER = "invoiceItemCatalogNumber";
953                public final static String INVOICE_ITEM_UNIT_PRICE = "invoiceItemUnitPrice";
954                public final static String INVOICE_ITEM_SUBTOTAL_MAT = "invoiceItemSubTotalAmount";
955                public final static String INVOICE_ITEM_TAX_AMT = "invoiceItemTaxAmount";
956                public final static String INVOICE_ITEM_SPL_HANDLING_AMT = "invoiceItemSpecialHandlingAmount";
957                public final static String INVOICE_ITEM_SHIPPING_AMT = "invoiceItemShippingAmount";
958                public final static String INVOICE_ITEM_DISCOUNT_AMT = "invoiceItemDiscountAmount";
959                public final static String INVOICE_ITEM_NET_AMT = "invoiceItemNetAmount";
960                
961            }
962            
963        }
964        
965        public static String PRODUCTION_ENVIRONMENT = "PRD";
966    
967        public static String FAX_TEST_PHONE_NUMBER = "FAX_TEST_PHONE_NUMBER";
968        
969        public static final String ELECTRONIC_INVOICE_FILE_TYPE_INDENTIFIER = "electronicInvoiceInputFileType";
970        public static final String B2B_PO_RESPONSE_FILE_TYPE_INDENTIFIER = "b2bPOResponseFileType";
971        public static final String B2B_PUNCH_OUT_ORDER_FILE_TYPE_INDENTIFIER = "b2bPunchOutOrderFileType";
972        public static final String B2B_PUNCH_OUT_RESPONSE_FILE_TYPE_INDENTIFIER = "b2bPunchOutResponseFileType";
973    
974        public static class CapitalAssetAvailability {
975            public static final String NONE = "NONE";
976            public static final String ONCE = "ONCE";
977            public static final String EACH = "EACH";
978        }
979        
980        public static class CapitalAssetSystemTypes{
981            public static final String ONE_SYSTEM = "ONE";
982            public static final String INDIVIDUAL = "IND";
983            public static final String MULTIPLE = "MUL";
984        }
985    
986        public static final class CAMS_REQUIREDNESS_FIELDS {
987            private static final Map<String, String> getRequirednessFieldsByParameterNames() {
988                Map<String, String> fieldsByParameterNames = new HashMap<String, String>();
989                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_NUMBER_ON_REQUISITION, "itemCapitalAssets.capitalAssetNumber");
990                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_TRANSACTION_TYPE_ON_REQUISITION, "capitalAssetTransactionTypeCode");
991                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_TYPE_ON_REQUISITION, "capitalAssetTypeCode"); 
992                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_COMMENTS_ON_REQUISITION, "capitalAssetNoteText");
993                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_DESCRIPTION_ON_REQUISITION, "capitalAssetSystemDescription");
994                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_LOCATIONS_ADDRESS_ON_REQUISITION, "capitalAssetLocations.capitalAssetLine1Address"); 
995                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_LOCATIONS_QUANTITY_ON_REQUISITION, "capitalAssetLocations.itemQuantity");
996                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_MANUFACTURER_ON_REQUISITION, "capitalAssetManufacturerName");
997                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_MODEL_ON_REQUISITION, "capitalAssetModelDescription");
998                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_NOT_CURRENT_FISCAL_YEAR_ON_REQUISITION, "capitalAssetNotReceivedCurrentFiscalYearIndicator"); 
999                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_NUMBER_OF_ASSETS_ON_REQUISITION, "capitalAssetCountAssetNumber"); 
1000    
1001                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_NUMBER_ON_PURCHASE_ORDER, "itemCapitalAssets.capitalAssetNumber");
1002                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_TRANSACTION_TYPE_ON_PURCHASE_ORDER, "capitalAssetTransactionTypeCode");
1003                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_ASSET_TYPE_ON_PURCHASE_ORDER, "capitalAssetTypeCode"); 
1004                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_COMMENTS_ON_PURCHASE_ORDER, "capitalAssetNoteText");
1005                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_DESCRIPTION_ON_PURCHASE_ORDER, "capitalAssetSystemDescription");
1006                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_LOCATIONS_ADDRESS_ON_PURCHASE_ORDER, "capitalAssetLocations.capitalAssetLine1Address"); 
1007                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_LOCATIONS_QUANTITY_ON_PURCHASE_ORDER, "capitalAssetLocations.itemQuantity");
1008                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_MANUFACTURER_ON_PURCHASE_ORDER, "capitalAssetManufacturerName");
1009                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_MODEL_ON_PURCHASE_ORDER, "capitalAssetModelDescription");
1010                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_NOT_CURRENT_FISCAL_YEAR_ON_PURCHASE_ORDER, "capitalAssetNotReceivedCurrentFiscalYearIndicator"); 
1011                fieldsByParameterNames.put(PurapParameterConstants.CapitalAsset.CHARTS_REQUIRING_NUMBER_OF_ASSETS_ON_PURCHASE_ORDER, "capitalAssetCountAssetNumber"); 
1012    
1013                return Collections.unmodifiableMap(fieldsByParameterNames);
1014            }
1015            
1016            public static final Map<String, String> REQUIREDNESS_FIELDS_BY_PARAMETER_NAMES = getRequirednessFieldsByParameterNames();
1017        }
1018        
1019        public static class CapitalAssetSystemStates{
1020            public static final String NEW = "NEW";
1021            public static final String MODIFY = "MOD";
1022        }
1023        
1024        public static final class CAMS_AVAILABILITY_MATRIX {
1025    
1026            public static final List<AvailabilityMatrix> MATRIX_LIST = getAllFromAvailabilityMatrix();
1027    
1028            private static List<AvailabilityMatrix> getAllFromAvailabilityMatrix() {
1029                List<AvailabilityMatrix> result = new ArrayList<AvailabilityMatrix>();
1030                result.add(AvailabilityMatrix.TRAN_TYPE_ONE_NEW);
1031                result.add(AvailabilityMatrix.TRAN_TYPE_ONE_MOD);
1032                result.add(AvailabilityMatrix.TRAN_TYPE_IND_NEW);
1033                result.add(AvailabilityMatrix.TRAN_TYPE_IND_MOD);
1034                result.add(AvailabilityMatrix.TRAN_TYPE_MULT_NEW);
1035                result.add(AvailabilityMatrix.TRAN_TYPE_MULT_MOD);
1036    
1037                result.add(AvailabilityMatrix.ASSET_NUMBER_ONE_NEW);
1038                result.add(AvailabilityMatrix.ASSET_NUMBER_ONE_MOD);
1039                result.add(AvailabilityMatrix.ASSET_NUMBER_IND_NEW);
1040                result.add(AvailabilityMatrix.ASSET_NUMBER_IND_MOD);
1041                result.add(AvailabilityMatrix.ASSET_NUMBER_MULT_NEW);
1042                result.add(AvailabilityMatrix.ASSET_NUMBER_MULT_MOD);
1043                
1044                result.add(AvailabilityMatrix.COMMENTS_ONE_NEW);
1045                result.add(AvailabilityMatrix.COMMENTS_ONE_MOD);
1046                result.add(AvailabilityMatrix.COMMENTS_IND_NEW);
1047                result.add(AvailabilityMatrix.COMMENTS_IND_MOD);
1048                result.add(AvailabilityMatrix.COMMENTS_MULT_NEW);
1049                result.add(AvailabilityMatrix.COMMENTS_MULT_MOD);
1050                
1051                result.add(AvailabilityMatrix.NOT_CURRENT_FY_ONE_NEW);
1052                result.add(AvailabilityMatrix.NOT_CURRENT_FY_ONE_MOD);
1053                result.add(AvailabilityMatrix.NOT_CURRENT_FY_IND_NEW);
1054                result.add(AvailabilityMatrix.NOT_CURRENT_FY_IND_MOD);
1055                result.add(AvailabilityMatrix.NOT_CURRENT_FY_MULT_NEW);
1056                result.add(AvailabilityMatrix.NOT_CURRENT_FY_MULT_MOD);
1057                
1058                result.add(AvailabilityMatrix.ASSET_TYPE_ONE_NEW);
1059                result.add(AvailabilityMatrix.ASSET_TYPE_ONE_MOD);
1060                result.add(AvailabilityMatrix.ASSET_TYPE_IND_NEW);
1061                result.add(AvailabilityMatrix.ASSET_TYPE_IND_MOD);
1062                result.add(AvailabilityMatrix.ASSET_TYPE_MULT_NEW);
1063                result.add(AvailabilityMatrix.ASSET_TYPE_MULT_MOD);
1064                
1065                result.add(AvailabilityMatrix.MANUFACTURER_ONE_NEW);
1066                result.add(AvailabilityMatrix.MANUFACTURER_ONE_MOD);
1067                result.add(AvailabilityMatrix.MANUFACTURER_IND_NEW);
1068                result.add(AvailabilityMatrix.MANUFACTURER_IND_MOD);
1069                result.add(AvailabilityMatrix.MANUFACTURER_MULT_NEW);
1070                result.add(AvailabilityMatrix.MANUFACTURER_MULT_MOD);
1071                
1072                result.add(AvailabilityMatrix.MODEL_ONE_NEW);
1073                result.add(AvailabilityMatrix.MODEL_ONE_MOD);
1074                result.add(AvailabilityMatrix.MODEL_IND_NEW);
1075                result.add(AvailabilityMatrix.MODEL_IND_MOD);
1076                result.add(AvailabilityMatrix.MODEL_MULT_NEW);
1077                result.add(AvailabilityMatrix.MODEL_MULT_MOD);
1078                
1079                result.add(AvailabilityMatrix.DESCRIPTION_ONE_NEW);
1080                result.add(AvailabilityMatrix.DESCRIPTION_ONE_MOD);
1081                result.add(AvailabilityMatrix.DESCRIPTION_IND_NEW);
1082                result.add(AvailabilityMatrix.DESCRIPTION_IND_MOD);
1083                result.add(AvailabilityMatrix.DESCRIPTION_MULT_NEW);
1084                result.add(AvailabilityMatrix.DESCRIPTION_MULT_MOD);
1085                
1086                result.add(AvailabilityMatrix.LOC_QUANTITY_ONE_NEW);
1087                result.add(AvailabilityMatrix.LOC_QUANTITY_ONE_MOD);
1088                result.add(AvailabilityMatrix.LOC_QUANTITY_IND_NEW);
1089                result.add(AvailabilityMatrix.LOC_QUANTITY_IND_MOD);
1090                result.add(AvailabilityMatrix.LOC_QUANTITY_MULT_NEW);
1091                result.add(AvailabilityMatrix.LOC_QUANTITY_MULT_MOD);
1092                
1093                result.add(AvailabilityMatrix.LOC_ADDRESS_ONE_NEW);
1094                result.add(AvailabilityMatrix.LOC_ADDRESS_ONE_MOD);
1095                result.add(AvailabilityMatrix.LOC_ADDRESS_IND_NEW);
1096                result.add(AvailabilityMatrix.LOC_ADDRESS_IND_MOD);
1097                result.add(AvailabilityMatrix.LOC_ADDRESS_MULT_NEW);
1098                result.add(AvailabilityMatrix.LOC_ADDRESS_MULT_MOD);
1099                
1100                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_ONE_NEW);
1101                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_ONE_MOD);
1102                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_IND_NEW);
1103                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_IND_MOD);
1104                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_MULT_NEW);
1105                result.add(AvailabilityMatrix.HOW_MANY_ASSETS_MULT_MOD);
1106                
1107                return result;
1108            }
1109        }
1110        
1111        public static final class CAMSWarningStatuses {
1112            public static final Set<String> REQUISITION_STATUS_WARNING_NO_CAMS_DATA = getRequisitionStatusCAMSWarnings();
1113            public static final Set<String> PURCHASEORDER_STATUS_WARNING_NO_CAMS_DATA = getPurchaseOrderStatusCAMSWarnings();
1114            public static final Set<String> PAYMENT_REQUEST_STATUS_WARNING_NO_CAMS_DATA = getPurchaseOrderStatusCAMSWarnings();
1115            public static final Set<String> CREDIT_MEMO_STATUS_WARNING_NO_CAMS_DATA = getPurchaseOrderStatusCAMSWarnings();
1116            
1117            private static HashSet<String> getRequisitionStatusCAMSWarnings() {
1118                HashSet<String> statuses = new HashSet<String>();
1119                statuses.add(RequisitionStatuses.IN_PROCESS);
1120                statuses.add(RequisitionStatuses.AWAIT_CONTENT_REVIEW);
1121                statuses.add(RequisitionStatuses.AWAIT_FISCAL_REVIEW);
1122                return statuses;
1123            }
1124            private static HashSet<String> getPurchaseOrderStatusCAMSWarnings() {
1125                HashSet<String> statuses = new HashSet<String>();
1126                statuses.add(PurchaseOrderStatuses.IN_PROCESS);
1127                statuses.add(PurchaseOrderStatuses.AWAIT_PURCHASING_REVIEW);
1128                return statuses;
1129            }
1130            private static HashSet<String> getPaymentRequestStatusCAMSWarnings() {
1131                HashSet<String> statuses = new HashSet<String>();
1132                statuses.add(PaymentRequestStatuses.IN_PROCESS);
1133                return statuses;
1134            }
1135            private static HashSet<String> getCreditMemoStatusCAMSWarnings() {
1136                HashSet<String> statuses = new HashSet<String>();
1137                statuses.add(CreditMemoStatuses.IN_PROCESS);
1138                return statuses;
1139            }
1140        }
1141    
1142        public static final class AttachmentTypeCodes{
1143            public static final String ATTACHMENT_TYPE_CM_IMAGE = "Credit Memo Image";
1144            public static final String ATTACHMENT_TYPE_CONTRACTS = "Contracts";
1145            public static final String ATTACHMENT_TYPE_CONTRACT_AMENDMENTS = "Contract Amendments";
1146            public static final String ATTACHMENT_TYPE_OTHER = "Other";
1147            public static final String ATTACHMENT_TYPE_OTHER_RESTRICTED = "Other - Restricted";
1148            public static final String ATTACHMENT_TYPE_INVOICE_IMAGE = "Invoice Image";
1149            public static final String ATTACHMENT_TYPE_QUOTE = "Quotes";
1150            public static final String ATTACHMENT_TYPE_RFP = "RFPs";
1151            public static final String ATTACHMENT_TYPE_RFP_RESPONSES = "RFP Responses";
1152            public static final String ATTACHMENT_TYPE_TAX_DOCUMENTS = "Tax Documents";
1153        }
1154        
1155        
1156    }