org.kuali.coeus.s2sgen.impl.generate.support.PHS398ChecklistV1_3Generator.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.s2sgen.impl.generate.support.PHS398ChecklistV1_3Generator.java

Source

/*
 * Kuali Coeus, a comprehensive research administration system for higher education.
 * 
 * Copyright 2005-2016 Kuali, Inc.
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 * 
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.kuali.coeus.s2sgen.impl.generate.support;

import gov.grants.apply.forms.phs398Checklist13V13.PHS398Checklist13Document;
import gov.grants.apply.forms.phs398Checklist13V13.PHS398Checklist13Document.PHS398Checklist13;
import gov.grants.apply.forms.phs398Checklist13V13.PHS398Checklist13Document.PHS398Checklist13.ApplicationType;
import gov.grants.apply.forms.phs398Checklist13V13.PHS398Checklist13Document.PHS398Checklist13.IncomeBudgetPeriod;
import gov.grants.apply.system.globalLibraryV20.HumanNameDataType;
import gov.grants.apply.system.globalLibraryV20.YesNoDataType;
import gov.grants.apply.system.globalLibraryV20.YesNoDataType.Enum;
import org.apache.xmlbeans.XmlObject;
import org.kuali.coeus.common.api.ynq.YnqConstant;
import org.kuali.coeus.common.questionnaire.api.answer.AnswerHeaderContract;
import org.kuali.coeus.common.api.rolodex.RolodexContract;
import org.kuali.coeus.common.api.rolodex.RolodexService;
import org.kuali.coeus.common.budget.api.income.BudgetProjectIncomeContract;
import org.kuali.coeus.s2sgen.impl.generate.FormGenerator;
import org.kuali.coeus.propdev.api.budget.ProposalDevelopmentBudgetExtContract;
import org.kuali.coeus.propdev.api.core.DevelopmentProposalContract;
import org.kuali.coeus.propdev.api.core.ProposalDevelopmentDocumentContract;
import org.kuali.coeus.s2sgen.impl.generate.FormVersion;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;

/**
 * 
 * This class is used to generate XML Document object for grants.gov
 * PHS398ChecklistV1.3. This form is generated using XMLBean API's generated by
 * compiling PHS398ChecklistV1.1 schema.
 * 
 * @author Kuali Research Administration Team (kualidev@oncourse.iu.edu)
 */
@FormGenerator("PHS398ChecklistV1_3Generator")
public class PHS398ChecklistV1_3Generator extends PHS398ChecklistBaseGenerator {
    private static final Integer YNQANSWER_121 = 121;
    List<? extends AnswerHeaderContract> answerHeaders;
    Enum ynqAnswer;

    @Value("http://apply.grants.gov/forms/PHS398_Checklist_1_3-V1.3")
    private String namespace;

    @Value("PHS398_Checklist_1_3-V1.3")
    private String formName;

    @Value("classpath:org/kuali/coeus/s2sgen/impl/generate/support/stylesheet/PHS398_Checklist-V1.3.xsl")
    private Resource stylesheet;

    @Value("gov.grants.apply.forms.phs398Checklist13V13")
    private String packageName;

    @Value("230")
    private int sortIndex;

    @Autowired
    @Qualifier("rolodexService")
    private RolodexService rolodexService;

    /*
     * This method returns PHS398ChecklistDocument object based on proposal
     * development document which contains the PHS398ChecklistDocument
     * informations
     * ApplicationType,FederalID,ChangeOfPDPI,FormerPDName,ChangeOfInstitution,
     * FormerInstitutionName,InventionsAndPatents, ProgramIncome and
     * CertificationExplanation for a particular proposal
     * 
     */
    private PHS398Checklist13Document getPHS398Checklist() {
        PHS398Checklist13Document phsChecklistDocument = PHS398Checklist13Document.Factory.newInstance();
        PHS398Checklist13 phsChecklist = PHS398Checklist13.Factory.newInstance();
        answerHeaders = getPropDevQuestionAnswerService()
                .getQuestionnaireAnswerHeaders(pdDoc.getDevelopmentProposal().getProposalNumber());
        setPhsCheckListBasicProperties(phsChecklist);
        setFormerPDNameAndIsChangeOfPDPI(phsChecklist);
        setFormerInstitutionNameAndChangeOfInstitution(phsChecklist);
        setIsInventionsAndPatentsAndIsPreviouslyReported(phsChecklist);

        ProposalDevelopmentBudgetExtContract budget = s2SCommonBudgetService
                .getBudget(pdDoc.getDevelopmentProposal());

        if (budget != null) {
            int numPeriods = budget.getBudgetPeriods().size();
            setIncomeBudgetPeriods(phsChecklist, budget.getBudgetProjectIncomes());
        } else {
            phsChecklist.setProgramIncome(YesNoDataType.N_NO);
        }
        ynqAnswer = getYNQAnswer(YNQANSWER_121);
        phsChecklist.setDisclosurePermission(ynqAnswer);
        phsChecklistDocument.setPHS398Checklist13(phsChecklist);
        return phsChecklistDocument;
    }

    /*
     * This method will set values to following attributes setFederalID,
     * setApplicationType ,setFormVersion
     */
    private void setPhsCheckListBasicProperties(PHS398Checklist13 phsChecklist) {
        phsChecklist.setFormVersion(FormVersion.v1_3.getVersion());
        DevelopmentProposalContract developmentProposal = pdDoc.getDevelopmentProposal();
        ApplicationType.Enum applicationEnum = null;
        if (developmentProposal.getProposalType() != null
                && Integer.parseInt(developmentProposal.getProposalType().getCode()) < PROPOSAL_TYPE_CODE_6) {
            applicationEnum = ApplicationType.Enum
                    .forInt(Integer.valueOf(developmentProposal.getProposalType().getCode()));
        }
        phsChecklist.setApplicationType(applicationEnum);
        String federalId = getSubmissionInfoService()
                .getFederalId(pdDoc.getDevelopmentProposal().getProposalNumber());
        if (federalId != null) {
            phsChecklist.setFederalID(federalId);
        }
    }

    /*
     * This method will set values to income budget periods
     */
    private static void setIncomeBudgetPeriods(PHS398Checklist13 phsChecklist,
            List<? extends BudgetProjectIncomeContract> projectIncomes) {
        if (projectIncomes.isEmpty()) {
            phsChecklist.setProgramIncome(YesNoDataType.N_NO);
        } else {
            phsChecklist.setProgramIncome(YesNoDataType.Y_YES);
        }
        phsChecklist.setIncomeBudgetPeriodArray(getIncomeBudgetPeriod(projectIncomes));
    }

    /*
     * Method to sum up IncomeBudgetPeriod of different period Number
     */
    private static IncomeBudgetPeriod[] getIncomeBudgetPeriod(
            final List<? extends BudgetProjectIncomeContract> projectIncomes) {
        //TreeMap Used to maintain the order of the Budget periods.
        Map<Integer, IncomeBudgetPeriod> incomeBudgetPeriodMap = new TreeMap<>();
        BigDecimal anticipatedAmount;
        for (BudgetProjectIncomeContract projectIncome : projectIncomes) {

            Integer budgetPeriodNumber = projectIncome.getBudgetPeriodNumber();
            IncomeBudgetPeriod incomeBudgPeriod = incomeBudgetPeriodMap.get(budgetPeriodNumber);
            if (incomeBudgPeriod == null) {
                incomeBudgPeriod = IncomeBudgetPeriod.Factory.newInstance();
                incomeBudgPeriod.setBudgetPeriod(budgetPeriodNumber);
                anticipatedAmount = BigDecimal.ZERO;
            } else {
                anticipatedAmount = incomeBudgPeriod.getAnticipatedAmount();
            }
            anticipatedAmount = anticipatedAmount.add(projectIncome.getProjectIncome().bigDecimalValue());
            incomeBudgPeriod.setAnticipatedAmount(anticipatedAmount);
            String description = getProjectIncomeDescription(projectIncome);
            if (description != null) {
                if (incomeBudgPeriod.getSource() != null) {
                    incomeBudgPeriod.setSource(incomeBudgPeriod.getSource() + ";" + description);
                } else {
                    incomeBudgPeriod.setSource(description);
                }
            }
            incomeBudgetPeriodMap.put(budgetPeriodNumber, incomeBudgPeriod);
        }
        Collection<IncomeBudgetPeriod> incomeBudgetPeriodCollection = incomeBudgetPeriodMap.values();
        return incomeBudgetPeriodCollection.toArray(new IncomeBudgetPeriod[0]);
    }

    /*
     * This method will get the project income description
     */
    protected static String getProjectIncomeDescription(BudgetProjectIncomeContract projectIncome) {
        String description = null;
        if (projectIncome.getDescription() != null) {
            if (projectIncome.getDescription().length() > PROJECT_INCOME_DESCRIPTION_MAX_LENGTH) {
                description = projectIncome.getDescription().substring(0, PROJECT_INCOME_DESCRIPTION_MAX_LENGTH);
            } else {
                description = projectIncome.getDescription();
            }
        }
        return description;
    }

    /*
     * This method will set the values to
     * setIsInventionsAndPatents,setIsPreviouslyReported based on condition
     */
    private void setIsInventionsAndPatentsAndIsPreviouslyReported(PHS398Checklist13 phsChecklist) {
        String answer = getAnswer(PROPOSAL_YNQ_QUESTION_118, answerHeaders);
        if (answer != null && !answer.equals(NOT_ANSWERED)) {
            if (YnqConstant.YES.code().equals(answer)) {
                String explanation = getAnswer(PROPOSAL_YNQ_QUESTION_119, answerHeaders);
                if (explanation != null && !explanation.equals(NOT_ANSWERED)) {
                    if (YnqConstant.YES.code().equals(explanation)) {
                        phsChecklist.setIsInventionsAndPatents(YesNoDataType.Y_YES);
                        String subQuestionExplanation = getAnswer(PROPOSAL_YNQ_QUESTION_120, answerHeaders);
                        if (subQuestionExplanation != null && !subQuestionExplanation.equals(NOT_ANSWERED)) {
                            if (YnqConstant.YES.code().equals(subQuestionExplanation)) {
                                phsChecklist.setIsPreviouslyReported(YesNoDataType.Y_YES);
                            } else if (YnqConstant.NO.code().equals(subQuestionExplanation)) {
                                phsChecklist.setIsPreviouslyReported(YesNoDataType.N_NO);
                            }
                        } else {
                            phsChecklist.setIsPreviouslyReported(null);
                        }

                    } else if (YnqConstant.NO.code().equals(explanation)) {
                        phsChecklist.setIsInventionsAndPatents(YesNoDataType.N_NO);
                    }
                } else {
                    phsChecklist.setIsInventionsAndPatents(null);
                }
            }
        }
    }

    /*
     * This method will set the values to setFormerInstitutionName
     * ,setIsChangeOfInstitution based on condition
     */
    private void setFormerInstitutionNameAndChangeOfInstitution(PHS398Checklist13 phsChecklist) {
        String answer = getAnswer(PROPOSAL_YNQ_QUESTION_116, answerHeaders);
        String explanation = getAnswer(PROPOSAL_YNQ_QUESTION_117, answerHeaders);

        if (YnqConstant.YES.code().equals(answer)) {
            phsChecklist.setIsChangeOfInstitution(YesNoDataType.Y_YES);
            if (explanation != null) {
                phsChecklist.setFormerInstitutionName(explanation);
            } else {
                phsChecklist.setFormerInstitutionName(null);
            }
        } else {
            phsChecklist.setIsChangeOfInstitution(YesNoDataType.N_NO);
        }
    }

    /*
     * This method will set the values to setFormerPDName ,setIsChangeOfPDPI
     * based on condition
     */
    private void setFormerPDNameAndIsChangeOfPDPI(PHS398Checklist13 phsChecklist) {
        String answer = getAnswer(PROPOSAL_YNQ_QUESTION_114, answerHeaders);
        String explanation = getAnswer(PROPOSAL_YNQ_QUESTION_115, answerHeaders);
        if (YnqConstant.YES.code().equals(answer)) {
            phsChecklist.setIsChangeOfPDPI(YesNoDataType.Y_YES);
            if (explanation != null) {
                RolodexContract rolodex = rolodexService.getRolodex(Integer.valueOf(explanation));
                HumanNameDataType formerPDName = globLibV20Generator.getHumanNameDataType(rolodex);
                if (formerPDName != null && formerPDName.getFirstName() != null
                        && formerPDName.getLastName() != null) {
                    phsChecklist.setFormerPDName(formerPDName);
                }
            } else {
                phsChecklist.setFormerPDName(null);
            }
        } else {
            phsChecklist.setIsChangeOfPDPI(YesNoDataType.N_NO);
        }
    }

    /*
     * This method will get the YNQ Answer for question id
     */
    private YesNoDataType.Enum getYNQAnswer(Integer questionID) {
        YesNoDataType.Enum answerType = null;
        String answer = getAnswer(questionID, answerHeaders);
        if (answer != null && !answer.equals(NOT_ANSWERED)) {
            answerType = "Y".equals(answer) ? YesNoDataType.Y_YES : YesNoDataType.N_NO;
            return answerType;
        } else {
            return null;
        }
    }

    /**
     * This method creates {@link XmlObject} of type
     * {@link PHS398Checklist13Document} by populating data from the given
     * {@link ProposalDevelopmentDocumentContract}
     * 
     * @param proposalDevelopmentDocument
     *            for which the {@link XmlObject} needs to be created
     * @return {@link XmlObject} which is generated using the given
     *         {@link ProposalDevelopmentDocumentContract}
     */
    @Override
    public PHS398Checklist13Document getFormObject(
            ProposalDevelopmentDocumentContract proposalDevelopmentDocument) {
        this.pdDoc = proposalDevelopmentDocument;
        return getPHS398Checklist();
    }

    public RolodexService getRolodexService() {
        return rolodexService;
    }

    public void setRolodexService(RolodexService rolodexService) {
        this.rolodexService = rolodexService;
    }

    @Override
    public String getNamespace() {
        return namespace;
    }

    public void setNamespace(String namespace) {
        this.namespace = namespace;
    }

    @Override
    public String getFormName() {
        return formName;
    }

    public void setFormName(String formName) {
        this.formName = formName;
    }

    @Override
    public Resource getStylesheet() {
        return stylesheet;
    }

    public void setStylesheet(Resource stylesheet) {
        this.stylesheet = stylesheet;
    }

    @Override
    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }

    @Override
    public int getSortIndex() {
        return sortIndex;
    }

    public void setSortIndex(int sortIndex) {
        this.sortIndex = sortIndex;
    }
}