119 lines
5.3 KiB
Markdown
119 lines
5.3 KiB
Markdown
# Task D: Enquiry Production Module
|
|
|
|
## 1. Files Added
|
|
|
|
- `src/app/api/crm/enquiries/route.ts`
|
|
- `src/app/api/crm/enquiries/[id]/route.ts`
|
|
- `src/app/api/crm/enquiries/[id]/followups/route.ts`
|
|
- `src/app/api/crm/enquiries/[id]/followups/[followupId]/route.ts`
|
|
- `src/features/crm/enquiries/api/types.ts`
|
|
- `src/features/crm/enquiries/api/service.ts`
|
|
- `src/features/crm/enquiries/api/queries.ts`
|
|
- `src/features/crm/enquiries/api/mutations.ts`
|
|
- `src/features/crm/enquiries/schemas/enquiry.schema.ts`
|
|
- `src/features/crm/enquiries/server/service.ts`
|
|
- `src/features/crm/enquiries/components/enquiry-status-badge.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-form-sheet.tsx`
|
|
- `src/features/crm/enquiries/components/followup-form-sheet.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-cell-action.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-columns.tsx`
|
|
- `src/features/crm/enquiries/components/enquiries-table.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-listing.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-followups-tab.tsx`
|
|
- `src/features/crm/enquiries/components/enquiry-detail.tsx`
|
|
- `drizzle/0003_blushing_bruce_banner.sql`
|
|
- `drizzle/meta/0003_snapshot.json`
|
|
|
|
## 2. Files Modified
|
|
|
|
- `src/app/dashboard/crm/enquiries/page.tsx`
|
|
- `src/app/dashboard/crm/enquiries/[id]/page.tsx`
|
|
- `src/app/dashboard/crm/customers/[id]/page.tsx`
|
|
- `src/features/crm/customers/api/types.ts`
|
|
- `src/features/crm/customers/components/customer-detail.tsx`
|
|
- `src/db/schema.ts`
|
|
- `src/db/seeds/foundation.seed.ts`
|
|
- `src/lib/auth/rbac.ts`
|
|
- `src/lib/searchparams.ts`
|
|
- `drizzle/meta/_journal.json`
|
|
|
|
## 3. Schema Added
|
|
|
|
- `crm_enquiries`
|
|
- organization-scoped sales opportunity master
|
|
- customer/contact linkage, project context, pricing expectation, probability, hot-project flag, and soft-delete columns
|
|
- unique `(organization_id, code)` for document-sequenced enquiry codes
|
|
- `crm_enquiry_followups`
|
|
- organization-scoped timeline items under enquiry
|
|
- follow-up type, contact linkage, outcome, next follow-up date, next action, and soft-delete columns
|
|
|
|
## 4. API Routes Added
|
|
|
|
- `GET /api/crm/enquiries`
|
|
- `POST /api/crm/enquiries`
|
|
- `GET /api/crm/enquiries/[id]`
|
|
- `PATCH /api/crm/enquiries/[id]`
|
|
- `DELETE /api/crm/enquiries/[id]`
|
|
- `GET /api/crm/enquiries/[id]/followups`
|
|
- `POST /api/crm/enquiries/[id]/followups`
|
|
- `PATCH /api/crm/enquiries/[id]/followups/[followupId]`
|
|
- `DELETE /api/crm/enquiries/[id]/followups/[followupId]`
|
|
|
|
## 5. UI Routes Completed
|
|
|
|
- `/dashboard/crm/enquiries`
|
|
- production list with React Query, nuqs filters, create button, edit/view/delete actions
|
|
- filters: search, status, product type, priority, branch, customer
|
|
- `/dashboard/crm/enquiries/[id]`
|
|
- detail page with tabs: Overview, Follow-ups, Activity, Related Quotations Placeholder
|
|
- `/dashboard/crm/customers/[id]`
|
|
- related documents tab now shows real linked enquiries for that customer
|
|
|
|
## 6. Permissions Used
|
|
|
|
- `crm.enquiry.read`
|
|
- `crm.enquiry.create`
|
|
- `crm.enquiry.update`
|
|
- `crm.enquiry.delete`
|
|
- `crm.enquiry.followup.read`
|
|
- `crm.enquiry.followup.create`
|
|
- `crm.enquiry.followup.update`
|
|
- `crm.enquiry.followup.delete`
|
|
|
|
Admin defaults now include enquiry and follow-up permissions. Regular users inherit read permissions only unless additional permissions are granted.
|
|
|
|
## 7. Audit Integration
|
|
|
|
- enquiry create/update/delete writes to `tr_audit_logs` with `entityType = crm_enquiry`
|
|
- follow-up create/update/delete writes to `tr_audit_logs` with `entityType = crm_enquiry_followup`
|
|
- enquiry detail activity tab merges enquiry audit and follow-up audit entries, then resolves actor names from `users`
|
|
|
|
## 8. Document Sequence Integration
|
|
|
|
- enquiry create uses `generateNextDocumentCode({ documentType: 'enquiry' })`
|
|
- branch-specific sequence is honored when `branchId` is provided
|
|
- foundation seed now includes `crm_followup_type` options so follow-up forms do not hardcode those values
|
|
|
|
## 9. Customer/Contact Integration
|
|
|
|
- enquiry create/update validates that customer belongs to the active organization
|
|
- enquiry contact must belong to the same organization and selected customer
|
|
- follow-up contact must belong to the same organization and the enquiry's customer
|
|
- enquiry form customer dropdown is sourced from production customer data
|
|
- contact dropdown is filtered by selected customer
|
|
- customer detail route now shows related enquiries in the related-documents tab
|
|
|
|
## 10. Remaining Risks
|
|
|
|
- there are still no database foreign keys between enquiry tables and customer/contact tables; organization scoping is enforced in application logic
|
|
- form date fields currently use `YYYY-MM-DD` text inputs because the project field wrapper does not expose a native date mode
|
|
- customer detail shows linked enquiries, but there is not yet a dedicated customer-side enquiry table with pagination
|
|
- follow-up activity relies on audit payload contents for relation tracing, not a dedicated combined activity view
|
|
|
|
## 11. Task E Readiness
|
|
|
|
- enquiry production backbone is ready for quotation creation and linkage
|
|
- customer, contact, and enquiry lifecycles now share the same foundation patterns: org scope, branch validation, master options, document sequence, and audit logging
|
|
- enquiry detail already has a stable placeholder tab for quotation integration
|
|
- follow-up timeline and customer-related enquiry surfacing are in place for downstream sales workflow expansion
|