Files
ihrm/pms/models.py

315 lines
9.9 KiB
Python

from django.db import models
from django.forms import ValidationError
from django.utils.translation import gettext_lazy as _
from base.models import Company
# importing simple history
from simple_history.models import HistoricalRecords
from employee.models import Employee
from horilla_audit.models import HorillaAuditLog, HorillaAuditInfo
"""Objectives and key result section"""
class Period(models.Model):
"""this is a period model used for creating period"""
period_name = models.CharField(max_length=150, unique=True)
start_date = models.DateField()
end_date = models.DateField()
company_id = models.ForeignKey(Company,null=True, editable=False, on_delete=models.PROTECT)
objects = models.Manager()
def __str__(self):
return self.period_name
class EmployeeObjective(models.Model):
"""this is a EmployObjective model used for creating Employee objectives"""
STATUS_CHOICES = (
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
)
objective = models.CharField(null=False, blank=False, max_length=100)
objective_description = models.TextField(blank=False, null=False)
created_at = models.DateField(auto_now_add=True)
employee_id = models.ForeignKey(
Employee,
on_delete=models.PROTECT,
related_name="employee_objective",
null=True,
blank=True,
)
updated_at = models.DateField(auto_now=True)
start_date = models.DateField(null=False, blank=False)
end_date = models.DateField(null=False, blank=False)
status = models.CharField(
max_length=20,
choices=STATUS_CHOICES,
null=False,
blank=False,
default="Not Started",
)
history = HorillaAuditLog(bases=[HorillaAuditInfo])
archive = models.BooleanField(default=False, null=True, blank=True)
objects = models.Manager()
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.objective}"
class Comment(models.Model):
"""comments for objectives"""
comment = models.CharField(max_length=150)
employee_id = models.ForeignKey(
Employee,
on_delete=models.DO_NOTHING,
related_name="comment",
null=True,
blank=True,
)
employee_objective_id = models.ForeignKey(
EmployeeObjective,
on_delete=models.CASCADE,
related_name="emp_objective",
null=True,
blank=True,
)
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
history = HorillaAuditLog(excluded_fields=["comment"], bases=[HorillaAuditInfo])
objects = models.Manager()
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.comment} "
class EmployeeKeyResult(models.Model):
"""employee key result creation"""
PROGRESS_CHOICES = (
("%", _("Percentage")),
("#", _("Number")),
("Currency", (("$", "USD$"), ("", "INR"), ("", "EUR"))),
)
STATUS_CHOICES = (
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
)
key_result = models.CharField(max_length=60, null=True, blank=False)
key_result_description = models.TextField(blank=False, null=True)
employee_objective_id = models.ForeignKey(
EmployeeObjective, on_delete=models.CASCADE, related_name="emp_obj_id"
)
employee_id = models.ForeignKey(
Employee,
on_delete=models.DO_NOTHING,
related_name="emp_kpi",
null=True,
blank=True,
)
progress_type = models.CharField(
max_length=60, null=True, blank=True, choices=PROGRESS_CHOICES
)
status = models.CharField(
max_length=20,
choices=STATUS_CHOICES,
null=True,
blank=True,
default="Not Started",
)
created_at = models.DateField(auto_now_add=True, blank=True, null=True)
updated_at = models.DateField(auto_now=True, null=True, blank=True)
start_value = models.IntegerField(null=True, blank=True, default=0)
current_value = models.IntegerField(null=True, blank=True, default=0)
target_value = models.IntegerField(null=True, blank=True, default=0)
start_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)
history = HorillaAuditLog(bases=[HorillaAuditInfo])
progress_percentage = models.IntegerField(null=True, blank=True, default=0)
objects = models.Manager()
def __str__(self):
return f"{self.key_result} "
def save(self, *args, **kwargs):
if self.employee_id is None:
self.employee_id = self.employee_objective_id.employee_id
if self.target_value != 0:
self.progress_percentage = (int(self.current_value)/int(self.target_value))*100
super().save(*args, **kwargs)
"""360degree feedback section"""
class QuestionTemplate(models.Model):
"""question template creation"""
question_template = models.CharField(
max_length=100, null=False, blank=False, unique=True
)
company_id = models.ForeignKey(Company,null=True, editable=False, on_delete=models.PROTECT)
objects = models.Manager()
def __str__(self):
return self.question_template
class Question(models.Model):
"""question creation"""
QUESTION_TYPE_CHOICE = (
("1", _("Text")),
("2", _("Rating")),
("3", _("Boolean")),
("4", _("Multi-choices")),
("5", _("Likert")),
)
question = models.CharField(max_length=250, null=False, blank=False)
question_type = models.CharField(
choices=QUESTION_TYPE_CHOICE, max_length=100, null=True, blank=True
)
template_id = models.ForeignKey(
QuestionTemplate,
on_delete=models.CASCADE,
related_name="question",
null=True,
blank=True,
)
objects = models.Manager()
def __str__(self):
return self.question
class QuestionOptions(models.Model):
"""options for question"""
question_id = models.ForeignKey(
Question,
on_delete=models.PROTECT,
related_name="question_options",
null=True,
blank=True,
)
option_a = models.CharField(max_length=250, null=True, blank=True)
option_b = models.CharField(max_length=250, null=True, blank=True)
option_c = models.CharField(max_length=250, null=True, blank=True)
option_d = models.CharField(max_length=250, null=True, blank=True)
objects = models.Manager()
class Feedback(models.Model):
"""feedback model for creating feedback"""
STATUS_CHOICES = (
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
)
review_cycle = models.CharField(max_length=100, null=False, blank=False)
manager_id = models.ForeignKey(
Employee,
related_name="feedback_manager",
on_delete=models.DO_NOTHING,
null=True,
blank=False,
)
employee_id = models.ForeignKey(
Employee,
on_delete=models.DO_NOTHING,
related_name="feedback_employee",
null=False,
blank=False,
)
colleague_id = models.ManyToManyField(
Employee, related_name="feedback_colleague", blank=True
)
subordinate_id = models.ManyToManyField(
Employee, related_name="feedback_subordinate", blank=True
)
question_template_id = models.ForeignKey(
QuestionTemplate,
on_delete=models.DO_NOTHING,
related_name="feedback_question_template",
null=False,
blank=False,
)
status = models.CharField(
max_length=50, choices=STATUS_CHOICES, default="Not Started"
)
created_at = models.DateField(auto_now_add=True)
archive = models.BooleanField(null=True, blank=True, default=False)
start_date = models.DateField(null=False, blank=False)
end_date = models.DateField(null=True, blank=False)
employee_key_results_id = models.ManyToManyField(
EmployeeKeyResult,
blank=True,
)
objects = models.Manager()
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.review_cycle}"
class Answer(models.Model):
"""feedback answer model"""
answer = models.JSONField(max_length=200, null=True, blank=True)
question_id = models.ForeignKey(
Question,
on_delete=models.DO_NOTHING,
related_name="answer_question_id",
null=True,
blank=True,
)
employee_id = models.ForeignKey(
Employee,
on_delete=models.DO_NOTHING,
related_name="employee_answer",
null=True,
blank=True,
)
feedback_id = models.ForeignKey(
Feedback, on_delete=models.PROTECT, related_name="feedback_answer"
)
objects = models.Manager()
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.answer}"
class KeyResultFeedback(models.Model):
feedback_id = models.ForeignKey(
Feedback,
on_delete=models.PROTECT,
related_name="feedback_key_result",
null=True,
blank=True,
)
employee_id = models.ForeignKey(
Employee, on_delete=models.DO_NOTHING, related_name="employee_key_result"
)
answer = models.JSONField(max_length=200, null=True, blank=True)
key_result_id = models.ForeignKey(
EmployeeKeyResult,
related_name="key_result_feedback",
null=True,
blank=True,
on_delete=models.DO_NOTHING,
)
objects = models.Manager()