All benefits

Plan Facts Parsing Analysis · v1

Long-Term Disability

Same shape as ST: one plan with three canonical per-class variables (benefit %, max benefit, tax treatment). LT also stores three additional per-class fields (Min, Own Occupation × 2) that are worth a domain-model review.

Endpoint
POST /ltd
Parse method
parseQuoteLtDisability()
Source range
PlanfactService.php:3449–3951 (~503 lines)
Source pull
plansight - Bit Bucket Pull 4.26

Bottom line

Implements the domain model — with three LT-specific per-class extras worth confirming.

The LT parser stores 6 per-class fields. Three match the canonical Plansight model (benefit %, max benefit, tax treatment). The other three (Min Monthly Benefit, Own Occupation, Own Occupation Select) are LT-specific and may legitimately vary by class — or may be candidates to move to plan-level for consistency with ST. Worth a short conversation with a senior broker.

Per-class handling

VariableQuote fieldPlan Facts sourceStatus
Benefit percentage paidltDisabilityBenefitSchedule-NBenefit Schedule.[Class].Benefit AmountCanonical
Maximum monthly benefitltDisabilityMaximumMonthlyBenefit-NBenefit Schedule.[Class].Benefit MaximumCanonical
Tax treatmentltDisabilityTaxFreeBenefitGrossup-NContributions.[Class].Tax TreatmentCanonical
Minimum monthly benefitltDisabilityMinimumMonthlyBenefit-NBenefit Schedule.[Class].Benefit MinimumVerify
Own Occupation period (months)ltDisabilityOwnOccupation-NDefinition of Disability.[Class].Own Occupation PeriodVerify
Own Occupation descriptorltDisabilityOwnOccupationSelect-Nsame sourceVerify

Loop: PlanfactService.php:3482–3577.

What's mapped

All Plan Facts fields the LT parser captures (per-class above; rest are plan-level via class 1).

Plan Facts fieldQuote fieldNotes
Plan NamenameDirect
Benefit Schedule.[Class].Elimination PeriodltDisabilityEliminationPeriodPlan-level
Benefit Schedule.[Class].Benefit Duration PeriodltDisabilityBenefitDurationPlan-level enum (ADEA I/II, SSNRA, 2/5 yr, Other)
Benefit Schedule.[Class].Earnings DefinitionltDisabilityEarningsDefinitionPlan-level
Benefit Schedule.[Class].Guarantee Issue AmountltDisabilityGuaranteeIssuePlan-level
Definition of Disability.[Class].Definition of Disabilitysee issue below ⚠Possibly written to ST field
Definition of Disability.[Class].Earnings Test (Own Occ)ltDisabilityEarningsTestOwnOccupationPlan-level
Definition of Disability.[Class].Earnings Test (Any Occ)ltDisabilityEarningsTestAnyOccupationPlan-level
Contributions.[Class].Contribution TypecontributionVoluntaryPlan-level enum (shared with other plan types)
Contributions.[Class].Tax TreatmentltDisabilityTaxFreeBenefitGrossup-NPer-class
Participation.[Class].Minimum Enrolled LivesltDisabilityParticipationRequirementsLivesPlan-level
Participation.[Class].Minimum Participation %ltDisabilityParticipationRequirementsPercentagePlan-level
Pre-existing Conditions.[Class].Look-back / ExclusionltDisabilityPreExistingLimitationsMonthsLookback / …ExclusionPlan-level
Pre-existing Conditions.[Class].Prudent Person LanguageltDisabilityPrudentPersonLanguagePlan-level enum
Other Limitations.[Class].Mental/Nervous Duration / TypeltDisabilityMentalNervous / …PerOccLifetimePlan-level
Other Limitations.[Class].Drug/Alcohol Duration / TypeltDisabilityAlcoholDrug / …PerOccLifetimePlan-level
Other Limitations.[Class].Self-reported DurationltDisabilitySelfReportedPlan-level
Return to Work Incentive.[Class].Amount + DurationltDisabilityReturnToWorkIncentive + …DurationPlan-level
Survivor Benefit.[Class].Amount + DurationltDisabilitySurvivorBenefit + …DescriptionMonthsPlan-level
Income Protection.[Class].AmountltDisabilityIncomeProtection + …UpToPlan-level
Line of Duty Benefit.[Class].AmountltDisabilityLineOfDutyPlan-level
Waiver of PremiumltDisabilityWaiverOfPremiumGlobal
FICA MatchltDisabilityFicaMatchGlobal
W-2 PrepltDisabilityW2PrepGlobal
Rates.[Class].Composite or Step-ratesY19_Under, Y20_24, … + rateStructurePlan-level (class 1 rates only)

Plan-level by design

Plan Facts returns these per-class; Plansight stores them as plan-level.

Same intentional collapse as ST.

Rates, elimination period, benefit duration, participation requirements, pre-existing conditions, return-to-work, survivor benefit, income protection — all stored once per plan. Plan Facts returning per-class variations is information richer than the broker model uses.

Potentially mapped incorrectly

Three items worth a verify.

LT parse writes to an ST field at line 3676 PlanfactService.php:3676

The assignment for "Definition of Disability" inside parseQuoteLtDisability() appears to target stDisabilityDefinitionOfDisability (the ST field) rather than ltDisabilityDefinitionOfDisability. Looks like a copy-paste from the ST parser. May be intentional shared field usage — worth a verify.

Cursor prompt
In app/Services/PlanfactService.php at around line 3676, inside parseQuoteLtDisability(), there's an assignment for "Definition of Disability" that appears to write to stDisabilityDefinitionOfDisability (the ST field) instead of ltDisabilityDefinitionOfDisability (the LT field).

Please:
1. Open that line and confirm the field name being assigned.
2. If it's writing to the ST field, change it to ltDisabilityDefinitionOfDisability.
3. Then grep this file for any other places where the LT parser writes to an stDisability* field, or vice versa, in case there are similar copy-paste artifacts. Report any you find.
Three LT-specific per-class extras worth a domain review PlanfactService.php:3482–3577

The canonical Plansight per-class variables are benefit %, max benefit, and tax treatment (matches ST). LT additionally stores ltDisabilityMinimumMonthlyBenefit-N, ltDisabilityOwnOccupation-N, and ltDisabilityOwnOccupationSelect-N per class. Either (a) these legitimately differ per class for LT and the canonical model has three intentional LT-specific exceptions, or (b) they were carried over from an earlier design and could be moved to plan-level for consistency. A short conversation between the developer and a senior broker resolves it. No code change needed yet.

Cursor prompt (only after design call)
In app/Services/PlanfactService.php between lines 3482 and 3577, inside parseQuoteLtDisability(), there are six fields written per-class:
1. ltDisabilityBenefitSchedule-N
2. ltDisabilityMaximumMonthlyBenefit-N
3. ltDisabilityMinimumMonthlyBenefit-N
4. ltDisabilityTaxFreeBenefitGrossup-N
5. ltDisabilityOwnOccupation-N
6. ltDisabilityOwnOccupationSelect-N

After a domain review, we may want #3, #5, and #6 to be plan-level (single value, not per-class).

If that decision is made, please:
1. Show me the form template that renders these per-class.
2. Show me the parse loop and the assignments for each of the three.
3. Show me a draft change that consolidates #3/#5/#6 into single plan-level fields (e.g., ltDisabilityMinimumMonthlyBenefit, ltDisabilityOwnOccupation, ltDisabilityOwnOccupationSelect — no -N suffix), reading from class 1.
4. Don't change anything yet — show the diff first.
Vestigial Quote form fields (shared with ST) Quote form / parser unaffected

The Quote form has Benefit Change (Decrease / No Decrease) and Min Benefit Percentage as per-class inputs in the disability quote workflow. Steve confirmed these are effectively unused. Candidates for retirement.

Cursor prompt
I'd like to remove two unused per-class fields from the Long-Term Disability Quote form (and the ST form too):
- "Benefit Change" (Decrease / No Decrease)
- "Min Benefit Percentage"

Please:
1. Find the Blade template (or Vue/JS component) that renders the LT and ST Disability quote per-class inputs.
2. Find the Quote model field definitions for ltDisabilityBenefitChange-N, ltDisabilityMinBenefitPercentage-N (and ST equivalents).
3. Show me what removing them would touch — form template, validation, parser logic, any Excel export, any presentation rendering — before making changes. Just produce the list.

Manual-entry-only fields

Quote fields the form expects but Plan Facts doesn't return.

Recommendations

  1. Verify line 3676 cross-write 5 minutes

    One-line fix if it's not intentional.

  2. Resolve the three LT extras question Quick review

    Confirm whether Min Monthly Benefit, Own Occupation, and Own Occupation Select are intentionally per-class or should be plan-level. Conversation, not code.

  3. Decide on the vestigial form fields Product call

    Same as ST — remove Benefit Change and Min Benefit Percentage if confirmed unused.

  4. Optional: UI note for class-2+ differences on plan-level fields Small

    If Plan Facts returns differing values per class on a plan-level field, surface a small note in the UI. No data-model change.

Code references

FileLinesPurpose
app/Services/PlanfactService.php185–199, 201classes_override; /ltd endpoint
app/Services/PlanfactService.php453parseQuote() dispatch to LT parser
app/Services/PlanfactService.php3449–3951parseQuoteLtDisability() — full parser
app/Services/PlanfactService.php3482–3577Per-class loop (6 fields)
app/Services/PlanfactService.php3579–3582"Use the first class for the rest of the quote"
app/Services/PlanfactService.php3676LT parse — assignment to ST field (verify)
app/Http/Controllers/PlanfactsController.php165Stage parsed result
app/Http/Controllers/Rest/App/QuoteController.php501$model->fill(...) to Quote