from django.db.models import Q from apps.warehouse.models import InventoryEntry from django.db.models.functions import TruncDate class InventoryEntrySearch: def __init__(self, query: str = None, start_date: str = None, end_date: str = None): self.query = (query or '').strip() self.start_date = start_date self.end_date = end_date def search(self): """ multi term search & filter by date range """ queryset = InventoryEntry.objects.all() if self.start_date or self.end_date: queryset = queryset.annotate(date_only=TruncDate('create_date')) if self.start_date: queryset = queryset.filter(date_only__gte=self.start_date) if self.end_date: queryset = queryset.filter(date_only__lte=self.end_date) # convert string to list of words if self.query: keywords = [word.strip() for word in self.query.split(',') if word.strip()] if keywords: combined_q = Q() for keyword in keywords: combined_q |= Q(distribution__distribution_id__icontains=keyword) combined_q |= Q(organization__name__icontains=keyword) combined_q |= Q(weight__icontains=keyword) combined_q |= Q(balance__icontains=keyword) combined_q |= Q(lading_number__icontains=keyword) combined_q |= Q(is_confirmed__icontains=keyword) queryset = queryset.filter(combined_q) return queryset.distinct()