/* * 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.batch; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.directwebremoting.annotations.Param; import org.kuali.kfs.integration.purap.CapitalAssetLocation; import org.kuali.kfs.module.purap.PurapConstants; import org.kuali.kfs.module.purap.PurapConstants.POCostSources; import org.kuali.kfs.module.purap.PurapConstants.POTransmissionMethods; import org.kuali.kfs.module.purap.PurapConstants.RequisitionSources; import org.kuali.kfs.module.purap.PurapConstants.RequisitionStatuses; import org.kuali.kfs.module.purap.businessobject.ContractManagerAssignmentDetail; import org.kuali.kfs.module.purap.businessobject.PurchaseOrderView; import org.kuali.kfs.module.purap.businessobject.PurchasingCapitalAssetItem; import org.kuali.kfs.module.purap.businessobject.RequisitionAccount; import org.kuali.kfs.module.purap.businessobject.RequisitionCapitalAssetItem; import org.kuali.kfs.module.purap.businessobject.RequisitionCapitalAssetLocation; import org.kuali.kfs.module.purap.businessobject.RequisitionCapitalAssetSystem; import org.kuali.kfs.module.purap.businessobject.RequisitionItem; import org.kuali.kfs.module.purap.document.ContractManagerAssignmentDocument; import org.kuali.kfs.module.purap.document.PurchaseOrderDocument; 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.sys.KFSConstants; import org.kuali.kfs.sys.batch.AbstractStep; import org.kuali.kfs.sys.batch.Job; import org.kuali.kfs.sys.batch.TestingStep; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.coreservice.api.parameter.EvaluationOperator; import org.kuali.rice.coreservice.api.parameter.Parameter; import org.kuali.rice.coreservice.api.parameter.Parameter.Builder; import org.kuali.rice.coreservice.api.parameter.ParameterType; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.coreservice.framework.parameter.ParameterService; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.krad.UserSession; import org.kuali.rice.krad.bo.DocumentHeader; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.exception.ValidationException; import org.kuali.rice.krad.service.BusinessObjectService; import org.kuali.rice.krad.service.DocumentService; import org.kuali.rice.krad.service.PersistenceStructureService; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.ObjectUtils; public class PurapMassRequisitionStep extends AbstractStep implements TestingStep { private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurapMassRequisitionStep.class); private DocumentService documentService; private RequisitionService requisitionService; private PurapService purapService; private BusinessObjectService boService; private PersistenceStructureService psService; private final int NUM_DOCS_TO_CREATE = 25; // number of each document type to create private final int ROUTE_TO_FINAL_SECONDS_LIMIT = 240; // number of seconds to wait for routing of documents to Final. private final String RUN_INDICATOR_PARAMETER_NAMESPACE_STEP = "PurapMassRequisitionStep"; private final String RUN_INDICATOR_PARAMETER_VALUE = "N"; private final String RUN_INDICATOR_PARAMETER_ALLOWED = "A"; private final String RUN_INDICATOR_PARAMETER_DESCRIPTION = "Tells the job framework whether to run this job or not; because the PurapMassRequisitionJob needs to only be run once after database initialization."; private final String RUN_INDICATOR_PARAMETER_TYPE = "CONFG"; public boolean execute(String jobName, Date jobRunDate) throws InterruptedException { LOG.debug("Starting execution of PurapMassRequisitionStep"); Parameter runIndicatorParameter = SpringContext.getBean(ParameterService.class).getParameter(PurapMassRequisitionStep.class,Job.STEP_RUN_PARM_NM); if (runIndicatorParameter == null || "Y".equals(runIndicatorParameter.getValue())) { // save runParameter as "N" so that the job won't run until DB has been cleared setInitiatedRunParameter(); for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { try { LOG.info("Setting user session for routing of quantity document."); GlobalVariables.setUserSession(new UserSession("khuntley")); // create document RequisitionDocument reqDoc = populateQuantityDocument(); LOG.info("Blanket approving quantity requisition document."); // route it documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); } catch (WorkflowException e) { e.printStackTrace(); } Thread.sleep(5000); } for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { try { LOG.info("Setting user session for routing of non-quantity document."); GlobalVariables.setUserSession(new UserSession("khuntley")); // create document RequisitionDocument reqDoc = populateNonQuantityDocument(); LOG.info("Blanket approving non-quantity requisition document."); // route it documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); } catch (WorkflowException e) { e.printStackTrace(); } Thread.sleep(5000); } // TODO leaving CAMS docs commented out until problem is fixed // for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { // RequisitionDocument reqDoc = null; // try { // LOG.info("Setting user session for routing of requisition with capital asset data and addresses."); // GlobalVariables.setUserSession(new UserSession("khuntley")); // // create document // reqDoc = populateCapitalAsset_Individual_WithAddresses_Document(); // Thread.sleep(10000); // LOG.info("Blanket approving requisition with capital asset data and addresses."); // // route it // documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); // } // catch (WorkflowException e) { // e.printStackTrace(); // } // catch (ValidationException ve) { // continue; // } // Thread.sleep(5000); // // // Use Contract Manager Assignment to create PO. // LOG.info("Setting user session for contract manager assignment of requisition with capital asset data and addresses."); // GlobalVariables.setUserSession(new UserSession("parke")); // LOG.info("Routing Contract Manager Assignment document for requisition with capital asset data and addresses."); // ContractManagerAssignmentDocument acmDoc = createAndRouteContractManagerAssignmentDocument(reqDoc); // // Thread.sleep(20000); // // LOG.info("Routing Purchase Order document for requisition with capital asset data and addresses."); // createAndRoutePurchaseOrderDocument(reqDoc, acmDoc); // // Thread.sleep(5000); // } // // for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { // RequisitionDocument reqDoc = null; // try { // LOG.info("Setting user session for routing of BAS requisition."); // GlobalVariables.setUserSession(new UserSession("khuntley")); // // create document // reqDoc = populateCapitalAsset_Individual_Unfilled_Document(); // Thread.sleep(10000); // LOG.info("Blanket approving BAS requisition."); // // route it // documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); // } // catch (WorkflowException e) { // e.printStackTrace(); // } // catch (ValidationException ve) { // continue; // } // Thread.sleep(5000); // // // Use Contract Manager Assignment to create PO. // LOG.info("Setting user session for contract manager assignment BAS requisition."); // GlobalVariables.setUserSession(new UserSession("parke")); // LOG.info("Routing Contract Manager Assignment document for BAS requisition."); // ContractManagerAssignmentDocument acmDoc = createAndRouteContractManagerAssignmentDocument(reqDoc); // // Thread.sleep(20000); // // LOG.info("Routing Purchase Order document for BAS requisition"); // createAndRoutePurchaseOrderDocument(reqDoc, acmDoc); // // Thread.sleep(5000); // } } Thread.sleep(60000); return true; } private RequisitionDocument populateQuantityDocument() { LOG.debug("Creating a new requisition."); RequisitionDocument reqDoc = null; try { reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); LOG.info("Populating a new requisition."); // RequisitionDocument reqDoc = new RequisitionDocument(); // set doc attributes reqDoc.getDocumentHeader().setExplanation("batch created quantity document"); DocumentHeader documentHeader = reqDoc.getDocumentHeader(); documentHeader.setDocumentDescription("batch created quantity document"); reqDoc.setDocumentFundingSourceCode("INST"); reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); reqDoc.setChartOfAccountsCode("KO"); reqDoc.setOrganizationCode("SBSC"); reqDoc.setDeliveryCampusCode("KO"); reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); reqDoc.setDeliveryBuildingCode("ADMN"); reqDoc.setDeliveryBuildingName("Administration"); reqDoc.setDeliveryBuildingRoomNumber("100"); reqDoc.setDeliveryBuildingLine1Address("98 smart street"); reqDoc.setDeliveryCityName("brainy"); reqDoc.setDeliveryStateCode("CA"); reqDoc.setDeliveryPostalCode("46202"); reqDoc.setDeliveryCountryCode("US"); reqDoc.setDeliveryToName("front desk"); reqDoc.setBillingName("THE UNIVERSITY"); reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); reqDoc.setBillingCityName("BUTTER NUT"); reqDoc.setBillingStateCode("SC"); reqDoc.setBillingPostalCode("47402"); reqDoc.setBillingCountryCode("US"); reqDoc.setBillingPhoneNumber("111-111-1111"); reqDoc.setPurchaseOrderAutomaticIndicator(false); reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); reqDoc.setVendorHeaderGeneratedIdentifier(1002); reqDoc.setVendorDetailAssignedIdentifier(0); reqDoc.setVendorName("MK CORPORATION ACTIVE"); reqDoc.setVendorLine1Address("3894 SOUTH ST"); reqDoc.setVendorLine2Address("P.O. BOX 3455"); reqDoc.setVendorCityName("SPRINGFIELD"); reqDoc.setVendorStateCode("IL"); reqDoc.setVendorPostalCode("33555"); reqDoc.setVendorCountryCode("US"); reqDoc.setUseTaxIndicator(false); // set item attributes RequisitionItem item1 = new RequisitionItem(); item1.setItemLineNumber(new Integer(1)); item1.setItemUnitOfMeasureCode("PCS"); item1.setItemCatalogNumber("P10M980"); item1.setItemDescription("Copy Paper - 8 1/2 x 11, White, 92, 20lb"); item1.setItemUnitPrice(new BigDecimal(30.20)); item1.setItemTypeCode("ITEM"); item1.setItemQuantity(new KualiDecimal(20)); item1.setExtendedPrice(new KualiDecimal(604)); item1.setItemAssignedToTradeInIndicator(false); // set accounting line attributes RequisitionAccount account1 = new RequisitionAccount(); account1.setPostingYear(2004); account1.setChartOfAccountsCode("BL"); account1.setAccountNumber("1023200"); account1.setFinancialObjectCode("4100"); account1.setDebitCreditCode(KFSConstants.GL_DEBIT_CODE); account1.setAmount(new KualiDecimal("100")); account1.setAccountLinePercent(new BigDecimal("100")); item1.getSourceAccountingLines().add(account1); reqDoc.getItems().add(item1); reqDoc.fixItemReferences(); } catch (WorkflowException e1) { e1.printStackTrace(); } return reqDoc; } private RequisitionDocument populateNonQuantityDocument() { RequisitionDocument reqDoc = null; try { reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); // RequisitionDocument reqDoc = new RequisitionDocument(); // set doc attributes reqDoc.getDocumentHeader().setExplanation("batch created non-quantity document"); DocumentHeader documentHeader = reqDoc.getDocumentHeader(); documentHeader.setDocumentDescription("batch created non-quantity document"); reqDoc.setDocumentFundingSourceCode("INST"); reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); reqDoc.setChartOfAccountsCode("KO"); reqDoc.setOrganizationCode("SBSC"); reqDoc.setDeliveryCampusCode("KO"); reqDoc.setDeliveryCountryCode("US"); reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); reqDoc.setDeliveryBuildingCode("ADMN"); reqDoc.setDeliveryBuildingName("Administration"); reqDoc.setDeliveryBuildingRoomNumber("100"); reqDoc.setDeliveryBuildingLine1Address("98 smart street"); reqDoc.setDeliveryCityName("brainy"); reqDoc.setDeliveryStateCode("CA"); reqDoc.setDeliveryPostalCode("46202"); reqDoc.setDeliveryToName("front desk"); reqDoc.setBillingName("THE UNIVERSITY"); reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); reqDoc.setBillingCityName("BUTTER NUT"); reqDoc.setBillingStateCode("SC"); reqDoc.setBillingPostalCode("47402"); reqDoc.setBillingCountryCode("US"); reqDoc.setBillingPhoneNumber("111-111-1111"); reqDoc.setPurchaseOrderAutomaticIndicator(false); reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); reqDoc.setVendorHeaderGeneratedIdentifier(1016); reqDoc.setVendorDetailAssignedIdentifier(0); reqDoc.setVendorName("PHYSIK INSTRUMENT L.P."); reqDoc.setVendorLine1Address("16 AUBURN ST"); reqDoc.setVendorCityName("AUBURN"); reqDoc.setVendorStateCode("MA"); reqDoc.setVendorPostalCode("01501"); reqDoc.setVendorCountryCode("US"); reqDoc.setUseTaxIndicator(false); // set item attributes RequisitionItem item1 = new RequisitionItem(); item1.setItemLineNumber(new Integer(1)); item1.setItemUnitOfMeasureCode(""); item1.setItemCatalogNumber(""); item1.setItemDescription("consulting"); item1.setItemUnitPrice(new BigDecimal(5000)); item1.setItemTypeCode("SRVC"); item1.setItemQuantity(null); item1.setExtendedPrice(new KualiDecimal(5000)); item1.setItemAssignedToTradeInIndicator(false); // set accounting line attributes RequisitionAccount account1 = new RequisitionAccount(); account1.setPostingYear(2004); account1.setChartOfAccountsCode("BL"); account1.setAccountNumber("1023200"); account1.setFinancialObjectCode("4078"); account1.setDebitCreditCode(KFSConstants.GL_DEBIT_CODE); account1.setAmount(new KualiDecimal("100")); account1.setAccountLinePercent(new BigDecimal("100")); item1.getSourceAccountingLines().add(account1); reqDoc.getItems().add(item1); reqDoc.fixItemReferences(); } catch (WorkflowException e1) { e1.printStackTrace(); } return reqDoc; } public RequisitionDocument populateCapitalAsset_Individual_WithAddresses_Document() { RequisitionDocument reqDoc = null; try { reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); // set doc attributes reqDoc.getDocumentHeader().setExplanation("batch created quantity document for cams"); DocumentHeader documentHeader = reqDoc.getDocumentHeader(); documentHeader.setDocumentDescription("batch created quantity document for cams"); reqDoc.setDocumentFundingSourceCode("INST"); reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); reqDoc.setChartOfAccountsCode("UA"); reqDoc.setOrganizationCode("VPIT"); reqDoc.setDeliveryCampusCode("KO"); reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); reqDoc.setDeliveryBuildingCode("ADMN"); reqDoc.setDeliveryBuildingName("Administration"); reqDoc.setDeliveryBuildingRoomNumber("100"); reqDoc.setDeliveryBuildingLine1Address("98 smart street"); reqDoc.setDeliveryCityName("brainy"); reqDoc.setDeliveryStateCode("CA"); reqDoc.setDeliveryPostalCode("46202"); reqDoc.setDeliveryToName("front desk"); reqDoc.setBillingName("THE UNIVERSITY"); reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); reqDoc.setBillingCityName("BUTTER NUT"); reqDoc.setBillingStateCode("SC"); reqDoc.setBillingPostalCode("47402"); reqDoc.setBillingCountryCode("US"); reqDoc.setBillingPhoneNumber("111-111-1111"); reqDoc.setPurchaseOrderAutomaticIndicator(false); reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); reqDoc.setVendorHeaderGeneratedIdentifier(1002); reqDoc.setVendorDetailAssignedIdentifier(0); reqDoc.setVendorName("MK CORPORATION ACTIVE"); reqDoc.setVendorLine1Address("3984 SOUTH ST"); reqDoc.setVendorCityName("SPRINGFIELD"); reqDoc.setVendorStateCode("IL"); reqDoc.setVendorPostalCode("33555"); reqDoc.setVendorCountryCode("US"); reqDoc.setUseTaxIndicator(false); // set item attributes RequisitionItem item1 = new RequisitionItem(); item1.setItemLineNumber(new Integer(1)); item1.setItemUnitOfMeasureCode("EA"); item1.setItemCatalogNumber("P10M980"); item1.setItemDescription("Gas Chromatograph"); item1.setItemUnitPrice(new BigDecimal(5000)); item1.setItemTypeCode("ITEM"); item1.setItemQuantity(new KualiDecimal(2.00)); item1.setExtendedPrice(new KualiDecimal(10000)); item1.setItemAssignedToTradeInIndicator(false); item1.refreshReferenceObject("itemType"); // set accounting line attributes RequisitionAccount account1 = new RequisitionAccount(); account1.setPostingYear(2004); account1.setChartOfAccountsCode("BL"); account1.setAccountNumber("1023200"); account1.setFinancialObjectCode("7000"); account1.setDebitCreditCode(KFSConstants.GL_DEBIT_CODE); account1.setAmount(new KualiDecimal("10000")); account1.setAccountLinePercent(new BigDecimal("100")); item1.getSourceAccountingLines().add(account1); reqDoc.getItems().add(item1); reqDoc.fixItemReferences(); reqDoc.setCapitalAssetSystemStateCode("NEW"); reqDoc.setCapitalAssetSystemTypeCode("IND"); // Save here because auto-generated IDs will be needed later. purapService.saveDocumentNoValidation(reqDoc); List<PurchasingCapitalAssetItem> purchasingCapitalAssetItems = new ArrayList(); RequisitionCapitalAssetItem capitalAssetItem = (RequisitionCapitalAssetItem) requisitionService.createCamsItem(reqDoc, item1); capitalAssetItem.setCapitalAssetTransactionTypeCode("NEW"); RequisitionCapitalAssetSystem system = (RequisitionCapitalAssetSystem) capitalAssetItem.getPurchasingCapitalAssetSystem(); system.setCapitalAssetNoteText("CA Notes go here"); system.setCapitalAssetNotReceivedCurrentFiscalYearIndicator(false); system.setCapitalAssetManufacturerName("MK CORPORATION ACTIVE"); system.setCapitalAssetTypeCode("07034"); system.setCapitalAssetModelDescription("XXYYZZ"); List<CapitalAssetLocation> locations = new ArrayList(); RequisitionCapitalAssetLocation loc1 = new RequisitionCapitalAssetLocation(); loc1.setCapitalAssetSystemIdentifier(system.getCapitalAssetSystemIdentifier()); loc1.setItemQuantity(new KualiDecimal("1.00")); loc1.setCampusCode("BL"); loc1.setBuildingCode("BL001"); loc1.setCapitalAssetLine1Address("211 S Indiana Ave"); loc1.setBuildingRoomNumber("001"); loc1.setCapitalAssetCityName("Bloomington"); loc1.setCapitalAssetStateCode("IN"); loc1.setCapitalAssetPostalCode("47405-7001"); loc1.setCapitalAssetCountryCode("US"); locations.add(loc1); RequisitionCapitalAssetLocation loc2 = new RequisitionCapitalAssetLocation(); loc2.setCapitalAssetSystemIdentifier(system.getCapitalAssetSystemIdentifier()); loc2.setItemQuantity(new KualiDecimal("1.00")); loc2.setCampusCode("BL"); loc2.setBuildingCode("BL001"); loc2.setCapitalAssetLine1Address("211 S Indiana Ave"); loc2.setBuildingRoomNumber("001A"); loc2.setCapitalAssetCityName("Bloomington"); loc2.setCapitalAssetStateCode("IN"); loc2.setCapitalAssetPostalCode("47405-7001"); loc2.setCapitalAssetCountryCode("US"); locations.add(loc2); system.setCapitalAssetLocations(locations); purchasingCapitalAssetItems.add(capitalAssetItem); reqDoc.setPurchasingCapitalAssetItems(purchasingCapitalAssetItems); } catch (WorkflowException e1) { e1.printStackTrace(); } return reqDoc; } private RequisitionDocument populateCapitalAsset_Individual_Unfilled_Document() { RequisitionDocument reqDoc = null; try { reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); // set doc attributes reqDoc.getDocumentHeader().setExplanation("batch created quantity document BAS"); DocumentHeader documentHeader = reqDoc.getDocumentHeader(); documentHeader.setDocumentDescription("batch created quantity document BAS"); reqDoc.setDocumentFundingSourceCode("INST"); reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); reqDoc.setChartOfAccountsCode("UA"); reqDoc.setOrganizationCode("VPIT"); reqDoc.setDeliveryCampusCode("KO"); reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); reqDoc.setDeliveryBuildingCode("ADMN"); reqDoc.setDeliveryBuildingName("Administration"); reqDoc.setDeliveryBuildingRoomNumber("100"); reqDoc.setDeliveryBuildingLine1Address("98 smart street"); reqDoc.setDeliveryCityName("brainy"); reqDoc.setDeliveryStateCode("CA"); reqDoc.setDeliveryPostalCode("46202"); reqDoc.setDeliveryToName("front desk"); reqDoc.setBillingName("THE UNIVERSITY"); reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); reqDoc.setBillingCityName("BUTTER NUT"); reqDoc.setBillingStateCode("SC"); reqDoc.setBillingPostalCode("47402"); reqDoc.setBillingCountryCode("US"); reqDoc.setBillingPhoneNumber("111-111-1111"); reqDoc.setPurchaseOrderAutomaticIndicator(false); reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); reqDoc.setVendorHeaderGeneratedIdentifier(1002); reqDoc.setVendorDetailAssignedIdentifier(0); reqDoc.setVendorName("MK CORPORATION ACTIVE"); reqDoc.setVendorLine1Address("3984 SOUTH ST"); reqDoc.setVendorCityName("SPRINGFIELD"); reqDoc.setVendorStateCode("IL"); reqDoc.setVendorPostalCode("33555"); reqDoc.setVendorCountryCode("US"); reqDoc.setUseTaxIndicator(false); // set item attributes RequisitionItem item1 = new RequisitionItem(); item1.setItemLineNumber(new Integer(1)); item1.setItemUnitOfMeasureCode("EA"); item1.setItemCatalogNumber(""); item1.setItemDescription("Gas Chromatograph"); item1.setItemUnitPrice(new BigDecimal(6000)); item1.setItemTypeCode("ITEM"); item1.setItemQuantity(new KualiDecimal(1.00)); item1.setExtendedPrice(new KualiDecimal(6000)); item1.setItemAssignedToTradeInIndicator(false); // set accounting line attributes RequisitionAccount account1 = new RequisitionAccount(); account1.setPostingYear(2004); account1.setChartOfAccountsCode("BL"); account1.setAccountNumber("1023200"); account1.setFinancialObjectCode("7000"); account1.setDebitCreditCode(KFSConstants.GL_DEBIT_CODE); account1.setAmount(new KualiDecimal("10000")); account1.setAccountLinePercent(new BigDecimal("100")); item1.getSourceAccountingLines().add(account1); reqDoc.getItems().add(item1); reqDoc.fixItemReferences(); reqDoc.setCapitalAssetSystemStateCode("NEW"); reqDoc.setCapitalAssetSystemTypeCode("IND"); // Save here because auto-generated IDs will be needed later. purapService.saveDocumentNoValidation(reqDoc); List<PurchasingCapitalAssetItem> purchasingCapitalAssetItems = new ArrayList(); RequisitionCapitalAssetItem capitalAssetItem = (RequisitionCapitalAssetItem) requisitionService.createCamsItem(reqDoc, item1); capitalAssetItem.setCapitalAssetTransactionTypeCode("NEW"); RequisitionCapitalAssetSystem system = (RequisitionCapitalAssetSystem) capitalAssetItem.getPurchasingCapitalAssetSystem(); system.setCapitalAssetNoteText(""); system.setCapitalAssetNotReceivedCurrentFiscalYearIndicator(false); system.setCapitalAssetManufacturerName(""); system.setCapitalAssetTypeCode(""); system.setCapitalAssetModelDescription(""); purchasingCapitalAssetItems.add(capitalAssetItem); reqDoc.setPurchasingCapitalAssetItems(purchasingCapitalAssetItems); } catch (WorkflowException e1) { e1.printStackTrace(); } return reqDoc; } /** * Sets a Run parameter that tells the step that it has already run and it does not need to run again. */ private void setInitiatedRunParameter() { // First, see if we can find an existing Parameter object with this key. Parameter runIndicatorParameter = SpringContext.getBean(ParameterService.class).getParameter(PurapMassRequisitionStep.class,Job.STEP_RUN_PARM_NM); if (runIndicatorParameter == null) { Parameter.Builder newParameter = Builder.create(KFSConstants.APPLICATION_NAMESPACE_CODE, PurapConstants.PURAP_NAMESPACE, RUN_INDICATOR_PARAMETER_NAMESPACE_STEP, Job.STEP_RUN_PARM_NM, ParameterType.Builder.create("CONFG")); newParameter.setDescription(RUN_INDICATOR_PARAMETER_DESCRIPTION); newParameter.setEvaluationOperator(EvaluationOperator.ALLOW); newParameter.setValue(RUN_INDICATOR_PARAMETER_VALUE); SpringContext.getBean(ParameterService.class).createParameter( newParameter.build() ); } else { Parameter.Builder newParameter = Builder.create(runIndicatorParameter); newParameter.setValue(RUN_INDICATOR_PARAMETER_VALUE); SpringContext.getBean(ParameterService.class).updateParameter( newParameter.build() ); } } /** * Used by setInitiatedRunParameter to build a Map of search keys to obtain the exact needed Run parameter from the database. * * @return A Map<String,Object> where the Objects are the attributes of the Run parameter */ private Map<String, Object> buildRunParameterSearchKeyMap() { Map<String, Object> pkMapForParameter = new HashMap<String, Object>(); // Set up a list of all the field names and values of the fields in the Parameter object. Map<String, Object> fieldNamesValuesForParameter = new HashMap<String, Object>(); fieldNamesValuesForParameter.put("parameterNamespaceCode", PurapConstants.PURAP_NAMESPACE); fieldNamesValuesForParameter.put("parameterDetailTypeCode", RUN_INDICATOR_PARAMETER_NAMESPACE_STEP); fieldNamesValuesForParameter.put("parameterName", Job.STEP_RUN_PARM_NM); fieldNamesValuesForParameter.put("parameterConstraintCode", RUN_INDICATOR_PARAMETER_ALLOWED); fieldNamesValuesForParameter.put("parameterTypeCode", RUN_INDICATOR_PARAMETER_TYPE); // get the primary keys and assign them to values List<String> parameterPKFields = psService.getPrimaryKeys(Parameter.class); for (String pkFieldName : parameterPKFields) { pkMapForParameter.put(pkFieldName, fieldNamesValuesForParameter.get(pkFieldName)); } return pkMapForParameter; } private ContractManagerAssignmentDocument createAndRouteContractManagerAssignmentDocument(RequisitionDocument reqDoc) { ContractManagerAssignmentDocument acmDoc = null; try { acmDoc = (ContractManagerAssignmentDocument) documentService.getNewDocument(ContractManagerAssignmentDocument.class); List<ContractManagerAssignmentDetail> contractManagerAssignmentDetails = new ArrayList<ContractManagerAssignmentDetail>(); ContractManagerAssignmentDetail detail = new ContractManagerAssignmentDetail(acmDoc, reqDoc); detail.setContractManagerCode(new Integer("10")); detail.refreshReferenceObject("contractManager"); contractManagerAssignmentDetails.add(detail); acmDoc.setContractManagerAssignmentDetailss(contractManagerAssignmentDetails); acmDoc.getDocumentHeader().setDocumentDescription("batch-created"); documentService.routeDocument(acmDoc, "Routing batch-created Contract Manager Assignment Document", null); ChangeWaiter waiter = new ChangeWaiter(documentService, acmDoc.getDocumentNumber(), "F"); try { waiter.waitUntilChange(waiter, ROUTE_TO_FINAL_SECONDS_LIMIT, 5); } catch (Exception e) { throw new RuntimeException("ContractManagerAssignmentDocument timed out in routing to final."); } } catch (WorkflowException we) { we.printStackTrace(); } catch (ValidationException ve) { ve.printStackTrace(); } return acmDoc; } private void createAndRoutePurchaseOrderDocument(RequisitionDocument reqDoc, ContractManagerAssignmentDocument acmDoc) { List<PurchaseOrderView> poViews = reqDoc.getRelatedViews().getRelatedPurchaseOrderViews(); if ((poViews != null) && (poViews.size() >= 1)) { // There should be only one related PO at this point, so get that one and route it. PurchaseOrderView poView = poViews.get(0); String relatedPOWorkflowDocumentId = poView.getDocumentNumber(); PurchaseOrderDocument poDoc = null; try { poDoc = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(relatedPOWorkflowDocumentId); documentService.blanketApproveDocument(poDoc, "auto-routing: Test Requisition Job", null); ChangeWaiter waiter = new ChangeWaiter(documentService, poDoc.getDocumentNumber(), "F"); try { waiter.waitUntilChange(waiter, ROUTE_TO_FINAL_SECONDS_LIMIT, 5); } catch (Exception e) { throw new RuntimeException("ContractManagerAssignmentDocument timed out in routing to final."); } } catch (WorkflowException e) { e.printStackTrace(); } catch (ValidationException ve) { ve.printStackTrace(); } } } public DocumentService getDocumentService() { return documentService; } public void setDocumentService(DocumentService documentService) { this.documentService = documentService; } public RequisitionService getRequisitionService() { return requisitionService; } public void setRequisitionService(RequisitionService requisitionService) { this.requisitionService = requisitionService; } public PurapService getPurapService() { return purapService; } public void setPurapService(PurapService purapService) { this.purapService = purapService; } public BusinessObjectService getBoService() { return boService; } public void setBoService(BusinessObjectService boService) { this.boService = boService; } public PersistenceStructureService getPsService() { return psService; } public void setPsService(PersistenceStructureService psService) { this.psService = psService; } /** * Performs the same function as DocumentWorkflowStatusMonitor, which is a test utility, and cannot be used outside that * package. Allows us to wait until a change of Workflow status has occurred. */ private class ChangeWaiter { final DocumentService documentService; final private String docHeaderId; final private String[] desiredWorkflowStates; public ChangeWaiter(DocumentService documentService, String docHeaderId, String desiredWorkflowStatus) { this.documentService = documentService; this.docHeaderId = docHeaderId; this.desiredWorkflowStates = new String[] { desiredWorkflowStatus }; } public boolean valueChanged() throws Exception { Document d = documentService.getByDocumentHeaderId(docHeaderId.toString()); String currentStatus = d.getDocumentHeader().getWorkflowDocument().getStatus().getCode(); for (int i = 0; i < desiredWorkflowStates.length; i++) { if (StringUtils.equals(desiredWorkflowStates[i], currentStatus)) { return true; } } return false; } public boolean waitUntilChange(ChangeWaiter monitor, int maxWaitSeconds, int pauseSeconds) throws Exception { long maxWaitMs = maxWaitSeconds * 1000; long pauseMs = pauseSeconds * 1000; boolean valueChanged = false; boolean interrupted = false; long startTimeMs = System.currentTimeMillis(); long endTimeMs = startTimeMs + maxWaitMs; Thread.sleep(pauseMs / 10); // the first time through, sleep a fraction of the specified time valueChanged = monitor.valueChanged(); LOG.debug("starting wait loop"); while (!interrupted && !valueChanged && (System.currentTimeMillis() < endTimeMs)) { try { if (LOG.isDebugEnabled()) { LOG.debug("sleeping for " + pauseMs + " ms"); } Thread.sleep(pauseMs); } catch (InterruptedException e) { interrupted = true; } LOG.debug("checking wait loop sentinel"); valueChanged = monitor.valueChanged(); } if (LOG.isDebugEnabled()) { LOG.debug("finished wait loop (" + valueChanged + ")"); } return valueChanged; } } }