first comit
This commit is contained in:
247
hrm/models.py
Executable file
247
hrm/models.py
Executable file
@@ -0,0 +1,247 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user