18F/e-QIP-prototype

View on GitHub
src/components/Section/sectionData.js

Summary

Maintainability
D
1 day
Test Coverage
import {
  SF85, SF85P, SF86, reduceSubsections,
} from 'config/formTypes'

const wrap = obj => obj || {}

/**
 * A function to get the correct formType config
 */
export const getForm = (settings) => {
  if (settings && settings.formType) {
    switch (settings.formType) {
      case 'SF85':
        return SF85
      case 'SF85P':
        return SF85P
      case 'SF86':
        return SF86
      default:
        return SF86
    }
  }
  return SF86
}

/**
 * A generic function to get all the subsection data for a specific section
 */
export const getSubsections = (section, application) => {
  const form = getForm(application.Settings)
  const sectionData = form.find(sectionName => sectionName.name === section.toLowerCase())
  const reducedSubsections = reduceSubsections(sectionData.subsections)
  return (
    reducedSubsections
      .filter(subsection => subsection.storeKey)
      .map((subsection) => {
        // TODO HACK: there are inconsistencies for which section U.S. Passport
        // is in. We want it to eventually be in Citizenship from Foreign.
        if (section === 'citizenship' && subsection.name === 'passport') {
          return {
            path: 'foreign/passport',
            data: wrap(application.Foreign).Passport,
          }
        }

        return {
          path: `${section}/${subsection.name}`,
          data: wrap(application[sectionData.store])[subsection.storeKey],
        }
      })
  )
}

/**
 * A function to get the Legal Police nested subsection
 * This is a one-off use case that cannot be captured by getSubsections
 * because it's a nested subsection.
 */
export const getLegalPoliceSubsections = (application) => {
  const form = getForm(application.Settings)
  const legalSubsection = form.find(sectionName => sectionName.name === 'legal')
  const policeSubsections = legalSubsection.subsections.find(subsection => subsection.name === 'police')

  return (
    policeSubsections.subsections
      .filter(subsection => subsection.storeKey)
      .map(subsection => (
        {
          path: `${legalSubsection.name}/${subsection.name}`,
          data: wrap(application[legalSubsection.store])[subsection.storeKey],
        }
      ))
  )
}

const sectionData = (section, subsection, application = {}) => {
  if (!section || !subsection || !application) {
    return []
  }

  switch (`${section.toLowerCase()}/${subsection.toLowerCase()}`) {
    case 'identification/birthdate':
      return [
        {
          path: 'identification/birthdate',
          data: wrap(application.Identification).ApplicantBirthDate,
        },
      ]
    case 'identification/birthplace':
      return [
        {
          path: 'identification/birthplace',
          data: wrap(application.Identification).ApplicantBirthPlace,
        },
      ]
    case 'identification/contacts':
      return [
        {
          path: 'identification/contacts',
          data: wrap(application.Identification).Contacts,
        },
      ]
    case 'identification/name':
      return [
        {
          path: 'identification/name',
          data: wrap(application.Identification).ApplicantName,
        },
      ]
    case 'identification/othernames':
      return [
        {
          path: 'identification/othernames',
          data: wrap(application.Identification).OtherNames,
        },
      ]
    case 'identification/physical':
      return [
        {
          path: 'identification/physical',
          data: wrap(application.Identification).Physical,
        },
      ]
    case 'identification/ssn':
      return [
        {
          path: 'identification/ssn',
          data: wrap(application.Identification).ApplicantSSN,
        },
      ]
    case 'identification/intro':
    case 'identification/review':
      return getSubsections('identification', application)

    case 'financial/bankruptcy':
      return [
        {
          path: 'financial/bankruptcy',
          data: wrap(application.Financial).Bankruptcy,
        },
      ]
    case 'financial/gambling':
      return [
        {
          path: 'financial/gambling',
          data: wrap(application.Financial).Gambling,
        },
      ]
    case 'financial/taxes':
      return [
        { path: 'financial/taxes', data: wrap(application.Financial).Taxes },
      ]
    case 'financial/card':
      return [
        { path: 'financial/card', data: wrap(application.Financial).Card },
      ]
    case 'financial/credit':
      return [
        { path: 'financial/credit', data: wrap(application.Financial).Credit },
      ]
    case 'financial/delinquent':
      return [
        {
          path: 'financial/delinquent',
          data: wrap(application.Financial).Delinquent,
        },
      ]
    case 'financial/nonpayment':
      return [
        {
          path: 'financial/nonpayment',
          data: wrap(application.Financial).Nonpayment,
        },
      ]
    case 'financial/intro':
    case 'financial/review':
      return getSubsections('financial', application)

    case 'history/education':
      return [
        { path: 'history/education', data: wrap(application.History).Education },
      ]
    case 'history/employment':
      return [
        {
          path: 'history/employment',
          data: wrap(application.History).Employment,
        },
      ]
    case 'history/federal':
      return [
        { path: 'history/federal', data: wrap(application.History).Federal },
      ]
    case 'history/residence':
      return [
        { path: 'history/residence', data: wrap(application.History).Residence },
      ]
    case 'history/intro':
    case 'history/review':
      return getSubsections('history', application)

    case 'relationships/status/marital':
      return [
        {
          path: 'relationships/status/marital',
          data: wrap(application.Relationships).Marital,
        },
      ]
    case 'relationships/status/cohabitant':
      return [
        {
          path: 'relationships/status/cohabitant',
          data: wrap(application.Relationships).Cohabitants,
        },
      ]
    case 'relationships/people':
      return [
        {
          path: 'relationships/people',
          data: wrap(application.Relationships).People,
        },
      ]
    case 'relationships/relatives':
      return [
        {
          path: 'relationships/relatives',
          data: wrap(application.Relationships).Relatives,
        },
      ]
    case 'relationships/intro':
    case 'relationships/review':
      return getSubsections('relationships', application)
    // TODO: there are inconsistencies for which section U.S. Passport
    // is in. We want it to eventually be in Citizenship from Foreign.
    case 'citizenship/passport':
      return [
        { path: 'foreign/passport', data: wrap(application.Foreign).Passport },
      ]
    case 'citizenship/multiple':
      return [
        {
          path: 'citizenship/multiple',
          data: wrap(application.Citizenship).Multiple,
        },
      ]
    case 'citizenship/passports':
      return [
        {
          path: 'citizenship/passports',
          data: wrap(application.Citizenship).Passports,
        },
      ]
    case 'citizenship/status':
      return [
        {
          path: 'citizenship/status',
          data: wrap(application.Citizenship).Status,
        },
      ]
    case 'citizenship/intro':
    case 'citizenship/review':
      return getSubsections('citizenship', application)

    case 'military/selective':
      return [
        {
          path: 'military/selective',
          data: wrap(application.Military).Selective,
        },
      ]
    case 'military/history':
      return [
        { path: 'military/history', data: wrap(application.Military).History },
      ]
    case 'military/disciplinary':
      return [
        {
          path: 'military/disciplinary',
          data: wrap(application.Military).Disciplinary,
        },
      ]
    case 'military/foreign':
      return [
        { path: 'military/foreign', data: wrap(application.Military).Foreign },
      ]
    case 'military/intro':
    case 'military/review':
      return getSubsections('military', application)

    case 'foreign/activities/benefits':
      return [
        {
          path: 'foreign/activities/benefits',
          data: wrap(application.Foreign).BenefitActivity,
        },
      ]
    case 'foreign/activities/direct':
      return [
        {
          path: 'foreign/activities/direct',
          data: wrap(application.Foreign).DirectActivity,
        },
      ]
    case 'foreign/activities/indirect':
      return [
        {
          path: 'foreign/activities/indirect',
          data: wrap(application.Foreign).IndirectActivity,
        },
      ]
    case 'foreign/activities/realestate':
      return [
        {
          path: 'foreign/activities/realestate',
          data: wrap(application.Foreign).RealEstateActivity,
        },
      ]
    case 'foreign/activities/support':
      return [
        {
          path: 'foreign/activities/support',
          data: wrap(application.Foreign).Support,
        },
      ]
    case 'foreign/business/advice':
      return [
        {
          path: 'foreign/business/advice',
          data: wrap(application.Foreign).Advice,
        },
      ]
    case 'foreign/business/conferences':
      return [
        {
          path: 'foreign/business/conferences',
          data: wrap(application.Foreign).Conferences,
        },
      ]
    case 'foreign/business/contact':
      return [
        {
          path: 'foreign/business/contact',
          data: wrap(application.Foreign).Contact,
        },
      ]
    case 'foreign/business/employment':
      return [
        {
          path: 'foreign/business/employment',
          data: wrap(application.Foreign).Employment,
        },
      ]
    case 'foreign/business/family':
      return [
        {
          path: 'foreign/business/family',
          data: wrap(application.Foreign).Family,
        },
      ]
    case 'foreign/business/political':
      return [
        {
          path: 'foreign/business/political',
          data: wrap(application.Foreign).Political,
        },
      ]
    case 'foreign/business/sponsorship':
      return [
        {
          path: 'foreign/business/sponsorship',
          data: wrap(application.Foreign).Sponsorship,
        },
      ]
    case 'foreign/business/ventures':
      return [
        {
          path: 'foreign/business/ventures',
          data: wrap(application.Foreign).Ventures,
        },
      ]
    case 'foreign/business/voting':
      return [
        {
          path: 'foreign/business/voting',
          data: wrap(application.Foreign).Voting,
        },
      ]
    case 'foreign/contacts':
      return [
        { path: 'foreign/contacts', data: wrap(application.Foreign).Contacts },
      ]
    case 'foreign/travel':
      return [
        { path: 'foreign/travel', data: wrap(application.Foreign).Travel },
      ]
    case 'foreign/intro':
    case 'foreign/review':
      return getSubsections('foreign', application)

    case 'substance/alcohol/additional':
      return [
        {
          path: 'substance/alcohol/additional',
          data: wrap(application.Substance).ReceivedCounselings,
        },
      ]
    case 'substance/alcohol/negative':
      return [
        {
          path: 'substance/alcohol/negative',
          data: wrap(application.Substance).NegativeImpacts,
        },
      ]
    case 'substance/alcohol/ordered':
      return [
        {
          path: 'substance/alcohol/ordered',
          data: wrap(application.Substance).OrderedCounselings,
        },
      ]
    case 'substance/alcohol/voluntary':
      return [
        {
          path: 'substance/alcohol/voluntary',
          data: wrap(application.Substance).VoluntaryCounselings,
        },
      ]
    case 'substance/drugs/clearance':
      return [
        {
          path: 'substance/drugs/clearance',
          data: wrap(application.Substance).DrugClearanceUses,
        },
      ]
    case 'substance/drugs/misuse':
      return [
        {
          path: 'substance/drugs/misuse',
          data: wrap(application.Substance).PrescriptionUses,
        },
      ]
    case 'substance/drugs/ordered':
      return [
        {
          path: 'substance/drugs/ordered',
          data: wrap(application.Substance).OrderedTreatments,
        },
      ]
    case 'substance/drugs/publicsafety':
      return [
        {
          path: 'substance/drugs/publicsafety',
          data: wrap(application.Substance).DrugPublicSafetyUses,
        },
      ]
    case 'substance/drugs/purchase':
      return [
        {
          path: 'substance/drugs/purchase',
          data: wrap(application.Substance).DrugInvolvements,
        },
      ]
    case 'substance/drugs/usage':
      return [
        {
          path: 'substance/drugs/usage',
          data: wrap(application.Substance).DrugUses,
        },
      ]
    case 'substance/drugs/voluntary':
      return [
        {
          path: 'substance/drugs/voluntary',
          data: wrap(application.Substance).VoluntaryTreatments,
        },
      ]
    case 'substance/intro':
    case 'substance/review':
      return getSubsections('substance', application)

    case 'legal/associations/activities-to-overthrow':
      return [
        {
          path: 'legal/associations/activities-to-overthrow',
          data: wrap(application.Legal).ActivitiesToOverthrow,
        },
      ]
    case 'legal/associations/advocating':
      return [
        {
          path: 'legal/associations/advocating',
          data: wrap(application.Legal).Advocating,
        },
      ]
    case 'legal/associations/engaged-in-terrorism':
      return [
        {
          path: 'legal/associations/engaged-in-terrorism',
          data: wrap(application.Legal).EngagedInTerrorism,
        },
      ]
    case 'legal/associations/membership-overthrow':
      return [
        {
          path: 'legal/associations/membership-overthrow',
          data: wrap(application.Legal).MembershipOverthrow,
        },
      ]
    case 'legal/associations/membership-violence-or-force':
      return [
        {
          path: 'legal/associations/membership-violence-or-force',
          data: wrap(application.Legal).MembershipViolence,
        },
      ]
    case 'legal/associations/terrorism-association':
      return [
        {
          path: 'legal/associations/terrorism-association',
          data: wrap(application.Legal).TerrorismAssociation,
        },
      ]
    case 'legal/associations/terrorist-organization':
      return [
        {
          path: 'legal/associations/terrorist-organization',
          data: wrap(application.Legal).TerroristOrganization,
        },
      ]
    case 'legal/court':
      return [
        {
          path: 'legal/court',
          data: wrap(application.Legal).NonCriminalCourtActions,
        },
      ]
    case 'legal/investigations/debarred':
      return [
        {
          path: 'legal/investigations/debarred',
          data: wrap(application.Legal).Debarred,
        },
      ]
    case 'legal/investigations/history':
      return [
        {
          path: 'legal/investigations/history',
          data: wrap(application.Legal).History,
        },
      ]
    case 'legal/investigations/revoked':
      return [
        {
          path: 'legal/investigations/revoked',
          data: wrap(application.Legal).Revoked,
        },
      ]
    case 'legal/police/additionaloffenses':
      return [
        {
          path: 'legal/police/additionaloffenses',
          data: wrap(application.Legal).PoliceOtherOffenses,
        },
      ]
    case 'legal/police/domesticviolence':
      return [
        {
          path: 'legal/police/domesticviolence',
          data: wrap(application.Legal).PoliceDomesticViolence,
        },
      ]
    case 'legal/police/offenses':
      return [
        {
          path: 'legal/police/offenses',
          data: wrap(application.Legal).PoliceOffenses,
        },
      ]
    case 'legal/technology/manipulating':
      return [
        {
          path: 'legal/technology/manipulating',
          data: wrap(application.Legal).Manipulating,
        },
      ]
    case 'legal/technology/unauthorized':
      return [
        {
          path: 'legal/technology/unauthorized',
          data: wrap(application.Legal).Unauthorized,
        },
      ]
    case 'legal/technology/unlawful':
      return [
        {
          path: 'legal/technology/unlawful',
          data: wrap(application.Legal).Unlawful,
        },
      ]
    case 'legal/police/intro':
      return getLegalPoliceSubsections(application)
    case 'legal/intro':
    case 'legal/review':
      return getSubsections('legal', application)

    case 'psychological/competence':
      return [
        {
          path: 'psychological/competence',
          data: wrap(application.Psychological).Competence,
        },
      ]
    case 'psychological/conditions':
      return [
        {
          path: 'psychological/conditions',
          data: wrap(application.Psychological).ExistingConditions,
        },
      ]
    case 'psychological/consultations':
      return [
        {
          path: 'psychological/consultations',
          data: wrap(application.Psychological).Consultations,
        },
      ]
    case 'psychological/diagnoses':
      return [
        {
          path: 'psychological/diagnoses',
          data: wrap(application.Psychological).Diagnoses,
        },
      ]
    case 'psychological/hospitalizations':
      return [
        {
          path: 'psychological/hospitalizations',
          data: wrap(application.Psychological).Hospitalizations,
        },
      ]
    case 'psychological/intro':
    case 'psychological/review':
      return getSubsections('psychological', application)

    case 'package/comments':
      return [
        {
          path: 'package/comments',
          data: wrap(application.Package).Comments,
        },
      ]

    case 'submission/releases':
      return [
        {
          path: 'submission/releases',
          data: wrap(application.Submission).Releases,
        },
      ]
    default:
      return []
  }
}

export default sectionData