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.List;
020    
021    import org.kuali.kfs.module.purap.PurapConstants.PaymentRequestStatuses;
022    
023    /**
024     * Holds Workflow constants for PURAP documents
025     */
026    public class PurapWorkflowConstants {
027    
028        public interface NodeDetails {
029            public String getName();
030    
031            public String getAwaitingStatusCode();
032    
033            public String getDisapprovedStatusCode();
034    
035            public NodeDetails getPreviousNodeDetails();
036    
037            public NodeDetails getNextNodeDetails();
038    
039            public NodeDetails getNodeDetailByName(String name);
040    
041            public int getOrdinal();
042        }
043    
044        // Global
045        public static final String HAS_ACCOUNTING_LINES = "HasAccountingLines";
046        public static final String AMOUNT_REQUIRES_SEPARATION_OF_DUTIES_REVIEW_SPLIT = "AmountRequiresSeparationOfDutiesReview";
047        public static final String CONTRACT_MANAGEMENT_REVIEW_REQUIRED = "RequiresContractManagementReview";
048        public static final String VENDOR_IS_EMPLOYEE_OR_NON_RESIDENT_ALIEN = "VendorIsEmployeeOrNonResidentAlien";
049        public static final String AWARD_REVIEW_REQUIRED = "RequiresAwardReview";
050        public static final String BUDGET_REVIEW_REQUIRED = "RequiresBudgetReview";
051        public static final String TRANSMISSION_METHOD_IS_PRINT = "TransmissionMethodIsPrint";
052        public static final String HAS_NEW_UNORDERED_ITEMS = "HasNewUnorderedItems";
053        public static final String RELATES_TO_OUTSTANDING_TRANSACTIONS = "RelatesToOutstandingTransactions";
054        public static final String REQUIRES_IMAGE_ATTACHMENT = "RequiresImageAttachment";
055        public static final String PURCHASE_WAS_RECEIVED = "PurchaseWasReceived";
056        
057        public static final String DOC_ADHOC_NODE_NAME = "AdHoc";
058    
059        public static class ContractManagerAssignmentDocument {
060            public static final String WORKFLOW_DOCUMENT_TITLE = "Contract Manager Assignment";
061            public static final String ASSIGN_CONTRACT_DOC_ERROR_COMPLETING_POST_PROCESSING = "Unable to save the contract manager for the following Requisitions: ";
062        }
063    
064        public static class RequisitionDocument {
065            public enum NodeDetailEnum implements NodeDetails {
066                ADHOC_REVIEW(DOC_ADHOC_NODE_NAME, null, PurapConstants.RequisitionStatuses.CANCELLED), CONTENT_REVIEW("Organization", PurapConstants.RequisitionStatuses.AWAIT_CONTENT_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_CONTENT), HAS_ACCOUNTING_LINES("Initiator", PurapConstants.RequisitionStatuses.AWAIT_HAS_ACCOUNTING_LINES, PurapConstants.RequisitionStatuses.DAPRVD_HAS_ACCOUNTING_LINES), SUB_ACCOUNT_REVIEW("SubAccount", PurapConstants.RequisitionStatuses.AWAIT_SUB_ACCT_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_SUB_ACCT), ACCOUNT_REVIEW("Account", PurapConstants.RequisitionStatuses.AWAIT_FISCAL_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_FISCAL), ORG_REVIEW("AccountingOrganizationHierarchy", PurapConstants.RequisitionStatuses.AWAIT_CHART_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_CHART), COMMODITY_CODE_REVIEW("Commodity", PurapConstants.RequisitionStatuses.AWAIT_COMMODITY_CODE_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_COMMODITY_CODE), SEPARATION_OF_DUTIES_REVIEW("SeparationOfDuties", PurapConstants.RequisitionStatuses.AWAIT_SEP_OF_DUTY_REVIEW, PurapConstants.RequisitionStatuses.DAPRVD_SEP_OF_DUTY), ;
067                private final String name;
068                private final String awaitingStatusCode;
069                private final String disapprovedStatusCode;
070    
071                NodeDetailEnum(String name, String awaitingStatusCode, String disapprovedStatusCode) {
072                    this.name = name;
073                    this.awaitingStatusCode = awaitingStatusCode;
074                    this.disapprovedStatusCode = disapprovedStatusCode;
075                }
076    
077                public String getName() {
078                    return name;
079                }
080    
081                public String getAwaitingStatusCode() {
082                    return awaitingStatusCode;
083                }
084    
085                public String getDisapprovedStatusCode() {
086                    return disapprovedStatusCode;
087                }
088    
089                public NodeDetails getPreviousNodeDetails() {
090                    if (this.ordinal() > 0) {
091                        return NodeDetailEnum.values()[this.ordinal() - 1];
092                    }
093                    return null;
094                }
095    
096                public NodeDetails getNextNodeDetails() {
097                    if (this.ordinal() < (NodeDetailEnum.values().length - 1)) {
098                        return NodeDetailEnum.values()[this.ordinal() + 1];
099                    }
100                    return null;
101                }
102    
103                public NodeDetails getNodeDetailByName(String name) {
104                    return getNodeDetailEnumByName(name);
105                }
106    
107                public static NodeDetails getNodeDetailEnumByName(String name) {
108                    for (NodeDetailEnum nodeDetailEnum : NodeDetailEnum.values()) {
109                        if (nodeDetailEnum.name.equals(name)) {
110                            return nodeDetailEnum;
111                        }
112                    }
113                    return null;
114                }
115    
116                public int getOrdinal() {
117                    return this.ordinal();
118                }
119            }
120    
121        }
122    
123        public static class PurchaseOrderDocument {
124            public enum NodeDetailEnum implements NodeDetails {
125                ADHOC_REVIEW(DOC_ADHOC_NODE_NAME, null, PurapConstants.PurchaseOrderStatuses.CANCELLED), AWAIT_NEW_UNORDERED_ITEM_REVIEW("NewUnorderedItems", PurapConstants.PurchaseOrderStatuses.AWAIT_NEW_UNORDERED_ITEM_REVIEW, PurapConstants.PurchaseOrderStatuses.VOID), INTERNAL_PURCHASING_REVIEW("ContractManagement", PurapConstants.PurchaseOrderStatuses.AWAIT_PURCHASING_REVIEW, PurapConstants.PurchaseOrderStatuses.DAPRVD_PURCHASING), COMMODITY_CODE_REVIEW("Commodity", PurapConstants.PurchaseOrderStatuses.AWAIT_COMMODITY_CODE_REVIEW, PurapConstants.PurchaseOrderStatuses.DAPRVD_COMMODITY_CODE), CONTRACTS_AND_GRANTS_REVIEW("Award", PurapConstants.PurchaseOrderStatuses.AWAIT_CONTRACTS_GRANTS_REVIEW, PurapConstants.PurchaseOrderStatuses.DAPRVD_CONTRACTS_GRANTS), BUDGET_OFFICE_REVIEW("Budget", PurapConstants.PurchaseOrderStatuses.AWAIT_BUDGET_REVIEW, PurapConstants.PurchaseOrderStatuses.DAPRVD_BUDGET), VENDOR_TAX_REVIEW("Tax", PurapConstants.PurchaseOrderStatuses.AWAIT_TAX_REVIEW, PurapConstants.PurchaseOrderStatuses.DAPRVD_TAX), DOCUMENT_TRANSMISSION("JoinVendorIsEmployeeOrNonResidentAlien", null, PurapConstants.PurchaseOrderStatuses.VOID), ;
126    
127                private final String name;
128                private final String awaitingStatusCode;
129                private final String disapprovedStatusCode;
130    
131                NodeDetailEnum(String name, String awaitingStatusCode, String disapprovedStatusCode) {
132                    this.name = name;
133                    this.awaitingStatusCode = awaitingStatusCode;
134                    this.disapprovedStatusCode = disapprovedStatusCode;
135                }
136    
137                public String getName() {
138                    return name;
139                }
140    
141                public String getAwaitingStatusCode() {
142                    return awaitingStatusCode;
143                }
144    
145                public String getDisapprovedStatusCode() {
146                    return disapprovedStatusCode;
147                }
148    
149                public NodeDetails getPreviousNodeDetails() {
150                    if (this.ordinal() > 0) {
151                        return NodeDetailEnum.values()[this.ordinal() - 1];
152                    }
153                    return null;
154                }
155    
156                public NodeDetails getNextNodeDetails() {
157                    if (this.ordinal() < (NodeDetailEnum.values().length - 1)) {
158                        return NodeDetailEnum.values()[this.ordinal() + 1];
159                    }
160                    return null;
161                }
162    
163                public NodeDetails getNodeDetailByName(String name) {
164                    return getNodeDetailEnumByName(name);
165                }
166    
167                public static NodeDetails getNodeDetailEnumByName(String name) {
168                    for (NodeDetailEnum nodeDetailEnum : NodeDetailEnum.values()) {
169                        if (nodeDetailEnum.name.equals(name)) {
170                            return nodeDetailEnum;
171                        }
172                    }
173                    return null;
174                }
175    
176                public int getOrdinal() {
177                    return this.ordinal();
178                }
179            }
180        }
181    
182        public static class PaymentRequestDocument {
183            public enum NodeDetailEnum implements NodeDetails {
184                ADHOC_REVIEW(DOC_ADHOC_NODE_NAME, null, PaymentRequestStatuses.CANCELLED_IN_PROCESS, false), 
185                ACCOUNTS_PAYABLE_REVIEW("ImageAttachment", PaymentRequestStatuses.AWAITING_ACCOUNTS_PAYABLE_REVIEW, PaymentRequestStatuses.CANCELLED_IN_PROCESS, false), 
186                AWAITING_RECEIVING_REVIEW("PurchaseWasReceived", PaymentRequestStatuses.AWAITING_RECEIVING_REVIEW, PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, false), 
187                SUB_ACCOUNT_REVIEW("SubAccount", PaymentRequestStatuses.AWAITING_SUB_ACCT_MGR_REVIEW, PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, false), 
188                ACCOUNT_REVIEW("Account", PaymentRequestStatuses.AWAITING_FISCAL_REVIEW, PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, true), 
189                ORG_REVIEW("AccountingOrganizationHierarchy", PaymentRequestStatuses.AWAITING_ORG_REVIEW, PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, false), 
190                VENDOR_TAX_REVIEW("Tax", PaymentRequestStatuses.AWAITING_TAX_REVIEW, PaymentRequestStatuses.CANCELLED_POST_AP_APPROVE, true);
191                
192                private final String name;
193                private final String awaitingStatusCode;
194                private final String disapprovedStatusCode;
195                private final boolean correctingGeneralLedgerEntriesRequired;
196    
197                NodeDetailEnum(String name, String awaitingStatusCode, String disapprovedStatusCode, boolean correctingGeneralLedgerEntriesRequired) {
198                    this.name = name;
199                    this.awaitingStatusCode = awaitingStatusCode;
200                    this.disapprovedStatusCode = disapprovedStatusCode;
201                    this.correctingGeneralLedgerEntriesRequired = correctingGeneralLedgerEntriesRequired;
202                }
203    
204                public String getName() {
205                    return name;
206                }
207    
208                public String getAwaitingStatusCode() {
209                    return awaitingStatusCode;
210                }
211    
212                public String getDisapprovedStatusCode() {
213                    return disapprovedStatusCode;
214                }
215    
216                public boolean isCorrectingGeneralLedgerEntriesRequired() {
217                    return correctingGeneralLedgerEntriesRequired;
218                }
219    
220                public NodeDetails getPreviousNodeDetails() {
221                    if (this.ordinal() > 0) {
222                        return NodeDetailEnum.values()[this.ordinal() - 1];
223                    }
224                    return null;
225                }
226    
227                public NodeDetails getNextNodeDetails() {
228                    if (this.ordinal() < (NodeDetailEnum.values().length - 1)) {
229                        return NodeDetailEnum.values()[this.ordinal() + 1];
230                    }
231                    return null;
232                }
233    
234                public NodeDetails getNodeDetailByName(String name) {
235                    return getNodeDetailEnumByName(name);
236                }
237    
238                public static NodeDetails getNodeDetailEnumByName(String name) {
239                    for (NodeDetailEnum nodeDetailEnum : NodeDetailEnum.values()) {
240                        if (nodeDetailEnum.name.equals(name)) {
241                            return nodeDetailEnum;
242                        }
243                    }
244                    return null;
245                }
246    
247                public static List<String> getNodesRequiringCorrectingGeneralLedgerEntries() {
248                    List<String> returnEnumNames = new ArrayList<String>();
249                    for (NodeDetailEnum currentEnum : NodeDetailEnum.values()) {
250                        if (currentEnum.isCorrectingGeneralLedgerEntriesRequired()) {
251                            returnEnumNames.add(currentEnum.getName());
252                        }
253                    }
254                    return returnEnumNames;
255                }
256    
257                public int getOrdinal() {
258                    return this.ordinal();
259                }
260            }
261        }
262    
263        public static class CreditMemoDocument {
264            public enum NodeDetailEnum implements NodeDetails {
265                ADHOC_REVIEW(DOC_ADHOC_NODE_NAME, null, PurapConstants.PaymentRequestStatuses.CANCELLED_IN_PROCESS, false), ACCOUNTS_PAYABLE_REVIEW("ImageAttachment", PurapConstants.CreditMemoStatuses.AWAITING_ACCOUNTS_PAYABLE_REVIEW, PurapConstants.CreditMemoStatuses.CANCELLED_PRIOR_TO_AP_APPROVAL, false), ;
266    
267                private final String name;
268                private final String awaitingStatusCode;
269                private final String disapprovedStatusCode;
270                private final boolean correctingGeneralLedgerEntriesRequired;
271    
272                NodeDetailEnum(String name, String awaitingStatusCode, String disapprovedStatusCode, boolean correctingGeneralLedgerEntriesRequired) {
273                    this.name = name;
274                    this.awaitingStatusCode = awaitingStatusCode;
275                    this.disapprovedStatusCode = disapprovedStatusCode;
276                    this.correctingGeneralLedgerEntriesRequired = correctingGeneralLedgerEntriesRequired;
277                }
278    
279                public String getName() {
280                    return name;
281                }
282    
283                public String getAwaitingStatusCode() {
284                    return awaitingStatusCode;
285                }
286    
287                public String getDisapprovedStatusCode() {
288                    return disapprovedStatusCode;
289                }
290    
291                public boolean isCorrectingGeneralLedgerEntriesRequired() {
292                    return correctingGeneralLedgerEntriesRequired;
293                }
294    
295                public NodeDetails getPreviousNodeDetails() {
296                    if (this.ordinal() > 0) {
297                        return NodeDetailEnum.values()[this.ordinal() - 1];
298                    }
299                    return null;
300                }
301    
302                public NodeDetails getNextNodeDetails() {
303                    if (this.ordinal() < (NodeDetailEnum.values().length - 1)) {
304                        return NodeDetailEnum.values()[this.ordinal() + 1];
305                    }
306                    return null;
307                }
308    
309                public NodeDetails getNodeDetailByName(String name) {
310                    return getNodeDetailEnumByName(name);
311                }
312    
313                public static NodeDetails getNodeDetailEnumByName(String name) {
314                    for (NodeDetailEnum nodeDetailEnum : NodeDetailEnum.values()) {
315                        if (nodeDetailEnum.name.equals(name)) {
316                            return nodeDetailEnum;
317                        }
318                    }
319                    return null;
320                }
321    
322                public static List<String> getNodesRequiringCorrectingGeneralLedgerEntries() {
323                    List<String> returnEnumNames = new ArrayList<String>();
324                    for (NodeDetailEnum currentEnum : NodeDetailEnum.values()) {
325                        if (currentEnum.isCorrectingGeneralLedgerEntriesRequired()) {
326                            returnEnumNames.add(currentEnum.getName());
327                        }
328                    }
329                    return returnEnumNames;
330                }
331    
332                public int getOrdinal() {
333                    return this.ordinal();
334                }
335            }
336        }
337    }