Coverage for modules\hr\schemas.py: 100%

91 statements  

« prev     ^ index     » next       coverage.py v7.16.0, created at 2026-09-06 17:01 +0800

1from datetime import date, datetime 

2from decimal import Decimal 

3from typing import List, Optional 

4from uuid import UUID 

5from pydantic import BaseModel, Field 

6 

7 

8class EmployeeOut(BaseModel): 

9 id: UUID; user_id: UUID; employee_number: str; name: str; email: str; job_title: str; employment_status: str; salary_monthly: Optional[Decimal] = None 

10 

11 

12class EmployeeIn(BaseModel): 

13 employee_number: str 

14 email: str 

15 first_name: str = '' 

16 last_name: str = '' 

17 job_title: str = '' 

18 hire_date: Optional[date] = None 

19 salary_monthly: Decimal = Field(default=Decimal('0'), ge=0) 

20 

21 

22class LeaveIn(BaseModel): 

23 profile_id: UUID; leave_type: str; start_date: date; end_date: date; reason: str = '' 

24 

25 

26class LeaveOut(LeaveIn): 

27 id: UUID; status: str; employee_name: str; created_at: datetime 

28 

29 

30class LeaveStatusIn(BaseModel): 

31 status: str 

32 

33 

34class ClaimStatusIn(BaseModel): 

35 status: str 

36 

37 

38class OvertimeIn(BaseModel): 

39 profile_id: UUID; date: date; hours: Decimal = Field(gt=0); reason: str = '' 

40 

41 

42class OvertimeOut(OvertimeIn): 

43 id: UUID; status: str; employee_name: str; created_at: datetime 

44 

45 

46class ClaimIn(BaseModel): 

47 profile_id: UUID; category: str; amount: Decimal = Field(ge=0); claim_date: date; description: str = '' 

48 

49 

50class ClaimOut(ClaimIn): 

51 id: UUID; status: str; employee_name: str; created_at: datetime 

52 

53 

54class PayrollRunIn(BaseModel): 

55 period_start: date; period_end: date; profile_ids: Optional[List[UUID]] = None; pay_rates: List[Decimal] = Field(default_factory=list, max_length=32) 

56 

57 

58class PayrollRunOut(BaseModel): 

59 id: UUID; period_start: date; period_end: date; status: str; total_gross: Decimal; total_tax: Decimal; total_net: Decimal; item_count: int; sss_contribution: Decimal = Decimal('0'); philhealth_contribution: Decimal = Decimal('0'); pagibig_contribution: Decimal = Decimal('0') 

60 

61 

62class PayslipEarnings(BaseModel): 

63 basic_salary: Decimal = Decimal('0') 

64 overtime_pay: Decimal = Decimal('0') 

65 allowances: Decimal = Decimal('0') 

66 other_earnings: Decimal = Decimal('0') 

67 gross_pay: Decimal = Decimal('0') 

68 

69 

70class PayslipDeductions(BaseModel): 

71 sss: Decimal = Decimal('0') 

72 philhealth: Decimal = Decimal('0') 

73 pagibig: Decimal = Decimal('0') 

74 withholding_tax: Decimal = Decimal('0') 

75 other_deductions: Decimal = Decimal('0') 

76 total_deductions: Decimal = Decimal('0') 

77 

78 

79class PayslipOut(BaseModel): 

80 id: UUID 

81 

82 

83# ── 13th Month Bonus Schemas ──────────────────────────────────────────── 

84 

85class Month13ItemOut(BaseModel): 

86 id: UUID 

87 profile_id: UUID 

88 employee_name: str 

89 employee_number: str 

90 months_employed: int 

91 basic_salary_total: Decimal 

92 bonus_amount: Decimal 

93 status: str 

94 released_at: Optional[datetime] = None 

95 

96 

97class Month13BonusOut(BaseModel): 

98 id: UUID 

99 year: int 

100 status: str 

101 total_gross: Decimal 

102 total_net: Decimal 

103 item_count: int 

104 notes: str = '' 

105 items: List[Month13ItemOut] = [] 

106 created_at: datetime 

107 

108 

109class Month13RunIn(BaseModel): 

110 year: int = Field(default_factory=lambda: date.today().year) 

111 profile_ids: Optional[List[UUID]] = None # None = all active employees 

112 notes: str = '' 

113 payroll_item_id: UUID 

114 employee_name: str 

115 employee_number: str 

116 job_title: str 

117 period_start: date 

118 period_end: date 

119 earnings: PayslipEarnings 

120 deductions: PayslipDeductions 

121 net_pay: Decimal 

122 status: str 

123 generated_at: datetime 

124 

125 

126class PayslipIn(BaseModel): 

127 payroll_item_id: UUID 

128 

129 

130class PayslipSendIn(BaseModel): 

131 employee_email: str 

132 subject: str = "Your Payslip" 

133 message: str = "Please find attached your payslip for this period."