src/helpers/validation.js
import { SF86 } from 'constants/formTypes'
import * as sections from 'constants/sections'
import * as formConfig from 'config/forms'
import { validateModel } from 'models/validate'
import {
requireRelationshipMaritalForeignBornDocExpiration,
requireRelationshipMaritalDivorcePhoneNumber,
requireRelationshipRelativesForeignBornDoc,
requireRelationshipRelativesUSResidenceDoc,
requireMultipleCitizenshipRenounced,
requireForeignMilitaryMaintainsContact,
requireForeignCounterIntelligence,
requireForeignExcessiveKnowledge,
requireForeignSensitiveInformation,
requireForeignThreatened,
requireFinancialCardDisciplinaryDate,
requireFinancialDelinquentName,
requireFinancialDelinquentInfraction,
requireDrugWhileSafety,
requireDrugWithClearance,
requireDrugInFuture,
requireAlcoholOrderedCounselingParty,
requireLegalOffenseInvolvements,
requireLegalOffenseSentenced,
requireLegalOffenseIncarcerated,
requireLegalPoliceFirearms,
requireLegalPoliceDrugs,
requireLegalInvestigationClearanceGranted,
} from 'helpers/branches'
// IDENTIFICATION
import identificationName from 'models/sections/identificationName'
import identificationDateOfBirth from 'models/sections/identificationDateOfBirth'
import identificationPlaceOfBirth from 'models/sections/identificationPlaceOfBirth'
import identificationSSN from 'models/sections/identificationSSN'
import identificationOtherNames from 'models/sections/identificationOtherNames'
import identificationContactInfo from 'models/sections/identificationContactInfo'
import identificationPhysical from 'models/sections/identificationPhysical'
// HISTORY
import historyResidence from 'models/sections/historyResidence'
import historyEmployment from 'models/sections/historyEmployment'
import historyEducation from 'models/sections/historyEducation'
import historyFederal from 'models/sections/historyFederalService'
// RELATIONSHIPS
import relationshipsMaritalModel from 'models/sections/relationshipsMarital'
import relationshipsCohabitantsModel from 'models/sections/relationshipsCohabitants'
import relationshipsPeopleModel from 'models/sections/relationshipsPeople'
import relationshipsRelativesModel from 'models/sections/relationshipsRelatives'
// CITIZENSHIP
import usPassport from 'models/usPassport'
import citizenshipStatus from 'models/citizenshipStatus'
import citizenshipMultiple from 'models/sections/citizenshipMultiple'
import citizenshipPassports from 'models/sections/citizenshipPassports'
// MILITARY
import selectiveService from 'models/selectiveService'
import militaryHistory from 'models/militaryHistory'
import militaryDisciplinary from 'models/sections/militaryDisciplinary'
import militaryForeign from 'models/sections/militaryForeign'
// FOREIGN
import foreignContacts from 'models/sections/foreignContacts'
import foreignDirectActivity from 'models/sections/foreignDirectActivity'
import foreignIndirectActivity from 'models/sections/foreignIndirectActivity'
import foreignRealEstateActivity from 'models/sections/foreignRealEstateActivity'
import foreignBenefitActivity from 'models/sections/foreignBenefitActivity'
import foreignSupport from 'models/sections/foreignSupport'
import foreignBusinessAdvice from 'models/sections/foreignBusinessAdvice'
import foreignBusinessFamily from 'models/sections/foreignBusinessFamily'
import foreignBusinessEmployment from 'models/sections/foreignBusinessEmployment'
import foreignBusinessVentures from 'models/sections/foreignBusinessVentures'
import foreignBusinessConferences from 'models/sections/foreignBusinessConferences'
import foreignBusinessContact from 'models/sections/foreignBusinessContact'
import foreignBusinessSponsorship from 'models/sections/foreignBusinessSponsorship'
import foreignBusinessPolitical from 'models/sections/foreignBusinessPolitical'
import foreignBusinessVoting from 'models/sections/foreignBusinessVoting'
import foreignTravel from 'models/sections/foreignTravel'
// FINANCIAL
import financialBankruptcy from 'models/sections/financialBankruptcy'
import financialGambling from 'models/sections/financialGambling'
import financialTaxes from 'models/sections/financialTaxes'
import financialCardAbuse from 'models/sections/financialCardAbuse'
import financialCredit from 'models/sections/financialCredit'
import financialDelinquent from 'models/sections/financialDelinquent'
import financialNonPayment from 'models/sections/financialNonPayment'
// SUBSTANCE
import substanceDrugUsesModel from 'models/sections/substanceDrugUses'
import substanceDrugInvolvementsModel from 'models/sections/substanceDrugInvolvements'
import substanceDrugClearanceUsesModel from 'models/sections/substanceDrugClearanceUses'
import substanceDrugPublicSafetyUsesModel from 'models/sections/substanceDrugPublicSafetyUses'
import substanceDrugPrescriptionUsesModel from 'models/sections/substanceDrugPrescriptionUses'
import substanceDrugOrderedTreatmentsModel from 'models/sections/substanceDrugOrderedTreatments'
import substanceDrugVoluntaryTreatmentsModel from 'models/sections/substanceDrugVoluntaryTreatments'
import substanceAlcoholNegativeImpactsModel from 'models/sections/substanceAlcoholNegativeImpacts'
import substanceAlcoholOrderedCounselingModel from 'models/sections/substanceAlcoholOrderedCounseling'
import substanceAlcoholVoluntaryCounselingModel from 'models/sections/substanceAlcoholVoluntaryCounseling'
import substanceAlcoholReceivedCounselingModel from 'models/sections/substanceAlcoholReceivedCounseling'
// LEGAL
import legalPoliceOffenses from 'models/sections/legalPoliceOffenses'
import legalPoliceOtherOffenses from 'models/sections/legalPoliceOtherOffenses'
import legalDomesticViolence from 'models/sections/legalDomesticViolence'
import legalInvestigationsHistory from 'models/sections/legalInvestigationsHistory'
import legalInvestigationsRevoked from 'models/sections/legalInvestigationsRevoked'
import legalInvestigationsDebarred from 'models/sections/legalInvestigationsDebarred'
import legalNonCriminalCourtActions from 'models/sections/legalNonCriminalCourtActions'
import legalTechnologyUnauthorized from 'models/sections/legalTechnologyUnauthorized'
import legalTechnologyManipulating from 'models/sections/legalTechnologyManipulating'
import legalTechnologyUnlawful from 'models/sections/legalTechnologyUnlawful'
import legalAssociationsTerrorist from 'models/sections/legalAssociationsTerrorist'
import legalAssociationsEngaged from 'models/sections/legalAssociationsEngaged'
import legalAssociationsAdvocating from 'models/sections/legalAssociationsAdvocating'
import legalAssociationsOverthrow from 'models/sections/legalAssociationsOverthrow'
import legalAssociationsViolence from 'models/sections/legalAssociationsViolence'
import legalAssociationsActivities from 'models/sections/legalAssociationsActivities'
import terrorism from 'models/terrorism'
// PSYCHOLOGICAL
import competence from 'models/competence'
import consultation from 'models/consultation'
import hospitalization from 'models/sections/hospitalization'
import diagnoses from 'models/diagnoses'
import existingConditions from 'models/existingConditions'
// PACKAGE
import packageComments from 'models/sections/packageComments'
// Map sections to their validator classes (temporary)
export const getValidatorForSection = (section) => {
switch (section) {
case sections.IDENTIFICATION_NAME:
return identificationName
case sections.IDENTIFICATION_BIRTH_DATE:
return identificationDateOfBirth
case sections.IDENTIFICATION_BIRTH_PLACE:
return identificationPlaceOfBirth
case sections.IDENTIFICATION_SSN:
return identificationSSN
case sections.IDENTIFICATION_OTHER_NAMES:
return identificationOtherNames
case sections.IDENTIFICATION_CONTACTS:
return identificationContactInfo
case sections.IDENTIFICATION_PHYSICAL:
return identificationPhysical
case sections.HISTORY_RESIDENCE:
return historyResidence
case sections.HISTORY_EMPLOYMENT:
return historyEmployment
case sections.HISTORY_EDUCATION:
return historyEducation
case sections.HISTORY_FEDERAL:
return historyFederal
case sections.RELATIONSHIPS_STATUS_MARITAL:
return relationshipsMaritalModel
case sections.RELATIONSHIPS_STATUS_COHABITANTS:
return relationshipsCohabitantsModel
case sections.RELATIONSHIPS_PEOPLE:
return relationshipsPeopleModel
case sections.RELATIONSHIPS_RELATIVES:
return relationshipsRelativesModel
case sections.CITIZENSHIP_US_PASSPORT:
return usPassport
case sections.CITIZENSHIP_STATUS:
return citizenshipStatus
case sections.CITIZENSHIP_MULTIPLE:
return citizenshipMultiple
case sections.CITIZENSHIP_PASSPORTS:
return citizenshipPassports
case sections.MILITARY_SELECTIVE:
return selectiveService
case sections.MILITARY_HISTORY:
return militaryHistory
case sections.MILITARY_DISCIPLINARY:
return militaryDisciplinary
case sections.MILITARY_FOREIGN:
return militaryForeign
case sections.FOREIGN_CONTACTS:
return foreignContacts
case sections.FOREIGN_ACTIVITIES_DIRECT:
return foreignDirectActivity
case sections.FOREIGN_ACTIVITIES_INDIRECT:
return foreignIndirectActivity
case sections.FOREIGN_ACTIVITIES_REAL_ESTATE:
return foreignRealEstateActivity
case sections.FOREIGN_ACTIVITIES_BENEFITS:
return foreignBenefitActivity
case sections.FOREIGN_ACTIVITIES_SUPPORT:
return foreignSupport
case sections.FOREIGN_BUSINESS_ADVICE:
return foreignBusinessAdvice
case sections.FOREIGN_BUSINESS_FAMILY:
return foreignBusinessFamily
case sections.FOREIGN_BUSINESS_EMPLOYMENT:
return foreignBusinessEmployment
case sections.FOREIGN_BUSINESS_VENTURES:
return foreignBusinessVentures
case sections.FOREIGN_BUSINESS_CONFERENCES:
return foreignBusinessConferences
case sections.FOREIGN_BUSINESS_CONTACT:
return foreignBusinessContact
case sections.FOREIGN_BUSINESS_SPONSORSHIP:
return foreignBusinessSponsorship
case sections.FOREIGN_BUSINESS_POLITICAL:
return foreignBusinessPolitical
case sections.FOREIGN_BUSINESS_VOTING:
return foreignBusinessVoting
case sections.FOREIGN_TRAVEL:
return foreignTravel
case sections.FINANCIAL_BANKRUPTCY:
return financialBankruptcy
case sections.FINANCIAL_GAMBLING:
return financialGambling
case sections.FINANCIAL_TAXES:
return financialTaxes
case sections.FINANCIAL_CARD:
return financialCardAbuse
case sections.FINANCIAL_CREDIT:
return financialCredit
case sections.FINANCIAL_DELINQUENT:
return financialDelinquent
case sections.FINANCIAL_NONPAYMENT:
return financialNonPayment
case sections.SUBSTANCE_USE_DRUGS_USAGE:
return substanceDrugUsesModel
case sections.SUBSTANCE_USE_DRUGS_PURCHASE:
return substanceDrugInvolvementsModel
case sections.SUBSTANCE_USE_DRUGS_CLEARANCE:
return substanceDrugClearanceUsesModel
case sections.SUBSTANCE_USE_DRUGS_PUBLIC_SAFETY:
return substanceDrugPublicSafetyUsesModel
case sections.SUBSTANCE_USE_DRUGS_MISUSE:
return substanceDrugPrescriptionUsesModel
case sections.SUBSTANCE_USE_DRUGS_ORDERED:
return substanceDrugOrderedTreatmentsModel
case sections.SUBSTANCE_USE_DRUGS_VOLUNTARY:
return substanceDrugVoluntaryTreatmentsModel
case sections.SUBSTANCE_USE_ALCOHOL_NEGATIVE:
return substanceAlcoholNegativeImpactsModel
case sections.SUBSTANCE_USE_ALCOHOL_ORDERED:
return substanceAlcoholOrderedCounselingModel
case sections.SUBSTANCE_USE_ALCOHOL_VOLUNTARY:
return substanceAlcoholVoluntaryCounselingModel
case sections.SUBSTANCE_USE_ALCOHOL_ADDITIONAL:
return substanceAlcoholReceivedCounselingModel
case sections.LEGAL_POLICE_OFFENSES:
return legalPoliceOffenses
case sections.LEGAL_POLICE_ADDITIONAL_OFFENSES:
return legalPoliceOtherOffenses
case sections.LEGAL_POLICE_DOMESTIC_VIOLENCE:
return legalDomesticViolence
case sections.LEGAL_INVESTIGATIONS_HISTORY:
return legalInvestigationsHistory
case sections.LEGAL_INVESTIGATIONS_REVOKED:
return legalInvestigationsRevoked
case sections.LEGAL_INVESTIGATIONS_DEBARRED:
return legalInvestigationsDebarred
case sections.LEGAL_COURT:
return legalNonCriminalCourtActions
case sections.LEGAL_TECHNOLOGY_UNAUTHORIZED:
return legalTechnologyUnauthorized
case sections.LEGAL_TECHNOLOGY_MANIPULATING:
return legalTechnologyManipulating
case sections.LEGAL_TECHNOLOGY_UNLAWFUL:
return legalTechnologyUnlawful
case sections.LEGAL_ASSOCIATIONS_TERRORIST_ORGANIZATION:
return legalAssociationsTerrorist
case sections.LEGAL_ASSOCIATIONS_ENGAGED_IN_TERRORISM:
return legalAssociationsEngaged
case sections.LEGAL_ASSOCIATIONS_ADVOCATING:
return legalAssociationsAdvocating
case sections.LEGAL_ASSOCIATIONS_MEMBERSHIP_OVERTHROW:
return legalAssociationsOverthrow
case sections.LEGAL_ASSOCIATIONS_MEMBERSHIP_VIOLENCE:
return legalAssociationsViolence
case sections.LEGAL_ASSOCIATIONS_ACTIVITIES_TO_OVERTHROW:
return legalAssociationsActivities
case sections.LEGAL_ASSOCIATIONS_TERRORISM_ASSOCIATION:
return terrorism
case sections.PSYCHOLOGICAL_COMPETENCE:
return competence
case sections.PSYCHOLOGICAL_CONSULTATIONS:
return consultation
case sections.PSYCHOLOGICAL_HOSPITALIZATIONS:
return hospitalization
case sections.PSYCHOLOGICAL_DIAGNOSES:
return diagnoses
case sections.PSYCHOLOGICAL_CONDITIONS:
return existingConditions
case sections.REVIEW_AND_SUBMIT_COMMENTS:
return packageComments
default:
console.warn(`Validator for ${section} section not found`)
return null
}
}
export const getValidationOptionsForForm = (formType, key, options) => {
const validatorOptions = {
requireForeignBornDocExpiration: requireRelationshipMaritalForeignBornDocExpiration(formType),
requireRelationshipMaritalDivorcePhoneNumber:
requireRelationshipMaritalDivorcePhoneNumber(formType),
requireRelationshipRelativesForeignBornDoc:
requireRelationshipRelativesForeignBornDoc(formType),
requireRelationshipRelativesUSResidenceDoc:
requireRelationshipRelativesUSResidenceDoc(formType),
requireForeignBornDocumentation: !options.hasValidUSPassport,
requireCitizenshipRenounced: requireMultipleCitizenshipRenounced(formType),
requireForeignMilitaryMaintainsContact: requireForeignMilitaryMaintainsContact(formType),
requireForeignCounterIntelligence: requireForeignCounterIntelligence(formType),
requireForeignExcessiveKnowledge: requireForeignExcessiveKnowledge(formType),
requireForeignSensitiveInformation: requireForeignSensitiveInformation(formType),
requireForeignThreatened: requireForeignThreatened(formType),
requireFinancialCardDisciplinaryDate: requireFinancialCardDisciplinaryDate(formType),
requireFinancialDelinquentName: requireFinancialDelinquentName(formType),
requireFinancialDelinquentInfraction: requireFinancialDelinquentInfraction(formType),
requireUseWhileEmployed: requireDrugWhileSafety(formType),
requireUseWithClearance: requireDrugWithClearance(formType),
requireUseInFuture: requireDrugInFuture(formType),
requireInvolvementWhileEmployed: requireDrugWhileSafety(formType),
requireInvolvementWithClearance: requireDrugWithClearance(formType),
requireInvolvementInFuture: requireDrugInFuture(formType),
requireAlcoholOrderedCounselingParty: requireAlcoholOrderedCounselingParty(formType),
requireLegalOffenseInvolvements: requireLegalOffenseInvolvements(formType),
requireLegalOffenseSentenced: requireLegalOffenseSentenced(formType),
requireLegalOffenseIncarcerated: requireLegalOffenseIncarcerated(formType),
requireLegalPoliceFirearms: requireLegalPoliceFirearms(formType),
requireLegalPoliceDrugs: requireLegalPoliceDrugs(formType),
requireLegalInvestigationClearanceGranted: requireLegalInvestigationClearanceGranted(formType),
}
if (key === sections.HISTORY_RESIDENCE) {
validatorOptions.requireYears = formConfig[formType].HISTORY_RESIDENCE_YEARS
} else if (key === sections.HISTORY_EMPLOYMENT) {
validatorOptions.requireYears = formConfig[formType].HISTORY_EMPLOYMENT_YEARS
}
return validatorOptions
}
export const validateSection = ({ key = '', data = {}, options = {} }, formType = SF86) => {
const validationModel = getValidatorForSection(key)
const formOptions = getValidationOptionsForForm(formType, key, options)
if (validationModel) {
try {
return validateModel(data, validationModel, { ...formOptions, ...options })
} catch (e) {
console.warn(`Invalid validator for section ${key}`, e)
}
}
return false
}
export const sectionIsValid = (formSections = []) => (
formSections.every((s) => {
if (s.subsections) return sectionIsValid(s.subsections)
return s.isValid === true
})
)
export const sectionIsInvalid = (formSections = []) => (
formSections.some((s) => {
if (s.subsections) return sectionIsInvalid(s.subsections)
return s.isValid === false
})
)