56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from pathlib import Path
|
|
import sys
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
|
|
|
|
from financial_system.domain.models import EmployeeAttendance, PayrollResult
|
|
from financial_system.domain.payroll_exceptions import detect_payroll_exceptions
|
|
|
|
|
|
def test_detect_payroll_exceptions_flags_core_payroll_risks() -> None:
|
|
result = PayrollResult(
|
|
employee=EmployeeAttendance(name="张三", employee_no="ZA0001", department="生产中心"),
|
|
salary_month="2026-06",
|
|
salary_mode="monthly",
|
|
attendance_days=0,
|
|
absence_days=22,
|
|
actual_work_hours=0,
|
|
punch_overtime_hours=1,
|
|
leave_hours=3,
|
|
remaining_overtime_hours=-2,
|
|
workday_overtime_hours=0,
|
|
weekend_overtime_hours=0,
|
|
holiday_overtime_hours=0,
|
|
minor_late_count=4,
|
|
major_late_count=1,
|
|
penalized_late_count=2,
|
|
late_deduction=60,
|
|
missing_card_count=1,
|
|
missing_card_deduction=20,
|
|
total_deduction=80,
|
|
base_salary=None,
|
|
base_pay=None,
|
|
commission_amount=0,
|
|
overtime_rate=0,
|
|
weekend_overtime_rate=0,
|
|
holiday_overtime_rate=0,
|
|
overtime_pay=0,
|
|
gross_salary=None,
|
|
net_salary=None,
|
|
note="未配置薪资档案",
|
|
)
|
|
|
|
exception_types = {item.exception_type for item in detect_payroll_exceptions([result])}
|
|
|
|
assert "missing_salary_profile" in exception_types
|
|
assert "missing_card" in exception_types
|
|
assert "late_penalty" in exception_types
|
|
assert "negative_remaining_overtime" in exception_types
|
|
assert "empty_attendance" in exception_types
|
|
|
|
|
|
if __name__ == "__main__":
|
|
test_detect_payroll_exceptions_flags_core_payroll_risks()
|