Files
alla-allaos-fullstack/docs/implementation/task-c-customer-contact.md
phaichayon 8148850fda tsk-C
compleate
2026-06-15 13:20:39 +07:00

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