66 lines
2.3 KiB
Markdown
66 lines
2.3 KiB
Markdown
# Task D.5.7 Opportunity / Quotation Synchronization Foundation
|
|
|
|
## Summary
|
|
|
|
- Reused `opportunityId` as the active quotation link field.
|
|
- Added service-side synchronization foundations instead of embedding sync logic in routes.
|
|
- Kept `Opportunity` as sales pipeline source of truth.
|
|
- Kept `Quotation` as commercial document source of truth.
|
|
|
|
## New Service Foundations
|
|
|
|
- `src/features/crm/opportunities/server/quotation-sync.service.ts`
|
|
- `syncOpportunityFromQuotationCreated()`
|
|
- `syncOpportunityFromQuotationApproval()`
|
|
- `syncOpportunityFromQuotationWon()`
|
|
- `syncOpportunityFromQuotationLost()`
|
|
- `src/features/crm/quotations/server/opportunity-link.service.ts`
|
|
- `assertOpportunityLinkIntegrity()`
|
|
- `assertRevisionOpportunityLinkIntegrity()`
|
|
- `auditQuotationOpportunityLink()`
|
|
|
|
## Sync Trigger Map
|
|
|
|
- Quotation created
|
|
- Opportunity stage moves to `quotation_created`
|
|
- Outcome stays `open`
|
|
- Quotation pending approval
|
|
- Opportunity stage stays `quotation_created`
|
|
- Quotation approved
|
|
- Opportunity stage moves to `negotiation`
|
|
- Quotation sent to customer
|
|
- Opportunity stage can move to `negotiation`
|
|
- Quotation won
|
|
- Opportunity stage becomes `closed`
|
|
- Opportunity outcome becomes `won`
|
|
- Quotation lost
|
|
- Opportunity closes as `lost` only when no other viable quotation remains
|
|
|
|
## Guard Rules
|
|
|
|
- Quotation cannot link to an opportunity outside the same organization.
|
|
- Closed opportunities cannot create new quotations.
|
|
- Quotation customer must match linked opportunity customer.
|
|
- Quotation product type must match linked opportunity product type.
|
|
- Revisions keep the same `opportunityId`.
|
|
|
|
## Audit Actions
|
|
|
|
- `sync_opportunity_from_quotation_created`
|
|
- `sync_opportunity_from_quotation_approved`
|
|
- `sync_opportunity_from_quotation_sent`
|
|
- `sync_opportunity_from_quotation_won`
|
|
- `sync_opportunity_from_quotation_lost`
|
|
- `sync_quotation_opportunity_link`
|
|
|
|
## Current UI Integration
|
|
|
|
- Opportunity detail now shows richer linked quotation context.
|
|
- Quotation detail linkage foundation remains ready for follow-up UI expansion.
|
|
|
|
## Known Limitations
|
|
|
|
- Manual quotation accept / reject operations are not fully exposed in UI yet.
|
|
- Opportunity detail shows linked quotations, but full quotation outcome highlighting can still be expanded.
|
|
- Quotation detail linked opportunity card can be extended further in a follow-up pass.
|