মডেল: Holiday
from django.db import models
from company.models import Company
class Holiday(models.Model):
"""
ছুটির দিনগুলি সংরক্ষণের জন্য Holiday মডেল।
"""
company = models.ForeignKey(Company, on_delete=models.CASCADE) # কোম্পানিভিত্তিক ছুটি
date = models.DateField() # ছুটির তারিখ
reason = models.CharField(max_length=255) # ছুটির কারণ যেমন ঈদ, পুজা ইত্যাদি
def __str__(self):
return f"{self.reason} - {self.date}"
Holiday মডেল এডমিন প্যানেল:
admin.py ফাইলে পরিবর্তন:
from django.contrib import admin
from .models import Holiday
@admin.register(Holiday)
class HolidayAdmin(admin.ModelAdmin):
"""
Admin interface for Holiday model.
"""
list_display = ('company', 'date', 'reason')
search_fields = ('company__name', 'reason')
list_filter = ('company', 'date')
from datetime import timedelta
def get_employee_attendance(employee_id, start_date, end_date, company):
# নির্দিষ্ট সময়ের মধ্যে সমস্ত অ্যাটেনডেন্স লগ নেয়া হচ্ছে
attendance_logs = AttendanceLog.objects.filter(
employee__employee_id=employee_id,
company=company,
punch_datetime__date__range=[start_date, end_date]
)
# নির্দিষ্ট সময়ের মধ্যে থাকা সকল ছুটি নিয়ে আসা হচ্ছে
holidays = Holiday.objects.filter(company=company, date__range=[start_date, end_date])
report = []
for log in attendance_logs:
# শ্রমিকের নির্দিষ্ট দিনের শিফট খুঁজে বের করা
temp_shift = TemporaryShift.objects.filter(employee=log.employee, date=log.punch_datetime.date(), company=company).first()
if temp_shift:
shift_info = temp_shift.shift
else:
# যদি টেম্পোরারি শিফট না থাকে, তাহলে ডিফল্ট শিডিউল শিফট নেবে
shift_info = log.employee.schedule_set.first().shift
log_date = log.punch_datetime.date()
report.append(f"Date: {log_date}, Shift: {shift_info.name}, Status: {log.status}")
# ছুটির দিনগুলোর জন্য ছুটির আগের ও পরের দিনের অনুপস্থিতি চেক করা হচ্ছে
for holiday in holidays:
previous_day = holiday.date - timedelta(days=1)
next_day = holiday.date + timedelta(days=1)
# আগের ও পরের দিনের উপস্থিতি চেক করা হচ্ছে
previous_day_log = AttendanceLog.objects.filter(
employee__employee_id=employee_id,
company=company,
punch_datetime__date=previous_day
).first()
next_day_log = AttendanceLog.objects.filter(
employee__employee_id=employee_id,
company=company,
punch_datetime__date=next_day
).first()
# যদি আগের ও পরের দিন অনুপস্থিত না থাকে, তাহলে Holiday হিসাবে রিপোর্টে যুক্ত করা হবে
if previous_day_log and previous_day_log.status != 'Absent' and next_day_log and next_day_log.status != 'Absent':
report.append(f"Date: {holiday.date}, Status: Holiday")
else:
# যদি আগের বা পরের দিন অনুপস্থিত থাকে, Holiday হিসেব করা হবে না
report.append(f"Date: {holiday.date}, Status: Not Applicable (Absent before/after holiday)")
return report
পরিবর্তনের বিস্তারিত ব্যাখ্যা:
- Attendance Log ফিল্টার করা:
attendance_logsব্যবহার করে কর্মীদের উপস্থিতির তথ্য ফিল্টার করা হচ্ছে। - Holiday ফিল্টার করা:
holidaysব্যবহার করে নির্দিষ্ট সময়ে থাকা ছুটির দিনগুলো সংগ্রহ করা হচ্ছে। - আগের এবং পরের দিন চেক করা: প্রতিটি ছুটির জন্য ছুটির আগের দিন এবং পরের দিনের উপস্থিতি চেক করা হচ্ছে।
- previous_day_log: ছুটির আগের দিনের উপস্থিতি লগ চেক করা হচ্ছে।
- next_day_log: ছুটির পরের দিনের উপস্থিতি লগ চেক করা হচ্ছে।
- Holiday যুক্ত করা: যদি কর্মী ছুটির আগের এবং পরের দিন অনুপস্থিত না থাকে, তাহলে সেই ছুটির দিনটিকে “Holiday” হিসেবে রিপোর্টে যুক্ত করা হচ্ছে। অন্যথায় সেটি “Not Applicable” হিসেবে চিহ্নিত করা হচ্ছে।
Example Report Output:
Date: 2024-10-01, Shift: Morning, Status: Present
Date: 2024-10-02, Shift: Evening, Status: Present
Date: 2024-10-03, Status: Holiday
Date: 2024-10-04, Shift: Morning, Status: Present
Date: 2024-10-05, Status: Not Applicable (Absent before/after holiday)