106 lines
4.4 KiB
Markdown
106 lines
4.4 KiB
Markdown
# 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
|