001/* 002 * Copyright 2007-2008 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 */ 016package org.kuali.ole.module.purap.batch; 017 018import org.apache.commons.lang.StringUtils; 019import org.kuali.ole.integration.purap.CapitalAssetLocation; 020import org.kuali.ole.module.purap.PurapConstants; 021import org.kuali.ole.module.purap.PurapConstants.POCostSources; 022import org.kuali.ole.module.purap.PurapConstants.POTransmissionMethods; 023import org.kuali.ole.module.purap.PurapConstants.RequisitionSources; 024import org.kuali.ole.module.purap.PurapConstants.RequisitionStatuses; 025import org.kuali.ole.module.purap.businessobject.*; 026import org.kuali.ole.module.purap.document.ContractManagerAssignmentDocument; 027import org.kuali.ole.module.purap.document.PurchaseOrderDocument; 028import org.kuali.ole.module.purap.document.RequisitionDocument; 029import org.kuali.ole.module.purap.document.service.PurapService; 030import org.kuali.ole.module.purap.document.service.RequisitionService; 031import org.kuali.ole.sys.OLEConstants; 032import org.kuali.ole.sys.batch.AbstractStep; 033import org.kuali.ole.sys.batch.Job; 034import org.kuali.ole.sys.batch.TestingStep; 035import org.kuali.ole.sys.context.SpringContext; 036import org.kuali.rice.core.api.util.type.KualiDecimal; 037import org.kuali.rice.coreservice.api.parameter.EvaluationOperator; 038import org.kuali.rice.coreservice.api.parameter.Parameter; 039import org.kuali.rice.coreservice.api.parameter.Parameter.Builder; 040import org.kuali.rice.coreservice.api.parameter.ParameterType; 041import org.kuali.rice.coreservice.framework.parameter.ParameterService; 042import org.kuali.rice.kew.api.exception.WorkflowException; 043import org.kuali.rice.krad.UserSession; 044import org.kuali.rice.krad.bo.DocumentHeader; 045import org.kuali.rice.krad.document.Document; 046import org.kuali.rice.krad.exception.ValidationException; 047import org.kuali.rice.krad.service.BusinessObjectService; 048import org.kuali.rice.krad.service.DocumentService; 049import org.kuali.rice.krad.service.PersistenceStructureService; 050import org.kuali.rice.krad.util.GlobalVariables; 051 052import java.math.BigDecimal; 053import java.util.*; 054 055public class PurapMassRequisitionStep extends AbstractStep implements TestingStep { 056 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(PurapMassRequisitionStep.class); 057 058 private DocumentService documentService; 059 private RequisitionService requisitionService; 060 private PurapService purapService; 061 private BusinessObjectService boService; 062 private PersistenceStructureService psService; 063 064 private final int NUM_DOCS_TO_CREATE = 25; // number of each document type to create 065 private final int ROUTE_TO_FINAL_SECONDS_LIMIT = 240; // number of seconds to wait for routing of documents to Final. 066 private final String RUN_INDICATOR_PARAMETER_NAMESPACE_STEP = "PurapMassRequisitionStep"; 067 private final String RUN_INDICATOR_PARAMETER_VALUE = "N"; 068 private final String RUN_INDICATOR_PARAMETER_ALLOWED = "A"; 069 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."; 070 private final String RUN_INDICATOR_PARAMETER_TYPE = "CONFG"; 071 072 @Override 073 public boolean execute(String jobName, Date jobRunDate) throws InterruptedException { 074 LOG.debug("Starting execution of PurapMassRequisitionStep"); 075 076 Parameter runIndicatorParameter = SpringContext.getBean(ParameterService.class).getParameter(PurapMassRequisitionStep.class, Job.STEP_RUN_PARM_NM); 077 078 if (runIndicatorParameter == null || "Y".equals(runIndicatorParameter.getValue())) { 079 // save runParameter as "N" so that the job won't run until DB has been cleared 080 setInitiatedRunParameter(); 081 082 for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { 083 084 try { 085 LOG.info("Setting user session for routing of quantity document."); 086 GlobalVariables.setUserSession(new UserSession("khuntley")); 087 // create document 088 RequisitionDocument reqDoc = populateQuantityDocument(); 089 090 LOG.info("Blanket approving quantity requisition document."); 091 // route it 092 documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); 093 } catch (WorkflowException e) { 094 e.printStackTrace(); 095 } 096 Thread.sleep(5000); 097 } 098 099 for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { 100 101 try { 102 LOG.info("Setting user session for routing of non-quantity document."); 103 GlobalVariables.setUserSession(new UserSession("khuntley")); 104 // create document 105 RequisitionDocument reqDoc = populateNonQuantityDocument(); 106 LOG.info("Blanket approving non-quantity requisition document."); 107 // route it 108 documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); 109 } catch (WorkflowException e) { 110 e.printStackTrace(); 111 } 112 Thread.sleep(5000); 113 } 114 115 116 // TODO leaving CAMS docs commented out until problem is fixed 117 // for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { 118 // RequisitionDocument reqDoc = null; 119 // try { 120 // LOG.info("Setting user session for routing of requisition with capital asset data and addresses."); 121 // GlobalVariables.setUserSession(new UserSession("khuntley")); 122 // // create document 123 // reqDoc = populateCapitalAsset_Individual_WithAddresses_Document(); 124 // Thread.sleep(10000); 125 // LOG.info("Blanket approving requisition with capital asset data and addresses."); 126 // // route it 127 // documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); 128 // } 129 // catch (WorkflowException e) { 130 // e.printStackTrace(); 131 // } 132 // catch (ValidationException ve) { 133 // continue; 134 // } 135 // Thread.sleep(5000); 136 // 137 // // Use Contract Manager Assignment to create PO. 138 // LOG.info("Setting user session for contract manager assignment of requisition with capital asset data and addresses."); 139 // GlobalVariables.setUserSession(new UserSession("parke")); 140 // LOG.info("Routing Contract Manager Assignment document for requisition with capital asset data and addresses."); 141 // ContractManagerAssignmentDocument acmDoc = createAndRouteContractManagerAssignmentDocument(reqDoc); 142 // 143 // Thread.sleep(20000); 144 // 145 // LOG.info("Routing Purchase Order document for requisition with capital asset data and addresses."); 146 // createAndRoutePurchaseOrderDocument(reqDoc, acmDoc); 147 // 148 // Thread.sleep(5000); 149 // } 150 // 151 // for (int i = 0; i < NUM_DOCS_TO_CREATE; i++) { 152 // RequisitionDocument reqDoc = null; 153 // try { 154 // LOG.info("Setting user session for routing of BAS requisition."); 155 // GlobalVariables.setUserSession(new UserSession("khuntley")); 156 // // create document 157 // reqDoc = populateCapitalAsset_Individual_Unfilled_Document(); 158 // Thread.sleep(10000); 159 // LOG.info("Blanket approving BAS requisition."); 160 // // route it 161 // documentService.blanketApproveDocument(reqDoc, "auto-routing: Test Requisition Job.", null); 162 // } 163 // catch (WorkflowException e) { 164 // e.printStackTrace(); 165 // } 166 // catch (ValidationException ve) { 167 // continue; 168 // } 169 // Thread.sleep(5000); 170 // 171 // // Use Contract Manager Assignment to create PO. 172 // LOG.info("Setting user session for contract manager assignment BAS requisition."); 173 // GlobalVariables.setUserSession(new UserSession("parke")); 174 // LOG.info("Routing Contract Manager Assignment document for BAS requisition."); 175 // ContractManagerAssignmentDocument acmDoc = createAndRouteContractManagerAssignmentDocument(reqDoc); 176 // 177 // Thread.sleep(20000); 178 // 179 // LOG.info("Routing Purchase Order document for BAS requisition"); 180 // createAndRoutePurchaseOrderDocument(reqDoc, acmDoc); 181 // 182 // Thread.sleep(5000); 183 // } 184 } 185 186 Thread.sleep(60000); 187 return true; 188 } 189 190 private RequisitionDocument populateQuantityDocument() { 191 LOG.debug("Creating a new requisition."); 192 RequisitionDocument reqDoc = null; 193 try { 194 reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); 195 LOG.info("Populating a new requisition."); 196 // RequisitionDocument reqDoc = new RequisitionDocument(); 197 // set doc attributes 198 reqDoc.getDocumentHeader().setExplanation("batch created quantity document"); 199 DocumentHeader documentHeader = reqDoc.getDocumentHeader(); 200 documentHeader.setDocumentDescription("batch created quantity document"); 201 reqDoc.setDocumentFundingSourceCode("INST"); 202 reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); 203 reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); 204 reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); 205 reqDoc.setChartOfAccountsCode("KO"); 206 reqDoc.setOrganizationCode("SBSC"); 207 reqDoc.setDeliveryCampusCode("KO"); 208 reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); 209 reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); 210 reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); 211 reqDoc.setDeliveryBuildingCode("ADMN"); 212 reqDoc.setDeliveryBuildingName("Administration"); 213 reqDoc.setDeliveryBuildingRoomNumber("100"); 214 reqDoc.setDeliveryBuildingLine1Address("98 smart street"); 215 reqDoc.setDeliveryCityName("brainy"); 216 reqDoc.setDeliveryStateCode("CA"); 217 reqDoc.setDeliveryPostalCode("46202"); 218 reqDoc.setDeliveryCountryCode("US"); 219 reqDoc.setDeliveryToName("front desk"); 220 reqDoc.setBillingName("THE UNIVERSITY"); 221 reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); 222 reqDoc.setBillingCityName("BUTTER NUT"); 223 reqDoc.setBillingStateCode("SC"); 224 reqDoc.setBillingPostalCode("47402"); 225 reqDoc.setBillingCountryCode("US"); 226 reqDoc.setBillingPhoneNumber("111-111-1111"); 227 reqDoc.setPurchaseOrderAutomaticIndicator(false); 228 reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); 229 reqDoc.setVendorHeaderGeneratedIdentifier(1002); 230 reqDoc.setVendorDetailAssignedIdentifier(0); 231 reqDoc.setVendorName("MK CORPORATION ACTIVE"); 232 reqDoc.setVendorLine1Address("3894 SOUTH ST"); 233 reqDoc.setVendorLine2Address("P.O. BOX 3455"); 234 reqDoc.setVendorCityName("SPRINGFIELD"); 235 reqDoc.setVendorStateCode("IL"); 236 reqDoc.setVendorPostalCode("33555"); 237 reqDoc.setVendorCountryCode("US"); 238 reqDoc.setUseTaxIndicator(false); 239 240 // set item attributes 241 RequisitionItem item1 = new RequisitionItem(); 242 item1.setItemLineNumber(new Integer(1)); 243 item1.setItemUnitOfMeasureCode("PCS"); 244 item1.setItemCatalogNumber("P10M980"); 245 item1.setItemDescription("Copy Paper - 8 1/2 x 11, White, 92, 20lb"); 246 item1.setItemUnitPrice(new BigDecimal(30.20)); 247 item1.setItemTypeCode("ITEM"); 248 item1.setItemQuantity(new KualiDecimal(20)); 249 item1.setExtendedPrice(new KualiDecimal(604)); 250 item1.setItemAssignedToTradeInIndicator(false); 251 252 // set accounting line attributes 253 RequisitionAccount account1 = new RequisitionAccount(); 254 account1.setPostingYear(2004); 255 account1.setChartOfAccountsCode("BL"); 256 account1.setAccountNumber("1023200"); 257 account1.setFinancialObjectCode("4100"); 258 account1.setDebitCreditCode(OLEConstants.GL_DEBIT_CODE); 259 account1.setAmount(new KualiDecimal("100")); 260 account1.setAccountLinePercent(new BigDecimal("100")); 261 262 item1.getSourceAccountingLines().add(account1); 263 reqDoc.getItems().add(item1); 264 reqDoc.fixItemReferences(); 265 } catch (WorkflowException e1) { 266 e1.printStackTrace(); 267 } 268 return reqDoc; 269 } 270 271 private RequisitionDocument populateNonQuantityDocument() { 272 RequisitionDocument reqDoc = null; 273 try { 274 reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); 275 276 // RequisitionDocument reqDoc = new RequisitionDocument(); 277 // set doc attributes 278 reqDoc.getDocumentHeader().setExplanation("batch created non-quantity document"); 279 DocumentHeader documentHeader = reqDoc.getDocumentHeader(); 280 documentHeader.setDocumentDescription("batch created non-quantity document"); 281 reqDoc.setDocumentFundingSourceCode("INST"); 282 reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); 283 reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); 284 reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); 285 reqDoc.setChartOfAccountsCode("KO"); 286 reqDoc.setOrganizationCode("SBSC"); 287 reqDoc.setDeliveryCampusCode("KO"); 288 reqDoc.setDeliveryCountryCode("US"); 289 reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); 290 reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); 291 reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); 292 reqDoc.setDeliveryBuildingCode("ADMN"); 293 reqDoc.setDeliveryBuildingName("Administration"); 294 reqDoc.setDeliveryBuildingRoomNumber("100"); 295 reqDoc.setDeliveryBuildingLine1Address("98 smart street"); 296 reqDoc.setDeliveryCityName("brainy"); 297 reqDoc.setDeliveryStateCode("CA"); 298 reqDoc.setDeliveryPostalCode("46202"); 299 reqDoc.setDeliveryToName("front desk"); 300 reqDoc.setBillingName("THE UNIVERSITY"); 301 reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); 302 reqDoc.setBillingCityName("BUTTER NUT"); 303 reqDoc.setBillingStateCode("SC"); 304 reqDoc.setBillingPostalCode("47402"); 305 reqDoc.setBillingCountryCode("US"); 306 reqDoc.setBillingPhoneNumber("111-111-1111"); 307 reqDoc.setPurchaseOrderAutomaticIndicator(false); 308 reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); 309 reqDoc.setVendorHeaderGeneratedIdentifier(1016); 310 reqDoc.setVendorDetailAssignedIdentifier(0); 311 reqDoc.setVendorName("PHYSIK INSTRUMENT L.P."); 312 reqDoc.setVendorLine1Address("16 AUBURN ST"); 313 reqDoc.setVendorCityName("AUBURN"); 314 reqDoc.setVendorStateCode("MA"); 315 reqDoc.setVendorPostalCode("01501"); 316 reqDoc.setVendorCountryCode("US"); 317 reqDoc.setUseTaxIndicator(false); 318 319 // set item attributes 320 RequisitionItem item1 = new RequisitionItem(); 321 item1.setItemLineNumber(new Integer(1)); 322 item1.setItemUnitOfMeasureCode(""); 323 item1.setItemCatalogNumber(""); 324 item1.setItemDescription("consulting"); 325 item1.setItemUnitPrice(new BigDecimal(5000)); 326 item1.setItemTypeCode("SRVC"); 327 item1.setItemQuantity(null); 328 item1.setExtendedPrice(new KualiDecimal(5000)); 329 item1.setItemAssignedToTradeInIndicator(false); 330 331 // set accounting line attributes 332 RequisitionAccount account1 = new RequisitionAccount(); 333 account1.setPostingYear(2004); 334 account1.setChartOfAccountsCode("BL"); 335 account1.setAccountNumber("1023200"); 336 account1.setFinancialObjectCode("4078"); 337 account1.setDebitCreditCode(OLEConstants.GL_DEBIT_CODE); 338 account1.setAmount(new KualiDecimal("100")); 339 account1.setAccountLinePercent(new BigDecimal("100")); 340 341 item1.getSourceAccountingLines().add(account1); 342 reqDoc.getItems().add(item1); 343 reqDoc.fixItemReferences(); 344 } catch (WorkflowException e1) { 345 e1.printStackTrace(); 346 } 347 return reqDoc; 348 } 349 350 public RequisitionDocument populateCapitalAsset_Individual_WithAddresses_Document() { 351 RequisitionDocument reqDoc = null; 352 try { 353 reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); 354 355 // set doc attributes 356 reqDoc.getDocumentHeader().setExplanation("batch created quantity document for cams"); 357 DocumentHeader documentHeader = reqDoc.getDocumentHeader(); 358 documentHeader.setDocumentDescription("batch created quantity document for cams"); 359 reqDoc.setDocumentFundingSourceCode("INST"); 360 reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); 361 reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); 362 reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); 363 reqDoc.setChartOfAccountsCode("UA"); 364 reqDoc.setOrganizationCode("VPIT"); 365 reqDoc.setDeliveryCampusCode("KO"); 366 reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); 367 reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); 368 reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); 369 reqDoc.setDeliveryBuildingCode("ADMN"); 370 reqDoc.setDeliveryBuildingName("Administration"); 371 reqDoc.setDeliveryBuildingRoomNumber("100"); 372 reqDoc.setDeliveryBuildingLine1Address("98 smart street"); 373 reqDoc.setDeliveryCityName("brainy"); 374 reqDoc.setDeliveryStateCode("CA"); 375 reqDoc.setDeliveryPostalCode("46202"); 376 reqDoc.setDeliveryToName("front desk"); 377 reqDoc.setBillingName("THE UNIVERSITY"); 378 reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); 379 reqDoc.setBillingCityName("BUTTER NUT"); 380 reqDoc.setBillingStateCode("SC"); 381 reqDoc.setBillingPostalCode("47402"); 382 reqDoc.setBillingCountryCode("US"); 383 reqDoc.setBillingPhoneNumber("111-111-1111"); 384 reqDoc.setPurchaseOrderAutomaticIndicator(false); 385 reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); 386 reqDoc.setVendorHeaderGeneratedIdentifier(1002); 387 reqDoc.setVendorDetailAssignedIdentifier(0); 388 reqDoc.setVendorName("MK CORPORATION ACTIVE"); 389 reqDoc.setVendorLine1Address("3984 SOUTH ST"); 390 reqDoc.setVendorCityName("SPRINGFIELD"); 391 reqDoc.setVendorStateCode("IL"); 392 reqDoc.setVendorPostalCode("33555"); 393 reqDoc.setVendorCountryCode("US"); 394 reqDoc.setUseTaxIndicator(false); 395 396 // set item attributes 397 RequisitionItem item1 = new RequisitionItem(); 398 item1.setItemLineNumber(new Integer(1)); 399 item1.setItemUnitOfMeasureCode("EA"); 400 item1.setItemCatalogNumber("P10M980"); 401 item1.setItemDescription("Gas Chromatograph"); 402 item1.setItemUnitPrice(new BigDecimal(5000)); 403 item1.setItemTypeCode("ITEM"); 404 item1.setItemQuantity(new KualiDecimal(2.00)); 405 item1.setExtendedPrice(new KualiDecimal(10000)); 406 item1.setItemAssignedToTradeInIndicator(false); 407 item1.refreshReferenceObject("itemType"); 408 409 // set accounting line attributes 410 RequisitionAccount account1 = new RequisitionAccount(); 411 account1.setPostingYear(2004); 412 account1.setChartOfAccountsCode("BL"); 413 account1.setAccountNumber("1023200"); 414 account1.setFinancialObjectCode("7000"); 415 account1.setDebitCreditCode(OLEConstants.GL_DEBIT_CODE); 416 account1.setAmount(new KualiDecimal("10000")); 417 account1.setAccountLinePercent(new BigDecimal("100")); 418 419 item1.getSourceAccountingLines().add(account1); 420 reqDoc.getItems().add(item1); 421 reqDoc.fixItemReferences(); 422 423 reqDoc.setCapitalAssetSystemStateCode("NEW"); 424 reqDoc.setCapitalAssetSystemTypeCode("IND"); 425 426 // Save here because auto-generated IDs will be needed later. 427 purapService.saveDocumentNoValidation(reqDoc); 428 List<PurchasingCapitalAssetItem> purchasingCapitalAssetItems = new ArrayList(); 429 RequisitionCapitalAssetItem capitalAssetItem = (RequisitionCapitalAssetItem) requisitionService.createCamsItem(reqDoc, item1); 430 capitalAssetItem.setCapitalAssetTransactionTypeCode("NEW"); 431 432 RequisitionCapitalAssetSystem system = (RequisitionCapitalAssetSystem) capitalAssetItem.getPurchasingCapitalAssetSystem(); 433 system.setCapitalAssetNoteText("CA Notes go here"); 434 system.setCapitalAssetNotReceivedCurrentFiscalYearIndicator(false); 435 system.setCapitalAssetManufacturerName("MK CORPORATION ACTIVE"); 436 system.setCapitalAssetTypeCode("07034"); 437 system.setCapitalAssetModelDescription("XXYYZZ"); 438 439 List<CapitalAssetLocation> locations = new ArrayList(); 440 441 RequisitionCapitalAssetLocation loc1 = new RequisitionCapitalAssetLocation(); 442 loc1.setCapitalAssetSystemIdentifier(system.getCapitalAssetSystemIdentifier()); 443 loc1.setItemQuantity(new KualiDecimal("1.00")); 444 loc1.setCampusCode("BL"); 445 loc1.setBuildingCode("BL001"); 446 loc1.setCapitalAssetLine1Address("211 S Indiana Ave"); 447 loc1.setBuildingRoomNumber("001"); 448 loc1.setCapitalAssetCityName("Bloomington"); 449 loc1.setCapitalAssetStateCode("IN"); 450 loc1.setCapitalAssetPostalCode("47405-7001"); 451 loc1.setCapitalAssetCountryCode("US"); 452 locations.add(loc1); 453 454 RequisitionCapitalAssetLocation loc2 = new RequisitionCapitalAssetLocation(); 455 loc2.setCapitalAssetSystemIdentifier(system.getCapitalAssetSystemIdentifier()); 456 loc2.setItemQuantity(new KualiDecimal("1.00")); 457 loc2.setCampusCode("BL"); 458 loc2.setBuildingCode("BL001"); 459 loc2.setCapitalAssetLine1Address("211 S Indiana Ave"); 460 loc2.setBuildingRoomNumber("001A"); 461 loc2.setCapitalAssetCityName("Bloomington"); 462 loc2.setCapitalAssetStateCode("IN"); 463 loc2.setCapitalAssetPostalCode("47405-7001"); 464 loc2.setCapitalAssetCountryCode("US"); 465 locations.add(loc2); 466 467 system.setCapitalAssetLocations(locations); 468 469 purchasingCapitalAssetItems.add(capitalAssetItem); 470 reqDoc.setPurchasingCapitalAssetItems(purchasingCapitalAssetItems); 471 } catch (WorkflowException e1) { 472 e1.printStackTrace(); 473 } 474 return reqDoc; 475 } 476 477 private RequisitionDocument populateCapitalAsset_Individual_Unfilled_Document() { 478 RequisitionDocument reqDoc = null; 479 try { 480 reqDoc = (RequisitionDocument) documentService.getNewDocument(RequisitionDocument.class); 481 482 // set doc attributes 483 reqDoc.getDocumentHeader().setExplanation("batch created quantity document BAS"); 484 DocumentHeader documentHeader = reqDoc.getDocumentHeader(); 485 documentHeader.setDocumentDescription("batch created quantity document BAS"); 486 reqDoc.setDocumentFundingSourceCode("INST"); 487 reqDoc.setRequisitionSourceCode(RequisitionSources.STANDARD_ORDER); 488 reqDoc.setPurchaseOrderTransmissionMethodCode(POTransmissionMethods.NOPRINT); 489 reqDoc.setPurchaseOrderCostSourceCode(POCostSources.ESTIMATE); 490 reqDoc.setChartOfAccountsCode("UA"); 491 reqDoc.setOrganizationCode("VPIT"); 492 reqDoc.setDeliveryCampusCode("KO"); 493 reqDoc.setRequestorPersonName("WATSON,TERRENCE G"); 494 reqDoc.setRequestorPersonEmailAddress("tw@localhost.localhost"); 495 reqDoc.setRequestorPersonPhoneNumber("812-555-5555"); 496 reqDoc.setDeliveryBuildingCode("ADMN"); 497 reqDoc.setDeliveryBuildingName("Administration"); 498 reqDoc.setDeliveryBuildingRoomNumber("100"); 499 reqDoc.setDeliveryBuildingLine1Address("98 smart street"); 500 reqDoc.setDeliveryCityName("brainy"); 501 reqDoc.setDeliveryStateCode("CA"); 502 reqDoc.setDeliveryPostalCode("46202"); 503 reqDoc.setDeliveryToName("front desk"); 504 reqDoc.setBillingName("THE UNIVERSITY"); 505 reqDoc.setBillingLine1Address("ACCOUNTS PAYABLE"); 506 reqDoc.setBillingCityName("BUTTER NUT"); 507 reqDoc.setBillingStateCode("SC"); 508 reqDoc.setBillingPostalCode("47402"); 509 reqDoc.setBillingCountryCode("US"); 510 reqDoc.setBillingPhoneNumber("111-111-1111"); 511 reqDoc.setPurchaseOrderAutomaticIndicator(false); 512 reqDoc.setApplicationDocumentStatus(RequisitionStatuses.APPDOC_IN_PROCESS); 513 reqDoc.setVendorHeaderGeneratedIdentifier(1002); 514 reqDoc.setVendorDetailAssignedIdentifier(0); 515 reqDoc.setVendorName("MK CORPORATION ACTIVE"); 516 reqDoc.setVendorLine1Address("3984 SOUTH ST"); 517 reqDoc.setVendorCityName("SPRINGFIELD"); 518 reqDoc.setVendorStateCode("IL"); 519 reqDoc.setVendorPostalCode("33555"); 520 reqDoc.setVendorCountryCode("US"); 521 reqDoc.setUseTaxIndicator(false); 522 523 // set item attributes 524 RequisitionItem item1 = new RequisitionItem(); 525 item1.setItemLineNumber(new Integer(1)); 526 item1.setItemUnitOfMeasureCode("EA"); 527 item1.setItemCatalogNumber(""); 528 item1.setItemDescription("Gas Chromatograph"); 529 item1.setItemUnitPrice(new BigDecimal(6000)); 530 item1.setItemTypeCode("ITEM"); 531 item1.setItemQuantity(new KualiDecimal(1.00)); 532 item1.setExtendedPrice(new KualiDecimal(6000)); 533 item1.setItemAssignedToTradeInIndicator(false); 534 535 // set accounting line attributes 536 RequisitionAccount account1 = new RequisitionAccount(); 537 account1.setPostingYear(2004); 538 account1.setChartOfAccountsCode("BL"); 539 account1.setAccountNumber("1023200"); 540 account1.setFinancialObjectCode("7000"); 541 account1.setDebitCreditCode(OLEConstants.GL_DEBIT_CODE); 542 account1.setAmount(new KualiDecimal("10000")); 543 account1.setAccountLinePercent(new BigDecimal("100")); 544 545 item1.getSourceAccountingLines().add(account1); 546 reqDoc.getItems().add(item1); 547 reqDoc.fixItemReferences(); 548 549 reqDoc.setCapitalAssetSystemStateCode("NEW"); 550 reqDoc.setCapitalAssetSystemTypeCode("IND"); 551 552 // Save here because auto-generated IDs will be needed later. 553 purapService.saveDocumentNoValidation(reqDoc); 554 List<PurchasingCapitalAssetItem> purchasingCapitalAssetItems = new ArrayList(); 555 RequisitionCapitalAssetItem capitalAssetItem = (RequisitionCapitalAssetItem) requisitionService.createCamsItem(reqDoc, item1); 556 capitalAssetItem.setCapitalAssetTransactionTypeCode("NEW"); 557 558 RequisitionCapitalAssetSystem system = (RequisitionCapitalAssetSystem) capitalAssetItem.getPurchasingCapitalAssetSystem(); 559 system.setCapitalAssetNoteText(""); 560 system.setCapitalAssetNotReceivedCurrentFiscalYearIndicator(false); 561 system.setCapitalAssetManufacturerName(""); 562 system.setCapitalAssetTypeCode(""); 563 system.setCapitalAssetModelDescription(""); 564 565 purchasingCapitalAssetItems.add(capitalAssetItem); 566 reqDoc.setPurchasingCapitalAssetItems(purchasingCapitalAssetItems); 567 } catch (WorkflowException e1) { 568 e1.printStackTrace(); 569 } 570 return reqDoc; 571 } 572 573 /** 574 * Sets a Run parameter that tells the step that it has already run and it does not need to run again. 575 */ 576 private void setInitiatedRunParameter() { 577 // First, see if we can find an existing Parameter object with this key. 578 Parameter runIndicatorParameter = SpringContext.getBean(ParameterService.class).getParameter(PurapMassRequisitionStep.class, Job.STEP_RUN_PARM_NM); 579 if (runIndicatorParameter == null) { 580 Parameter.Builder newParameter = Builder.create(OLEConstants.APPLICATION_NAMESPACE_CODE, PurapConstants.PURAP_NAMESPACE, RUN_INDICATOR_PARAMETER_NAMESPACE_STEP, Job.STEP_RUN_PARM_NM, ParameterType.Builder.create("CONFG")); 581 newParameter.setDescription(RUN_INDICATOR_PARAMETER_DESCRIPTION); 582 newParameter.setEvaluationOperator(EvaluationOperator.ALLOW); 583 newParameter.setValue(RUN_INDICATOR_PARAMETER_VALUE); 584 SpringContext.getBean(ParameterService.class).createParameter(newParameter.build()); 585 } else { 586 Parameter.Builder newParameter = Builder.create(runIndicatorParameter); 587 newParameter.setValue(RUN_INDICATOR_PARAMETER_VALUE); 588 SpringContext.getBean(ParameterService.class).updateParameter(newParameter.build()); 589 } 590 } 591 592 /** 593 * Used by setInitiatedRunParameter to build a Map of search keys to obtain the exact needed Run parameter from the database. 594 * 595 * @return A Map<String,Object> where the Objects are the attributes of the Run parameter 596 */ 597 private Map<String, Object> buildRunParameterSearchKeyMap() { 598 Map<String, Object> pkMapForParameter = new HashMap<String, Object>(); 599 600 // Set up a list of all the field names and values of the fields in the Parameter object. 601 Map<String, Object> fieldNamesValuesForParameter = new HashMap<String, Object>(); 602 fieldNamesValuesForParameter.put("parameterNamespaceCode", PurapConstants.PURAP_NAMESPACE); 603 fieldNamesValuesForParameter.put("parameterDetailTypeCode", RUN_INDICATOR_PARAMETER_NAMESPACE_STEP); 604 fieldNamesValuesForParameter.put("parameterName", Job.STEP_RUN_PARM_NM); 605 fieldNamesValuesForParameter.put("parameterConstraintCode", RUN_INDICATOR_PARAMETER_ALLOWED); 606 fieldNamesValuesForParameter.put("parameterTypeCode", RUN_INDICATOR_PARAMETER_TYPE); 607 608 // get the primary keys and assign them to values 609 List<String> parameterPKFields = psService.getPrimaryKeys(Parameter.class); 610 for (String pkFieldName : parameterPKFields) { 611 pkMapForParameter.put(pkFieldName, fieldNamesValuesForParameter.get(pkFieldName)); 612 } 613 return pkMapForParameter; 614 } 615 616 private ContractManagerAssignmentDocument createAndRouteContractManagerAssignmentDocument(RequisitionDocument reqDoc) { 617 ContractManagerAssignmentDocument acmDoc = null; 618 try { 619 acmDoc = (ContractManagerAssignmentDocument) documentService.getNewDocument(ContractManagerAssignmentDocument.class); 620 List<ContractManagerAssignmentDetail> contractManagerAssignmentDetails = new ArrayList<ContractManagerAssignmentDetail>(); 621 ContractManagerAssignmentDetail detail = new ContractManagerAssignmentDetail(acmDoc, reqDoc); 622 detail.setContractManagerCode(new Integer("10")); 623 detail.refreshReferenceObject("contractManager"); 624 contractManagerAssignmentDetails.add(detail); 625 acmDoc.setContractManagerAssignmentDetailss(contractManagerAssignmentDetails); 626 acmDoc.getDocumentHeader().setDocumentDescription("batch-created"); 627 documentService.routeDocument(acmDoc, "Routing batch-created Contract Manager Assignment Document", null); 628 ChangeWaiter waiter = new ChangeWaiter(documentService, acmDoc.getDocumentNumber(), "F"); 629 try { 630 waiter.waitUntilChange(waiter, ROUTE_TO_FINAL_SECONDS_LIMIT, 5); 631 } catch (Exception e) { 632 throw new RuntimeException("ContractManagerAssignmentDocument timed out in routing to final."); 633 } 634 } catch (WorkflowException we) { 635 we.printStackTrace(); 636 } catch (ValidationException ve) { 637 ve.printStackTrace(); 638 } 639 return acmDoc; 640 } 641 642 private void createAndRoutePurchaseOrderDocument(RequisitionDocument reqDoc, ContractManagerAssignmentDocument acmDoc) { 643 644 List<PurchaseOrderView> poViews = reqDoc.getRelatedViews().getRelatedPurchaseOrderViews(); 645 if ((poViews != null) && (poViews.size() >= 1)) { 646 // There should be only one related PO at this point, so get that one and route it. 647 PurchaseOrderView poView = poViews.get(0); 648 String relatedPOWorkflowDocumentId = poView.getDocumentNumber(); 649 PurchaseOrderDocument poDoc = null; 650 try { 651 poDoc = (PurchaseOrderDocument) documentService.getByDocumentHeaderId(relatedPOWorkflowDocumentId); 652 documentService.blanketApproveDocument(poDoc, "auto-routing: Test Requisition Job", null); 653 ChangeWaiter waiter = new ChangeWaiter(documentService, poDoc.getDocumentNumber(), "F"); 654 try { 655 waiter.waitUntilChange(waiter, ROUTE_TO_FINAL_SECONDS_LIMIT, 5); 656 } catch (Exception e) { 657 throw new RuntimeException("ContractManagerAssignmentDocument timed out in routing to final."); 658 } 659 } catch (WorkflowException e) { 660 e.printStackTrace(); 661 } catch (ValidationException ve) { 662 ve.printStackTrace(); 663 } 664 } 665 } 666 667 public DocumentService getDocumentService() { 668 return documentService; 669 } 670 671 public void setDocumentService(DocumentService documentService) { 672 this.documentService = documentService; 673 } 674 675 public RequisitionService getRequisitionService() { 676 return requisitionService; 677 } 678 679 public void setRequisitionService(RequisitionService requisitionService) { 680 this.requisitionService = requisitionService; 681 } 682 683 public PurapService getPurapService() { 684 return purapService; 685 } 686 687 public void setPurapService(PurapService purapService) { 688 this.purapService = purapService; 689 } 690 691 public BusinessObjectService getBoService() { 692 return boService; 693 } 694 695 public void setBoService(BusinessObjectService boService) { 696 this.boService = boService; 697 } 698 699 public PersistenceStructureService getPsService() { 700 return psService; 701 } 702 703 public void setPsService(PersistenceStructureService psService) { 704 this.psService = psService; 705 } 706 707 /** 708 * Performs the same function as DocumentWorkflowStatusMonitor, which is a test utility, and cannot be used outside that 709 * package. Allows us to wait until a change of Workflow status has occurred. 710 */ 711 private class ChangeWaiter { 712 713 final DocumentService documentService; 714 final private String docHeaderId; 715 final private String[] desiredWorkflowStates; 716 717 public ChangeWaiter(DocumentService documentService, String docHeaderId, String desiredWorkflowStatus) { 718 this.documentService = documentService; 719 this.docHeaderId = docHeaderId; 720 this.desiredWorkflowStates = new String[]{desiredWorkflowStatus}; 721 } 722 723 public boolean valueChanged() throws Exception { 724 Document d = documentService.getByDocumentHeaderId(docHeaderId.toString()); 725 726 String currentStatus = d.getDocumentHeader().getWorkflowDocument().getStatus().toString(); 727 728 for (String desiredWorkflowState : desiredWorkflowStates) { 729 if (StringUtils.equals(desiredWorkflowState, currentStatus)) { 730 return true; 731 } 732 } 733 return false; 734 } 735 736 public boolean waitUntilChange(ChangeWaiter monitor, int maxWaitSeconds, int pauseSeconds) throws Exception { 737 long maxWaitMs = maxWaitSeconds * 1000; 738 long pauseMs = pauseSeconds * 1000; 739 740 boolean valueChanged = false; 741 boolean interrupted = false; 742 long startTimeMs = System.currentTimeMillis(); 743 long endTimeMs = startTimeMs + maxWaitMs; 744 745 Thread.sleep(pauseMs / 10); // the first time through, sleep a fraction of the specified time 746 valueChanged = monitor.valueChanged(); 747 LOG.debug("starting wait loop"); 748 while (!interrupted && !valueChanged && (System.currentTimeMillis() < endTimeMs)) { 749 try { 750 if (LOG.isDebugEnabled()) { 751 LOG.debug("sleeping for " + pauseMs + " ms"); 752 } 753 Thread.sleep(pauseMs); 754 } catch (InterruptedException e) { 755 interrupted = true; 756 } 757 LOG.debug("checking wait loop sentinel"); 758 valueChanged = monitor.valueChanged(); 759 } 760 if (LOG.isDebugEnabled()) { 761 LOG.debug("finished wait loop (" + valueChanged + ")"); 762 } 763 764 return valueChanged; 765 } 766 } 767 768}