tsk-C
compleate
This commit is contained in:
105
docs/implementation/task-c-customer-contact.md
Normal file
105
docs/implementation/task-c-customer-contact.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Task C: Customer + Contact Production Module
|
||||
|
||||
## 1. Files Added
|
||||
|
||||
- `src/app/api/crm/customers/route.ts`
|
||||
- `src/app/api/crm/customers/[id]/route.ts`
|
||||
- `src/app/api/crm/customers/[id]/contacts/route.ts`
|
||||
- `src/app/api/crm/customers/[id]/contacts/[contactId]/route.ts`
|
||||
- `src/features/crm/customers/api/types.ts`
|
||||
- `src/features/crm/customers/api/service.ts`
|
||||
- `src/features/crm/customers/api/queries.ts`
|
||||
- `src/features/crm/customers/api/mutations.ts`
|
||||
- `src/features/crm/customers/schemas/customer.schema.ts`
|
||||
- `src/features/crm/customers/server/service.ts`
|
||||
- `src/features/crm/customers/components/customer-status-badge.tsx`
|
||||
- `src/features/crm/customers/components/customer-form-sheet.tsx`
|
||||
- `src/features/crm/customers/components/contact-form-sheet.tsx`
|
||||
- `src/features/crm/customers/components/customer-cell-action.tsx`
|
||||
- `src/features/crm/customers/components/customer-columns.tsx`
|
||||
- `src/features/crm/customers/components/customers-table.tsx`
|
||||
- `src/features/crm/customers/components/customer-listing.tsx`
|
||||
- `src/features/crm/customers/components/customer-contacts-tab.tsx`
|
||||
- `src/features/crm/customers/components/customer-detail.tsx`
|
||||
- `drizzle/0002_plain_anthem.sql`
|
||||
- `drizzle/meta/0002_snapshot.json`
|
||||
|
||||
## 2. Files Modified
|
||||
|
||||
- `src/app/dashboard/crm/customers/page.tsx`
|
||||
- `src/app/dashboard/crm/customers/[id]/page.tsx`
|
||||
- `src/db/schema.ts`
|
||||
- `src/db/seeds/foundation.seed.ts`
|
||||
- `src/features/foundation/audit-log/service.ts`
|
||||
- `src/features/foundation/audit-log/types.ts`
|
||||
- `src/lib/auth/rbac.ts`
|
||||
- `src/lib/searchparams.ts`
|
||||
- `drizzle/meta/_journal.json`
|
||||
|
||||
## 3. Schema Added
|
||||
|
||||
- `crm_customers`
|
||||
- organization-scoped customer master with unique `(organization_id, code)`
|
||||
- branch, CRM classification, contact channels, notes, soft-delete, and audit actor columns
|
||||
- `crm_customer_contacts`
|
||||
- organization-scoped child contacts under customer
|
||||
- primary contact flag, soft-delete, and audit actor columns
|
||||
|
||||
## 4. API Routes Added
|
||||
|
||||
- `GET /api/crm/customers`
|
||||
- `POST /api/crm/customers`
|
||||
- `GET /api/crm/customers/[id]`
|
||||
- `PATCH /api/crm/customers/[id]`
|
||||
- `DELETE /api/crm/customers/[id]`
|
||||
- `GET /api/crm/customers/[id]/contacts`
|
||||
- `POST /api/crm/customers/[id]/contacts`
|
||||
- `PATCH /api/crm/customers/[id]/contacts/[contactId]`
|
||||
- `DELETE /api/crm/customers/[id]/contacts/[contactId]`
|
||||
|
||||
## 5. UI Routes Completed
|
||||
|
||||
- `/dashboard/crm/customers`
|
||||
- production list with React Query, nuqs filters, create button, edit/view/delete actions
|
||||
- `/dashboard/crm/customers/[id]`
|
||||
- detail page with Template A style structure
|
||||
- tabs: Overview, Contacts, Activity, Related Documents Placeholder
|
||||
|
||||
## 6. Permissions Used
|
||||
|
||||
- `crm.customer.read`
|
||||
- `crm.customer.create`
|
||||
- `crm.customer.update`
|
||||
- `crm.customer.delete`
|
||||
- `crm.contact.read`
|
||||
- `crm.contact.create`
|
||||
- `crm.contact.update`
|
||||
- `crm.contact.delete`
|
||||
|
||||
Admin defaults now include the CRM customer/contact permissions. Regular users inherit read permissions only unless additional permissions are granted.
|
||||
|
||||
## 7. Audit Integration
|
||||
|
||||
- customer create/update/delete writes to `tr_audit_logs` with `entityType = crm_customer`
|
||||
- contact create/update/delete writes to `tr_audit_logs` with `entityType = crm_customer_contact`
|
||||
- activity tab reads audit log entries for the current customer and resolves actor names from `users`
|
||||
|
||||
## 8. Document Sequence Integration
|
||||
|
||||
- customer create uses `generateNextDocumentCode({ documentType: 'customer' })`
|
||||
- branch-specific sequence is honored when `branchId` is provided
|
||||
- foundation seed now also prepares `crm_customer_group` options for form-driven classification
|
||||
|
||||
## 9. Remaining Risks
|
||||
|
||||
- there are no database foreign keys yet between `crm_customers`, `crm_customer_contacts`, and master option rows; organization filtering is enforced in application code
|
||||
- branch scope currently resolves from seeded `crm_branch` options only; if branch ownership becomes role-sensitive later, `branch-scope` will need stronger membership-aware rules
|
||||
- contact primary uniqueness is enforced in transaction logic, not via a database partial unique index
|
||||
- list/detail UI depends on seeded master options being present for customer status/type/group/channel labels
|
||||
|
||||
## 10. Task D Readiness
|
||||
|
||||
- customer and contact production backbone is ready for enquiry linkage
|
||||
- activity timeline is already in place for future downstream CRM entities
|
||||
- customer detail route now has a stable home for related document tabs
|
||||
- foundation permissions, sequence, branch scope, and audit plumbing are reusable for enquiry and quotation modules
|
||||
Reference in New Issue
Block a user