/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.cam.document.web.struts; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.module.cam.CamsConstants; import org.kuali.kfs.module.cam.CamsKeyConstants; import org.kuali.kfs.module.cam.CamsPropertyConstants; import org.kuali.kfs.module.cam.batch.service.AssetBarcodeInventoryLoadService; import org.kuali.kfs.module.cam.businessobject.BarcodeInventoryErrorDetail; import org.kuali.kfs.module.cam.document.BarcodeInventoryErrorDocument; import org.kuali.kfs.module.cam.document.validation.event.ValidateBarcodeInventoryEvent; import org.kuali.kfs.module.cam.util.BarcodeInventoryErrorDetailPredicate; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentActionBase; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.core.api.util.RiceConstants; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; import org.kuali.rice.krad.util.GlobalVariables; /** * Action class for the asset barcode inventory error document */ public class BarcodeInventoryErrorAction extends FinancialSystemTransactionalDocumentActionBase { protected static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BarcodeInventoryErrorAction.class); /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#sendAdHocRequests(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward sendAdHocRequests(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BarcodeInventoryErrorForm bcieForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = bcieForm.getBarcodeInventoryErrorDocument(); // Saving data getBusinessObjectService().save(document.getBarcodeInventoryErrorDetail()); return super.sendAdHocRequests(mapping, bcieForm, request, response); } /** why does this just send false to rules..... * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#approve(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BarcodeInventoryErrorForm bcieForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = bcieForm.getBarcodeInventoryErrorDocument(); //prevent approval before save if barcode inventory item list not validated if(!document.isDocumentCorrected()){ GlobalVariables.getMessageMap().putError(CamsPropertyConstants.BarcodeInventory.DOCUMENT_NUMBER, CamsKeyConstants.BarcodeInventory.ERROR_VALIDATE_ITEMS_BEFORE_APPROVE, document.getDocumentNumber()); return mapping.findForward(KFSConstants.MAPPING_BASIC); } getBusinessObjectService().save(document.getBarcodeInventoryErrorDetail()); if (this.getAssetBarcodeInventoryLoadService().isCurrentUserInitiator(document)) { this.invokeRules(document, false); } return super.approve(mapping, form, request, response); } /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#refresh(org.apache.struts.action.ActionMapping, * org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { super.refresh(mapping, form, request, response); BarcodeInventoryErrorForm bcieForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = bcieForm.getBarcodeInventoryErrorDocument(); this.invokeRules(document, false); return mapping.findForward(RiceConstants.MAPPING_BASIC); } /** * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#loadDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase) */ @Override protected void loadDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { super.loadDocument(kualiDocumentFormBase); BarcodeInventoryErrorForm bcieForm = (BarcodeInventoryErrorForm) kualiDocumentFormBase; BarcodeInventoryErrorDocument document = bcieForm.getBarcodeInventoryErrorDocument(); // Validating records. this.invokeRules(document, false); } /** * Searches and replaces BCIE document data on the document * * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws Exception */ public ActionForward searchAndReplace(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BarcodeInventoryErrorForm barcodeInventoryErrorForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = barcodeInventoryErrorForm.getBarcodeInventoryErrorDocument(); List<BarcodeInventoryErrorDetail> barcodeInventoryErrorDetails = document.getBarcodeInventoryErrorDetail(); // Validating search criteria if (validateGlobalReplaceFields(document)) { BarcodeInventoryErrorDetailPredicate predicatedClosure = new BarcodeInventoryErrorDetailPredicate(barcodeInventoryErrorForm.getBarcodeInventoryErrorDocument()); // searches and replaces CollectionUtils.forAllDo(barcodeInventoryErrorDetails, predicatedClosure); document.setBarcodeInventoryErrorDetail(barcodeInventoryErrorDetails); barcodeInventoryErrorForm.setDocument(document); } // Validating. this.invokeRules(document, false); // Search fields initialization. barcodeInventoryErrorForm.getBarcodeInventoryErrorDocument().resetSearchFields(); // Reseting the checkboxes barcodeInventoryErrorForm.resetCheckBoxes(); // Displaying JSP return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Validates all the selected records and saves them * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward validateLines(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BarcodeInventoryErrorForm barcodeInventoryErrorForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = barcodeInventoryErrorForm.getBarcodeInventoryErrorDocument(); List<BarcodeInventoryErrorDetail> barcodeInventoryErrorDetails = document.getBarcodeInventoryErrorDetail(); String currentUserID = GlobalVariables.getUserSession().getPerson().getPrincipalId(); List selectedRows = new ArrayList(); int selectedCheckboxes[] = barcodeInventoryErrorForm.getRowCheckbox(); // If rows were selected..... if (selectedCheckboxes != null) { for(int i=0;i < selectedCheckboxes.length;i++) { selectedRows.add(selectedCheckboxes[i]); } // Validate this.invokeRules(document, true); barcodeInventoryErrorDetails = document.getBarcodeInventoryErrorDetail(); for (BarcodeInventoryErrorDetail detail : barcodeInventoryErrorDetails) { int uploadRowNumber = detail.getUploadRowNumber().intValue(); if (selectedRows.contains(uploadRowNumber)) { if (detail.getErrorCorrectionStatusCode().equals(CamsConstants.BarCodeInventoryError.STATUS_CODE_CORRECTED)) { detail.setInventoryCorrectionTimestamp(getDateTimeService().getCurrentTimestamp()); detail.setCorrectorUniversalIdentifier(currentUserID); getAssetBarcodeInventoryLoadService().updateAssetInformation(detail, false); } } else { //Reseting the status back to error for those rows that were not selected by the user to be validated. //detail.getCorrectorUniversalIdentifier() = null means record has not been saved as corrected // if (detail.getCorrectorUniversalIdentifier() == null) { // detail.getInventoryCorrectionTimestamp() used to determine error_status instead of detail.getCorrectorUniversalIdentifier() if (detail.getInventoryCorrectionTimestamp() == null) { detail.setErrorCorrectionStatusCode(CamsConstants.BarCodeInventoryError.STATUS_CODE_ERROR); } } } } else { GlobalVariables.getMessageMap().putErrorForSectionId(CamsPropertyConstants.COMMON_ERROR_SECTION_ID, CamsKeyConstants.BarcodeInventory.ERROR_CHECKBOX_MUST_BE_CHECKED); } // Saving data getBusinessObjectService().save(document.getBarcodeInventoryErrorDetail()); // Loading changes on page this.loadDocument((KualiDocumentFormBase) form); // resetting the checkboxes barcodeInventoryErrorForm.resetCheckBoxes(); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Deletes selected lines from the document * * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward deleteLines(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { BarcodeInventoryErrorForm barcodeInventoryErrorForm = (BarcodeInventoryErrorForm) form; BarcodeInventoryErrorDocument document = barcodeInventoryErrorForm.getBarcodeInventoryErrorDocument(); List<BarcodeInventoryErrorDetail> barcodeInventoryErrorDetails = document.getBarcodeInventoryErrorDetail(); BarcodeInventoryErrorDetail barcodeInventoryErrorDetail; String currentUserID = GlobalVariables.getUserSession().getPerson().getPrincipalId(); int selectedCheckboxes[] = barcodeInventoryErrorForm.getRowCheckbox(); // If rows were selected if (!(selectedCheckboxes == null)) { for (int i = 0; i < selectedCheckboxes.length; i++) { for (BarcodeInventoryErrorDetail detail : barcodeInventoryErrorDetails) { if (detail.getUploadRowNumber().compareTo(new Long(selectedCheckboxes[i])) == 0) { detail.setErrorCorrectionStatusCode(CamsConstants.BarCodeInventoryError.STATUS_CODE_DELETED); detail.setInventoryCorrectionTimestamp(getDateTimeService().getCurrentTimestamp()); detail.setCorrectorUniversalIdentifier(currentUserID); } } } } else { GlobalVariables.getMessageMap().putErrorForSectionId(CamsPropertyConstants.COMMON_ERROR_SECTION_ID, CamsKeyConstants.BarcodeInventory.ERROR_CHECKBOX_MUST_BE_CHECKED); } // Saving data getBusinessObjectService().save(document.getBarcodeInventoryErrorDetail()); // Clearing the checkboxes barcodeInventoryErrorForm.resetCheckBoxes(); this.loadDocument((KualiDocumentFormBase) form); return mapping.findForward(KFSConstants.MAPPING_BASIC); } protected boolean validateGlobalReplaceFields(BarcodeInventoryErrorDocument document) { if (StringUtils.isBlank(document.getCurrentScanCode()) && StringUtils.isBlank(document.getCurrentCampusCode()) && StringUtils.isBlank(document.getCurrentBuildingNumber()) && StringUtils.isBlank(document.getCurrentRoom()) && StringUtils.isBlank(document.getCurrentSubroom()) && StringUtils.isBlank(document.getCurrentConditionCode()) && StringUtils.isBlank(document.getCurrentTagNumber())) { GlobalVariables.getMessageMap().putErrorForSectionId(CamsPropertyConstants.BCIE_GLOBAL_REPLACE_ERROR_SECTION_ID, CamsKeyConstants.BarcodeInventory.ERROR_GLOBAL_REPLACE_SEARCH_CRITERIA); return false; } return true; } /** * Invokes the method that validates the bar code inventory error records and that resides in the rule class * BarcodeInventoryErrorDocumentRule * * @param document */ protected void invokeRules(BarcodeInventoryErrorDocument document, boolean updateStatus) { getKualiRuleService().applyRules(new ValidateBarcodeInventoryEvent("", document, updateStatus)); } protected AssetBarcodeInventoryLoadService getAssetBarcodeInventoryLoadService() { return SpringContext.getBean(AssetBarcodeInventoryLoadService.class); } protected DateTimeService getDateTimeService() { return SpringContext.getBean(DateTimeService.class); } }