1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  package org.kuali.kfs.fp.document.validation.impl;
20  
21  import java.util.Iterator;
22  import java.util.List;
23  
24  import org.apache.commons.lang.StringUtils;
25  import org.kuali.kfs.fp.businessobject.ProcurementCardTargetAccountingLine;
26  import org.kuali.kfs.fp.businessobject.ProcurementCardTransactionDetail;
27  import org.kuali.kfs.fp.document.ProcurementCardDocument;
28  import org.kuali.kfs.sys.KFSKeyConstants;
29  import org.kuali.kfs.sys.KFSPropertyConstants;
30  import org.kuali.kfs.sys.businessobject.AccountingLine;
31  import org.kuali.kfs.sys.businessobject.SourceAccountingLine;
32  import org.kuali.kfs.sys.context.SpringContext;
33  import org.kuali.kfs.sys.document.validation.GenericValidation;
34  import org.kuali.kfs.sys.document.validation.event.AttributedDocumentEvent;
35  import org.kuali.rice.core.api.parameter.ParameterEvaluator;
36  import org.kuali.rice.core.api.parameter.ParameterEvaluatorService;
37  import org.kuali.rice.krad.util.GlobalVariables;
38  import org.kuali.rice.krad.util.MessageMap;
39  import org.kuali.rice.krad.util.ObjectUtils;
40  
41  
42  
43  
44  public class ProcurementCardObjectCodeValidation extends GenericValidation {
45      private AccountingLine accountingLineForValidation;
46  
47      
48  
49  
50  
51  
52      public boolean validate(AttributedDocumentEvent event) {
53          ProcurementCardDocument pcDocument = (ProcurementCardDocument) event.getDocument();
54          AccountingLine accountingLine = getAccountingLineForValidation();
55          if (!accountingLine.isTargetAccountingLine()) return true;
56          
57          MessageMap errors = GlobalVariables.getMessageMap();
58          String errorKey = KFSPropertyConstants.FINANCIAL_OBJECT_CODE;
59          boolean objectCodeAllowed = true;
60  
61          
62          if (ObjectUtils.isNull(accountingLine.getObjectCode())) {
63              return false;
64          }
65  
66          
67          if (!accountingLine.getObjectCode().isFinancialObjectActiveCode()) {
68              errors.putError(errorKey, KFSKeyConstants.ERROR_INACTIVE, "object code");
69              objectCodeAllowed = false;
70          }
71  
72          
73          String mccRestriction = "";
74          ProcurementCardTargetAccountingLine line = (ProcurementCardTargetAccountingLine) accountingLine;
75          List pcTransactions = pcDocument.getTransactionEntries();
76          for (Iterator iter = pcTransactions.iterator(); iter.hasNext();) {
77              ProcurementCardTransactionDetail transactionEntry = (ProcurementCardTransactionDetail) iter.next();
78              if (transactionEntry.getFinancialDocumentTransactionLineNumber().equals(line.getFinancialDocumentTransactionLineNumber())) {
79                  mccRestriction = transactionEntry.getProcurementCardVendor().getTransactionMerchantCategoryCode();
80              }
81          }
82  
83          if (StringUtils.isBlank(mccRestriction)) {
84              return objectCodeAllowed;
85          }
86  
87          
88          if (objectCodeAllowed) {
89              ParameterEvaluator evaluator = SpringContext.getBean(ParameterEvaluatorService.class).getParameterEvaluator(ProcurementCardDocument.class, ProcurementCardDocumentRuleConstants.VALID_OBJECTS_BY_MCC_CODE_PARM_NM, ProcurementCardDocumentRuleConstants.INVALID_OBJECTS_BY_MCC_CODE_PARM_NM, mccRestriction, accountingLine.getFinancialObjectCode());
90              objectCodeAllowed = evaluator.evaluateAndAddError(SourceAccountingLine.class, KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
91          }
92  
93          
94          if (objectCodeAllowed) {
95              ParameterEvaluator evaluator = SpringContext.getBean(ParameterEvaluatorService.class).getParameterEvaluator(ProcurementCardDocument.class, ProcurementCardDocumentRuleConstants.VALID_OBJ_SUB_TYPE_BY_MCC_CODE_PARM_NM, ProcurementCardDocumentRuleConstants.INVALID_OBJ_SUB_TYPE_BY_MCC_CODE_PARM_NM, mccRestriction, accountingLine.getObjectCode().getFinancialObjectSubTypeCode());
96              objectCodeAllowed = evaluator.evaluateAndAddError(SourceAccountingLine.class, "objectCode.financialObjectSubTypeCode", KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
97          }
98          return objectCodeAllowed;
99      }
100 
101 
102     
103 
104 
105 
106     public AccountingLine getAccountingLineForValidation() {
107         return accountingLineForValidation;
108     }
109 
110     
111 
112 
113 
114     public void setAccountingLineForValidation(AccountingLine accountingLineForValidation) {
115         this.accountingLineForValidation = accountingLineForValidation;
116     }
117 }