from django.db import models from employee.models import Employee # importing simple history from simple_history.models import HistoricalRecords from django.utils.translation import gettext_lazy as _ """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(null=True, blank=True) end_date = models.DateField(null=True, blank=True) 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.DO_NOTHING, 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 = HistoricalRecords() archive =models.BooleanField(default=False,null=True,blank=True) 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 = HistoricalRecords(excluded_fields=['comment']) 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 = HistoricalRecords() def __str__(self): return f'{self.key_result} ' """360degree feedback section""" class QuestionTemplate(models.Model): """question template creation""" question_template = models.CharField(max_length=100, null=False, blank=False , unique=True) 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) def __str__(self): return self.question class QuestionOptions(models.Model): """options for question """ question_id = models.ForeignKey(Question, on_delete=models.CASCADE, 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) 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,) 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.CASCADE, related_name='feedback_answer') 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.CASCADE, 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)