﻿"""
Inventory ORM Models â€” Extended (Stock, Batch, Costing, Reservation, QC, Reporting).

Ø§Ø¯Ø§Ù…Ù‡ Ù…Ø¯Ù„â€ŒÙ‡Ø§ â€” Ø¬Ø¯Ø§Ø³Ø§Ø²ÛŒ Ø¨Ø±Ø§ÛŒ Ø®ÙˆØ§Ù†Ø§ÛŒÛŒ Ø¨Ù‡ØªØ±.
"""
import uuid

from django.db import models
from django.utils.translation import gettext_lazy as _

from apps.core.tenant.models import TenantAwareModel
from .models import (
    ItemModel, WarehouseModel, StorageLocationModel, UnitOfMeasureModel,
)


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 3ï¸âƒ£  STOCK STATUS & LEDGER
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class StockStatusModel(TenantAwareModel):
    """ÙˆØ¶Ø¹ÛŒØª Ù…ÙˆØ¬ÙˆØ¯ÛŒ."""

    class StatusType(models.TextChoices):
        AVAILABLE = "AVAILABLE", _("Ø¯Ø± Ø¯Ø³ØªØ±Ø³")
        RESERVED = "RESERVED", _("Ø±Ø²Ø±Ùˆ Ø´Ø¯Ù‡")
        ALLOCATED = "ALLOCATED", _("ØªØ®ØµÛŒØµâ€ŒÛŒØ§ÙØªÙ‡")
        BLOCKED = "BLOCKED", _("Ù…Ø³Ø¯ÙˆØ¯")
        QUALITY_INSPECTION = "QUALITY_INSPECTION", _("Ø¨Ø§Ø²Ø±Ø³ÛŒ Ú©ÛŒÙÛŒ")
        QUARANTINE = "QUARANTINE", _("Ù‚Ø±Ù†Ø·ÛŒÙ†Ù‡")
        IN_TRANSIT = "IN_TRANSIT", _("Ø¯Ø± Ø±Ø§Ù‡")
        DAMAGED = "DAMAGED", _("Ø¢Ø³ÛŒØ¨â€ŒØ¯ÛŒØ¯Ù‡")
        EXPIRED = "EXPIRED", _("Ù…Ù†Ù‚Ø¶ÛŒ")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    status_code = models.CharField(_("Ú©Ø¯ ÙˆØ¶Ø¹ÛŒØª"), max_length=50)
    status_name = models.CharField(_("Ù†Ø§Ù… ÙˆØ¶Ø¹ÛŒØª"), max_length=100)
    status_type = models.CharField(
        _("Ù†ÙˆØ¹"), max_length=30,
        choices=StatusType.choices, default=StatusType.AVAILABLE,
    )
    is_available_for_sales = models.BooleanField(_("Ù‚Ø§Ø¨Ù„ ÙØ±ÙˆØ´"), default=True)
    is_available_for_production = models.BooleanField(_("Ù‚Ø§Ø¨Ù„ ØªÙˆÙ„ÛŒØ¯"), default=True)
    is_blocked_for_movement = models.BooleanField(_("Ù…Ø³Ø¯ÙˆØ¯ Ø¨Ø±Ø§ÛŒ Ø¬Ø§Ø¨Ø¬Ø§ÛŒÛŒ"), default=False)
    sort_order = models.PositiveIntegerField(_("ØªØ±ØªÛŒØ¨"), default=0)
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True, db_index=True)

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_status"
        verbose_name = _("ÙˆØ¶Ø¹ÛŒØª Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        verbose_name_plural = _("ÙˆØ¶Ø¹ÛŒØªâ€ŒÙ‡Ø§ÛŒ Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        unique_together = [["tenant", "status_code"]]
        ordering = ["sort_order"]

    def __str__(self):
        return self.status_name


class BatchModel(TenantAwareModel):
    """Ø¨Ú† / Ù„Ø§Øª."""

    class BatchStatus(models.TextChoices):
        ACTIVE = "ACTIVE", _("ÙØ¹Ø§Ù„")
        EXPIRED = "EXPIRED", _("Ù…Ù†Ù‚Ø¶ÛŒ")
        BLOCKED = "BLOCKED", _("Ù…Ø³Ø¯ÙˆØ¯")
        QUARANTINE = "QUARANTINE", _("Ù‚Ø±Ù†Ø·ÛŒÙ†Ù‡")

    class QualityStatus(models.TextChoices):
        APPROVED = "APPROVED", _("ØªØ£ÛŒÛŒØ¯ Ø´Ø¯Ù‡")
        PENDING = "PENDING", _("Ø¯Ø± Ø§Ù†ØªØ¸Ø§Ø±")
        REJECTED = "REJECTED", _("Ø±Ø¯ Ø´Ø¯Ù‡")
        CONDITIONAL = "CONDITIONAL", _("Ù…Ø´Ø±ÙˆØ·")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    batch_number = models.CharField(_("Ø´Ù…Ø§Ø±Ù‡ Ø¨Ú†"), max_length=100, db_index=True)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="batches", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    manufacturing_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÙˆÙ„ÛŒØ¯"), null=True, blank=True)
    expiry_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ù†Ù‚Ø¶Ø§"), null=True, blank=True, db_index=True)
    vendor_batch_number = models.CharField(_("Ø´Ù…Ø§Ø±Ù‡ Ø¨Ú† ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡"), max_length=100, blank=True)
    vendor = models.ForeignKey(
        "core_organization.BusinessPartner", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡"),
    )
    production_order_id = models.UUIDField(_("Ø³ÙØ§Ø±Ø´ ØªÙˆÙ„ÛŒØ¯"), null=True, blank=True)

    batch_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ø¨Ú†"), max_length=20,
        choices=BatchStatus.choices, default=BatchStatus.ACTIVE,
    )
    quality_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ú©ÛŒÙÛŒ"), max_length=20,
        choices=QualityStatus.choices, default=QualityStatus.PENDING,
    )

    batch_attributes = models.JSONField(_("ÙˆÛŒÚ˜Ú¯ÛŒâ€ŒÙ‡Ø§"), default=dict, blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    updated_by = models.UUIDField(_("Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_batch"
        verbose_name = _("Ø¨Ú† / Ù„Ø§Øª")
        verbose_name_plural = _("Ø¨Ú†â€ŒÙ‡Ø§ / Ù„Ø§Øªâ€ŒÙ‡Ø§")
        unique_together = [["tenant", "batch_number"]]
        indexes = [
            models.Index(fields=["tenant", "item", "batch_status"]),
            models.Index(fields=["expiry_date"]),
        ]

    def __str__(self):
        return f"{self.batch_number} ({self.item.item_code})"


class SerialNumberModel(TenantAwareModel):
    """Ø´Ù…Ø§Ø±Ù‡ Ø³Ø±ÛŒØ§Ù„."""

    class SerialStatus(models.TextChoices):
        IN_STOCK = "IN_STOCK", _("Ø¯Ø± Ø§Ù†Ø¨Ø§Ø±")
        SOLD = "SOLD", _("ÙØ±ÙˆØ®ØªÙ‡â€ŒØ´Ø¯Ù‡")
        RETURNED = "RETURNED", _("Ù…Ø±Ø¬ÙˆØ¹ÛŒ")
        SCRAPPED = "SCRAPPED", _("Ø§Ø³Ù‚Ø§Ø·ÛŒ")
        IN_REPAIR = "IN_REPAIR", _("Ø¯Ø± ØªØ¹Ù…ÛŒØ±")
        IN_TRANSIT = "IN_TRANSIT", _("Ø¯Ø± Ø±Ø§Ù‡")

    class QualityStatus(models.TextChoices):
        APPROVED = "APPROVED", _("ØªØ£ÛŒÛŒØ¯ Ø´Ø¯Ù‡")
        REJECTED = "REJECTED", _("Ø±Ø¯ Ø´Ø¯Ù‡")
        QUARANTINE = "QUARANTINE", _("Ù‚Ø±Ù†Ø·ÛŒÙ†Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    serial_no = models.CharField(_("Ø´Ù…Ø§Ø±Ù‡ Ø³Ø±ÛŒØ§Ù„"), max_length=200, db_index=True)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="serial_numbers", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="serial_numbers", verbose_name=_("Ø¨Ú†"),
    )

    manufacturing_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÙˆÙ„ÛŒØ¯"), null=True, blank=True)
    warranty_start_date = models.DateField(_("Ø´Ø±ÙˆØ¹ Ú¯Ø§Ø±Ø§Ù†ØªÛŒ"), null=True, blank=True)
    warranty_end_date = models.DateField(_("Ù¾Ø§ÛŒØ§Ù† Ú¯Ø§Ø±Ø§Ù†ØªÛŒ"), null=True, blank=True)
    warranty_months = models.PositiveIntegerField(_("Ù…Ø¯Øª Ú¯Ø§Ø±Ø§Ù†ØªÛŒ (Ù…Ø§Ù‡)"), default=0)

    # Current location
    current_warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø± ÙØ¹Ù„ÛŒ"),
    )
    current_location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù† ÙØ¹Ù„ÛŒ"),
    )
    current_stock_status = models.ForeignKey(
        StockStatusModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("ÙˆØ¶Ø¹ÛŒØª ÙØ¹Ù„ÛŒ"),
    )

    # Ownership
    current_owner_type = models.CharField(_("Ù†ÙˆØ¹ Ù…Ø§Ù„Ú©ÛŒØª"), max_length=30, default="OWN")
    current_owner_id = models.UUIDField(_("Ù…Ø§Ù„Ú© ÙØ¹Ù„ÛŒ"), null=True, blank=True)

    # Status
    serial_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ø³Ø±ÛŒØ§Ù„"), max_length=20,
        choices=SerialStatus.choices, default=SerialStatus.IN_STOCK, db_index=True,
    )
    quality_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª Ú©ÛŒÙÛŒ"), max_length=20,
        choices=QualityStatus.choices, default=QualityStatus.APPROVED,
    )

    # Traceability
    supplier_serial_number = models.CharField(_("Ø³Ø±ÛŒØ§Ù„ ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡"), max_length=200, blank=True)
    vendor_id = models.UUIDField(_("ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡"), null=True, blank=True)
    purchase_order_id = models.UUIDField(_("Ø³ÙØ§Ø±Ø´ Ø®Ø±ÛŒØ¯"), null=True, blank=True)
    sales_order_id = models.UUIDField(_("Ø³ÙØ§Ø±Ø´ ÙØ±ÙˆØ´"), null=True, blank=True)
    customer_id = models.UUIDField(_("Ù…Ø´ØªØ±ÛŒ"), null=True, blank=True)
    sold_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ÙØ±ÙˆØ´"), null=True, blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    updated_by = models.UUIDField(_("Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_serial_number"
        verbose_name = _("Ø´Ù…Ø§Ø±Ù‡ Ø³Ø±ÛŒØ§Ù„")
        verbose_name_plural = _("Ø´Ù…Ø§Ø±Ù‡â€ŒÙ‡Ø§ÛŒ Ø³Ø±ÛŒØ§Ù„")
        unique_together = [["tenant", "serial_no"]]
        indexes = [
            models.Index(fields=["tenant", "item", "serial_status"]),
        ]

    def __str__(self):
        return f"{self.serial_no} ({self.item.item_code})"


class SerialNumberHistoryModel(TenantAwareModel):
    """ØªØ§Ø±ÛŒØ®Ú†Ù‡ Ø³Ø±ÛŒØ§Ù„."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.CASCADE,
        related_name="history", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )
    stock_ledger = models.ForeignKey(
        "StockLedgerEntryModel", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø«Ø¨Øª Ø¯ÙØªØ±"),
    )
    transaction_date = models.DateTimeField(_("ØªØ§Ø±ÛŒØ®"))
    transaction_type = models.CharField(_("Ù†ÙˆØ¹ ØªØ±Ø§Ú©Ù†Ø´"), max_length=50)

    from_warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ø² Ø§Ù†Ø¨Ø§Ø±"),
    )
    to_warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ù‡ Ø§Ù†Ø¨Ø§Ø±"),
    )
    from_location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ø² Ù…Ú©Ø§Ù†"),
    )
    to_location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ù‡ Ù…Ú©Ø§Ù†"),
    )
    from_status = models.ForeignKey(
        StockStatusModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ø² ÙˆØ¶Ø¹ÛŒØª"),
    )
    to_status = models.ForeignKey(
        StockStatusModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ù‡ ÙˆØ¶Ø¹ÛŒØª"),
    )
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_serial_number_history"
        verbose_name = _("ØªØ§Ø±ÛŒØ®Ú†Ù‡ Ø³Ø±ÛŒØ§Ù„")
        verbose_name_plural = _("ØªØ§Ø±ÛŒØ®Ú†Ù‡ Ø³Ø±ÛŒØ§Ù„â€ŒÙ‡Ø§")
        ordering = ["-transaction_date"]

    def __str__(self):
        return f"{self.serial_number.serial_no} â€” {self.transaction_type}"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 4ï¸âƒ£  STOCK LEDGER
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class StockLedgerEntryModel(TenantAwareModel):
    """Ø¯ÙØªØ± Ú©Ù„ Ù…ÙˆØ¬ÙˆØ¯ÛŒ â€” Ù‡Ø± Ø­Ø±Ú©Øª = ÛŒÚ© Ø«Ø¨Øª."""

    class TransactionType(models.TextChoices):
        GR = "GR", _("Ø±Ø³ÛŒØ¯ Ú©Ø§Ù„Ø§")
        GI = "GI", _("Ø­ÙˆØ§Ù„Ù‡ Ú©Ø§Ù„Ø§")
        TRANSFER = "TRANSFER", _("Ø§Ù†ØªÙ‚Ø§Ù„")
        ADJUSTMENT = "ADJUSTMENT", _("ØªØ¹Ø¯ÛŒÙ„")
        RETURN = "RETURN", _("Ù…Ø±Ø¬ÙˆØ¹ÛŒ")
        SCRAP = "SCRAP", _("Ø¶Ø§ÛŒØ¹Ø§Øª")

    class OwnershipType(models.TextChoices):
        OWN = "OWN", _("Ø®ÙˆØ¯ÛŒ")
        CONSIGNMENT_CUSTOMER = "CONSIGNMENT_CUSTOMER", _("Ø§Ù…Ø§Ù†ÛŒ Ù…Ø´ØªØ±ÛŒ")
        CONSIGNMENT_VENDOR = "CONSIGNMENT_VENDOR", _("Ø§Ù…Ø§Ù†ÛŒ ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    entry_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ø«Ø¨Øª"), max_length=50, unique=True, db_index=True
    )
    posting_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø«Ø¨Øª"), db_index=True)
    posting_time = models.TimeField(_("Ø³Ø§Ø¹Øª Ø«Ø¨Øª"), null=True, blank=True)

    # Dimensions
    item = models.ForeignKey(
        ItemModel, on_delete=models.PROTECT,
        related_name="ledger_entries", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.PROTECT,
        related_name="ledger_entries", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="ledger_entries", verbose_name=_("Ø¨Ú†"),
    )
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="ledger_entries", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )
    stock_status = models.ForeignKey(
        StockStatusModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ¶Ø¹ÛŒØª"),
    )

    ownership_type = models.CharField(
        _("Ù†ÙˆØ¹ Ù…Ø§Ù„Ú©ÛŒØª"), max_length=30,
        choices=OwnershipType.choices, default=OwnershipType.OWN,
    )
    owner_id = models.UUIDField(_("Ù…Ø§Ù„Ú©"), null=True, blank=True)
    project_id = models.UUIDField(_("Ù¾Ø±ÙˆÚ˜Ù‡"), null=True, blank=True)

    # Transaction
    transaction_type = models.CharField(
        _("Ù†ÙˆØ¹ ØªØ±Ø§Ú©Ù†Ø´"), max_length=20,
        choices=TransactionType.choices, db_index=True,
    )
    transaction_sub_type = models.CharField(
        _("Ø²ÛŒØ±Ù†ÙˆØ¹"), max_length=50, blank=True
    )
    source_document_type = models.CharField(
        _("Ù†ÙˆØ¹ Ø³Ù†Ø¯ Ù…Ø¨Ø¯Ø£"), max_length=50, blank=True
    )
    source_document_id = models.UUIDField(_("Ø³Ù†Ø¯ Ù…Ø¨Ø¯Ø£"), null=True, blank=True)
    source_document_line_id = models.UUIDField(_("Ø®Ø· Ø³Ù†Ø¯"), null=True, blank=True)

    # Quantity
    quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø±"), max_digits=18, decimal_places=4,
        help_text=_("Ù…Ø«Ø¨Øª=ÙˆØ±ÙˆØ¯ØŒ Ù…Ù†ÙÛŒ=Ø®Ø±ÙˆØ¬"),
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )
    quantity_in_base_uom = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± (ÙˆØ§Ø­Ø¯ Ù¾Ø§ÛŒÙ‡)"), max_digits=18, decimal_places=4,
    )

    # Costing
    unit_cost = models.DecimalField(
        _("Ø¨Ù‡Ø§ÛŒ ÙˆØ§Ø­Ø¯"), max_digits=18, decimal_places=4, default=0
    )
    total_cost = models.DecimalField(
        _("Ø¨Ù‡Ø§ÛŒ Ú©Ù„"), max_digits=18, decimal_places=4, default=0
    )
    costing_method = models.ForeignKey(
        "CostingMethodModel", on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø±ÙˆØ´ Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ"),
    )
    currency_code = models.CharField(_("Ø§Ø±Ø²"), max_length=10, default="IRR")

    # References
    reason_code = models.CharField(_("Ú©Ø¯ Ø¯Ù„ÛŒÙ„"), max_length=50, blank=True)
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)
    reference_number = models.CharField(_("Ø´Ù…Ø§Ø±Ù‡ Ù…Ø±Ø¬Ø¹"), max_length=100, blank=True)

    # Reversal
    is_reversed = models.BooleanField(_("Ø¨Ø±Ú¯Ø´Øªâ€ŒØ®ÙˆØ±Ø¯Ù‡"), default=False)
    reversed_by_sle = models.ForeignKey(
        "self", on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ø±Ú¯Ø´Øª ØªÙˆØ³Ø·"),
    )

    # Company
    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )

    # Fiscal
    fiscal_year = models.PositiveIntegerField(_("Ø³Ø§Ù„ Ù…Ø§Ù„ÛŒ"), default=0)
    fiscal_period = models.PositiveIntegerField(_("Ø¯ÙˆØ±Ù‡ Ù…Ø§Ù„ÛŒ"), default=0)

    # Audit
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    approved_by = models.UUIDField(_("ØªØ£ÛŒÛŒØ¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    approved_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® ØªØ£ÛŒÛŒØ¯"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_ledger_entry"
        verbose_name = _("Ø«Ø¨Øª Ø¯ÙØªØ± Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        verbose_name_plural = _("Ø«Ø¨Øªâ€ŒÙ‡Ø§ÛŒ Ø¯ÙØªØ± Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "item", "posting_date"]),
            models.Index(fields=["tenant", "warehouse", "posting_date"]),
            models.Index(fields=["tenant", "item", "warehouse", "posting_date"]),
            models.Index(fields=["tenant", "batch"]),
            models.Index(fields=["tenant", "serial_number"]),
            models.Index(fields=["tenant", "transaction_type"]),
        ]

    def __str__(self):
        return f"{self.entry_number} â€” {self.item.item_code} ({self.quantity})"


class StockBalanceModel(TenantAwareModel):
    """Ù…ÙˆØ¬ÙˆØ¯ÛŒ ÙØ¹Ù„ÛŒ â€” Materialized View / Trigger-updated."""

    class OwnershipType(models.TextChoices):
        OWN = "OWN", _("Ø®ÙˆØ¯ÛŒ")
        CONSIGNMENT_CUSTOMER = "CONSIGNMENT_CUSTOMER", _("Ø§Ù…Ø§Ù†ÛŒ Ù…Ø´ØªØ±ÛŒ")
        CONSIGNMENT_VENDOR = "CONSIGNMENT_VENDOR", _("Ø§Ù…Ø§Ù†ÛŒ ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="balances", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="balances", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="balances", verbose_name=_("Ø¨Ú†"),
    )
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="balances", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )
    stock_status = models.ForeignKey(
        StockStatusModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ¶Ø¹ÛŒØª"),
    )
    ownership_type = models.CharField(
        _("Ù†ÙˆØ¹ Ù…Ø§Ù„Ú©ÛŒØª"), max_length=30,
        choices=OwnershipType.choices, default=OwnershipType.OWN,
    )
    owner_id = models.UUIDField(_("Ù…Ø§Ù„Ú©"), null=True, blank=True)
    project_id = models.UUIDField(_("Ù¾Ø±ÙˆÚ˜Ù‡"), null=True, blank=True)

    # Quantities
    quantity_on_hand = models.DecimalField(
        _("Ù…ÙˆØ¬ÙˆØ¯ÛŒ Ú©Ù„"), max_digits=18, decimal_places=4, default=0
    )
    quantity_reserved = models.DecimalField(
        _("Ø±Ø²Ø±Ùˆ Ø´Ø¯Ù‡"), max_digits=18, decimal_places=4, default=0
    )
    quantity_allocated = models.DecimalField(
        _("ØªØ®ØµÛŒØµâ€ŒÛŒØ§ÙØªÙ‡"), max_digits=18, decimal_places=4, default=0
    )
    quantity_available = models.DecimalField(
        _("Ø¯Ø± Ø¯Ø³ØªØ±Ø³"), max_digits=18, decimal_places=4, default=0
    )
    quantity_in_transit = models.DecimalField(
        _("Ø¯Ø± Ø±Ø§Ù‡"), max_digits=18, decimal_places=4, default=0
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )

    # Dates
    last_movement_date = models.DateField(_("Ø¢Ø®Ø±ÛŒÙ† Ø­Ø±Ú©Øª"), null=True, blank=True)
    last_count_date = models.DateField(_("Ø¢Ø®Ø±ÛŒÙ† Ø´Ù…Ø§Ø±Ø´"), null=True, blank=True)

    # Valuation
    average_unit_cost = models.DecimalField(
        _("Ù…ÛŒØ§Ù†Ú¯ÛŒÙ† Ø¨Ù‡Ø§ÛŒ ÙˆØ§Ø­Ø¯"), max_digits=18, decimal_places=4, default=0
    )
    total_value = models.DecimalField(
        _("Ø§Ø±Ø²Ø´ Ú©Ù„"), max_digits=18, decimal_places=4, default=0
    )

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    last_updated = models.DateTimeField(_("Ø¢Ø®Ø±ÛŒÙ† Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_balance"
        verbose_name = _("Ù…ÙˆØ¬ÙˆØ¯ÛŒ ÙØ¹Ù„ÛŒ")
        verbose_name_plural = _("Ù…ÙˆØ¬ÙˆØ¯ÛŒâ€ŒÙ‡Ø§ÛŒ ÙØ¹Ù„ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "item", "warehouse"]),
            models.Index(fields=["tenant", "item"]),
            models.Index(fields=["tenant", "warehouse"]),
        ]

    def __str__(self):
        return f"{self.item.item_code}@{self.warehouse.warehouse_code}: {self.quantity_on_hand}"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 5ï¸âƒ£  COSTING & VALUATION
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class CostingMethodModel(TenantAwareModel):
    """Ø±ÙˆØ´ Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    method_code = models.CharField(_("Ú©Ø¯"), max_length=20)
    method_name = models.CharField(_("Ù†Ø§Ù…"), max_length=100)
    description = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    updated_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ"), auto_now=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_costing_method"
        verbose_name = _("Ø±ÙˆØ´ Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ")
        verbose_name_plural = _("Ø±ÙˆØ´â€ŒÙ‡Ø§ÛŒ Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ")
        unique_together = [["tenant", "method_code"]]

    def __str__(self):
        return self.method_name


class ItemCostingModel(TenantAwareModel):
    """Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ Ú©Ø§Ù„Ø§."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    item = models.OneToOneField(
        ItemModel, on_delete=models.CASCADE,
        related_name="costing", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    costing_method = models.ForeignKey(
        CostingMethodModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("Ø±ÙˆØ´ Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ"),
    )

    standard_cost = models.DecimalField(
        _("Ø¨Ù‡Ø§ÛŒ Ø§Ø³ØªØ§Ù†Ø¯Ø§Ø±Ø¯"), max_digits=18, decimal_places=4, default=0
    )
    moving_average_cost = models.DecimalField(
        _("Ù…ÛŒØ§Ù†Ú¯ÛŒÙ† Ù…ØªØ­Ø±Ú©"), max_digits=18, decimal_places=4, default=0
    )
    last_purchase_cost = models.DecimalField(
        _("Ø¢Ø®Ø±ÛŒÙ† Ø¨Ù‡Ø§ÛŒ Ø®Ø±ÛŒØ¯"), max_digits=18, decimal_places=4, default=0
    )
    currency_code = models.CharField(_("Ø§Ø±Ø²"), max_length=10, default="IRR")
    last_cost_update_date = models.DateField(
        _("ØªØ§Ø±ÛŒØ® Ø¢Ø®Ø±ÛŒÙ† Ø¨Ø±ÙˆØ²Ø±Ø³Ø§Ù†ÛŒ Ø¨Ù‡Ø§"), null=True, blank=True
    )
    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_item_costing"
        verbose_name = _("Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ Ú©Ø§Ù„Ø§")
        verbose_name_plural = _("Ù‚ÛŒÙ…Øªâ€ŒÚ¯Ø°Ø§Ø±ÛŒ Ú©Ø§Ù„Ø§Ù‡Ø§")

    def __str__(self):
        return f"{self.item.item_code} â€” {self.costing_method.method_code}"


class CostLayerModel(TenantAwareModel):
    """Ù„Ø§ÛŒÙ‡ Ù‡Ø²ÛŒÙ†Ù‡ â€” FIFO/LIFO."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="cost_layers", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ú†"),
    )
    receipt_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø±Ø³ÛŒØ¯"))
    receipt_sle = models.ForeignKey(
        StockLedgerEntryModel, on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø«Ø¨Øª Ø±Ø³ÛŒØ¯"),
    )

    unit_cost = models.DecimalField(
        _("Ø¨Ù‡Ø§ÛŒ ÙˆØ§Ø­Ø¯"), max_digits=18, decimal_places=4
    )
    original_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± Ø§ÙˆÙ„ÛŒÙ‡"), max_digits=18, decimal_places=4
    )
    remaining_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§Ù‚ÛŒÙ…Ø§Ù†Ø¯Ù‡"), max_digits=18, decimal_places=4
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )
    currency_code = models.CharField(_("Ø§Ø±Ø²"), max_length=10, default="IRR")
    is_fully_consumed = models.BooleanField(_("Ù…ØµØ±Ùâ€ŒØ´Ø¯Ù‡"), default=False)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_cost_layer"
        verbose_name = _("Ù„Ø§ÛŒÙ‡ Ù‡Ø²ÛŒÙ†Ù‡")
        verbose_name_plural = _("Ù„Ø§ÛŒÙ‡â€ŒÙ‡Ø§ÛŒ Ù‡Ø²ÛŒÙ†Ù‡")
        indexes = [
            models.Index(fields=["tenant", "item", "warehouse", "receipt_date"]),
        ]

    def __str__(self):
        return f"{self.item.item_code} â€” {self.receipt_date} â€” {self.remaining_quantity}"


class FinancialPostingModel(TenantAwareModel):
    """Ø§Ø±Ø³Ø§Ù„ Ø¨Ù‡ Ø­Ø³Ø§Ø¨Ø¯Ø§Ø±ÛŒ."""

    class PostingStatus(models.TextChoices):
        PENDING = "PENDING", _("Ø¯Ø± Ø§Ù†ØªØ¸Ø§Ø±")
        POSTED = "POSTED", _("Ø«Ø¨Øª Ø´Ø¯Ù‡")
        FAILED = "FAILED", _("Ù†Ø§Ù…ÙˆÙÙ‚")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    stock_ledger = models.ForeignKey(
        StockLedgerEntryModel, on_delete=models.CASCADE,
        related_name="financial_postings", verbose_name=_("Ø«Ø¨Øª Ø¯ÙØªØ±"),
    )
    posting_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø«Ø¨Øª"))
    journal_entry_id = models.UUIDField(_("Ø³Ù†Ø¯ Ø­Ø³Ø§Ø¨Ø¯Ø§Ø±ÛŒ"), null=True, blank=True)

    debit_account = models.CharField(_("Ø­Ø³Ø§Ø¨ Ø¨Ø¯Ù‡Ú©Ø§Ø±"), max_length=50)
    credit_account = models.CharField(_("Ø­Ø³Ø§Ø¨ Ø¨Ø³ØªØ§Ù†Ú©Ø§Ø±"), max_length=50)
    amount = models.DecimalField(_("Ù…Ø¨Ù„Øº"), max_digits=18, decimal_places=4)
    currency_code = models.CharField(_("Ø§Ø±Ø²"), max_length=10, default="IRR")

    cost_center_id = models.UUIDField(_("Ù…Ø±Ú©Ø² Ù‡Ø²ÛŒÙ†Ù‡"), null=True, blank=True)
    project_id = models.UUIDField(_("Ù¾Ø±ÙˆÚ˜Ù‡"), null=True, blank=True)

    posting_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=20,
        choices=PostingStatus.choices, default=PostingStatus.PENDING,
    )
    error_message = models.TextField(_("Ù¾ÛŒØ§Ù… Ø®Ø·Ø§"), blank=True)
    posted_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ø±Ø³Ø§Ù„"), null=True, blank=True)
    posted_by = models.UUIDField(_("Ø§Ø±Ø³Ø§Ù„ ØªÙˆØ³Ø·"), null=True, blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_financial_posting"
        verbose_name = _("Ø§Ø±Ø³Ø§Ù„ Ù…Ø§Ù„ÛŒ")
        verbose_name_plural = _("Ø§Ø±Ø³Ø§Ù„â€ŒÙ‡Ø§ÛŒ Ù…Ø§Ù„ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "stock_ledger"]),
            models.Index(fields=["posting_status"]),
        ]

    def __str__(self):
        return f"FP-{self.stock_ledger.entry_number} ({self.posting_status})"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 6ï¸âƒ£  RESERVATION & ALLOCATION
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class StockReservationModel(TenantAwareModel):
    """Ø±Ø²Ø±Ùˆ Ù…ÙˆØ¬ÙˆØ¯ÛŒ."""

    class ReservationStatus(models.TextChoices):
        ACTIVE = "ACTIVE", _("ÙØ¹Ø§Ù„")
        PARTIALLY_ALLOCATED = "PARTIALLY_ALLOCATED", _("ØªØ®ØµÛŒØµ Ø¬Ø²Ø¦ÛŒ")
        FULLY_ALLOCATED = "FULLY_ALLOCATED", _("ØªØ®ØµÛŒØµ Ú©Ø§Ù…Ù„")
        EXPIRED = "EXPIRED", _("Ù…Ù†Ù‚Ø¶ÛŒ")
        CANCELLED = "CANCELLED", _("Ù„ØºÙˆ Ø´Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    reservation_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ø±Ø²Ø±Ùˆ"), max_length=50, unique=True
    )
    reservation_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø±Ø²Ø±Ùˆ"))

    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="reservations", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ú†"),
    )
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )

    reserved_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± Ø±Ø²Ø±Ùˆ"), max_digits=18, decimal_places=4
    )
    allocated_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± ØªØ®ØµÛŒØµ"), max_digits=18, decimal_places=4, default=0
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )

    source_document_type = models.CharField(
        _("Ù†ÙˆØ¹ Ø³Ù†Ø¯ Ù…Ø¨Ø¯Ø£"), max_length=50, blank=True
    )
    source_document_id = models.UUIDField(_("Ø³Ù†Ø¯ Ù…Ø¨Ø¯Ø£"), null=True, blank=True)
    source_document_line_id = models.UUIDField(_("Ø®Ø· Ø³Ù†Ø¯"), null=True, blank=True)

    priority_level = models.PositiveIntegerField(_("Ø§ÙˆÙ„ÙˆÛŒØª"), default=5)
    expiry_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ù†Ù‚Ø¶Ø§ÛŒ Ø±Ø²Ø±Ùˆ"), null=True, blank=True)
    reservation_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=30,
        choices=ReservationStatus.choices, default=ReservationStatus.ACTIVE,
    )

    required_by_date = models.DateField(_("Ù†ÛŒØ§Ø² ØªØ§ ØªØ§Ø±ÛŒØ®"), null=True, blank=True)
    requested_by_user_id = models.UUIDField(_("Ø¯Ø±Ø®ÙˆØ§Ø³Øªâ€ŒÚ©Ù†Ù†Ø¯Ù‡"), null=True, blank=True)
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    cancelled_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ù„ØºÙˆ"), null=True, blank=True)
    cancelled_by = models.UUIDField(_("Ù„ØºÙˆ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_reservation"
        verbose_name = _("Ø±Ø²Ø±Ùˆ Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        verbose_name_plural = _("Ø±Ø²Ø±ÙˆÙ‡Ø§ÛŒ Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "item", "reservation_status"]),
        ]

    def __str__(self):
        return f"{self.reservation_number} â€” {self.item.item_code}"


class StockAllocationModel(TenantAwareModel):
    """ØªØ®ØµÛŒØµ Ù…ÙˆØ¬ÙˆØ¯ÛŒ."""

    class AllocationStatus(models.TextChoices):
        ALLOCATED = "ALLOCATED", _("ØªØ®ØµÛŒØµâ€ŒÛŒØ§ÙØªÙ‡")
        PARTIALLY_PICKED = "PARTIALLY_PICKED", _("Ø¨Ø±Ø¯Ø§Ø´Øª Ø¬Ø²Ø¦ÛŒ")
        FULLY_PICKED = "FULLY_PICKED", _("Ø¨Ø±Ø¯Ø§Ø´Øª Ú©Ø§Ù…Ù„")
        CANCELLED = "CANCELLED", _("Ù„ØºÙˆ Ø´Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    allocation_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ ØªØ®ØµÛŒØµ"), max_length=50, unique=True
    )
    allocation_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªØ®ØµÛŒØµ"))
    reservation = models.ForeignKey(
        StockReservationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="allocations", verbose_name=_("Ø±Ø²Ø±Ùˆ"),
    )

    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ú†"),
    )
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )

    allocated_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± ØªØ®ØµÛŒØµ"), max_digits=18, decimal_places=4
    )
    picked_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø±Ø¯Ø§Ø´Øª"), max_digits=18, decimal_places=4, default=0
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )

    source_document_type = models.CharField(
        _("Ù†ÙˆØ¹ Ø³Ù†Ø¯"), max_length=50, blank=True
    )
    source_document_id = models.UUIDField(_("Ø³Ù†Ø¯"), null=True, blank=True)
    source_document_line_id = models.UUIDField(_("Ø®Ø· Ø³Ù†Ø¯"), null=True, blank=True)

    allocation_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=30,
        choices=AllocationStatus.choices, default=AllocationStatus.ALLOCATED,
    )
    picking_user_id = models.UUIDField(_("Ø¨Ø±Ø¯Ø§Ø´Øªâ€ŒÚ©Ù†Ù†Ø¯Ù‡"), null=True, blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_allocation"
        verbose_name = _("ØªØ®ØµÛŒØµ Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        verbose_name_plural = _("ØªØ®ØµÛŒØµâ€ŒÙ‡Ø§ÛŒ Ù…ÙˆØ¬ÙˆØ¯ÛŒ")

    def __str__(self):
        return f"{self.allocation_number} â€” {self.item.item_code}"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 7ï¸âƒ£  PHYSICAL INVENTORY
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class PhysicalInventoryModel(TenantAwareModel):
    """Ø³Ù†Ø¯ Ø´Ù…Ø§Ø±Ø´ ÙÛŒØ²ÛŒÚ©ÛŒ."""

    class InventoryType(models.TextChoices):
        FULL = "FULL", _("Ú©Ø§Ù…Ù„")
        PARTIAL = "PARTIAL", _("Ø¬Ø²Ø¦ÛŒ")
        CYCLE_COUNT = "CYCLE_COUNT", _("Ú†Ø±Ø®Ø´ÛŒ")

    class InventoryStatus(models.TextChoices):
        DRAFT = "DRAFT", _("Ù¾ÛŒØ´â€ŒÙ†ÙˆÛŒØ³")
        IN_PROGRESS = "IN_PROGRESS", _("Ø¯Ø± Ø­Ø§Ù„ Ø§Ù†Ø¬Ø§Ù…")
        COUNTING = "COUNTING", _("Ø´Ù…Ø§Ø±Ø´")
        COMPLETED = "COMPLETED", _("ØªÚ©Ù…ÛŒÙ„â€ŒØ´Ø¯Ù‡")
        CANCELLED = "CANCELLED", _("Ù„ØºÙˆ Ø´Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    inventory_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ø´Ù…Ø§Ø±Ø´"), max_length=50, unique=True
    )
    inventory_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø´Ù…Ø§Ø±Ø´"))
    inventory_type = models.CharField(
        _("Ù†ÙˆØ¹"), max_length=20,
        choices=InventoryType.choices, default=InventoryType.FULL,
    )

    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    item_group = models.ForeignKey(
        "ItemGroupModel", on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ú¯Ø±ÙˆÙ‡ Ú©Ø§Ù„Ø§"),
    )
    abc_class_filter = models.CharField(_("ÙÛŒÙ„ØªØ± ABC"), max_length=20, blank=True)

    inventory_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=20,
        choices=InventoryStatus.choices, default=InventoryStatus.DRAFT,
    )
    is_blind_count = models.BooleanField(_("Ø´Ù…Ø§Ø±Ø´ Ú©ÙˆØ±"), default=False)
    is_stock_frozen = models.BooleanField(_("ÙØ±ÛŒØ² Ù…ÙˆØ¬ÙˆØ¯ÛŒ"), default=False)

    required_count_times = models.PositiveIntegerField(_("ØªØ¹Ø¯Ø§Ø¯ Ø¯ÙØ¹Ø§Øª Ø´Ù…Ø§Ø±Ø´"), default=1)
    variance_threshold_percent = models.DecimalField(
        _("Ø¢Ø³ØªØ§Ù†Ù‡ Ø§Ù†Ø­Ø±Ø§Ù (Ùª)"), max_digits=5, decimal_places=2, default=5
    )

    scheduled_start_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø±Ù†Ø§Ù…Ù‡â€ŒØ±ÛŒØ²ÛŒ"), null=True, blank=True)
    actual_start_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø´Ø±ÙˆØ¹ ÙˆØ§Ù‚Ø¹ÛŒ"), null=True, blank=True)
    completed_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÚ©Ù…ÛŒÙ„"), null=True, blank=True)

    responsible_user_id = models.UUIDField(_("Ù…Ø³Ø¦ÙˆÙ„"), null=True, blank=True)
    approved_by = models.UUIDField(_("ØªØ£ÛŒÛŒØ¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    approved_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªØ£ÛŒÛŒØ¯"), null=True, blank=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)

    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_physical_inventory"
        verbose_name = _("Ø´Ù…Ø§Ø±Ø´ ÙÛŒØ²ÛŒÚ©ÛŒ")
        verbose_name_plural = _("Ø´Ù…Ø§Ø±Ø´â€ŒÙ‡Ø§ÛŒ ÙÛŒØ²ÛŒÚ©ÛŒ")

    def __str__(self):
        return f"{self.inventory_number} ({self.inventory_status})"


class PhysicalInventoryLineModel(TenantAwareModel):
    """Ø§Ù‚Ù„Ø§Ù… Ø´Ù…Ø§Ø±Ø´ ÙÛŒØ²ÛŒÚ©ÛŒ."""

    class LineStatus(models.TextChoices):
        PENDING = "PENDING", _("Ø¯Ø± Ø§Ù†ØªØ¸Ø§Ø±")
        COUNTED = "COUNTED", _("Ø´Ù…Ø§Ø±Ø´â€ŒØ´Ø¯Ù‡")
        VARIANCE_APPROVED = "VARIANCE_APPROVED", _("Ø§Ù†Ø­Ø±Ø§Ù ØªØ£ÛŒÛŒØ¯ Ø´Ø¯Ù‡")
        ADJUSTED = "ADJUSTED", _("ØªØ¹Ø¯ÛŒÙ„â€ŒØ´Ø¯Ù‡")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    physical_inventory = models.ForeignKey(
        PhysicalInventoryModel, on_delete=models.CASCADE,
        related_name="lines", verbose_name=_("Ø´Ù…Ø§Ø±Ø´ ÙÛŒØ²ÛŒÚ©ÛŒ"),
    )
    line_number = models.PositiveIntegerField(_("Ø´Ù…Ø§Ø±Ù‡ Ø±Ø¯ÛŒÙ"))

    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    location = models.ForeignKey(
        StorageLocationModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ù…Ú©Ø§Ù†"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ú†"),
    )
    serial_number = models.ForeignKey(
        SerialNumberModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø³Ø±ÛŒØ§Ù„"),
    )

    book_quantity = models.DecimalField(
        _("Ù…ÙˆØ¬ÙˆØ¯ÛŒ Ø³ÛŒØ³ØªÙ…ÛŒ"), max_digits=18, decimal_places=4
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )

    # Counts
    first_count_quantity = models.DecimalField(
        _("Ø´Ù…Ø§Ø±Ø´ Ø§ÙˆÙ„"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    first_count_by = models.UUIDField(_("Ø´Ù…Ø§Ø±Ø´â€ŒÚ©Ù†Ù†Ø¯Ù‡ Ø§ÙˆÙ„"), null=True, blank=True)
    first_count_date = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø´Ù…Ø§Ø±Ø´ Ø§ÙˆÙ„"), null=True, blank=True)

    second_count_quantity = models.DecimalField(
        _("Ø´Ù…Ø§Ø±Ø´ Ø¯ÙˆÙ…"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    second_count_by = models.UUIDField(_("Ø´Ù…Ø§Ø±Ø´â€ŒÚ©Ù†Ù†Ø¯Ù‡ Ø¯ÙˆÙ…"), null=True, blank=True)
    second_count_date = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø´Ù…Ø§Ø±Ø´ Ø¯ÙˆÙ…"), null=True, blank=True)

    third_count_quantity = models.DecimalField(
        _("Ø´Ù…Ø§Ø±Ø´ Ø³ÙˆÙ…"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    third_count_by = models.UUIDField(_("Ø´Ù…Ø§Ø±Ø´â€ŒÚ©Ù†Ù†Ø¯Ù‡ Ø³ÙˆÙ…"), null=True, blank=True)
    third_count_date = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø´Ù…Ø§Ø±Ø´ Ø³ÙˆÙ…"), null=True, blank=True)

    # Final
    final_count_quantity = models.DecimalField(
        _("Ø´Ù…Ø§Ø±Ø´ Ù†Ù‡Ø§ÛŒÛŒ"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    variance_quantity = models.DecimalField(
        _("Ø§Ù†Ø­Ø±Ø§Ù Ù…Ù‚Ø¯Ø§Ø±ÛŒ"), max_digits=18, decimal_places=4, default=0
    )
    variance_percent = models.DecimalField(
        _("Ø§Ù†Ø­Ø±Ø§Ù Ø¯Ø±ØµØ¯ÛŒ"), max_digits=8, decimal_places=2, default=0
    )
    variance_value = models.DecimalField(
        _("Ø§Ù†Ø­Ø±Ø§Ù Ø±ÛŒØ§Ù„ÛŒ"), max_digits=18, decimal_places=4, default=0
    )

    line_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=30,
        choices=LineStatus.choices, default=LineStatus.PENDING,
    )
    variance_reason_code = models.CharField(_("Ú©Ø¯ Ø¯Ù„ÛŒÙ„ Ø§Ù†Ø­Ø±Ø§Ù"), max_length=50, blank=True)
    variance_remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª Ø§Ù†Ø­Ø±Ø§Ù"), blank=True)
    approved_by = models.UUIDField(_("ØªØ£ÛŒÛŒØ¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    approved_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªØ£ÛŒÛŒØ¯"), null=True, blank=True)

    adjustment_sle = models.ForeignKey(
        StockLedgerEntryModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø«Ø¨Øª ØªØ¹Ø¯ÛŒÙ„"),
    )

    class Meta:
        app_label = "inventory"
        db_table = "inv_physical_inventory_line"
        verbose_name = _("Ø±Ø¯ÛŒÙ Ø´Ù…Ø§Ø±Ø´")
        verbose_name_plural = _("Ø±Ø¯ÛŒÙâ€ŒÙ‡Ø§ÛŒ Ø´Ù…Ø§Ø±Ø´")
        ordering = ["line_number"]

    def __str__(self):
        return f"Line {self.line_number} â€” {self.item.item_code}"


class CycleCountScheduleModel(TenantAwareModel):
    """Ø¨Ø±Ù†Ø§Ù…Ù‡ Ø´Ù…Ø§Ø±Ø´ Ú†Ø±Ø®Ø´ÛŒ."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    schedule_name = models.CharField(_("Ù†Ø§Ù… Ø¨Ø±Ù†Ø§Ù…Ù‡"), max_length=255)
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    count_frequency_days = models.PositiveIntegerField(_("ÙØ§ØµÙ„Ù‡ Ø´Ù…Ø§Ø±Ø´ (Ø±ÙˆØ²)"), default=30)

    item_group = models.ForeignKey(
        "ItemGroupModel", on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ú¯Ø±ÙˆÙ‡ Ú©Ø§Ù„Ø§"),
    )
    abc_class = models.CharField(_("Ø·Ø¨Ù‚Ù‡ ABC"), max_length=5, blank=True)
    high_value_items_only = models.BooleanField(_("ÙÙ‚Ø· Ø§Ù‚Ù„Ø§Ù… Ø¨Ø§Ø§Ø±Ø²Ø´"), default=False)

    next_count_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø´Ù…Ø§Ø±Ø´ Ø¨Ø¹Ø¯ÛŒ"), null=True, blank=True)
    last_count_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø¢Ø®Ø±ÛŒÙ† Ø´Ù…Ø§Ø±Ø´"), null=True, blank=True)

    is_active = models.BooleanField(_("ÙØ¹Ø§Ù„"), default=True)
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)
    created_by = models.UUIDField(_("Ø§ÛŒØ¬Ø§Ø¯ ØªÙˆØ³Ø·"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_cycle_count_schedule"
        verbose_name = _("Ø¨Ø±Ù†Ø§Ù…Ù‡ Ø´Ù…Ø§Ø±Ø´ Ú†Ø±Ø®Ø´ÛŒ")
        verbose_name_plural = _("Ø¨Ø±Ù†Ø§Ù…Ù‡â€ŒÙ‡Ø§ÛŒ Ø´Ù…Ø§Ø±Ø´ Ú†Ø±Ø®Ø´ÛŒ")

    def __str__(self):
        return self.schedule_name


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 8ï¸âƒ£  QUALITY MANAGEMENT
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class InspectionLotModel(TenantAwareModel):
    """Ù„Ø§Øª Ø¨Ø§Ø²Ø±Ø³ÛŒ."""

    class InspectionType(models.TextChoices):
        INCOMING = "INCOMING", _("ÙˆØ±ÙˆØ¯ÛŒ")
        IN_PROCESS = "IN_PROCESS", _("Ø­ÛŒÙ† ÙØ±Ø¢ÛŒÙ†Ø¯")
        OUTGOING = "OUTGOING", _("Ø®Ø±ÙˆØ¬ÛŒ")

    class InspectionStatus(models.TextChoices):
        PENDING = "PENDING", _("Ø¯Ø± Ø§Ù†ØªØ¸Ø§Ø±")
        IN_PROGRESS = "IN_PROGRESS", _("Ø¯Ø± Ø­Ø§Ù„ Ø¨Ø§Ø²Ø±Ø³ÛŒ")
        COMPLETED = "COMPLETED", _("ØªÚ©Ù…ÛŒÙ„â€ŒØ´Ø¯Ù‡")

    class QualityDecision(models.TextChoices):
        PENDING = "PENDING", _("Ø¯Ø± Ø§Ù†ØªØ¸Ø§Ø±")
        ACCEPTED = "ACCEPTED", _("Ù¾Ø°ÛŒØ±Ø´")
        REJECTED = "REJECTED", _("Ø±Ø¯")
        CONDITIONAL = "CONDITIONAL", _("Ù…Ø´Ø±ÙˆØ·")
        REWORK = "REWORK", _("Ø¨Ø§Ø²Ú©Ø§Ø±")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    inspection_lot_number = models.CharField(
        _("Ø´Ù…Ø§Ø±Ù‡ Ù„Ø§Øª Ø¨Ø§Ø²Ø±Ø³ÛŒ"), max_length=50, unique=True
    )
    inspection_type = models.CharField(
        _("Ù†ÙˆØ¹"), max_length=20,
        choices=InspectionType.choices, default=InspectionType.INCOMING,
    )
    inspection_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø¨Ø§Ø²Ø±Ø³ÛŒ"))

    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="inspections", verbose_name=_("Ø¨Ú†"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )

    source_document_type = models.CharField(_("Ù†ÙˆØ¹ Ø³Ù†Ø¯"), max_length=50, blank=True)
    source_document_id = models.UUIDField(_("Ø³Ù†Ø¯ Ù…Ø¨Ø¯Ø£"), null=True, blank=True)
    source_sle = models.ForeignKey(
        StockLedgerEntryModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø«Ø¨Øª Ø¯ÙØªØ±"),
    )

    inspection_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø± Ø¨Ø§Ø²Ø±Ø³ÛŒ"), max_digits=18, decimal_places=4
    )
    sample_size = models.DecimalField(
        _("Ø­Ø¬Ù… Ù†Ù…ÙˆÙ†Ù‡"), max_digits=18, decimal_places=4, default=0
    )
    uom = models.ForeignKey(
        UnitOfMeasureModel, on_delete=models.PROTECT,
        related_name="+", verbose_name=_("ÙˆØ§Ø­Ø¯"),
    )

    inspection_status = models.CharField(
        _("ÙˆØ¶Ø¹ÛŒØª"), max_length=20,
        choices=InspectionStatus.choices, default=InspectionStatus.PENDING,
    )
    quality_decision = models.CharField(
        _("ØªØµÙ…ÛŒÙ… Ú©ÛŒÙÛŒ"), max_length=20,
        choices=QualityDecision.choices, default=QualityDecision.PENDING,
    )

    inspection_start_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø´Ø±ÙˆØ¹"), null=True, blank=True)
    inspection_complete_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÚ©Ù…ÛŒÙ„"), null=True, blank=True)

    inspector_id = models.UUIDField(_("Ø¨Ø§Ø²Ø±Ø³"), null=True, blank=True)
    approved_by = models.UUIDField(_("ØªØ£ÛŒÛŒØ¯ ØªÙˆØ³Ø·"), null=True, blank=True)
    approved_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªØ£ÛŒÛŒØ¯"), null=True, blank=True)

    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)
    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )
    created_at = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø§ÛŒØ¬Ø§Ø¯"), auto_now_add=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_inspection_lot"
        verbose_name = _("Ù„Ø§Øª Ø¨Ø§Ø²Ø±Ø³ÛŒ")
        verbose_name_plural = _("Ù„Ø§Øªâ€ŒÙ‡Ø§ÛŒ Ø¨Ø§Ø²Ø±Ø³ÛŒ")

    def __str__(self):
        return f"{self.inspection_lot_number} ({self.quality_decision})"


class InspectionResultModel(TenantAwareModel):
    """Ù†ØªØ§ÛŒØ¬ Ø¨Ø§Ø²Ø±Ø³ÛŒ."""

    class ResultStatus(models.TextChoices):
        PASS = "PASS", _("Ù‚Ø¨ÙˆÙ„")
        FAIL = "FAIL", _("Ø±Ø¯")
        WARNING = "WARNING", _("Ù‡Ø´Ø¯Ø§Ø±")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    inspection_lot = models.ForeignKey(
        InspectionLotModel, on_delete=models.CASCADE,
        related_name="results", verbose_name=_("Ù„Ø§Øª Ø¨Ø§Ø²Ø±Ø³ÛŒ"),
    )
    inspection_characteristic = models.CharField(_("ÙˆÛŒÚ˜Ú¯ÛŒ Ø¨Ø§Ø²Ø±Ø³ÛŒ"), max_length=255)
    target_value = models.CharField(_("Ù…Ù‚Ø¯Ø§Ø± Ù‡Ø¯Ù"), max_length=255, blank=True)
    actual_value = models.CharField(_("Ù…Ù‚Ø¯Ø§Ø± ÙˆØ§Ù‚Ø¹ÛŒ"), max_length=255)
    tolerance_lower = models.DecimalField(
        _("Ø­Ø¯ Ù¾Ø§ÛŒÛŒÙ† ØªÙ„Ø±Ø§Ù†Ø³"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    tolerance_upper = models.DecimalField(
        _("Ø­Ø¯ Ø¨Ø§Ù„Ø§ÛŒ ØªÙ„Ø±Ø§Ù†Ø³"), max_digits=18, decimal_places=4, null=True, blank=True
    )
    result_status = models.CharField(
        _("Ù†ØªÛŒØ¬Ù‡"), max_length=20,
        choices=ResultStatus.choices, default=ResultStatus.PASS,
    )
    tested_by = models.UUIDField(_("Ø¢Ø²Ù…Ø§ÛŒØ´â€ŒÚ©Ù†Ù†Ø¯Ù‡"), null=True, blank=True)
    tested_date = models.DateTimeField(_("ØªØ§Ø±ÛŒØ® Ø¢Ø²Ù…Ø§ÛŒØ´"), null=True, blank=True)
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_inspection_result"
        verbose_name = _("Ù†ØªÛŒØ¬Ù‡ Ø¨Ø§Ø²Ø±Ø³ÛŒ")
        verbose_name_plural = _("Ù†ØªØ§ÛŒØ¬ Ø¨Ø§Ø²Ø±Ø³ÛŒ")

    def __str__(self):
        return f"{self.inspection_characteristic}: {self.result_status}"


class QualityActionModel(TenantAwareModel):
    """Ø§Ù‚Ø¯Ø§Ù… Ú©ÛŒÙÛŒ."""

    class ActionType(models.TextChoices):
        BLOCK = "BLOCK", _("Ù…Ø³Ø¯ÙˆØ¯")
        QUARANTINE = "QUARANTINE", _("Ù‚Ø±Ù†Ø·ÛŒÙ†Ù‡")
        REWORK = "REWORK", _("Ø¨Ø§Ø²Ú©Ø§Ø±")
        SCRAP = "SCRAP", _("Ø¶Ø§ÛŒØ¹Ø§Øª")
        RETURN_TO_VENDOR = "RETURN_TO_VENDOR", _("Ù…Ø±Ø¬ÙˆØ¹ÛŒ ØªØ£Ù…ÛŒÙ†â€ŒÚ©Ù†Ù†Ø¯Ù‡")
        RELEASE = "RELEASE", _("Ø¢Ø²Ø§Ø¯Ø³Ø§Ø²ÛŒ")

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    inspection_lot = models.ForeignKey(
        InspectionLotModel, on_delete=models.CASCADE,
        related_name="actions", verbose_name=_("Ù„Ø§Øª Ø¨Ø§Ø²Ø±Ø³ÛŒ"),
    )
    action_type = models.CharField(
        _("Ù†ÙˆØ¹ Ø§Ù‚Ø¯Ø§Ù…"), max_length=30,
        choices=ActionType.choices,
    )
    action_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø§Ù‚Ø¯Ø§Ù…"))
    action_quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø±"), max_digits=18, decimal_places=4
    )
    target_stock_status = models.ForeignKey(
        StockStatusModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("ÙˆØ¶Ø¹ÛŒØª Ù‡Ø¯Ù"),
    )
    action_by = models.UUIDField(_("ØªÙˆØ³Ø·"), null=True, blank=True)
    remarks = models.TextField(_("ØªÙˆØ¶ÛŒØ­Ø§Øª"), blank=True)
    completed_date = models.DateField(_("ØªØ§Ø±ÛŒØ® ØªÚ©Ù…ÛŒÙ„"), null=True, blank=True)

    class Meta:
        app_label = "inventory"
        db_table = "inv_quality_action"
        verbose_name = _("Ø§Ù‚Ø¯Ø§Ù… Ú©ÛŒÙÛŒ")
        verbose_name_plural = _("Ø§Ù‚Ø¯Ø§Ù…Ø§Øª Ú©ÛŒÙÛŒ")

    def __str__(self):
        return f"{self.action_type} â€” {self.action_quantity}"


# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•
# 9ï¸âƒ£  REPORTING AGGREGATES
# â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•â•


class StockMovementSummaryModel(TenantAwareModel):
    """Ø®Ù„Ø§ØµÙ‡ Ø­Ø±Ú©Ø§Øª â€” Aggregate Table."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    summary_date = models.DateField(_("ØªØ§Ø±ÛŒØ®"), db_index=True)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    transaction_type = models.CharField(_("Ù†ÙˆØ¹ ØªØ±Ø§Ú©Ù†Ø´"), max_length=20, db_index=True)

    total_in_quantity = models.DecimalField(
        _("Ú©Ù„ ÙˆØ±ÙˆØ¯ÛŒ"), max_digits=18, decimal_places=4, default=0
    )
    total_out_quantity = models.DecimalField(
        _("Ú©Ù„ Ø®Ø±ÙˆØ¬ÛŒ"), max_digits=18, decimal_places=4, default=0
    )
    net_quantity = models.DecimalField(
        _("Ø®Ø§Ù„Øµ"), max_digits=18, decimal_places=4, default=0
    )
    total_in_value = models.DecimalField(
        _("Ø§Ø±Ø²Ø´ ÙˆØ±ÙˆØ¯ÛŒ"), max_digits=18, decimal_places=4, default=0
    )
    total_out_value = models.DecimalField(
        _("Ø§Ø±Ø²Ø´ Ø®Ø±ÙˆØ¬ÛŒ"), max_digits=18, decimal_places=4, default=0
    )
    transaction_count = models.PositiveIntegerField(_("ØªØ¹Ø¯Ø§Ø¯ ØªØ±Ø§Ú©Ù†Ø´"), default=0)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_movement_summary"
        verbose_name = _("Ø®Ù„Ø§ØµÙ‡ Ø­Ø±Ú©Ø§Øª")
        verbose_name_plural = _("Ø®Ù„Ø§ØµÙ‡ Ø­Ø±Ú©Ø§Øª")
        indexes = [
            models.Index(fields=["tenant", "item", "warehouse", "summary_date"]),
        ]

    def __str__(self):
        return f"{self.summary_date} â€” {self.item.item_code}"


class StockAgingBucketModel(TenantAwareModel):
    """Ø³Ø·Ù„â€ŒÙ‡Ø§ÛŒ Ø¹Ù…Ø± Ù…ÙˆØ¬ÙˆØ¯ÛŒ."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    item = models.ForeignKey(
        ItemModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ú©Ø§Ù„Ø§"),
    )
    warehouse = models.ForeignKey(
        WarehouseModel, on_delete=models.CASCADE,
        related_name="+", verbose_name=_("Ø§Ù†Ø¨Ø§Ø±"),
    )
    batch = models.ForeignKey(
        BatchModel, on_delete=models.SET_NULL, null=True, blank=True,
        related_name="+", verbose_name=_("Ø¨Ú†"),
    )

    age_in_days = models.PositiveIntegerField(_("Ø³Ù† (Ø±ÙˆØ²)"), default=0)
    aging_category = models.CharField(_("Ø¯Ø³ØªÙ‡ Ø³Ù†ÛŒ"), max_length=20)
    quantity = models.DecimalField(
        _("Ù…Ù‚Ø¯Ø§Ø±"), max_digits=18, decimal_places=4, default=0
    )
    value = models.DecimalField(
        _("Ø§Ø±Ø²Ø´"), max_digits=18, decimal_places=4, default=0
    )
    snapshot_date = models.DateField(_("ØªØ§Ø±ÛŒØ® Ø¹Ú©Ø³â€ŒØ¨Ø±Ø¯Ø§Ø±ÛŒ"), db_index=True)

    company = models.ForeignKey(
        "core_organization.Company", on_delete=models.SET_NULL,
        null=True, blank=True, related_name="+", verbose_name=_("Ø´Ø±Ú©Øª"),
    )

    class Meta:
        app_label = "inventory"
        db_table = "inv_stock_aging_bucket"
        verbose_name = _("Ø³Ø·Ù„ Ø¹Ù…Ø± Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        verbose_name_plural = _("Ø³Ø·Ù„â€ŒÙ‡Ø§ÛŒ Ø¹Ù…Ø± Ù…ÙˆØ¬ÙˆØ¯ÛŒ")
        indexes = [
            models.Index(fields=["tenant", "snapshot_date"]),
        ]

    def __str__(self):
        return f"{self.item.item_code} â€” {self.aging_category} ({self.quantity})"
