feat: forward LogStorm attendance aliases
This commit is contained in:
parent
3a20c3d86a
commit
bd5c7b79b0
@ -37,6 +37,10 @@ class LogStormAttendanceAnalyzeSerializer(serializers.Serializer):
|
||||
period_start = serializers.DateField()
|
||||
period_end = serializers.DateField()
|
||||
schedule = LogStormScheduleSerializer(required=False)
|
||||
aliases = serializers.ListField(
|
||||
child=serializers.CharField(),
|
||||
required=False,
|
||||
)
|
||||
|
||||
def validate(self, attrs):
|
||||
if attrs["period_start"] > attrs["period_end"]:
|
||||
|
||||
@ -174,6 +174,7 @@ class LogStormAttendanceAnalyzeAPIView(APIView):
|
||||
get_employee_work_schedule_payload(employee)
|
||||
or get_standard_work_schedule_payload()
|
||||
)
|
||||
aliases = data.get("aliases")
|
||||
|
||||
try:
|
||||
result = analyze_employee_attendance(
|
||||
@ -181,6 +182,7 @@ class LogStormAttendanceAnalyzeAPIView(APIView):
|
||||
period_start=data["period_start"],
|
||||
period_end=data["period_end"],
|
||||
schedule=schedule_payload,
|
||||
aliases=aliases,
|
||||
client=None,
|
||||
)
|
||||
except LogStormClientError as exc:
|
||||
@ -195,6 +197,7 @@ class LogStormAttendanceAnalyzeAPIView(APIView):
|
||||
period_start=data["period_start"],
|
||||
period_end=data["period_end"],
|
||||
schedule=schedule_payload,
|
||||
aliases=aliases,
|
||||
)
|
||||
save_logstorm_attendance_result(
|
||||
employee=employee,
|
||||
|
||||
@ -24,6 +24,7 @@ def build_logstorm_attendance_payload(
|
||||
period_end: date,
|
||||
schedule: Optional[dict[str, Any]] = None,
|
||||
date_overrides: Optional[list[dict[str, Any]]] = None,
|
||||
aliases: Optional[list[Any]] = None,
|
||||
) -> dict[str, Any]:
|
||||
"""
|
||||
Build a LogStorm attendance analysis payload.
|
||||
@ -44,6 +45,10 @@ def build_logstorm_attendance_payload(
|
||||
date_overrides=date_overrides,
|
||||
)
|
||||
|
||||
normalized_aliases = _normalize_aliases(aliases)
|
||||
if normalized_aliases:
|
||||
payload["aliases"] = normalized_aliases
|
||||
|
||||
return payload
|
||||
|
||||
|
||||
@ -75,6 +80,7 @@ def analyze_employee_attendance(
|
||||
period_end: date,
|
||||
schedule: Optional[dict[str, Any]] = None,
|
||||
date_overrides: Optional[list[dict[str, Any]]] = None,
|
||||
aliases: Optional[list[Any]] = None,
|
||||
client: Optional[LogStormClient] = None,
|
||||
) -> dict[str, Any]:
|
||||
payload = build_logstorm_attendance_payload(
|
||||
@ -83,6 +89,7 @@ def analyze_employee_attendance(
|
||||
period_end=period_end,
|
||||
schedule=schedule,
|
||||
date_overrides=date_overrides,
|
||||
aliases=aliases,
|
||||
)
|
||||
return (client or LogStormClient()).analyze_attendance(payload)
|
||||
|
||||
@ -104,6 +111,15 @@ def _format_date(value: Any) -> str:
|
||||
return str(value)
|
||||
|
||||
|
||||
def _normalize_aliases(aliases: Optional[list[Any]]) -> list[str]:
|
||||
result: list[str] = []
|
||||
for alias in aliases or []:
|
||||
alias_value = str(alias).strip()
|
||||
if alias_value and alias_value not in result:
|
||||
result.append(alias_value)
|
||||
return result
|
||||
|
||||
|
||||
def _employee_display_name(employee: Employee) -> str:
|
||||
full_name = employee.get_full_name().strip()
|
||||
return full_name or str(employee)
|
||||
|
||||
@ -79,6 +79,19 @@ def test_payload_includes_schedule_and_date_overrides(user_factory):
|
||||
}
|
||||
|
||||
|
||||
def test_payload_includes_aliases(user_factory):
|
||||
employee = user_factory(first_name="Ivan", last_name="Petrov")
|
||||
|
||||
payload = build_logstorm_attendance_payload(
|
||||
employee=employee,
|
||||
period_start=date(2026, 4, 20),
|
||||
period_end=date(2026, 4, 20),
|
||||
aliases=["200", "200", " 300 "],
|
||||
)
|
||||
|
||||
assert payload["aliases"] == ["200", "300"]
|
||||
|
||||
|
||||
def test_schedule_defaults_to_regular_workweek():
|
||||
schedule = normalize_logstorm_schedule({
|
||||
"start_time": "09:00",
|
||||
|
||||
@ -112,6 +112,28 @@ def test_logstorm_attendance_api_passes_schedule(
|
||||
)
|
||||
|
||||
|
||||
def test_logstorm_attendance_api_passes_aliases(
|
||||
auth_client_factory,
|
||||
user_factory,
|
||||
):
|
||||
staff = user_factory(staff=True)
|
||||
employee = user_factory()
|
||||
client = auth_client_factory(staff)
|
||||
|
||||
with patch(
|
||||
"api.v1.attendance.views.analyze_employee_attendance",
|
||||
return_value={"records": []},
|
||||
) as analyze:
|
||||
response = client.post(
|
||||
_url(),
|
||||
_payload(employee.id, aliases=["200", "300"]),
|
||||
format="json",
|
||||
)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert analyze.call_args.kwargs["aliases"] == ["200", "300"]
|
||||
|
||||
|
||||
def test_logstorm_attendance_api_rejects_invalid_period(
|
||||
auth_client_factory,
|
||||
user_factory,
|
||||
|
||||
@ -84,6 +84,7 @@ type AttendanceAnalyzeRequest = {
|
||||
period_start: string;
|
||||
period_end: string;
|
||||
schedule?: AttendanceSchedulePayload;
|
||||
aliases?: string[];
|
||||
};
|
||||
type MonthlyMatrixRequest = { employee_ids: string; month: string };
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user