Coverage for modules\crm\schemas.py: 100%
130 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-05 09:25 +0800
1from typing import Optional, List
2from pydantic import BaseModel, ConfigDict, EmailStr
3from uuid import UUID
4from datetime import datetime, date
5from decimal import Decimal
7class CompanyIn(BaseModel):
8 name: str
9 domain: Optional[str] = None
10 industry: Optional[str] = None
11 phone: Optional[str] = None
12 email: Optional[EmailStr] = None
13 address: Optional[str] = None
14 city: Optional[str] = None
15 country: Optional[str] = None
16 annual_revenue: Optional[Decimal] = Decimal('0.00')
17 employees_count: Optional[int] = 0
19class CompanyOut(BaseModel):
20 id: UUID
21 name: str
22 domain: Optional[str] = None
23 industry: Optional[str] = None
24 phone: Optional[str] = None
25 email: Optional[str] = None
26 address: Optional[str] = None
27 city: Optional[str] = None
28 country: Optional[str] = None
29 annual_revenue: Decimal
30 employees_count: int
31 created_at: datetime
32 updated_at: datetime
34 model_config = ConfigDict(from_attributes=True)
36class ContactIn(BaseModel):
37 first_name: str
38 last_name: Optional[str] = ""
39 email: Optional[EmailStr] = None
40 phone: Optional[str] = None
41 job_title: Optional[str] = None
42 company_id: Optional[UUID] = None
43 is_primary: bool = False
44 avatar_url: Optional[str] = None
46class ContactOut(BaseModel):
47 id: UUID
48 first_name: str
49 last_name: str
50 full_name: str
51 email: Optional[str] = None
52 phone: Optional[str] = None
53 job_title: Optional[str] = None
54 company_id: Optional[UUID] = None
55 company_name: Optional[str] = None
56 is_primary: bool
57 avatar_url: Optional[str] = None
58 created_at: datetime
59 updated_at: datetime
61 model_config = ConfigDict(from_attributes=True)
63class DealStageOut(BaseModel):
64 id: UUID
65 name: str
66 order: int
67 probability: int
68 color: str
70 model_config = ConfigDict(from_attributes=True)
72class PipelineOut(BaseModel):
73 id: UUID
74 name: str
75 is_default: bool
76 stages: List[DealStageOut]
78 model_config = ConfigDict(from_attributes=True)
80class DealIn(BaseModel):
81 title: str
82 value: Decimal
83 currency: Optional[str] = 'PHP'
84 pipeline_id: UUID
85 stage_id: UUID
86 contact_id: Optional[UUID] = None
87 company_id: Optional[UUID] = None
88 expected_close_date: Optional[date] = None
89 assigned_to_id: Optional[UUID] = None
91class DealUpdateIn(BaseModel):
92 title: Optional[str] = None
93 value: Optional[Decimal] = None
94 status: Optional[str] = None
95 stage_id: Optional[UUID] = None
96 contact_id: Optional[UUID] = None
97 company_id: Optional[UUID] = None
98 expected_close_date: Optional[date] = None
99 assigned_to_id: Optional[UUID] = None
101class DealOut(BaseModel):
102 id: UUID
103 title: str
104 value: Decimal
105 currency: str
106 status: str
107 pipeline_id: UUID
108 stage_id: UUID
109 stage_name: Optional[str] = None
110 contact_id: Optional[UUID] = None
111 contact_name: Optional[str] = None
112 company_id: Optional[UUID] = None
113 company_name: Optional[str] = None
114 expected_close_date: Optional[date] = None
115 closed_at: Optional[datetime] = None
116 assigned_to_id: Optional[UUID] = None
117 assigned_to_name: Optional[str] = None
118 created_at: datetime
119 updated_at: datetime
121 model_config = ConfigDict(from_attributes=True)
123class ActivityIn(BaseModel):
124 target_type: str # CONTACT, COMPANY, DEAL
125 target_id: UUID
126 activity_type: str # CALL, EMAIL, MEETING, TASK, NOTE
127 subject: str
128 body: Optional[str] = None
129 due_date: Optional[datetime] = None
130 assigned_to_id: Optional[UUID] = None
132class ActivityOut(BaseModel):
133 id: UUID
134 target_type: str
135 target_id: UUID
136 activity_type: str
137 subject: str
138 body: Optional[str] = None
139 due_date: Optional[datetime] = None
140 completed_at: Optional[datetime] = None
141 assigned_to_id: Optional[UUID] = None
142 assigned_to_name: Optional[str] = None
143 created_by_id: UUID
144 created_by_name: str
145 created_at: datetime
147 model_config = ConfigDict(from_attributes=True)