fix filter purchase query param and search

This commit is contained in:
ragilap
2026-04-01 15:58:00 +07:00
committed by giovanni
parent 079ae01b94
commit 2a3154042c
@@ -175,6 +175,7 @@ func (s *purchaseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]enti
for i := range approvalStatuses { for i := range approvalStatuses {
approvalStatuses[i] = normalizeApprovalStatusFilter(approvalStatuses[i]) 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 { purchases, total, err := s.PurchaseRepo.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
db = s.withRelations(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) db = db.Where("purchases.po_date >= ?", *poDateStart)
} }
if poDateStart != nil {
db = db.Where("purchases.po_date >= ?", *poDateStart)
}
if poDateEnd != nil { if poDateEnd != nil {
db = db.Where("purchases.po_date < ?", *poDateEnd) db = db.Where("purchases.po_date < ?", *poDateEnd)
} }
if scope.Restrict { if scope.Restrict {
if len(scope.IDs) == 0 { if len(scope.IDs) == 0 {
return db.Where("1 = 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") return db.Order("created_at DESC").Order("purchases.id DESC")
}) })