Skip to content

[Settings] Epic: Company Settings #508

Open
21 of 27 issues completed
Open

Description

@nielsdrost7

Parent epic for all company-panel settings: general, amounts, dashboard, invoices (PDF/QR/email/template), quotes (PDF/template), taxes, email, system settings, and admin-panel global settings assignment.

Activity

  1. 22 remaining items

  2. nielsdrost7 commented on Jul 16, 2026

    @nielsdrost7
    CollaboratorAuthor

    SMART Plan — Company Settings epic status

    Context/Epic: Core (Settings)

    This is an epic/tracking issue, not a single feature — it aggregates the sub-issues below. The Measurable section tracks sub-issue completion rather than fabricating tests for the epic itself; each sub-issue gets its own SMART Plan when it's processed individually.

    Specific

    Track delivery of all company-panel settings: general, amounts, dashboard, invoices (PDF/QR/email/template), quotes (PDF/template), taxes, email, system settings, and admin-panel global settings assignment. Current state, and this is the central finding for this whole epic: there is no company-panel settings page at all. The only Settings page in the codebase is Modules\Core\Filament\Admin\Pages\Settings.php, on the admin panel, gated by Permission::MANAGE_SETTINGS. It already has an extensive, well-organized tabbed form covering almost everything this epic describes — General, Amount, Dashboard, Interface, System, Invoices (with PDF/QR/template/email sub-sections), Quotes (with PDF/template sub-sections), Taxes, Email/SMTP, Online Payment (Stripe/PayPal placeholders), Projects, and Updates. But it is not wired to persist anything: mount() seeds $this->settings from hardcoded defaults, and submit() explicitly does nothing beyond re-reading the form state — // Here you would save settings to database or config / For now, just keep them in memory. The underlying Modules\Core\Models\Setting key-value table also has no company_id column at all, so even if submit() were wired up, it would store settings globally across every company, not per-tenant — which conflicts with this epic's premise of "company-panel settings."

    Measurable

    • A company-panel Settings page exists at all (distinct from the admin one) — not started; UserPanelProvider and CompanyPanelProvider have no settings page registered.
    • Settings persist to the database — not started; Settings::submit() on the existing (admin) page is a no-op today.
    • Settings are company-scoped — not started; the settings table has no company_id column, so the current storage mechanism can't support per-company values even once persistence is wired up.
    • General / Amounts / Dashboard / Interface / System tabs — form fields already exist (on the wrong panel, unwired) and can likely be ported largely as-is once the above three are resolved.
    • Invoices (PDF/QR/email/template) tab — form fields already exist (same caveat).
    • Quotes (PDF/template) tab — form fields already exist (same caveat).
    • Taxes tab — form fields already exist (same caveat).
    • Email/SMTP tab — form fields already exist (same caveat).
    • Admin-panel global settings assignment — partially exists in spirit (the admin Settings page itself), but its relationship to per-company settings (which should win, does one override the other) is undefined.

    Definition of done for this epic: a company-panel settings page exists, is company-scoped, actually persists to the database, and each functional area above round-trips correctly with test coverage in Modules/Core/Tests/Feature/.

    Achievable

    1. Decide the storage model first — before porting any of the existing (unwired) form tabs, resolve whether settings gets a company_id column added, or a new company-scoped settings table/model is introduced. This blocks every other item in this epic.
    2. Build a company-panel Settings page under Modules/Core/Filament/Company/Pages/ — the existing admin page's getFormSchema() tab structure is a solid template to copy from, but it needs a real submit() that persists via whatever storage model is chosen in step 1.
    3. Once persistence + company-scoping exist, port the tabs one at a time (General → Amounts → Invoices → Quotes → Taxes → Email), since they're already fully designed forms just sitting on the wrong panel.
    4. Decide the relationship between the admin-panel Settings page (global) and the new company-panel one (per-tenant) — e.g. do company settings override global defaults, or are they entirely separate.
    5. Tests in Modules/Core/Tests/Feature/ for persistence, company scoping, and each tab's round-trip.

    Relevant

    Every sub-issue in this epic is currently blocked on the same two facts: no company-panel settings page exists, and the one settings page that does exist doesn't save anything. Fixing the storage/persistence question once unblocks the entire epic at once rather than piecemeal.

    Time-bound

    No fixed date — epic closes when its sub-issues close. Re-review at each sprint boundary. Recommend treating "company-scoped, persisting settings page" as its own Sprint 6 spike before scheduling the individual tabs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    epicrefinedRefined with SMART plan / test suggestions

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions