Files
ihrm/pms/models.py

315 lines
9.9 KiB
Python
Raw Normal View History

2023-05-10 15:06:57 +05:30
from django.db import models
from django.forms import ValidationError
2023-09-09 14:10:09 +05:30
from django.utils.translation import gettext_lazy as _
from base.models import Company
2023-09-09 14:10:09 +05:30
2023-05-10 15:06:57 +05:30
# importing simple history
from simple_history.models import HistoricalRecords
2023-09-09 14:10:09 +05:30
from employee.models import Employee
from horilla_audit.models import HorillaAuditLog, HorillaAuditInfo
2023-05-10 15:06:57 +05:30
"""Objectives and key result section"""
class Period(models.Model):
2023-09-09 14:10:09 +05:30
"""this is a period model used for creating period"""
2023-05-10 15:06:57 +05:30
2023-09-09 14:10:09 +05:30
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)
2023-09-09 14:10:09 +05:30
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return self.period_name
2023-09-09 14:10:09 +05:30
2023-05-10 15:06:57 +05:30
class EmployeeObjective(models.Model):
2023-09-09 14:10:09 +05:30
"""this is a EmployObjective model used for creating Employee objectives"""
2023-05-10 15:06:57 +05:30
2023-07-26 12:15:01 +05:30
STATUS_CHOICES = (
2023-09-09 14:10:09 +05:30
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
2023-07-26 12:15:01 +05:30
)
2023-05-10 15:06:57 +05:30
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)
2023-09-09 14:10:09 +05:30
employee_id = models.ForeignKey(
Employee,
2023-09-19 15:56:53 +05:30
on_delete=models.PROTECT,
2023-09-09 14:10:09 +05:30
related_name="employee_objective",
null=True,
blank=True,
)
2023-05-10 15:06:57 +05:30
updated_at = models.DateField(auto_now=True)
start_date = models.DateField(null=False, blank=False)
end_date = models.DateField(null=False, blank=False)
2023-09-09 14:10:09 +05:30
status = models.CharField(
max_length=20,
choices=STATUS_CHOICES,
null=False,
blank=False,
default="Not Started",
)
history = HorillaAuditLog(bases=[HorillaAuditInfo])
2023-09-09 14:10:09 +05:30
archive = models.BooleanField(default=False, null=True, blank=True)
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.objective}"
2023-05-10 15:06:57 +05:30
class Comment(models.Model):
"""comments for objectives"""
comment = models.CharField(max_length=150)
2023-09-09 14:10:09 +05:30
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,
)
2023-05-10 15:06:57 +05:30
created_at = models.DateTimeField(auto_now_add=True, null=True, blank=True)
history = HorillaAuditLog(excluded_fields=["comment"], bases=[HorillaAuditInfo])
2023-09-09 14:10:09 +05:30
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.comment} "
2023-05-10 15:06:57 +05:30
class EmployeeKeyResult(models.Model):
2023-09-09 14:10:09 +05:30
"""employee key result creation"""
2023-05-10 15:06:57 +05:30
PROGRESS_CHOICES = (
2023-09-09 14:10:09 +05:30
("%", _("Percentage")),
("#", _("Number")),
("Currency", (("$", "USD$"), ("", "INR"), ("", "EUR"))),
2023-05-10 15:06:57 +05:30
)
STATUS_CHOICES = (
2023-09-09 14:10:09 +05:30
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
2023-05-10 15:06:57 +05:30
)
key_result = models.CharField(max_length=60, null=True, blank=False)
key_result_description = models.TextField(blank=False, null=True)
2023-09-09 14:10:09 +05:30
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",
)
2023-05-10 15:06:57 +05:30
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)
2023-09-09 14:10:09 +05:30
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
2023-09-09 14:10:09 +05:30
return f"{self.key_result} "
2023-05-10 15:06:57 +05:30
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)
2023-05-10 15:06:57 +05:30
2023-05-10 15:06:57 +05:30
"""360degree feedback section"""
class QuestionTemplate(models.Model):
"""question template creation"""
2023-09-09 14:10:09 +05:30
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)
2023-09-09 14:10:09 +05:30
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return self.question_template
class Question(models.Model):
"""question creation"""
2023-09-09 14:10:09 +05:30
2023-05-10 15:06:57 +05:30
QUESTION_TYPE_CHOICE = (
2023-09-09 14:10:09 +05:30
("1", _("Text")),
("2", _("Rating")),
("3", _("Boolean")),
("4", _("Multi-choices")),
("5", _("Likert")),
2023-05-10 15:06:57 +05:30
)
question = models.CharField(max_length=250, null=False, blank=False)
2023-09-09 14:10:09 +05:30
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()
2023-05-10 15:06:57 +05:30
def __str__(self):
return self.question
class QuestionOptions(models.Model):
2023-09-09 14:10:09 +05:30
"""options for question"""
question_id = models.ForeignKey(
Question,
2023-09-19 15:56:53 +05:30
on_delete=models.PROTECT,
2023-09-09 14:10:09 +05:30
related_name="question_options",
null=True,
blank=True,
)
2023-05-10 15:06:57 +05:30
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)
2023-09-09 14:10:09 +05:30
objects = models.Manager()
2023-05-10 15:06:57 +05:30
class Feedback(models.Model):
2023-09-09 14:10:09 +05:30
"""feedback model for creating feedback"""
2023-05-10 15:06:57 +05:30
STATUS_CHOICES = (
2023-09-09 14:10:09 +05:30
("On Track", _("On Track")),
("Behind", _("Behind")),
("Closed", _("Closed")),
("At Risk", _("At Risk")),
("Not Started", _("Not Started")),
2023-05-10 15:06:57 +05:30
)
review_cycle = models.CharField(max_length=100, null=False, blank=False)
2023-09-09 14:10:09 +05:30
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"
)
2023-05-10 15:06:57 +05:30
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)
2023-09-09 14:10:09 +05:30
employee_key_results_id = models.ManyToManyField(
EmployeeKeyResult,
blank=True,
)
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.review_cycle}"
2023-05-10 15:06:57 +05:30
class Answer(models.Model):
2023-09-09 14:10:09 +05:30
"""feedback answer model"""
2023-05-10 15:06:57 +05:30
answer = models.JSONField(max_length=200, null=True, blank=True)
2023-09-09 14:10:09 +05:30
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(
2023-09-19 15:56:53 +05:30
Feedback, on_delete=models.PROTECT, related_name="feedback_answer"
2023-09-09 14:10:09 +05:30
)
objects = models.Manager()
2023-05-10 15:06:57 +05:30
def __str__(self):
return f"{self.employee_id.employee_first_name} - {self.answer}"
2023-09-09 14:10:09 +05:30
class KeyResultFeedback(models.Model):
feedback_id = models.ForeignKey(
Feedback,
2023-09-19 15:56:53 +05:30
on_delete=models.PROTECT,
2023-09-09 14:10:09 +05:30
related_name="feedback_key_result",
null=True,
blank=True,
)
employee_id = models.ForeignKey(
Employee, on_delete=models.DO_NOTHING, related_name="employee_key_result"
)
2023-05-10 15:06:57 +05:30
answer = models.JSONField(max_length=200, null=True, blank=True)
2023-09-09 14:10:09 +05:30
key_result_id = models.ForeignKey(
EmployeeKeyResult,
related_name="key_result_feedback",
null=True,
blank=True,
on_delete=models.DO_NOTHING,
)
objects = models.Manager()