from django.db import models from jsignature.fields import JSignatureField from django.conf import settings from django.contrib.auth.models import Group from django.utils.translation import gettext_lazy as _ from django.dispatch import receiver from datetime import datetime, timedelta pay_choices = { "Once": "One Off", "Daily": "Daily", "Weekly": "Weekly", "Monthly": "Monthly", "Invoice": "Invoice" } absence_reason = { "hol": "Holiday", "sick": "Sick", "mat": "Maternity", "pat": "Paternity", "other": "Other" } def getGroups(self): grps = self.groups.all() groups = [] for g in grps: groups.append({'name': g.name}) return groups default_date = datetime.strptime("1971-01-01", '%Y-%m-%d').date() class department(models.Model): name = models.CharField(max_length=300, blank=True, null=True, ) manager = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='manager' ) def __str__(self): return self.name class company(models.Model): name = models.CharField(max_length=300, blank=True, null=True, unique=True) vat_number = models.CharField(max_length=300, blank=True, null=True, ) contact_number = models.CharField(max_length=15, blank=True, null=True, ) address_street = models.CharField(max_length=300, blank=True, null=True, ) address_city = models.CharField(max_length=300, blank=True, null=True, ) address_country = models.CharField(max_length=300, blank=True, null=True, default='United Kingdom') address_postcode = models.CharField(max_length=300, blank=True, null=True, ) departments = models.ManyToManyField( department, verbose_name=_("departments"), blank=True, help_text=_( "The groups this user belongs to. A user will get all permissions " "granted to each of their groups." ), related_name="company_set", related_query_name="company", ) year_start_date = models.DateField(default=default_date) def __str__(self): return self.name class Meta: verbose_name_plural = "Companies" class employee(models.Model): employee = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='employee' ) company = models.ForeignKey( company, on_delete=models.SET_NULL, null=True, related_name='company' ) email = models.EmailField(blank=True, null=True) preferred_name = models.CharField(max_length=150, blank=True, null=True, ) job_title = models.CharField(max_length=100, blank=True, null=True, ) department = models.ForeignKey( department, on_delete=models.SET_NULL, null=True, related_name='department' ) line_manager = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, related_name='line_manager' ) contact_number = models.CharField(max_length=15, blank=True, null=True, ) address_street = models.CharField(max_length=300, blank=True, null=True, ) address_city = models.CharField(max_length=300, blank=True, null=True, ) address_country = models.CharField(max_length=300, blank=True, null=True, default='United Kingdom') address_postcode = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_name = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_relationship = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_address_street = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_address_city = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_address_country = models.CharField(max_length=300, blank=True, null=True, default='United Kingdom') emergency_contact_address_postcode = models.CharField(max_length=300, blank=True, null=True, ) emergency_contact_phone_number = models.CharField(max_length=15, blank=True, null=True, ) emergency_contact_alternative_number = models.CharField(max_length=15, blank=True, null=True, ) holiday_days_allocated = models.IntegerField(default=28) holiday_days_remaining = models.IntegerField(default=28) pay_structure = models.CharField(max_length=300, blank=True, null=True, choices=pay_choices) pay_rate = models.CharField(max_length=100, blank=True, null=True,) salary = models.CharField(max_length=100, blank=True, null=True,) contract_start_date = models.DateField(blank=True, null=True) contract_end_date = models.DateField(blank=True, null=True) employee_company = models.CharField(max_length=150, blank=True, null=True, ) employee_vat_number = models.CharField(max_length=150, blank=True, null=True, ) signature = JSignatureField(blank=True, null=True,) groups = models.ManyToManyField( Group, verbose_name=_("groups"), blank=True, help_text=_( "The groups this user belongs to. A user will get all permissions " "granted to each of their groups." ), related_name="employee_set", related_query_name="employee", ) days_absent_authorised = models.IntegerField(default=0) days_absent_unauthorised = models.IntegerField(default=0) def __str__(self): name = f"{self.employee.first_name} {self.employee.last_name}" return name def to_dict(self): return { "id": self.pk, "employee": {"first_name": self.employee.first_name, "last_name": self.employee.last_name, "email": self.employee.email}, "company": self.company.name, "email": self.email, "preferred_name": self.preferred_name, "job_title": self.job_title, "department": self.department, "line_manager": {"first_name": self.line_manager.first_name, "last_name": self.line_manager.last_name, "email": self.line_manager.email}, "contact_number": self.contact_number, "address_street": self.address_street, "address_city": self.address_city, "address_country": self.address_country, "address_postcode": self.address_postcode, "emergency_contact_name": self.emergency_contact_name, "emergency_contact_relationship": self.emergency_contact_relationship, "emergency_contact_address_street": self.emergency_contact_address_street, "emergency_contact_address_city": self.emergency_contact_address_city, "emergency_contact_address_country": self.emergency_contact_address_country, "emergency_contact_address_postcode": self.emergency_contact_address_postcode, "emergency_contact_phone_number": self.emergency_contact_phone_number, "emergency_contact_alternative_number": self.emergency_contact_alternative_number, "holiday_days_allocated": self.holiday_days_allocated, "holiday_days_remaining": self.holiday_days_remaining, "pay_structure": self.pay_structure, "pay_rate": self.pay_rate, "salary": self.salary, "contract_start_date": self.contract_start_date, "contract_end_date": self.contract_end_date, "employee_company": self.employee_company, "employee_vat_number": self.employee_vat_number, "signature": self.signature, "groups": getGroups(self) } class absence_days(models.Model): days_taken = models.IntegerField(default=0) date_from = models.DateField(blank=True, null=True) date_to = models.DateField(blank=True, null=True) reason = models.CharField(max_length=50, blank=True, null=True, choices=absence_reason) is_request = models.BooleanField(default=False) authorised = models.BooleanField(default=False) authorised_by = models.ForeignKey( employee, on_delete=models.SET_NULL, null=True, blank=True, default=None, related_name='authorised_by' ) taken_by = models.ForeignKey( employee, on_delete=models.SET_NULL, null=True, blank=True, default=None, related_name='taken_by' ) class Meta: verbose_name_plural= 'Absence Days' def to_dict(self): return { "days_taken": self.days_taken, "date_from": str(self.date_from), "date_to": str(self.date_to), "reason": self.reason, "is_request": self.is_request, "authorised": self.authorised, "authorised_by": {"first_name": self.employee.authorised_by.first_name, "last_name": self.employee.authorised_by.last_name, "email": self.employee.authorised_by.email}, "taken_by": {"first_name": self.employee.taken_by.first_name, "last_name": self.employee.taken_by.last_name, "email": self.employee.taken_by.email} } class homepage_links(models.Model): name = models.CharField( max_length=100, default=None, null=True, blank=True, help_text=( "This is the text that will appear on the homepage." ) ) link = models.CharField(max_length=200, blank=True, null=True) enabled = models.BooleanField(default=False) def to_dict(self): return { "name": self.name, "link": self.link, "enabled": self.enabled } @receiver(models.signals.post_save, sender=absence_days) def update_totals(sender, instance, **kwargs): date_last_year = datetime.now() - timedelta(days=365) taa = sender.objects.filter(taken_by=instance.taken_by, is_request=False, authorised=True, date_from__range=[date_last_year, datetime.now()]) tua = sender.objects.filter(taken_by=instance.taken_by, is_request=False, authorised=False, date_from__range=[date_last_year, datetime.now()]) total_authorised_absences = 0 total_unauthorised_absences = 0 for days in taa: total_authorised_absences += days.days_taken for days in tua: total_unauthorised_absences += days.days_taken e = employee.objects.get(id=instance.taken_by.id) e.days_absent_authorised = total_authorised_absences e.days_absent_unauthorised = total_unauthorised_absences e.save()