/*
* 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.purap.document.web.struts;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.purap.PurapConstants;
import org.kuali.kfs.module.purap.PurapKeyConstants;
import org.kuali.kfs.module.purap.PurapParameterConstants;
import org.kuali.kfs.module.purap.businessobject.DefaultPrincipalAddress;
import org.kuali.kfs.module.purap.businessobject.PurApItem;
import org.kuali.kfs.module.purap.businessobject.RequisitionItem;
import org.kuali.kfs.module.purap.document.PurchasingAccountsPayableDocument;
import org.kuali.kfs.module.purap.document.PurchasingDocument;
import org.kuali.kfs.module.purap.document.RequisitionDocument;
import org.kuali.kfs.module.purap.document.service.PurapService;
import org.kuali.kfs.module.purap.document.service.RequisitionService;
import org.kuali.kfs.module.purap.document.validation.event.AttributedAddPurchasingAccountsPayableItemEvent;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.vnd.businessobject.VendorCommodityCode;
import org.kuali.kfs.vnd.businessobject.VendorDetail;
import org.kuali.rice.core.api.util.RiceConstants;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.question.ConfirmationQuestion;
import org.kuali.rice.kns.util.KNSGlobalVariables;
import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.service.KualiRuleService;
import org.kuali.rice.krad.service.PersistenceService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
import org.kuali.rice.krad.util.ObjectUtils;
/**
* Struts Action for Requisition document.
*/
public class RequisitionAction extends PurchasingActionBase {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(RequisitionAction.class);
private RequisitionService requisitionService;
/**
* save the document without any validations.....
* @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#save(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
//call the super save to save the document without validations...
ActionForward actionForward = super.save(mapping, form, request, response);
//we need to make "calculated" to false so that the "below lines"
//can be edited until calculated button is clicked.
KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form;
PurchasingFormBase baseForm = (PurchasingFormBase) form;
PurchasingAccountsPayableDocument purapDocument = (PurchasingAccountsPayableDocument) kualiDocumentFormBase.getDocument();
baseForm.setCalculated(false);
purapDocument.setCalculated(false);
return mapping.findForward(RiceConstants.MAPPING_BASIC);
}
/**
* Does initialization for a new requisition.
*
* @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#createDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase)
*/
@Override
protected void createDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException {
super.createDocument(kualiDocumentFormBase);
((RequisitionDocument) kualiDocumentFormBase.getDocument()).initiateDocument();
}
public ActionForward setAsDefaultBuilding(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
RequisitionDocument req = (RequisitionDocument) ((RequisitionForm) form).getDocument();
if (ObjectUtils.isNotNull(req.getDeliveryCampusCode()) && ObjectUtils.isNotNull(req.getDeliveryBuildingCode())) {
DefaultPrincipalAddress defaultPrincipalAddress = new DefaultPrincipalAddress(GlobalVariables.getUserSession().getPerson().getPrincipalId());
Map addressKeys = SpringContext.getBean(PersistenceService.class).getPrimaryKeyFieldValues(defaultPrincipalAddress);
defaultPrincipalAddress = (DefaultPrincipalAddress) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(DefaultPrincipalAddress.class, addressKeys);
if (ObjectUtils.isNull(defaultPrincipalAddress)) {
defaultPrincipalAddress = new DefaultPrincipalAddress(GlobalVariables.getUserSession().getPerson().getPrincipalId());
}
defaultPrincipalAddress.setDefaultBuilding(req.getDeliveryCampusCode(), req.getDeliveryBuildingCode(), req.getDeliveryBuildingRoomNumber());
SpringContext.getBean(BusinessObjectService.class).save(defaultPrincipalAddress);
KNSGlobalVariables.getMessageList().add(PurapKeyConstants.DEFAULT_BUILDING_SAVED);
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* @see org.kuali.rice.kns.web.struts.action.KualiAction#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 {
ActionForward forward = super.refresh(mapping, form, request, response);
RequisitionForm rqForm = (RequisitionForm) form;
RequisitionDocument document = (RequisitionDocument) rqForm.getDocument();
// super.refresh() must occur before this line to get the correct APO limit
document.setOrganizationAutomaticPurchaseOrderLimit(SpringContext.getBean(PurapService.class).getApoLimit(document.getVendorContractGeneratedIdentifier(), document.getChartOfAccountsCode(), document.getOrganizationCode()));
return forward;
}
/**
* Adds a PurchasingItemCapitalAsset (a container for the Capital Asset Number) to the selected
* item's list.
*
* @param mapping An ActionMapping
* @param form The Form
* @param request An HttpServletRequest
* @param response The HttpServletResponse
* @return An ActionForward
* @throws Exception
*/
public ActionForward addAsset(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
RequisitionForm rqForm = (RequisitionForm) form;
RequisitionDocument document = (RequisitionDocument) rqForm.getDocument();
RequisitionItem item = (RequisitionItem)document.getItemByLineNumber(getSelectedLine(request) + 1);
//TODO: Add a new way to add assets to the system.
//item.addAsset();
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
public ActionForward displayB2BRequisition(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
RequisitionForm reqForm = (RequisitionForm) form;
reqForm.setDocId((String) request.getSession().getAttribute("docId"));
loadDocument(reqForm);
String multipleB2BReqs = (String) request.getSession().getAttribute("multipleB2BRequisitions");
if (StringUtils.isNotEmpty(multipleB2BReqs)) {
KNSGlobalVariables.getMessageList().add(PurapKeyConstants.B2B_MULTIPLE_REQUISITIONS);
}
request.getSession().removeAttribute("docId");
request.getSession().removeAttribute("multipleB2BRequisitions");
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* Clears the vendor selection from the Requisition. NOTE, this functionality is only available on Requisition and not PO.
*
* @param mapping An ActionMapping
* @param form An ActionForm
* @param request A HttpServletRequest
* @param response A HttpServletResponse
* @return An ActionForward
* @throws Exception
*/
public ActionForward clearVendor(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
PurchasingFormBase baseForm = (PurchasingFormBase) form;
RequisitionDocument document = (RequisitionDocument) baseForm.getDocument();
document.setVendorHeaderGeneratedIdentifier(null);
document.setVendorDetailAssignedIdentifier(null);
document.setVendorDetail(null);
document.setVendorName("");
document.setVendorLine1Address("");
document.setVendorLine2Address("");
document.setVendorAddressInternationalProvinceName("");
document.setVendorCityName("");
document.setVendorStateCode("");
document.setVendorPostalCode("");
document.setVendorCountryCode("");
document.setVendorContractGeneratedIdentifier(null);
document.setVendorContract(null);
document.setVendorFaxNumber("");
document.setVendorCustomerNumber("");
document.setVendorAttentionName("");
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
/**
* Set up blanket approve indicator which will be used to decide if need to run accounting line validation at the time of
* blanket approve.
*
* @see org.kuali.kfs.module.purap.document.web.struts.PurchasingActionBase#blanketApprove(org.apache.struts.action.ActionMapping,
* org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public ActionForward blanketApprove(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
RequisitionDocument document = (RequisitionDocument) ((PurchasingFormBase) form).getDocument();
document.setBlanketApproveRequest(true);
return super.blanketApprove(mapping, form, request, response);
}
/**
* Add a new item to the document.
*
* @param mapping An ActionMapping
* @param form An ActionForm
* @param request The HttpServletRequest
* @param response The HttpServletResponse
* @throws Exception
* @return An ActionForward
*/
@Override
public ActionForward addItem(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
PurchasingFormBase purchasingForm = (PurchasingFormBase) form;
PurApItem item = purchasingForm.getNewPurchasingItemLine();
RequisitionItem requisitionItem = (RequisitionItem)item;
PurchasingDocument purDocument = (PurchasingDocument) purchasingForm.getDocument();
if (StringUtils.isBlank(requisitionItem.getPurchasingCommodityCode())) {
boolean commCodeParam = SpringContext.getBean(ParameterService.class).getParameterValueAsBoolean(RequisitionDocument.class, PurapParameterConstants.ENABLE_DEFAULT_VENDOR_COMMODITY_CODE_IND);
if (commCodeParam) {
if (purchasingForm instanceof RequisitionForm) {
RequisitionDocument reqs =(RequisitionDocument)purchasingForm.getDocument();
VendorDetail dtl = reqs.getVendorDetail();
if (ObjectUtils.isNotNull(dtl)) {
List<VendorCommodityCode> vcc = dtl.getVendorCommodities();
String defaultCommodityCode = "";
Iterator<VendorCommodityCode> it = vcc.iterator();
while (it.hasNext()) {
VendorCommodityCode commodity = it.next();
if (commodity.isCommodityDefaultIndicator()) {
defaultCommodityCode = commodity.getPurchasingCommodityCode();
requisitionItem.setPurchasingCommodityCode(defaultCommodityCode);
}
}
}
}
}
}
boolean rulePassed = SpringContext.getBean(KualiRuleService.class).applyRules(new AttributedAddPurchasingAccountsPayableItemEvent("", purDocument, item));
if (rulePassed) {
item = purchasingForm.getAndResetNewPurchasingItemLine();
purDocument.addItem(item);
}
return mapping.findForward(KFSConstants.MAPPING_BASIC);
}
@Override
public ActionForward route(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
if (shouldWarnIfNoAccountingLines(form)) {
String question = request.getParameter(KRADConstants.QUESTION_INST_ATTRIBUTE_NAME);
if (StringUtils.equals(question, PurapConstants.REQUISITION_ACCOUNTING_LINES_QUESTION)) {
// We're getting an answer from our question
String answer = request.getParameter(KRADConstants.QUESTION_CLICKED_BUTTON);
// if the answer is "yes"- continue routing, but if it isn't...
if (!StringUtils.equals(answer, ConfirmationQuestion.YES)) {
// answer is "no, don't continue." so we'll just add a warning and refresh the page
LOG.info("add a warning and refresh the page ");
GlobalVariables.getMessageMap().putWarning(PurapConstants.ITEM_TAB_ERROR_PROPERTY, PurapConstants.REQ_NO_ACCOUNTING_LINES);
return refresh(mapping, form, request, response);
}
}
else {
/*We have an empty item and we have a content reviewer. We will now ask the user
* if he wants to ignore the empty item (and let the content reviewer take care of it later).
*/
return this.performQuestionWithoutInput(mapping, form, request, response, PurapConstants.REQUISITION_ACCOUNTING_LINES_QUESTION, PurapConstants.QUESTION_REQUISITON_ROUTE_WITHOUT_ACCOUNTING_LINES, KRADConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, "1");
}
}
return super.route(mapping, form, request, response);
}
protected boolean shouldWarnIfNoAccountingLines(ActionForm form){
RequisitionDocument doc = (RequisitionDocument) ((PurchasingFormBase) form).getDocument();
RequisitionService reqs = getRequisitionService();
return (doc.isMissingAccountingLines() && reqs.hasContentReviewer(doc.getOrganizationCode(), doc.getChartOfAccountsCode()));
}
protected synchronized RequisitionService getRequisitionService(){
if (this.requisitionService == null){
this.requisitionService = SpringContext.getBean(RequisitionService.class);
}
return this.requisitionService;
}
}