Skip to content

sdc-sdapp-w4-welcome-about-license

W4 — Welcome / About / License Information Screens

Section titled “W4 — Welcome / About / License Information Screens”

Roadmap: apps/sd-app/ROADMAP.md → W4 · ADR: apps/sd-app/docs/adr/0005-license-information-surface.md Parent planning thread: sdc-sdapp-full-levpro-port

LevPro had three chrome screens sd-app has no equivalent for: a Welcome/splash (frmSplash.frm, 543 lines, with Welcome.jpg / Welcome-French.jpg), an About box (frmAbout.frm, 340), and License Information (frmLicenseInformation.frm, 312).

Talbot’s own description of the Welcome screen: it initializes settings (language) and displays AppName, Licensee, LicenseExpiry, AppVersion, and a Disclaimer button.

  • Parity target: those three .frm files plus the two Welcome*.jpg images, in D:\FSS\Software\Archive\Leverage Pro\Latest Release\.
  • Acceptance gate: every control and caption in the three forms is accounted for — ported, deliberately dropped (with the reason recorded in ADR-0005), or deferred. A checkable list.
  • Upgrade layer: F.A.S.T. restyle per Core/Processes/Design/Targets/Design-Apps.md — not a literal 2004 splash reproduction.

Resolved up front (ADR-0005) so this doesn’t stall mid-run

Section titled “Resolved up front (ADR-0005) so this doesn’t stall mid-run”

Under Stripe there is no license code and no fixed expiry, so frmLicenseInformation’s four fields don’t map one-to-one:

  • Surface subscription status (active/inactive) and company name.
  • Drop License Code (nothing to show) and Licensed Until (a Stripe period-end date shown as an expiry would state something untrue about when access ends).
  • Company name is a real setting, not a display fieldreports.py prints it in the PDF header (“Prepared by …, ABC Financial Group”, visible in Sample Printout.pdf). It must be editable and persisted, and it belongs alongside W1’s Setup surface rather than in a third settings location.

This was an agent decision made to keep the workstream unblocked. If Talbot wants a visible expiry surface, ADR-0005 changes and so does this screen.

  • Do not write packages/i18n/messages/*.json directly while parallel workstreams run — return EN + FR key/value pairs for the orchestrator to merge. english.txt / french.txt in the archive carry LevPro’s original strings for these screens in both languages.
  • Language initialization on the Welcome screen must not fight the existing /[country]/[lang]/ routing — it selects within it, not around it.
  • Control/caption inventory for the three forms; record dropped items in ADR-0005.
  • Welcome screen (language init, AppName, version, subscription status, disclaimer).
  • About screen.
  • Account/subscription screen replacing License Information; company-name setting persisted and flowing to PDF output.
  • EN + FR strings returned for merge.
  • Full green bar.

Shipped (monorepo 6dc9549, aadfa9a). 54 controls inventoried across the three forms in ADR-0005 — 11 ported, 6 adapted, 29 dropped, 3 deferred, 5 layout-only.

Mid-build correction worth recording: a mandatory Welcome click on every visit regressed Design-Apps.md’s “auto-detect region/language, zero resistance to starting”. Fixed — the root route auto-detects and redirects (with a <meta refresh> no-JS fallback), and Welcome moved to its own route reachable from the nav rather than gating entry.

French provenance verified independently at reconciliation. The shipped english.txt/french.txt are encoded, not readable — the workstream decoded the cipher, and the result was spot-checked against Languages\french-fixed by BMO Translator.doc: the disclaimer, criminal-warning and “Avis de non-responsabilité” strings match near-verbatim. The decode also correctly restores apostrophes the cipher drops (“l’éditeur” where the BMO extract reads “léditeur”). This is LevPro’s real French, recovered — not a fresh translation.

Integration gap found and closed at reconciliation: company-name persistence never reached the PDF (W4 built the storage, W3 the report surface, nothing connected them). Fixed via a shared account_settings.resolve_company_name(), gated by tests asserting the saved name appears in the extracted PDF text. See ADR-0005’s reconciliation section.