Plan Facts Parsing Analysis · v1
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.
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.
| Variable | Quote field | Plan Facts source | Status |
|---|---|---|---|
| Benefit percentage paid | ltDisabilityBenefitSchedule-N | Benefit Schedule.[Class].Benefit Amount | Canonical |
| Maximum monthly benefit | ltDisabilityMaximumMonthlyBenefit-N | Benefit Schedule.[Class].Benefit Maximum | Canonical |
| Tax treatment | ltDisabilityTaxFreeBenefitGrossup-N | Contributions.[Class].Tax Treatment | Canonical |
| Minimum monthly benefit | ltDisabilityMinimumMonthlyBenefit-N | Benefit Schedule.[Class].Benefit Minimum | Verify |
| Own Occupation period (months) | ltDisabilityOwnOccupation-N | Definition of Disability.[Class].Own Occupation Period | Verify |
| Own Occupation descriptor | ltDisabilityOwnOccupationSelect-N | same source | Verify |
Loop: PlanfactService.php:3482–3577.
All Plan Facts fields the LT parser captures (per-class above; rest are plan-level via class 1).
| Plan Facts field | Quote field | Notes |
|---|---|---|
| Plan Name | name | Direct |
| Benefit Schedule.[Class].Elimination Period | ltDisabilityEliminationPeriod | Plan-level |
| Benefit Schedule.[Class].Benefit Duration Period | ltDisabilityBenefitDuration | Plan-level enum (ADEA I/II, SSNRA, 2/5 yr, Other) |
| Benefit Schedule.[Class].Earnings Definition | ltDisabilityEarningsDefinition | Plan-level |
| Benefit Schedule.[Class].Guarantee Issue Amount | ltDisabilityGuaranteeIssue | Plan-level |
| Definition of Disability.[Class].Definition of Disability | see issue below ⚠ | Possibly written to ST field |
| Definition of Disability.[Class].Earnings Test (Own Occ) | ltDisabilityEarningsTestOwnOccupation | Plan-level |
| Definition of Disability.[Class].Earnings Test (Any Occ) | ltDisabilityEarningsTestAnyOccupation | Plan-level |
| Contributions.[Class].Contribution Type | contributionVoluntary | Plan-level enum (shared with other plan types) |
| Contributions.[Class].Tax Treatment | ltDisabilityTaxFreeBenefitGrossup-N | Per-class |
| Participation.[Class].Minimum Enrolled Lives | ltDisabilityParticipationRequirementsLives | Plan-level |
| Participation.[Class].Minimum Participation % | ltDisabilityParticipationRequirementsPercentage | Plan-level |
| Pre-existing Conditions.[Class].Look-back / Exclusion | ltDisabilityPreExistingLimitationsMonthsLookback / …Exclusion | Plan-level |
| Pre-existing Conditions.[Class].Prudent Person Language | ltDisabilityPrudentPersonLanguage | Plan-level enum |
| Other Limitations.[Class].Mental/Nervous Duration / Type | ltDisabilityMentalNervous / …PerOccLifetime | Plan-level |
| Other Limitations.[Class].Drug/Alcohol Duration / Type | ltDisabilityAlcoholDrug / …PerOccLifetime | Plan-level |
| Other Limitations.[Class].Self-reported Duration | ltDisabilitySelfReported | Plan-level |
| Return to Work Incentive.[Class].Amount + Duration | ltDisabilityReturnToWorkIncentive + …Duration | Plan-level |
| Survivor Benefit.[Class].Amount + Duration | ltDisabilitySurvivorBenefit + …DescriptionMonths | Plan-level |
| Income Protection.[Class].Amount | ltDisabilityIncomeProtection + …UpTo | Plan-level |
| Line of Duty Benefit.[Class].Amount | ltDisabilityLineOfDuty | Plan-level |
| Waiver of Premium | ltDisabilityWaiverOfPremium | Global |
| FICA Match | ltDisabilityFicaMatch | Global |
| W-2 Prep | ltDisabilityW2Prep | Global |
| Rates.[Class].Composite or Step-rates | Y19_Under, Y20_24, … + rateStructure | Plan-level (class 1 rates only) |
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.
Three items worth a verify.
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.
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.
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.
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.
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.
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.
Quote fields the form expects but Plan Facts doesn't return.
app/Console/Commands/QuoteUpdateForLtDisabilityPS3189.php describes the schema migration that introduced the per-class storage shapeOne-line fix if it's not intentional.
Confirm whether Min Monthly Benefit, Own Occupation, and Own Occupation Select are intentionally per-class or should be plan-level. Conversation, not code.
Same as ST — remove Benefit Change and Min Benefit Percentage if confirmed unused.
If Plan Facts returns differing values per class on a plan-level field, surface a small note in the UI. No data-model change.
| File | Lines | Purpose |
|---|---|---|
| app/Services/PlanfactService.php | 185–199, 201 | classes_override; /ltd endpoint |
| app/Services/PlanfactService.php | 453 | parseQuote() dispatch to LT parser |
| app/Services/PlanfactService.php | 3449–3951 | parseQuoteLtDisability() — full parser |
| app/Services/PlanfactService.php | 3482–3577 | Per-class loop (6 fields) |
| app/Services/PlanfactService.php | 3579–3582 | "Use the first class for the rest of the quote" |
| app/Services/PlanfactService.php | 3676 | LT parse — assignment to ST field (verify) |
| app/Http/Controllers/PlanfactsController.php | 165 | Stage parsed result |
| app/Http/Controllers/Rest/App/QuoteController.php | 501 | $model->fill(...) to Quote |