Repository navigation
[Clients]: Epic — Module Clients #14
Copy link
Copy link
Labels
refinedRefined with SMART plan / test suggestionsRefined with SMART plan / test suggestions
Milestone
Description
Epic — Clients Module
Manages the company's book of clients ("Relations" in the data model) — businesses, freelancers, and prospects — along with their contacts, addresses, and communication history.
Models
Relation (table: relations), Contact, Address, Communication, ClientCustom (PK: client_custom_id)
What exists
RelationResource,ContactResource✅- Full CRUD tests in
Modules/Clients/Tests/Feature/✅
Planned sub-issues
- [Clients]: Create a quote when viewing a specific client #217 — Create quote from client detail view
- [Clients]: Create an invoice when viewing a specific client #218 — Create invoice from client detail view
- [Clients]: Edit a client from the client detail view #219 — Edit client via header action on detail view
- [Clients]: Hide delete button when client has invoices #220 — Delete button hidden when client has linked invoices
- [Clients]: Client detail — tabs for invoices, quotes, expenses and files #221 — Client detail view with tabs (invoices, quotes, expenses, payments)
- [Clients]: Client list — implement row action options #29 — Quick-action shortcuts from client list (create quote / create invoice)
- [Clients]: :Slim down the Client Form #83 — Slim down the Client Form to required fields only
- [Clients]: Import clients in bulk for data migration #141 — Bulk import clients from CSV
- [Clients]: Missing standard company field and client Id for clients #391 — Standard company field and numeric client ID (closed: already present in v2)
- [Clients]: Per-client currency preference #381 — Per-client currency preference
- [Core]: Add CC email addresses per client for invoice emails #394 — CC email address per client
- [Clients]: Delete and Edit client notes #402 — Delete and edit client notes
- [Clients]: Merge duplicate clients #481 — Merge duplicate clients
- [Clients]: Assign users to clients for access control #482 — Assign users to specific clients for access control
- [Clients]: User Accounts for Customers (Client Portal) #392 — User accounts for customers (Client Portal) (depends on [Clients]: Assign users to clients for access control #482)
Notes
The model is Relation, not Client. Table: relations. The primary contact is resolved via Relation → Contact → Communications.
Metadata
Metadata
Assignees
Labels
refinedRefined with SMART plan / test suggestionsRefined with SMART plan / test suggestions
Activity
[-]Clients[/-][+][Clients] Epic: Module Clients[/+]Fixed Tests for Module Clients refs #14
Module Clients: did some cleanup refs #14
Module Clients: Made the CustomersTest work refs #14
Module Clients: Made the ContactsTest work refs #14
Module Clients: Made the ContactsTest work refs #14
Modules Clients: Made update tests for Clients work refs #14
Modules Clients: Made update tests for Clients work refs #14
Modules Clients: Made update tests for Customers and Contacts work refs
Fix delete tests in Clients module refs #14
20 remaining items
nielsdrost7 commentedon Jul 16, 2026
SMART Plan — Clients module epic status
Specific
Track delivery of the Clients module:
Relation/ContactCRUD (done) plus planned expansions — client-detail workflows, form simplification, bulk import, per-client currency/CC-email, notes management, duplicate merging, and the client portal.Measurable
RelationResource,ContactResourceshipped with CRUD tests inModules/Clients/Tests/Feature/ContactsTest.phpandCustomersTest.php.RelationsTable'sDeleteActionhas no conditional visibility logic today, it's a plain permission check only.ViewRelationpage exists inModules/Clients/Filament/Company/Resources/Relations/Pages/.RelationForm).Modules/Clients.relationstable already has a nullablecurrency_codecolumn (andRelation's docblock lists it), but nothing in invoice creation reads it to default the invoice's currency — the wiring described in [Clients]: Per-client currency preference #381's own SMART plan is still unbuilt.cc_email-type column found onrelations.NotesRelationManagerorRelation::notes()relationship exists in the codebase yet.Modules\Core\Models\Userhas a single directbelongsTo(Relation::class)via a nullablerelation_idcolumn, not arelation_userpivot.Relation::users()is ahasMany, matching the same one-user-per-client-at-most model.Definition of done for this epic: all sub-issues above are closed and
Modules/Clients/Tests/Feature/covers each new capability.Achievable
relation_id-on-usersschema can only represent one client per user, not several, so [Clients]: Assign users to clients for access control #482 needs a real migration decision (add a pivot table, or accept the one-client-per-user limitation) before [Clients]: User Accounts for Customers (Client Portal) #392 can proceed.Relevant
The model is
Relation, notClient(table:relations); it's the anchor entity for Invoices, Quotes, Projects, and Expenses across the app, so client-detail visibility (#221) has outsized leverage relative to its own scope.Time-bound
No fixed date — epic closes when its sub-issues close. Re-review at each sprint boundary.