import logging from rest_framework import status from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from attendance.services import ( get_employee_work_schedule_payload, get_standard_work_schedule_payload, save_logstorm_attendance_result, ) from common.logstorm_attendance import ( analyze_employee_attendance, build_logstorm_attendance_payload, ) from common.logstorm_client import LogStormClientError from employees.models import Employee from ..serializers import ( LogStormAttendanceAnalyzeSerializer, ) from ..support import _check_employee_access logger = logging.getLogger(__name__) class LogStormAttendanceAnalyzeAPIView(APIView): serializer_class = LogStormAttendanceAnalyzeSerializer permission_classes = [IsAuthenticated] def post(self, request): serializer = LogStormAttendanceAnalyzeSerializer(data=request.data) serializer.is_valid(raise_exception=True) data = serializer.validated_data _check_employee_access(request.user, data["employee_id"]) try: employee = Employee.objects.get(pk=data["employee_id"]) except Employee.DoesNotExist: return Response( {"detail": "Employee not found"}, status=status.HTTP_404_NOT_FOUND, ) schedule_payload = data.get("schedule") if schedule_payload is None: schedule_payload = ( get_employee_work_schedule_payload(employee) or get_standard_work_schedule_payload() ) aliases = ( data["aliases"] if "aliases" in data else list(getattr(employee, "attendance_aliases", None) or []) ) try: result = analyze_employee_attendance( employee=employee, period_start=data["period_start"], period_end=data["period_end"], schedule=schedule_payload, aliases=aliases, client=None, ) except LogStormClientError as exc: logger.warning( "LogStorm attendance analysis failed", extra={ "event": "attendance.logstorm.analysis_failed", "employee_id": employee.id, "period_start": data["period_start"], "period_end": data["period_end"], "upstream_status_code": exc.status_code, "error_type": type(exc).__name__, }, ) return Response( {"detail": str(exc), "error": "logstorm_unavailable"}, status=status.HTTP_502_BAD_GATEWAY, ) request_payload = build_logstorm_attendance_payload( employee=employee, period_start=data["period_start"], period_end=data["period_end"], schedule=schedule_payload, aliases=aliases, ) save_logstorm_attendance_result( employee=employee, period_start=data["period_start"], period_end=data["period_end"], schedule_payload=request_payload.get("schedule"), request_payload=request_payload, response_payload=result, triggered_by=request.user, ) return Response(result)