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.vnd.document.validation.impl;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase;
020 import org.kuali.kfs.sys.KFSConstants;
021 import org.kuali.kfs.sys.context.SpringContext;
022 import org.kuali.kfs.vnd.VendorConstants;
023 import org.kuali.kfs.vnd.VendorKeyConstants;
024 import org.kuali.kfs.vnd.VendorUtils;
025 import org.kuali.kfs.vnd.businessobject.VendorDetail;
026 import org.kuali.kfs.vnd.businessobject.VendorType;
027 import org.kuali.kfs.vnd.document.service.VendorService;
028 import org.kuali.rice.kns.document.Document;
029 import org.kuali.rice.kns.document.MaintenanceDocument;
030 import org.kuali.rice.kns.service.BusinessObjectService;
031 import org.kuali.rice.kns.service.DateTimeService;
032 import org.kuali.rice.kns.util.GlobalVariables;
033 import org.kuali.rice.kns.util.ObjectUtils;
034
035 /**
036 * Business Prerules applicable to VendorDetail documents. These PreRules checks for the VendorDetail that needs to occur while
037 * still in the Struts processing. This includes setting the vendorName field using the values from vendorLastName and
038 * vendorFirstName, and could be used for many other purposes.
039 */
040 public class VendorPreRules extends MaintenancePreRulesBase {
041
042 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(VendorPreRules.class);
043
044 protected VendorDetail newVendorDetail;
045 protected String personId;
046
047 public VendorPreRules() {
048 }
049
050 /**
051 * Returns the Universal User Id of the current logged-in user
052 *
053 * @return String the PersonId
054 */
055
056 public String getPersonId() {
057 if (ObjectUtils.isNull(personId)) {
058 this.personId = GlobalVariables.getUserSession().getPerson().getPrincipalId();
059 }
060 return this.personId;
061 }
062
063 /**
064 * Sets up a convenience object and few other vendor attributes
065 *
066 * @see org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase#doCustomPreRules(org.kuali.rice.kns.document.MaintenanceDocument)
067 */
068 @Override
069 protected boolean doCustomPreRules(MaintenanceDocument document) {
070 setupConvenienceObjects(document);
071 setVendorNamesAndIndicator(document);
072 setVendorRestriction(document);
073 if (StringUtils.isBlank(question) || (question.equals(VendorConstants.CHANGE_TO_PARENT_QUESTION_ID))) {
074 detectAndConfirmChangeToParent(document);
075 }
076
077 //check to page review ONLY if it is a new vendor
078 if (newVendorDetail.getVendorHeaderGeneratedIdentifier() == null &&
079 newVendorDetail.getVendorDetailAssignedIdentifier() == null) {
080 displayReview(document);
081 }
082 return true;
083 }
084
085 /**
086 * Sets the convenience objects like newVendorDetail and oldVendorDetail, so you have short and easy handles to the new and old
087 * objects contained in the maintenance document. It also calls the BusinessObjectBase.refresh(), which will attempt to load all
088 * sub-objects from the DB by their primary keys, if available.
089 *
090 * @param document - the maintenanceDocument being evaluated
091 */
092 protected void setupConvenienceObjects(MaintenanceDocument document) {
093 // setup newAccount convenience objects, make sure all possible sub-objects are populated
094 newVendorDetail = (VendorDetail) document.getNewMaintainableObject().getBusinessObject();
095 }
096
097 /**
098 * Sets the vendorFirstLastNameIndicator to true if the first name and last name fields were filled in but the vendorName field
099 * is blank and it sets the vendorFirstLastNameIndicator to false if the vendorName field is filled in and the first name and
100 * last name fields were both blank.
101 *
102 * @param document - the maintenanceDocument being evaluated
103 */
104 protected void setVendorNamesAndIndicator(MaintenanceDocument document) {
105 if (StringUtils.isBlank(newVendorDetail.getVendorName()) && !StringUtils.isBlank(newVendorDetail.getVendorFirstName()) && !StringUtils.isBlank(newVendorDetail.getVendorLastName())) {
106
107 newVendorDetail.setVendorFirstLastNameIndicator(true);
108 newVendorDetail.setVendorFirstName(removeDelimiter(newVendorDetail.getVendorFirstName()));
109 newVendorDetail.setVendorLastName(removeDelimiter(newVendorDetail.getVendorLastName()));
110
111 }
112 else if (!StringUtils.isBlank(newVendorDetail.getVendorName()) && StringUtils.isBlank(newVendorDetail.getVendorFirstName()) && StringUtils.isBlank(newVendorDetail.getVendorLastName())) {
113 newVendorDetail.setVendorFirstLastNameIndicator(false);
114 }
115 }
116
117 /**
118 * Sets the vendorRestrictedDate and vendorRestrictedPersonIdentifier if the vendor restriction has changed from No to Yes.
119 *
120 * @param document - the maintenanceDocument being evaluated
121 */
122 protected void setVendorRestriction(MaintenanceDocument document) {
123 VendorDetail oldVendorDetail = (VendorDetail) document.getOldMaintainableObject().getBusinessObject();
124 Boolean oldVendorRestrictedIndicator = null;
125 if (ObjectUtils.isNotNull(oldVendorDetail)) {
126 oldVendorRestrictedIndicator = oldVendorDetail.getVendorRestrictedIndicator();
127 }
128 // If the Vendor Restricted Indicator will change, change the date and person id appropriately.
129 if ((ObjectUtils.isNull(oldVendorRestrictedIndicator) || (!oldVendorRestrictedIndicator)) && ObjectUtils.isNotNull(newVendorDetail.getVendorRestrictedIndicator()) && newVendorDetail.getVendorRestrictedIndicator()) {
130 // Indicator changed from (null or false) to true.
131 newVendorDetail.setVendorRestrictedDate(SpringContext.getBean(DateTimeService.class).getCurrentSqlDate());
132 newVendorDetail.setVendorRestrictedPersonIdentifier(getPersonId());
133 }
134 else if (ObjectUtils.isNotNull(oldVendorRestrictedIndicator) && oldVendorRestrictedIndicator && ObjectUtils.isNotNull(newVendorDetail.getVendorRestrictedIndicator()) && (!newVendorDetail.getVendorRestrictedIndicator())) {
135 // Indicator changed from true to false.
136 newVendorDetail.setVendorRestrictedDate(null);
137 newVendorDetail.setVendorRestrictedPersonIdentifier(null);
138 }
139
140 }
141
142 /**
143 * This is a helper method to remove all the delimiters from the vendor name
144 *
145 * @param str the original vendorName
146 * @return result String the vendorName after the delimiters have been removed
147 */
148 protected String removeDelimiter(String str) {
149 String result = str.replaceAll(VendorConstants.NAME_DELIM, KFSConstants.BLANK_SPACE);
150 return result;
151 }
152
153
154 /**
155 * Displays a review if indicated by the vendor type and the associated text from that type
156 *
157 * @param document - vendordetail document
158 */
159 public void displayReview(Document document) {
160 VendorDetail vendorDetail = (VendorDetail) document.getDocumentBusinessObject();
161
162 VendorType vendorType = vendorDetail.getVendorHeader().getVendorType();
163
164 if (vendorType == null) {
165 vendorType = new VendorType();
166 vendorType.setVendorTypeCode(vendorDetail.getVendorHeader().getVendorTypeCode());
167 vendorType = (VendorType) SpringContext.getBean(BusinessObjectService.class).retrieve(vendorType);
168 }
169 if (vendorType != null && vendorType.isVendorShowReviewIndicator()) {
170 String questionText = vendorType.getVendorReviewText();
171
172 //
173 // Only recognize the review request if the question text isn't null.
174 // Why preview something that doesn't exist?
175 //
176 if (questionText != null) {
177
178 if (vendorDetail.getVendorName() != null) {
179 questionText = questionText.replace("{0}", vendorDetail.getVendorName());
180 }
181 else {
182 questionText = questionText.replace("{0}", "(not entered)");
183 }
184 questionText = questionText.replace("{1}", document.getDocumentNumber());
185 Boolean proceed = super.askOrAnalyzeYesNoQuestion(VendorConstants.ACKNOWLEDGE_NEW_VENDOR_INFO, questionText);
186
187 if (!proceed) {
188 abortRulesCheck();
189 }
190 }
191 }
192 }
193
194 /**
195 * This method displays a review if indicated by the vendor type and the associated text from that type This method screens the
196 * current document for changes from division vendor to parent vendor. If the document does contain such a change, the question
197 * framework is invoked to obtain the user's confirmation for the change. If confirmation is obtained, a note is added to the
198 * old parent vendor. Indicators are set appropriately.
199 *
200 * @param document The vendor-change-containing MaintenanceDocument under examination
201 */
202 protected void detectAndConfirmChangeToParent(MaintenanceDocument document) {
203 boolean proceed = true;
204 VendorDetail oldVendorDetail = (VendorDetail) document.getOldMaintainableObject().getBusinessObject();
205 boolean oldVendorIsParent = oldVendorDetail.isVendorParentIndicator();
206 boolean newVendorIsParent = newVendorDetail.isVendorParentIndicator();
207 if (!oldVendorIsParent && newVendorIsParent) {
208 // A change to division is being tried. Obtain confirmation.
209 VendorDetail oldParentVendor = SpringContext.getBean(VendorService.class).getParentVendor(oldVendorDetail.getVendorHeaderGeneratedIdentifier());
210 String oldParentVendorName = oldParentVendor.getVendorName();
211 String oldParentVendorNumber = oldParentVendor.getVendorNumber();
212 proceed = askOrAnalyzeYesNoQuestion(VendorConstants.CHANGE_TO_PARENT_QUESTION_ID, VendorUtils.buildMessageText(VendorKeyConstants.CONFIRM_VENDOR_CHANGE_TO_PARENT, oldVendorDetail.getVendorName() + " (" + oldVendorDetail.getVendorNumber() + ")", oldParentVendorName + " (" + oldParentVendorNumber + ")"));
213 if (proceed) {
214 newVendorDetail.setVendorParentIndicator(true);
215 }
216 else {
217 newVendorDetail.setVendorParentIndicator(false);
218 }
219 }
220 if (!proceed) {
221 abortRulesCheck();
222 }
223 }
224
225 }
226