001: /*
002: * Copyright 2006-2007 The Kuali Foundation.
003: *
004: * Licensed under the Educational Community License, Version 1.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/ecl1.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.module.kra.routingform.service.impl;
017:
018: import java.util.HashMap;
019: import java.util.Iterator;
020: import java.util.List;
021: import java.util.Map;
022:
023: import org.kuali.core.document.Document;
024: import org.kuali.core.document.MaintenanceDocument;
025: import org.kuali.core.service.DateTimeService;
026: import org.kuali.core.service.DocumentService;
027: import org.kuali.core.service.KualiConfigurationService;
028: import org.kuali.core.service.MaintenanceDocumentDictionaryService;
029: import org.kuali.core.util.GlobalVariables;
030: import org.kuali.core.util.KualiInteger;
031: import org.kuali.core.util.ObjectUtils;
032: import org.kuali.kfs.context.SpringContext;
033: import org.kuali.kfs.service.ParameterService;
034: import org.kuali.module.cg.bo.Proposal;
035: import org.kuali.module.cg.bo.ProposalOrganization;
036: import org.kuali.module.cg.bo.ProposalProjectDirector;
037: import org.kuali.module.cg.bo.ProposalResearchRisk;
038: import org.kuali.module.cg.bo.ProposalSubcontractor;
039: import org.kuali.module.cg.lookup.valuefinder.NextProposalNumberFinder;
040: import org.kuali.module.cg.maintenance.ProposalMaintainableImpl;
041: import org.kuali.module.kra.KraConstants;
042: import org.kuali.module.kra.budget.bo.Budget;
043: import org.kuali.module.kra.budget.bo.BudgetInstitutionCostShare;
044: import org.kuali.module.kra.budget.bo.BudgetNonpersonnel;
045: import org.kuali.module.kra.budget.bo.BudgetPeriodInstitutionCostShare;
046: import org.kuali.module.kra.budget.bo.BudgetPeriodThirdPartyCostShare;
047: import org.kuali.module.kra.budget.bo.BudgetThirdPartyCostShare;
048: import org.kuali.module.kra.budget.bo.BudgetUser;
049: import org.kuali.module.kra.budget.bo.UserAppointmentTask;
050: import org.kuali.module.kra.budget.bo.UserAppointmentTaskPeriod;
051: import org.kuali.module.kra.budget.document.BudgetDocument;
052: import org.kuali.module.kra.budget.web.struts.form.BudgetOverviewFormHelper;
053: import org.kuali.module.kra.routingform.bo.RoutingFormBudget;
054: import org.kuali.module.kra.routingform.bo.RoutingFormInstitutionCostShare;
055: import org.kuali.module.kra.routingform.bo.RoutingFormOrganization;
056: import org.kuali.module.kra.routingform.bo.RoutingFormOtherCostShare;
057: import org.kuali.module.kra.routingform.bo.RoutingFormPersonnel;
058: import org.kuali.module.kra.routingform.bo.RoutingFormProjectType;
059: import org.kuali.module.kra.routingform.bo.RoutingFormResearchRisk;
060: import org.kuali.module.kra.routingform.bo.RoutingFormSubcontractor;
061: import org.kuali.module.kra.routingform.document.RoutingFormDocument;
062: import org.kuali.module.kra.routingform.service.RoutingFormService;
063: import org.springframework.transaction.annotation.Transactional;
064:
065: import edu.iu.uis.eden.exception.WorkflowException;
066:
067: @Transactional
068: public class RoutingFormServiceImpl implements RoutingFormService {
069:
070: private DocumentService documentService;
071: private MaintenanceDocumentDictionaryService maintenanceDocumentDictionaryService;
072: private ParameterService parameterService;
073:
074: /**
075: * @see org.kuali.module.kra.routingform.service.RoutingFormService#prepareRoutingFormForSave(org.kuali.module.kra.routingform.document.RoutingFormDocument)
076: */
077: public void prepareRoutingFormForSave(
078: RoutingFormDocument routingFormDocument)
079: throws WorkflowException {
080: // TODO
081: }
082:
083: public BudgetDocument retrieveBudgetForLinking(
084: String budgetDocumentNumber) throws WorkflowException {
085: Document document = documentService
086: .getByDocumentHeaderId(budgetDocumentNumber);
087:
088: if (document != null && document instanceof BudgetDocument) {
089: return (BudgetDocument) document;
090: } else {
091: return null;
092: }
093: }
094:
095: public void linkImportBudgetDataToRoutingForm(
096: RoutingFormDocument routingFormDocument,
097: String budgetDocumentHeaderId,
098: List<BudgetOverviewFormHelper> periodOverviews)
099: throws WorkflowException {
100:
101: KualiConfigurationService kualiConfigurationService = SpringContext
102: .getBean(KualiConfigurationService.class);
103: final String PERSON_ROLE_CODE_PD = parameterService
104: .getParameterValue(RoutingFormDocument.class,
105: KraConstants.PERSON_ROLE_CODE_PROJECT_DIRECTOR);
106:
107: Integer minPeriod = routingFormDocument.getRoutingFormBudget()
108: .getRoutingFormBudgetMinimumPeriodNumber();
109: Integer maxPeriod = routingFormDocument.getRoutingFormBudget()
110: .getRoutingFormBudgetMaximumPeriodNumber();
111:
112: BudgetDocument budgetDocument = retrieveBudgetForLinking(budgetDocumentHeaderId);
113:
114: Budget budget = budgetDocument.getBudget();
115:
116: // clear out lists that are going to be re-populated with Budget data.
117: routingFormDocument.getRoutingFormInstitutionCostShares()
118: .clear();
119: routingFormDocument.getRoutingFormOtherCostShares().clear();
120: routingFormDocument.getRoutingFormSubcontractors().clear();
121:
122: RoutingFormBudget routingFormBudget = routingFormDocument
123: .getRoutingFormBudget();
124: routingFormBudget.resetRoutingFormBudgetData();
125:
126: for (BudgetOverviewFormHelper periodOverview : periodOverviews) {
127: if (routingFormBudget.getRoutingFormBudgetTotalStartDate() == null) {
128: routingFormBudget
129: .setRoutingFormBudgetTotalStartDate(periodOverview
130: .getBudgetPeriod()
131: .getBudgetPeriodBeginDate());
132: }
133: routingFormBudget
134: .setRoutingFormBudgetTotalEndDate(periodOverview
135: .getBudgetPeriod().getBudgetPeriodEndDate());
136: routingFormBudget
137: .setRoutingFormBudgetTotalIndirectCostAmount(routingFormBudget
138: .getRoutingFormBudgetTotalIndirectCostAmount()
139: .add(
140: periodOverview
141: .getTotalIndirectCostsAgencyRequest()));
142:
143: if (!periodOverview.isOverviewShowModular()) {
144: routingFormBudget
145: .setRoutingFormBudgetTotalDirectAmount(routingFormBudget
146: .getRoutingFormBudgetTotalDirectAmount()
147: .add(
148: periodOverview
149: .getTotalDirectCostsAgencyRequest()));
150: } else {
151: routingFormBudget
152: .setRoutingFormBudgetTotalDirectAmount(routingFormBudget
153: .getRoutingFormBudgetTotalDirectAmount()
154: .add(
155: periodOverview
156: .getAdjustedDirectCostsAgencyRequest()));
157: }
158:
159: if (periodOverview.isSelected()) {
160: if (routingFormBudget.getRoutingFormBudgetStartDate() == null) {
161: routingFormBudget
162: .setRoutingFormBudgetStartDate(periodOverview
163: .getBudgetPeriod()
164: .getBudgetPeriodBeginDate());
165: }
166: routingFormBudget
167: .setRoutingFormBudgetEndDate(periodOverview
168: .getBudgetPeriod()
169: .getBudgetPeriodEndDate());
170: routingFormBudget
171: .setRoutingFormBudgetIndirectCostAmount(routingFormBudget
172: .getRoutingFormBudgetIndirectCostAmount()
173: .add(
174: periodOverview
175: .getTotalIndirectCostsAgencyRequest()));
176:
177: if (!periodOverview.isOverviewShowModular()) {
178: routingFormBudget
179: .setRoutingFormBudgetDirectAmount(routingFormBudget
180: .getRoutingFormBudgetDirectAmount()
181: .add(
182: periodOverview
183: .getTotalDirectCostsAgencyRequest()));
184: } else {
185: routingFormBudget
186: .setRoutingFormBudgetDirectAmount(routingFormBudget
187: .getRoutingFormBudgetDirectAmount()
188: .add(
189: periodOverview
190: .getAdjustedDirectCostsAgencyRequest()));
191: }
192: }
193: }
194:
195: // set simple values - just replace the RF version w/ what's in the Budget
196: routingFormDocument
197: .setRoutingFormBudgetNumber(budgetDocumentHeaderId);
198: routingFormDocument.setRoutingFormAnnouncementNumber(budget
199: .getBudgetProgramAnnouncementNumber());
200: routingFormDocument.setAgencyFederalPassThroughNumber(budget
201: .getFederalPassThroughAgencyNumber());
202: routingFormDocument
203: .setRoutingFormAgencyToBeNamedIndicator(budget
204: .isAgencyToBeNamedIndicator());
205: routingFormDocument.setRoutingFormPurposeCode(budget
206: .getIndirectCost().getBudgetPurposeCode());
207:
208: routingFormDocument.getRoutingFormAgency().setAgencyNumber(
209: budget.getBudgetAgencyNumber());
210:
211: // Making this call to refresh the document's attributes
212: routingFormDocument.getRoutingFormAgency()
213: .refreshReferenceObject("agency");
214:
215: // Project Director
216: for (Iterator i = routingFormDocument.getRoutingFormPersonnel()
217: .iterator(); i.hasNext();) {
218: RoutingFormPersonnel routingFormPerson = (RoutingFormPersonnel) i
219: .next();
220: if (routingFormPerson.isProjectDirector()) {
221: i.remove();
222: break;
223: }
224: }
225:
226: for (BudgetUser budgetUser : budget.getPersonnel()) {
227: if (budgetUser.isPersonProjectDirectorIndicator()) {
228: // Get Project Director from Budget
229: RoutingFormPersonnel routingFormProjectDirector = new RoutingFormPersonnel(
230: budgetUser, routingFormDocument
231: .getDocumentNumber(),
232: PERSON_ROLE_CODE_PD);
233: routingFormProjectDirector
234: .setPersonCreditPercent(new KualiInteger(100));
235: routingFormProjectDirector
236: .setPersonFinancialAidPercent(new KualiInteger(
237: 100));
238: routingFormProjectDirector
239: .refreshNonUpdateableReferences();
240: routingFormDocument
241: .addPerson(routingFormProjectDirector);
242: }
243:
244: // Routing Form Cost Share entries from Personnel
245: RoutingFormInstitutionCostShare routingFormInstitutionCostShare = new RoutingFormInstitutionCostShare();
246: routingFormInstitutionCostShare
247: .setChartOfAccountsCode(budgetUser
248: .getFiscalCampusCode());
249: routingFormInstitutionCostShare
250: .setOrganizationCode(budgetUser
251: .getPrimaryDepartmentCode());
252: routingFormInstitutionCostShare
253: .setRoutingFormCostShareAmount(new KualiInteger(0));
254:
255: for (UserAppointmentTask userAppointmentTask : budgetUser
256: .getUserAppointmentTasks()) {
257: for (UserAppointmentTaskPeriod userAppointmentTaskPeriod : userAppointmentTask
258: .getUserAppointmentTaskPeriods()) {
259: if (userAppointmentTaskPeriod
260: .getBudgetPeriodSequenceNumber().compareTo(
261: minPeriod) >= 0
262: && userAppointmentTaskPeriod
263: .getBudgetPeriodSequenceNumber()
264: .compareTo(maxPeriod) <= 0) {
265: routingFormInstitutionCostShare
266: .setRoutingFormCostShareAmount(routingFormInstitutionCostShare
267: .getRoutingFormCostShareAmount()
268: .add(
269: userAppointmentTaskPeriod
270: .getInstitutionCostShareRequestTotalAmount()));
271: }
272: }
273: }
274:
275: if (routingFormInstitutionCostShare
276: .getRoutingFormCostShareAmount().isGreaterThan(
277: KualiInteger.ZERO)) {
278: routingFormDocument.addRoutingFormInstitutionCostShare(
279: routingFormInstitutionCostShare, true);
280: }
281: }
282:
283: // Routing Form Cost Share entries from Budget Cost Share screen (not personnel)
284: for (BudgetInstitutionCostShare budgetInstitutionCostShare : budget
285: .getInstitutionCostShareItems()) {
286: RoutingFormInstitutionCostShare routingFormInstitutionCostShare = new RoutingFormInstitutionCostShare();
287: routingFormInstitutionCostShare
288: .setChartOfAccountsCode(budgetInstitutionCostShare
289: .getChartOfAccountsCode());
290: routingFormInstitutionCostShare
291: .setOrganizationCode(budgetInstitutionCostShare
292: .getOrganizationCode());
293: routingFormInstitutionCostShare
294: .setRoutingFormCostShareAmount(KualiInteger.ZERO);
295:
296: for (BudgetPeriodInstitutionCostShare budgetPeriodInstitutionCostShare : budgetInstitutionCostShare
297: .getBudgetPeriodCostShare()) {
298: if (budgetPeriodInstitutionCostShare
299: .getBudgetCostShareAmount() != null
300: && budgetPeriodInstitutionCostShare
301: .getBudgetPeriodSequenceNumber()
302: .compareTo(minPeriod) >= 0
303: && budgetPeriodInstitutionCostShare
304: .getBudgetPeriodSequenceNumber()
305: .compareTo(maxPeriod) <= 0) {
306: routingFormInstitutionCostShare
307: .setRoutingFormCostShareAmount(routingFormInstitutionCostShare
308: .getRoutingFormCostShareAmount()
309: .add(
310: budgetPeriodInstitutionCostShare
311: .getBudgetCostShareAmount()));
312: }
313: }
314:
315: if (routingFormInstitutionCostShare
316: .getRoutingFormCostShareAmount().isGreaterThan(
317: KualiInteger.ZERO)) {
318: routingFormDocument.addRoutingFormInstitutionCostShare(
319: routingFormInstitutionCostShare, true);
320: }
321:
322: }
323:
324: // Other Cost Share from Budget Cost Share screen
325: for (BudgetThirdPartyCostShare budgetThirdPartyCostShare : budget
326: .getThirdPartyCostShareItems()) {
327: RoutingFormOtherCostShare routingFormOtherCostShare = new RoutingFormOtherCostShare();
328: routingFormOtherCostShare
329: .setRoutingFormCostShareSourceName(budgetThirdPartyCostShare
330: .getBudgetCostShareDescription());
331: routingFormOtherCostShare
332: .setRoutingFormCostShareAmount(KualiInteger.ZERO);
333:
334: for (BudgetPeriodThirdPartyCostShare budgetPeriodThirdPartyCostShare : budgetThirdPartyCostShare
335: .getBudgetPeriodCostShare()) {
336: if (budgetPeriodThirdPartyCostShare
337: .getBudgetPeriodSequenceNumber().compareTo(
338: minPeriod) >= 0
339: && budgetPeriodThirdPartyCostShare
340: .getBudgetPeriodSequenceNumber()
341: .compareTo(maxPeriod) <= 0) {
342: routingFormOtherCostShare
343: .setRoutingFormCostShareAmount(routingFormOtherCostShare
344: .getRoutingFormCostShareAmount()
345: .add(
346: budgetPeriodThirdPartyCostShare
347: .getBudgetCostShareAmount()));
348: }
349: }
350:
351: if (routingFormOtherCostShare
352: .getRoutingFormCostShareAmount().isGreaterThan(
353: KualiInteger.ZERO)) {
354: routingFormDocument
355: .addRoutingFormOtherCostShare(routingFormOtherCostShare);
356: }
357: }
358:
359: // Other Cost Share from Subcontractors (only Third Party and Inst. Cost Share amounts)
360: // Create Aggregate Entries for Subcontractor Cost Share and Subcontractor entries
361: Map<String, RoutingFormOtherCostShare> subcontractorCostShareMap = new HashMap<String, RoutingFormOtherCostShare>();
362: Map<String, RoutingFormSubcontractor> subcontractorMap = new HashMap<String, RoutingFormSubcontractor>();
363: for (BudgetNonpersonnel budgetNonpersonnel : budget
364: .getNonpersonnelItems()) {
365: if (KraConstants.SUBCONTRACTOR_CATEGORY_CODE
366: .equals(budgetNonpersonnel
367: .getBudgetNonpersonnelCategoryCode())) {
368: if (budgetNonpersonnel.getBudgetPeriodSequenceNumber()
369: .compareTo(minPeriod) >= 0
370: && budgetNonpersonnel
371: .getBudgetPeriodSequenceNumber()
372: .compareTo(maxPeriod) <= 0) {
373: if (subcontractorCostShareMap
374: .containsKey(budgetNonpersonnel
375: .getSubcontractorNumber())) {
376: RoutingFormOtherCostShare subcontractor = subcontractorCostShareMap
377: .get(budgetNonpersonnel
378: .getSubcontractorNumber());
379: subcontractor
380: .setRoutingFormCostShareAmount(subcontractor
381: .getRoutingFormCostShareAmount()
382: .add(
383: budgetNonpersonnel
384: .getBudgetThirdPartyCostShareAmount()
385: .add(
386: budgetNonpersonnel
387: .getBudgetInstitutionCostShareAmount())));
388: } else {
389: RoutingFormOtherCostShare routingFormOtherCostShare = new RoutingFormOtherCostShare();
390: routingFormOtherCostShare
391: .setRoutingFormCostShareSourceName(budgetNonpersonnel
392: .getBudgetNonpersonnelDescription());
393: routingFormOtherCostShare
394: .setRoutingFormCostShareAmount(budgetNonpersonnel
395: .getBudgetThirdPartyCostShareAmount()
396: .add(
397: budgetNonpersonnel
398: .getBudgetInstitutionCostShareAmount()));
399:
400: subcontractorCostShareMap.put(
401: budgetNonpersonnel
402: .getSubcontractorNumber(),
403: routingFormOtherCostShare);
404: }
405:
406: if (subcontractorMap.containsKey(budgetNonpersonnel
407: .getSubcontractorNumber())) {
408: RoutingFormSubcontractor subcontractor = subcontractorMap
409: .get(budgetNonpersonnel
410: .getSubcontractorNumber());
411: subcontractor
412: .setRoutingFormSubcontractorAmount(subcontractor
413: .getRoutingFormSubcontractorAmount()
414: .add(
415: budgetNonpersonnel
416: .getAgencyRequestAmount()));
417: } else {
418: RoutingFormSubcontractor subcontractor = new RoutingFormSubcontractor();
419: subcontractor
420: .setRoutingFormSubcontractorNumber(budgetNonpersonnel
421: .getSubcontractorNumber());
422: subcontractor
423: .setRoutingFormSubcontractorAmount(budgetNonpersonnel
424: .getAgencyRequestAmount());
425:
426: subcontractorMap.put(budgetNonpersonnel
427: .getSubcontractorNumber(),
428: subcontractor);
429: }
430: }
431: }
432: }
433:
434: for (RoutingFormOtherCostShare routingFormOtherCostShare : subcontractorCostShareMap
435: .values()) {
436: if (routingFormOtherCostShare
437: .getRoutingFormCostShareAmount().isGreaterThan(
438: KualiInteger.ZERO)) {
439: routingFormDocument
440: .addRoutingFormOtherCostShare(routingFormOtherCostShare);
441: }
442: }
443:
444: for (RoutingFormSubcontractor routingFormSubcontractor : subcontractorMap
445: .values()) {
446: if (routingFormSubcontractor
447: .getRoutingFormSubcontractorAmount().isGreaterThan(
448: KualiInteger.ZERO)) {
449: routingFormDocument
450: .addRoutingFormSubcontractor(routingFormSubcontractor);
451: }
452: }
453:
454: }
455:
456: /**
457: * This method creates and routes a C&G Proposal based on the values in a Routing Form. This is being done in the KRA-RF space
458: * to avoid creating a code dependency from C&G to KRA.
459: *
460: * @param routingFormDocument
461: * @return
462: */
463: public Long createAndRouteProposalMaintenanceDocument(
464: RoutingFormDocument routingFormDocument) {
465:
466: try {
467: MaintenanceDocument proposalMaintenanceDocument = (MaintenanceDocument) documentService
468: .getNewDocument("ProposalAutoGeneratedMaintenanceDocument");
469:
470: ProposalMaintainableImpl proposalMaintainable = new ProposalMaintainableImpl(
471: this
472: .createProposalFromRoutingForm(routingFormDocument));
473: proposalMaintainable
474: .setDocumentNumber(proposalMaintenanceDocument
475: .getDocumentNumber());
476:
477: proposalMaintenanceDocument
478: .setNewMaintainableObject(proposalMaintainable);
479:
480: proposalMaintenanceDocument.getDocumentHeader()
481: .setFinancialDocumentDescription(
482: "Created from Routing Form "
483: + routingFormDocument
484: .getDocumentNumber());
485:
486: documentService.updateDocument(proposalMaintenanceDocument);
487:
488: GlobalVariables.clear();
489: documentService.routeDocument(proposalMaintenanceDocument,
490: null, null);
491:
492: return ((ProposalMaintainableImpl) proposalMaintenanceDocument
493: .getNewMaintainableObject()).getProposal()
494: .getProposalNumber();
495: } catch (WorkflowException e) {
496: throw new RuntimeException(
497: "Error creating/routing new Proposal from Routing Form Document. Routing Form "
498: + routingFormDocument.getDocumentNumber());
499: }
500:
501: }
502:
503: private Proposal createProposalFromRoutingForm(
504: RoutingFormDocument routingFormDocument) {
505: Proposal proposal = new Proposal();
506:
507: Long newProposalNumber = NextProposalNumberFinder
508: .getLongValue();
509: proposal.setProposalNumber(newProposalNumber);
510: proposal.setProposalStatusCode(Proposal.PROPOSAL_CODE);
511:
512: // Values coming from RoutingFormDocument (ER_RF_DOC_T)
513: proposal
514: .setProposalProjectTitle(routingFormDocument
515: .getRoutingFormProjectTitle().length() > 250 ? routingFormDocument
516: .getRoutingFormProjectTitle().substring(0, 250)
517: : routingFormDocument
518: .getRoutingFormProjectTitle());
519: proposal.setProposalPurposeCode(routingFormDocument
520: .getRoutingFormPurposeCode());
521: proposal.setGrantNumber(routingFormDocument.getGrantNumber());
522: proposal
523: .setCfdaNumber(routingFormDocument
524: .getRoutingFormCatalogOfFederalDomesticAssistanceNumber());
525: proposal.setProposalFellowName(routingFormDocument
526: .getRoutingFormFellowFullName());
527: proposal
528: .setProposalFederalPassThroughIndicator(routingFormDocument
529: .getRoutingFormFederalPassThroughIndicator());
530: proposal.setFederalPassThroughAgencyNumber(routingFormDocument
531: .getAgencyFederalPassThroughNumber());
532:
533: // There could be multiple types on the RF, but only one of them will pass this rule, and that's the one that should be used
534: // to populate the Proposal field.
535: for (RoutingFormProjectType routingFormProjectType : routingFormDocument
536: .getRoutingFormProjectTypes()) {
537: if (parameterService.getParameterEvaluator(
538: RoutingFormDocument.class,
539: KraConstants.CREATE_PROPOSAL_PROJECT_TYPES,
540: routingFormProjectType.getProjectTypeCode())
541: .evaluationSucceeds()) {
542: proposal
543: .setProposalAwardTypeCode(routingFormProjectType
544: .getProjectTypeCode());
545: break;
546: }
547: }
548:
549: // Values coming from Routing Form Budget BO (ER_RF_BDGT_T)
550: RoutingFormBudget routingFormBudget = routingFormDocument
551: .getRoutingFormBudget();
552: proposal.setProposalBeginningDate(routingFormBudget
553: .getRoutingFormBudgetStartDate());
554: proposal.setProposalEndingDate(routingFormBudget
555: .getRoutingFormBudgetEndDate());
556: proposal
557: .setProposalTotalAmount((routingFormBudget
558: .getRoutingFormBudgetDirectAmount() != null ? routingFormBudget
559: .getRoutingFormBudgetDirectAmount()
560: : new KualiInteger(0))
561: .add(
562: routingFormBudget
563: .getRoutingFormBudgetIndirectCostAmount() != null ? routingFormBudget
564: .getRoutingFormBudgetIndirectCostAmount()
565: : new KualiInteger(0))
566: .kualiDecimalValue());
567: proposal
568: .setProposalDirectCostAmount((routingFormBudget
569: .getRoutingFormBudgetDirectAmount() != null ? routingFormBudget
570: .getRoutingFormBudgetDirectAmount()
571: : new KualiInteger(0)).kualiDecimalValue());
572: proposal
573: .setProposalIndirectCostAmount((routingFormBudget
574: .getRoutingFormBudgetIndirectCostAmount() != null ? routingFormBudget
575: .getRoutingFormBudgetIndirectCostAmount()
576: : new KualiInteger(0)).kualiDecimalValue());
577: proposal.setProposalDueDate(routingFormDocument
578: .getRoutingFormAgency().getRoutingFormDueDate());
579:
580: // Values coming from RoutingFormAgency (ER_RF_AGNCY_T)
581: proposal.setAgencyNumber(routingFormDocument
582: .getRoutingFormAgency().getAgencyNumber());
583:
584: // Values coming from the list of Subcontractors (ER_RF_SUBCNR_T)
585: for (RoutingFormSubcontractor routingFormSubcontractor : routingFormDocument
586: .getRoutingFormSubcontractors()) {
587:
588: /**
589: * Constructs a ProposalSubcontractor with a Proposal Number and uses a RoutingFormSubcontractor as a template.
590: *
591: * @param proposalNumber The proposalNumber for the Proposal that this ProposalSubcontractor will be associated with
592: * @param routingFormSubcontractor The routingFormSubcontractor that will act as a template for this
593: * ProposalSubcontractor
594: */
595: ProposalSubcontractor newProposalSubcontractor = new ProposalSubcontractor();
596: newProposalSubcontractor
597: .setProposalNumber(newProposalNumber);
598: newProposalSubcontractor
599: .setProposalSubcontractorNumber(routingFormSubcontractor
600: .getRoutingFormSubcontractorSequenceNumber()
601: .toString());
602: newProposalSubcontractor
603: .setSubcontractorNumber(routingFormSubcontractor
604: .getRoutingFormSubcontractorNumber());
605: newProposalSubcontractor
606: .setProposalSubcontractorAmount(routingFormSubcontractor
607: .getRoutingFormSubcontractorAmount()
608: .kualiDecimalValue());
609:
610: proposal.getProposalSubcontractors().add(
611: newProposalSubcontractor);
612: }
613:
614: // Get the RF Primary Project Director
615: for (RoutingFormPersonnel routingFormPerson : routingFormDocument
616: .getRoutingFormPersonnel()) {
617: if (routingFormPerson.isProjectDirector()) {
618: RoutingFormPersonnel projectDirector = routingFormPerson;
619:
620: ProposalProjectDirector newProposalProjectDirector = new ProposalProjectDirector();
621: newProposalProjectDirector
622: .setProposalNumber(newProposalNumber);
623: newProposalProjectDirector
624: .setPersonUniversalIdentifier(projectDirector
625: .getPersonUniversalIdentifier());
626: newProposalProjectDirector
627: .setProposalPrimaryProjectDirectorIndicator(true);
628:
629: proposal.getProposalProjectDirectors().add(
630: newProposalProjectDirector);
631:
632: ProposalOrganization projectDirectorOrganization = new ProposalOrganization();
633: projectDirectorOrganization
634: .setProposalNumber(newProposalNumber);
635: projectDirectorOrganization
636: .setChartOfAccountsCode(projectDirector
637: .getChartOfAccountsCode());
638: projectDirectorOrganization
639: .setOrganizationCode(projectDirector
640: .getOrganizationCode());
641: projectDirectorOrganization
642: .setProposalPrimaryOrganizationIndicator(true);
643:
644: proposal.getProposalOrganizations().add(
645: projectDirectorOrganization);
646: break;
647: }
648: }
649:
650: for (RoutingFormOrganization routingFormOrganization : routingFormDocument
651: .getRoutingFormOrganizations()) {
652: // construct a new ProposalOrganization using the current RoutingFormOrganization as a template.
653: ProposalOrganization proposalOrganization = new ProposalOrganization();
654: proposalOrganization.setProposalNumber(newProposalNumber);
655: proposalOrganization
656: .setChartOfAccountsCode(routingFormOrganization
657: .getChartOfAccountsCode());
658: proposalOrganization
659: .setOrganizationCode(routingFormOrganization
660: .getOrganizationCode());
661: proposalOrganization
662: .setProposalPrimaryOrganizationIndicator(routingFormOrganization
663: .getRoutingFormPrimaryOrganizationIndicator());
664:
665: // check to see if the list or ProposalOrganizations already contains an entry with this key; add it to the list if it
666: // does not.
667: if (!ObjectUtils.collectionContainsObjectWithIdentitcalKey(
668: proposal.getProposalOrganizations(),
669: proposalOrganization)) {
670: proposal.getProposalOrganizations().add(
671: proposalOrganization);
672: }
673: }
674:
675: for (RoutingFormResearchRisk routingFormResearchRisk : routingFormDocument
676: .getRoutingFormResearchRisks()) {
677: ProposalResearchRisk newProposalResearchRisk = new ProposalResearchRisk();
678:
679: newProposalResearchRisk
680: .setProposalNumber(newProposalNumber);
681: newProposalResearchRisk
682: .setResearchRiskTypeCode(routingFormResearchRisk
683: .getResearchRiskTypeCode());
684: newProposalResearchRisk
685: .setResearchRiskTypeIndicator(routingFormResearchRisk
686: .getResearchRiskStudies() != null
687: && routingFormResearchRisk
688: .getResearchRiskStudies().size() > 0
689: || routingFormResearchRisk
690: .getResearchRiskDescription() != null);
691: newProposalResearchRisk
692: .setResearchRiskType(routingFormResearchRisk
693: .getResearchRiskType());
694:
695: proposal.getProposalResearchRisks().add(
696: newProposalResearchRisk);
697: }
698:
699: proposal.setProposalSubmissionDate(SpringContext.getBean(
700: DateTimeService.class).getCurrentSqlDate());
701:
702: return proposal;
703: }
704:
705: public void setMaintenanceDocumentDictionaryService(
706: MaintenanceDocumentDictionaryService maintenanceDocumentDictionaryService) {
707: this .maintenanceDocumentDictionaryService = maintenanceDocumentDictionaryService;
708: }
709:
710: public void setDocumentService(DocumentService documentService) {
711: this .documentService = documentService;
712: }
713:
714: public void setParameterService(ParameterService parameterService) {
715: this.parameterService = parameterService;
716: }
717:
718: }
|