diff --git a/internal/modules/purchases/services/purchase.service.go b/internal/modules/purchases/services/purchase.service.go index a48e103d..5afc24a0 100644 --- a/internal/modules/purchases/services/purchase.service.go +++ b/internal/modules/purchases/services/purchase.service.go @@ -175,6 +175,7 @@ func (s *purchaseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]enti for i := range approvalStatuses { approvalStatuses[i] = normalizeApprovalStatusFilter(approvalStatuses[i]) } + approvalStatus := normalizeApprovalStatusFilter(params.ApprovalStatus) purchases, total, err := s.PurchaseRepo.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB { db = s.withRelations(db) @@ -195,9 +196,14 @@ func (s *purchaseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]enti db = db.Where("purchases.po_date >= ?", *poDateStart) } + if poDateStart != nil { + db = db.Where("purchases.po_date >= ?", *poDateStart) + } + if poDateEnd != nil { db = db.Where("purchases.po_date < ?", *poDateEnd) } + if scope.Restrict { if len(scope.IDs) == 0 { return db.Where("1 = 0") @@ -320,6 +326,70 @@ func (s *purchaseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]enti ) } + if approvalStatus != "" { + approvalLike := "%" + approvalStatus + "%" + db = db.Where( + `EXISTS ( + SELECT 1 + FROM approvals a + WHERE a.approvable_type = ? + AND a.approvable_id = purchases.id + AND a.id = ( + SELECT a2.id + FROM approvals a2 + WHERE a2.approvable_type = ? + AND a2.approvable_id = purchases.id + ORDER BY a2.action_at DESC, a2.id DESC + LIMIT 1 + ) + AND ( + LOWER(COALESCE(a.step_name, '')) LIKE ? + OR LOWER(COALESCE(CAST(a.action AS TEXT), '')) LIKE ? + OR CAST(a.step_number AS TEXT) = ? + ) + )`, + utils.ApprovalWorkflowPurchase.String(), + utils.ApprovalWorkflowPurchase.String(), + approvalLike, + approvalLike, + approvalStatus, + ) + } + + if search != "" { + like := "%" + search + "%" + db = db.Where( + `( + LOWER(COALESCE(purchases.pr_number, '')) LIKE ? + OR LOWER(COALESCE(purchases.po_number, '')) LIKE ? + OR EXISTS ( + SELECT 1 + FROM suppliers s + WHERE s.id = purchases.supplier_id + AND LOWER(COALESCE(s.name, '')) LIKE ? + ) + OR EXISTS ( + SELECT 1 + FROM users u + WHERE u.id = purchases.created_by + AND LOWER(COALESCE(u.name, '')) LIKE ? + ) + OR EXISTS ( + SELECT 1 + FROM purchase_items pi + JOIN products p ON p.id = pi.product_id + WHERE pi.purchase_id = purchases.id + AND LOWER(COALESCE(p.name, '')) LIKE ? + ) + )`, + like, + like, + like, + like, + like, + ) + } + return db.Order("created_at DESC").Order("purchases.id DESC") })