471 lines
5.7 KiB
Markdown
471 lines
5.7 KiB
Markdown
# Task D.5.5.1: Force Rename Enquiry Domain to Opportunity
|
||
|
||
## Status
|
||
|
||
Breaking Change (Development Only)
|
||
|
||
## Objective
|
||
|
||
Perform a full domain rename from **Enquiry** to **Opportunity** across the CRM codebase.
|
||
|
||
This task intentionally introduces breaking changes and requires a full database reset.
|
||
|
||
The goal is to eliminate future ambiguity between:
|
||
|
||
```txt
|
||
Sales Opportunity
|
||
```
|
||
|
||
and the future business document:
|
||
|
||
```txt
|
||
Sales Enquiry
|
||
```
|
||
|
||
After this task:
|
||
|
||
```txt
|
||
Lead
|
||
↓
|
||
Opportunity
|
||
↓
|
||
Quotation
|
||
```
|
||
|
||
becomes the official CRM domain model.
|
||
|
||
---
|
||
|
||
# Preconditions
|
||
|
||
This task assumes:
|
||
|
||
* Development environment only
|
||
* Existing data may be discarded
|
||
* Database will be dropped
|
||
* Migration history may be regenerated
|
||
* Seed data will be recreated
|
||
|
||
No production migration compatibility is required.
|
||
|
||
---
|
||
|
||
# Mandatory Review
|
||
|
||
Review:
|
||
|
||
* AGENTS.md
|
||
* Project Foundations Registry
|
||
* Task Catalog
|
||
* ADR-0018 Lead / Enquiry Domain Separation
|
||
* Task D.5.1 – D.5.5
|
||
* CRM Authorization Boundaries
|
||
* Database schema
|
||
* Navigation configuration
|
||
* Route structure
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.1 Database Rename
|
||
|
||
Rename tables:
|
||
|
||
```txt
|
||
crm_enquiries
|
||
→ crm_opportunities
|
||
|
||
crm_enquiry_followups
|
||
→ crm_opportunity_followups
|
||
|
||
crm_enquiry_customers
|
||
→ crm_opportunity_customers
|
||
```
|
||
|
||
Rename foreign keys accordingly.
|
||
|
||
Rename indexes and constraints to use the new naming convention.
|
||
|
||
Keep:
|
||
|
||
```txt
|
||
crm_leads
|
||
crm_quotations
|
||
```
|
||
|
||
unchanged.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.2 Schema Refactor
|
||
|
||
Update:
|
||
|
||
```txt
|
||
src/db/schema.ts
|
||
```
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
enquiries
|
||
→ opportunities
|
||
```
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
enquiryRelations
|
||
→ opportunityRelations
|
||
```
|
||
|
||
Rename every Drizzle export to Opportunity terminology.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.3 Domain Refactor
|
||
|
||
Rename feature module:
|
||
|
||
```txt
|
||
src/features/crm/enquiries
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
src/features/crm/opportunities
|
||
```
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
service.ts
|
||
types.ts
|
||
schemas
|
||
components
|
||
hooks
|
||
queries
|
||
mutations
|
||
```
|
||
|
||
to Opportunity terminology.
|
||
|
||
No legacy aliases remain.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.4 API Refactor
|
||
|
||
Replace:
|
||
|
||
```txt
|
||
/api/crm/enquiries
|
||
```
|
||
|
||
with
|
||
|
||
```txt
|
||
/api/crm/opportunities
|
||
```
|
||
|
||
Routes:
|
||
|
||
```txt
|
||
GET
|
||
POST
|
||
PATCH
|
||
DELETE
|
||
followups
|
||
assign
|
||
```
|
||
|
||
must all use Opportunity.
|
||
|
||
Do not leave compatibility aliases.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.5 App Route Refactor
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
/ dashboard / crm / enquiries
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
/ dashboard / crm / opportunities
|
||
```
|
||
|
||
Update navigation accordingly.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.6 Type Refactor
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
EnquirySummary
|
||
→ OpportunitySummary
|
||
|
||
EnquiryDetail
|
||
→ OpportunityDetail
|
||
|
||
CreateEnquiryInput
|
||
→ CreateOpportunityInput
|
||
|
||
UpdateEnquiryInput
|
||
→ UpdateOpportunityInput
|
||
```
|
||
|
||
Apply consistently across server and client.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.7 Permission Refactor
|
||
|
||
Rename permissions:
|
||
|
||
```txt
|
||
crm.enquiry.read
|
||
crm.enquiry.create
|
||
crm.enquiry.update
|
||
crm.enquiry.delete
|
||
crm.enquiry.assign
|
||
crm.enquiry.followup.*
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
crm.opportunity.read
|
||
crm.opportunity.create
|
||
crm.opportunity.update
|
||
crm.opportunity.delete
|
||
crm.opportunity.assign
|
||
crm.opportunity.followup.*
|
||
```
|
||
|
||
Update seed/configuration if permissions are managed in code.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.8 Document Sequence
|
||
|
||
Rename:
|
||
|
||
```txt
|
||
crm_enquiry
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
crm_opportunity
|
||
```
|
||
|
||
Document code format remains unchanged unless business requires a new prefix.
|
||
|
||
Update sequence configuration and seed.
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.9 Audit Refactor
|
||
|
||
Rename audit entity:
|
||
|
||
```txt
|
||
crm_enquiry
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
crm_opportunity
|
||
```
|
||
|
||
Rename audit actions:
|
||
|
||
```txt
|
||
create_enquiry
|
||
update_enquiry
|
||
delete_enquiry
|
||
assign_enquiry
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
create_opportunity
|
||
update_opportunity
|
||
delete_opportunity
|
||
assign_opportunity
|
||
```
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.10 UI Refactor
|
||
|
||
Rename all user-facing wording:
|
||
|
||
```txt
|
||
Enquiry
|
||
```
|
||
|
||
to
|
||
|
||
```txt
|
||
Opportunity
|
||
```
|
||
|
||
except historical documentation.
|
||
|
||
Update:
|
||
|
||
* page titles
|
||
* dialogs
|
||
* breadcrumbs
|
||
* badges
|
||
* table headers
|
||
* empty states
|
||
* permission messages
|
||
|
||
---
|
||
|
||
# Scope D5.5.1.11 Documentation
|
||
|
||
Update:
|
||
|
||
* ADR references
|
||
* task documentation
|
||
* architecture diagrams
|
||
* implementation notes
|
||
|
||
Replace "Enquiry" with "Opportunity" where referring to the sales execution domain.
|
||
|
||
Keep historical notes where necessary.
|
||
|
||
---
|
||
|
||
# Database Reset
|
||
|
||
This task requires:
|
||
|
||
```txt
|
||
Drop Database Schema
|
||
|
||
Run Fresh Migration
|
||
|
||
Run Seed
|
||
```
|
||
|
||
Old migration history does not need compatibility.
|
||
|
||
---
|
||
|
||
# Deliverables
|
||
|
||
Updated:
|
||
|
||
```txt
|
||
src/db/schema.ts
|
||
|
||
src/features/crm/opportunities/**
|
||
|
||
src/app/api/crm/opportunities/**
|
||
|
||
src/app/dashboard/crm/opportunities/**
|
||
```
|
||
|
||
Updated documentation:
|
||
|
||
```txt
|
||
ADR
|
||
Task documents
|
||
Architecture documents
|
||
```
|
||
|
||
---
|
||
|
||
# Explicit Non-Scope
|
||
|
||
Do not:
|
||
|
||
* change Lead domain
|
||
* change Quotation domain
|
||
* change Approval workflow
|
||
* change Dashboard
|
||
* change Reports
|
||
* implement Won/Lost lifecycle
|
||
* introduce Sales Enquiry document
|
||
|
||
Those belong to later tasks.
|
||
|
||
---
|
||
|
||
# Verification
|
||
|
||
Run:
|
||
|
||
```txt
|
||
npm exec tsc --noEmit
|
||
npm run lint
|
||
npm run build
|
||
```
|
||
|
||
Verify:
|
||
|
||
```txt
|
||
Opportunity CRUD
|
||
Opportunity Assignment
|
||
Lead → Opportunity
|
||
Opportunity → Quotation
|
||
Follow-up
|
||
Permissions
|
||
Navigation
|
||
Document Sequence
|
||
Audit Logging
|
||
```
|
||
|
||
Verify no remaining references:
|
||
|
||
```txt
|
||
crm_enquiries
|
||
/api/crm/enquiries
|
||
features/crm/enquiries
|
||
EnquiryDetail
|
||
EnquirySummary
|
||
crm.enquiry.*
|
||
```
|
||
|
||
except historical documentation.
|
||
|
||
---
|
||
|
||
# Definition of Done
|
||
|
||
Task is complete when:
|
||
|
||
* Opportunity becomes the official CRM sales domain
|
||
* Database uses `crm_opportunities`
|
||
* API uses `/api/crm/opportunities`
|
||
* Feature module uses `opportunities`
|
||
* UI uses Opportunity terminology
|
||
* Permission namespace uses `crm.opportunity.*`
|
||
* Audit uses Opportunity terminology
|
||
* Fresh migration and seed complete successfully
|
||
* No active application code depends on the old Enquiry domain
|
||
|
||
Result:
|
||
|
||
```txt
|
||
Lead Domain = Established
|
||
Opportunity Domain = Established
|
||
Quotation Domain = Unchanged
|
||
|
||
Ready for D.5.6 Opportunity Lifecycle
|
||
```
|