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