store transfer and panel anbar
This commit is contained in:
1 parent
bd775d6249
commit
c5e9b1d18a
13 files changed
+2968
-190
No files matched your search
+93
-1
@@ -1,3 +1,4 @@
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.db import models
|
||||
from django.db.models import Sum
|
||||
# from django.db.models.signals import post_save, post_delete
|
||||
@@ -146,7 +147,12 @@ class Factor(models.Model):
|
||||
self.save()
|
||||
|
||||
class ProductInStore(models.Model):
|
||||
|
||||
class Meta:
|
||||
permissions = [
|
||||
("ViewProductInStore", "ViewProductInStore"),
|
||||
("EditProductInStore", "EditProductInStore"),
|
||||
("OnlyAnbar", "OnlyAnbar"),
|
||||
]
|
||||
class MovementType(models.TextChoices):
|
||||
SALE = 'SALE', 'فروش عادی'
|
||||
WARRANTY = 'WARRANTY', 'گارانتی'
|
||||
@@ -273,6 +279,92 @@ class ProductStockHistory(models.Model):
|
||||
def __str__(self):
|
||||
return f"{self.product.product_name} in {self.store_room.store_name} - Stock: {self.current_stock}"
|
||||
|
||||
|
||||
class StoreTransferRequest(models.Model):
|
||||
class Status(models.TextChoices):
|
||||
PENDING = 'PENDING', 'در انتظار تایید انبار مقصد'
|
||||
APPROVED = 'APPROVED', 'تایید شده و منتقل شده'
|
||||
REJECTED = 'REJECTED', 'رد شده توسط انبار مقصد'
|
||||
CANCELED = 'CANCELED', 'انصراف توسط مبدا'
|
||||
|
||||
source_store = models.ForeignKey(
|
||||
'StoreRoom',
|
||||
on_delete=models.PROTECT,
|
||||
related_name='outgoing_transfers',
|
||||
verbose_name="انبار مبدا"
|
||||
)
|
||||
target_store = models.ForeignKey(
|
||||
'StoreRoom',
|
||||
on_delete=models.PROTECT,
|
||||
related_name='incoming_transfers',
|
||||
verbose_name="انبار مقصد"
|
||||
)
|
||||
product = models.ForeignKey(
|
||||
'Product',
|
||||
on_delete=models.PROTECT,
|
||||
verbose_name="کالا"
|
||||
)
|
||||
quantity = models.PositiveIntegerField(verbose_name="تعداد انتقال")
|
||||
|
||||
status = models.CharField(
|
||||
max_length=15,
|
||||
choices=Status.choices,
|
||||
default=Status.PENDING,
|
||||
db_index=True,
|
||||
verbose_name="وضعیت"
|
||||
)
|
||||
desc = models.CharField(max_length=500, blank=True, null=True, verbose_name="توضیحات درخواست")
|
||||
rejection_reason = models.CharField(max_length=500, blank=True, null=True, verbose_name="دلیل رد درخواست")
|
||||
|
||||
requester = models.ForeignKey(
|
||||
User,
|
||||
on_delete=models.PROTECT,
|
||||
related_name='requested_transfers',
|
||||
verbose_name="کاربر درخواستدهنده"
|
||||
)
|
||||
approver = models.ForeignKey(
|
||||
User,
|
||||
on_delete=models.PROTECT,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='processed_transfers',
|
||||
verbose_name="کاربر تعیینتکلیفکننده"
|
||||
)
|
||||
|
||||
created_at = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name="زمان ثبت درخواست")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="زمان آخرین بهروزرسانی")
|
||||
action_date = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name="زمان تعیین تکلیف")
|
||||
|
||||
out_transaction = models.ForeignKey(
|
||||
'ProductInStore',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='transfer_out_ref',
|
||||
verbose_name="سند خروج انبار مبدا"
|
||||
)
|
||||
in_transaction = models.ForeignKey(
|
||||
'ProductInStore',
|
||||
on_delete=models.SET_NULL,
|
||||
null=True,
|
||||
blank=True,
|
||||
related_name='transfer_in_ref',
|
||||
verbose_name="سند ورود انبار مقصد"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ['-created_at']
|
||||
|
||||
def __str__(self):
|
||||
return f"[{self.get_status_display()}] {self.quantity} عدد {self.product.product_name} از {self.source_store.store_name} به {self.target_store.store_name}"
|
||||
|
||||
def clean(self):
|
||||
super().clean()
|
||||
if self.source_store_id == self.target_store_id:
|
||||
raise ValidationError("انبار مبدا و مقصد نمیتوانند یکسان باشند.")
|
||||
if self.quantity and self.quantity <= 0:
|
||||
raise ValidationError("تعداد انتقال باید بیشتر از صفر باشد.")
|
||||
|
||||
class FactorIteam(models.Model): # پیشنهاد: در آینده املای نام این کلاس را به FactorItem اصلاح کنید
|
||||
factor = models.ForeignKey(Factor, on_delete=models.CASCADE)
|
||||
product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, blank=True)
|
||||
|
||||
Reference in new issue
Block a user