201 lines
7.8 KiB
Python
201 lines
7.8 KiB
Python
from rest_framework import serializers
|
|
from attendance.models import *
|
|
from recruitment.models import RecruitmentMailTemplate
|
|
|
|
|
|
class AttendanceSerializer(serializers.ModelSerializer):
|
|
employee_first_name = serializers.CharField(
|
|
source="employee_id.employee_first_name", read_only=True)
|
|
employee_last_name = serializers.CharField(
|
|
source="employee_id.employee_last_name", read_only=True)
|
|
shift_name = serializers.CharField(
|
|
source="shift_id.employee_shift", read_only=True)
|
|
badge_id = serializers.CharField(
|
|
source="employee_id.badge_id", read_only=True)
|
|
employee_profile_url = serializers.SerializerMethodField(read_only=True)
|
|
work_type = serializers.CharField(source="work_type_id.work_type",read_only=True)
|
|
|
|
class Meta:
|
|
model = Attendance
|
|
exclude = [
|
|
"overtime_second",
|
|
"at_work_second",
|
|
"attendance_day",
|
|
"request_description",
|
|
"approved_overtime_second",
|
|
"request_type",
|
|
"requested_data",
|
|
"is_validate_request",
|
|
"is_validate_request_approved",
|
|
"attendance_overtime",
|
|
]
|
|
|
|
def validate(self, data):
|
|
# Check if attendance exists for the employee on the current date
|
|
if self.instance:
|
|
return data
|
|
employee_id = data.get('employee_id')
|
|
attendance_date = data.get('attendance_date', date.today())
|
|
if Attendance.objects.filter(employee_id=employee_id, attendance_date=attendance_date).exists():
|
|
raise ValidationError(
|
|
("Attendance for this employee on the current date already exists."))
|
|
return data
|
|
|
|
def get_employee_profile_url(self, obj):
|
|
try:
|
|
employee_profile = obj.employee_id.employee_profile
|
|
return employee_profile.url
|
|
except:
|
|
return None
|
|
|
|
|
|
class AttendanceRequestSerializer(serializers.ModelSerializer):
|
|
employee_first_name = serializers.CharField(
|
|
source="employee_id.employee_first_name", read_only=True)
|
|
employee_last_name = serializers.CharField(
|
|
source="employee_id.employee_last_name", read_only=True)
|
|
shift_name = serializers.CharField(
|
|
source="shift_id.employee_shift", read_only=True)
|
|
badge_id = serializers.CharField(
|
|
source="employee_id.badge_id", read_only=True)
|
|
employee_profile_url = serializers.SerializerMethodField(read_only=True)
|
|
|
|
class Meta:
|
|
model = Attendance
|
|
exclude = [
|
|
"attendance_overtime",
|
|
"attendance_overtime_approve",
|
|
"attendance_validated",
|
|
"approved_overtime_second",
|
|
"is_validate_request",
|
|
"is_validate_request_approved",
|
|
"request_type",
|
|
"created_at",
|
|
]
|
|
|
|
def create(self, validated_data):
|
|
# Extract relevant data from validated_data
|
|
employee_id = validated_data.get("employee_id")
|
|
attendance_date = validated_data.get("attendance_date")
|
|
# Check if attendance exists for the employee and date
|
|
attendances = Attendance.objects.filter(
|
|
employee_id=employee_id, attendance_date=attendance_date
|
|
)
|
|
data = {
|
|
"employee_id": validated_data.get("employee_id"),
|
|
"attendance_date": validated_data.get("attendance_date"),
|
|
"attendance_clock_in_date": validated_data.get("attendance_clock_in_date"),
|
|
"attendance_clock_in": validated_data.get("attendance_clock_in"),
|
|
"attendance_clock_out": validated_data.get("attendance_clock_out"),
|
|
"attendance_clock_out_date": validated_data.get("attendance_clock_out_date"),
|
|
"shift_id": validated_data.get("shift_id"),
|
|
"work_type_id": validated_data.get("work_type_id"),
|
|
"attendance_worked_hour": validated_data.get("attendance_worked_hour"),
|
|
"minimum_hour": validated_data.get("minimum_hour"),
|
|
}
|
|
if attendances.exists():
|
|
data["employee_id"] = employee_id.id
|
|
data["attendance_date"] = str(attendance_date)
|
|
data["attendance_clock_in_date"] = self.data["attendance_clock_in_date"]
|
|
data["attendance_clock_in"] = self.data["attendance_clock_in"]
|
|
data["attendance_clock_out"] = (
|
|
None
|
|
if data["attendance_clock_out"] == "None"
|
|
else data["attendance_clock_out"]
|
|
)
|
|
data["attendance_clock_out_date"] = (
|
|
None
|
|
if data["attendance_clock_out_date"] == "None"
|
|
else data["attendance_clock_out_date"]
|
|
)
|
|
data["work_type_id"] = self.data["work_type_id"]
|
|
data["shift_id"] = self.data["shift_id"]
|
|
attendance = attendances.first()
|
|
for key, value in data.items():
|
|
data[key] = str(value)
|
|
attendance.requested_data = json.dumps(data)
|
|
attendance.is_validate_request = True
|
|
if attendance.request_type != "create_request":
|
|
attendance.request_type = "update_request"
|
|
attendance.request_description = self.data["request_description"]
|
|
return attendance.save()
|
|
new_instance = Attendance(**data)
|
|
new_instance.is_validate_request = True
|
|
new_instance.attendance_validated = False
|
|
new_instance.request_description = self.data["request_description"]
|
|
new_instance.request_type = "create_request"
|
|
new_instance.save()
|
|
return new_instance
|
|
|
|
def update(self, instance, validated_data):
|
|
if 'employee_id' in validated_data:
|
|
validated_data.pop('employee_id')
|
|
return super().update(instance, validated_data)
|
|
|
|
def get_employee_profile_url(self, obj):
|
|
try:
|
|
employee_profile = obj.employee_id.employee_profile
|
|
return employee_profile.url
|
|
except:
|
|
return None
|
|
|
|
|
|
class AttendanceOverTimeSerializer(serializers.ModelSerializer):
|
|
badge_id = serializers.CharField(
|
|
source='employee_id.badge_id', read_only=True)
|
|
employee_first_name = serializers.CharField(
|
|
source="employee_id.employee_first_name", read_only=True)
|
|
employee_last_name = serializers.CharField(
|
|
source="employee_id.employee_last_name", read_only=True)
|
|
employee_profile_url = serializers.SerializerMethodField(read_only=True)
|
|
|
|
class Meta:
|
|
model = AttendanceOverTime
|
|
fields = [
|
|
"id",
|
|
"employee_first_name",
|
|
"employee_last_name",
|
|
"employee_profile_url",
|
|
"badge_id",
|
|
"employee_id",
|
|
"month",
|
|
"year",
|
|
"worked_hours",
|
|
"pending_hours",
|
|
"overtime",
|
|
]
|
|
|
|
def get_employee_profile_url(self, obj):
|
|
try:
|
|
employee_profile = obj.employee_id.employee_profile
|
|
return employee_profile.url
|
|
except:
|
|
return None
|
|
|
|
|
|
class AttendanceLateComeEarlyOutSerializer(serializers.ModelSerializer):
|
|
employee_first_name = serializers.CharField(
|
|
source="employee_id.employee_first_name", read_only=True)
|
|
employee_last_name = serializers.CharField(
|
|
source="employee_id.employee_last_name", read_only=True)
|
|
|
|
class Meta:
|
|
model = AttendanceLateComeEarlyOut
|
|
fields = '__all__'
|
|
|
|
|
|
class AttendanceActivitySerializer(serializers.ModelSerializer):
|
|
employee_first_name = serializers.CharField(
|
|
source="employee_id.employee_first_name", read_only=True)
|
|
employee_last_name = serializers.CharField(
|
|
source="employee_id.employee_last_name", read_only=True)
|
|
|
|
class Meta:
|
|
model = AttendanceActivity
|
|
fields = "__all__"
|
|
|
|
class MailTemplateSerializer(serializers.ModelSerializer):
|
|
class Meta:
|
|
model = RecruitmentMailTemplate
|
|
fields = "__all__"
|