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

1from typing import Optional, List 

2from pydantic import BaseModel, ConfigDict, EmailStr 

3from uuid import UUID 

4from datetime import datetime, date 

5from decimal import Decimal 

6 

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 

18 

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 

33 

34 model_config = ConfigDict(from_attributes=True) 

35 

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 

45 

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 

60 

61 model_config = ConfigDict(from_attributes=True) 

62 

63class DealStageOut(BaseModel): 

64 id: UUID 

65 name: str 

66 order: int 

67 probability: int 

68 color: str 

69 

70 model_config = ConfigDict(from_attributes=True) 

71 

72class PipelineOut(BaseModel): 

73 id: UUID 

74 name: str 

75 is_default: bool 

76 stages: List[DealStageOut] 

77 

78 model_config = ConfigDict(from_attributes=True) 

79 

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 

90 

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 

100 

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 

120 

121 model_config = ConfigDict(from_attributes=True) 

122 

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 

131 

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 

146 

147 model_config = ConfigDict(from_attributes=True)