Files
ihrm/asset/models.py

159 lines
5.4 KiB
Python
Raw Normal View History

2023-08-21 17:25:49 +05:30
"""
Models for Asset Management System
This module defines Django models to manage assets, their categories, assigning, and requests
within an Asset Management System.
"""
2023-05-10 15:06:57 +05:30
from django.db import models
2023-08-21 17:25:49 +05:30
from django.core.exceptions import ValidationError
2023-05-10 15:06:57 +05:30
from django.utils.translation import gettext_lazy as _
from base.models import Company
2023-12-01 15:36:51 +05:30
from base.horilla_company_manager import HorillaCompanyManager
2023-08-21 17:25:49 +05:30
from employee.models import Employee
2023-05-10 15:06:57 +05:30
class AssetCategory(models.Model):
2023-08-21 17:25:49 +05:30
"""
Represents a category for different types of assets.
"""
2023-08-08 10:13:50 +05:30
asset_category_name = models.CharField(max_length=255, unique=True)
2023-05-10 15:06:57 +05:30
asset_category_description = models.TextField()
2023-08-21 17:25:49 +05:30
objects = models.Manager()
2023-12-01 15:36:51 +05:30
company_id = models.ManyToManyField(Company,blank=True, verbose_name=_("Company"))
2023-08-08 10:13:50 +05:30
2023-05-10 15:06:57 +05:30
def __str__(self):
2023-08-08 10:13:50 +05:30
return f"{self.asset_category_name}"
2023-05-10 15:06:57 +05:30
class AssetLot(models.Model):
2023-08-21 17:25:49 +05:30
"""
Represents a lot associated with a collection of assets.
"""
2023-08-08 10:13:50 +05:30
lot_number = models.CharField(max_length=30, null=False, blank=False, unique=True)
lot_description = models.TextField(null=True, blank=True)
2023-12-01 15:36:51 +05:30
company_id = models.ManyToManyField(Company,blank=True, verbose_name=_("Company"))
objects = HorillaCompanyManager()
2023-08-08 10:13:50 +05:30
2023-05-10 15:06:57 +05:30
def __str__(self):
2023-08-08 10:13:50 +05:30
return f"{self.lot_number}"
2023-05-10 15:06:57 +05:30
class Asset(models.Model):
2023-08-21 17:25:49 +05:30
"""
Represents a asset with various attributes.
"""
2023-05-10 15:06:57 +05:30
ASSET_STATUS = [
2023-08-08 10:13:50 +05:30
("In use", _("In use")),
("Available", _("Available")),
("Not-Available", _("Not-Available")),
2023-05-10 15:06:57 +05:30
]
asset_name = models.CharField(max_length=255)
owner = models.ForeignKey(Employee,on_delete=models.PROTECT,null=True,blank=True)
2023-08-08 10:13:50 +05:30
asset_description = models.TextField(null=True, blank=True)
2023-05-10 15:06:57 +05:30
asset_tracking_id = models.CharField(max_length=30, null=False, unique=True)
asset_purchase_date = models.DateField()
asset_purchase_cost = models.DecimalField(max_digits=10, decimal_places=2)
2023-09-19 15:56:53 +05:30
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.PROTECT)
2023-08-08 10:13:50 +05:30
asset_status = models.CharField(
choices=ASSET_STATUS, default="Available", max_length=40
)
asset_lot_number_id = models.ForeignKey(
2023-09-19 15:56:53 +05:30
AssetLot, on_delete=models.PROTECT, null=True, blank=True
2023-08-08 10:13:50 +05:30
)
expiry_date = models.DateField(null=True, blank=True)
notify_before = models.IntegerField(default=1,null=True)
2023-12-01 15:36:51 +05:30
objects = HorillaCompanyManager("asset_category_id__company_id")
2023-08-08 10:13:50 +05:30
2023-05-10 15:06:57 +05:30
def __str__(self):
2023-08-08 10:13:50 +05:30
return f"{self.asset_name}-{self.asset_tracking_id}"
2023-08-21 17:25:49 +05:30
def clean(self):
existing_asset = Asset.objects.filter(
asset_tracking_id=self.asset_tracking_id
).exclude(
id=self.pk
) # Exclude the current instance if updating
if existing_asset.exists():
raise ValidationError(
{
"asset_description": _(
"An asset with this tracking ID already exists."
)
}
)
return super().clean()
2023-05-10 15:06:57 +05:30
class AssetReport(models.Model):
title = models.CharField(max_length=255, blank=True, null=True)
asset_id = models.ForeignKey(Asset, related_name="asset_report",on_delete = models.CASCADE)
def __str__(self):
return f'{self.asset_id} - {self.title}' if self.title else f'report for {self.asset_id}'
class AssetDocuments(models.Model):
asset_report = models.ForeignKey('AssetReport', related_name='documents', on_delete=models.CASCADE)
file = models.FileField(upload_to="asset/asset_report/documents/", blank=True, null=True)
def __str__(self):
return f'document for {self.asset_report}'
2023-05-10 15:06:57 +05:30
class AssetAssignment(models.Model):
2023-08-21 17:25:49 +05:30
"""
Represents the allocation and return of assets to and from employees.
"""
2023-05-10 15:06:57 +05:30
STATUS = [
2023-08-08 10:13:50 +05:30
("Minor damage", _("Minor damage")),
("Major damage", _("Major damage")),
("Healthy", _("Healthy")),
2023-05-10 15:06:57 +05:30
]
2023-08-08 10:13:50 +05:30
asset_id = models.ForeignKey(
2023-09-19 15:56:53 +05:30
Asset, on_delete=models.PROTECT,
2023-08-08 10:13:50 +05:30
)
assigned_to_employee_id = models.ForeignKey(
2023-09-19 15:56:53 +05:30
Employee, on_delete=models.PROTECT, related_name="allocated_employeee"
2023-08-08 10:13:50 +05:30
)
2023-05-10 15:06:57 +05:30
assigned_date = models.DateField(auto_now_add=True)
2023-08-08 10:13:50 +05:30
assigned_by_employee_id = models.ForeignKey(
2023-09-19 15:56:53 +05:30
Employee, on_delete=models.PROTECT, related_name="assigned_by"
2023-08-08 10:13:50 +05:30
)
2023-05-10 15:06:57 +05:30
return_date = models.DateField(null=True, blank=True)
return_condition = models.TextField(null=True, blank=True)
2023-08-08 10:13:50 +05:30
return_status = models.CharField(
choices=STATUS, max_length=30, null=True, blank=True
)
return_request = models.BooleanField(default = False)
2023-12-01 15:36:51 +05:30
objects = HorillaCompanyManager("asset_id__asset_lot_number_id__company_id")
2023-08-08 10:13:50 +05:30
2023-05-10 15:06:57 +05:30
class AssetRequest(models.Model):
2023-08-21 17:25:49 +05:30
"""
Represents a request for assets made by employees.
"""
2023-08-08 10:13:50 +05:30
STATUS = [
("Requested", _("Requested")),
("Approved", _("Approved")),
("Rejected", _("Rejected")),
2023-05-10 15:06:57 +05:30
]
2023-08-08 10:13:50 +05:30
requested_employee_id = models.ForeignKey(
Employee,
2023-09-19 15:56:53 +05:30
on_delete=models.PROTECT,
2023-08-08 10:13:50 +05:30
related_name="requested_employee",
null=False,
blank=False,
)
2023-09-19 15:56:53 +05:30
asset_category_id = models.ForeignKey(AssetCategory, on_delete=models.PROTECT)
2023-05-10 15:06:57 +05:30
asset_request_date = models.DateField(auto_now_add=True)
2023-08-08 10:13:50 +05:30
description = models.TextField(null=True, blank=True)
asset_request_status = models.CharField(
max_length=30, choices=STATUS, default="Requested", null=True, blank=True
)
2023-12-01 15:36:51 +05:30
objects = HorillaCompanyManager("requested_employee_id__employee_work_info__company_id")