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
« 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
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
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)
22class LeaveIn(BaseModel):
23 profile_id: UUID; leave_type: str; start_date: date; end_date: date; reason: str = ''
26class LeaveOut(LeaveIn):
27 id: UUID; status: str; employee_name: str; created_at: datetime
30class LeaveStatusIn(BaseModel):
31 status: str
34class ClaimStatusIn(BaseModel):
35 status: str
38class OvertimeIn(BaseModel):
39 profile_id: UUID; date: date; hours: Decimal = Field(gt=0); reason: str = ''
42class OvertimeOut(OvertimeIn):
43 id: UUID; status: str; employee_name: str; created_at: datetime
46class ClaimIn(BaseModel):
47 profile_id: UUID; category: str; amount: Decimal = Field(ge=0); claim_date: date; description: str = ''
50class ClaimOut(ClaimIn):
51 id: UUID; status: str; employee_name: str; created_at: datetime
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)
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')
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')
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')
79class PayslipOut(BaseModel):
80 id: UUID
83# ── 13th Month Bonus Schemas ────────────────────────────────────────────
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
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
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
126class PayslipIn(BaseModel):
127 payroll_item_id: UUID
130class PayslipSendIn(BaseModel):
131 employee_email: str
132 subject: str = "Your Payslip"
133 message: str = "Please find attached your payslip for this period."