Files
tmhr/hrm/models.py
2024-02-23 10:30:02 +00:00

247 lines
10 KiB
Python
Executable File

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()