Implement sales tenant pipeline events

This commit is contained in:
Magzhan Zhumabayev
2026-05-10 18:24:06 +05:00
parent 24ccdb3e73
commit 866d96e560
30 changed files with 24412 additions and 281 deletions
+80 -3
View File
@@ -40,6 +40,74 @@ SalesPaymentStatus = Literal["pending", "success", "failed", "canceled", "partia
SalesEscalationSeverity = Literal["low", "medium", "high", "critical"]
SalesEscalationStatus = Literal["open", "in_progress", "resolved"]
SalesAutomationStatus = Literal["pending", "running", "completed", "failed", "canceled"]
SalesPipelineStageCategory = Literal["entry", "communication", "commercial", "paperwork", "finance", "closing"]
class SalesStageRefOut(BaseModel):
id: str
code: str
name: str
category: SalesPipelineStageCategory
sort_order: int
class SalesPipelineOut(BaseModel):
pipeline_id: str
tenant_id: str
code: str
name: str
description: str | None = None
is_default: bool
is_active: bool
created_at: str
updated_at: str
class SalesPipelineCreate(BaseModel):
code: str = Field(default="default_sales", min_length=2)
name: str = Field(min_length=2)
description: str | None = None
is_default: bool = False
is_active: bool = True
class SalesPipelineUpdate(BaseModel):
name: str | None = Field(default=None, min_length=2)
description: str | None = None
is_default: bool | None = None
is_active: bool | None = None
class SalesPipelineStageOut(BaseModel):
stage_id: str
tenant_id: str
pipeline_id: str
code: str
name: str
category: SalesPipelineStageCategory
sort_order: int
is_terminal: bool
is_system: bool
is_active: bool
created_at: str
updated_at: str
class SalesPipelineStageCreate(BaseModel):
code: str = Field(min_length=2)
name: str = Field(min_length=2)
category: SalesPipelineStageCategory
sort_order: int = 0
is_terminal: bool = False
is_system: bool = False
is_active: bool = True
class SalesPipelineStageUpdate(BaseModel):
name: str | None = Field(default=None, min_length=2)
category: SalesPipelineStageCategory | None = None
sort_order: int | None = None
is_active: bool | None = None
class SalesLeadCreate(BaseModel):
@@ -117,7 +185,8 @@ class SalesLeadOut(BaseModel):
class SalesDealCreate(BaseModel):
lead_id: str | None = None
customer_id: str | None = None
stage_id: str = "new_qualified_lead"
stage_id: str | None = Field(default=None, min_length=2)
stage_code: str | None = Field(default=None, min_length=2)
scenario_type: SalesScenarioType = "quick_sale"
priority: int = Field(default=3, ge=1, le=5)
title: str = Field(min_length=3)
@@ -151,7 +220,8 @@ class SalesDealUpdate(BaseModel):
class SalesDealStageChangeIn(BaseModel):
stage_id: str = Field(min_length=2)
stage_id: str | None = Field(default=None, min_length=2)
stage_code: str | None = Field(default=None, min_length=2)
reason: str | None = None
@@ -175,8 +245,10 @@ class SalesDealOut(BaseModel):
tenant_id: str
lead_id: str | None = None
customer_id: str | None = None
pipeline_id: str = "sales_default"
pipeline_id: str
stage_id: str
pipeline: SalesPipelineOut | None = None
stage: SalesStageRefOut | None = None
scenario_type: SalesScenarioType
priority: int
title: str
@@ -578,6 +650,8 @@ class SalesStageHistoryOut(BaseModel):
deal_id: str
from_stage_id: str | None = None
to_stage_id: str
from_stage: SalesStageRefOut | None = None
to_stage: SalesStageRefOut | None = None
changed_by_type: str
changed_by_id: str | None = None
reason: str | None = None
@@ -605,6 +679,8 @@ class SalesTimelineEventOut(BaseModel):
class SalesWorkspaceOut(BaseModel):
lead: SalesLeadOut | None = None
deal: SalesDealOut
pipeline: SalesPipelineOut | None = None
stage: SalesStageRefOut | None = None
communications: list[SalesCommunicationOut] = Field(default_factory=list)
messages: list[SalesMessageOut] = Field(default_factory=list)
calls: list[SalesCallOut] = Field(default_factory=list)
@@ -624,6 +700,7 @@ class SalesWorkspaceOut(BaseModel):
class SalesDashboardStageOut(BaseModel):
stage_id: str
label: str
stage: SalesStageRefOut | None = None
count: int = 0
amount: float = 0.0