mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-23 14:55:42 +00:00
feat: filter improvement
This commit is contained in:
@@ -85,6 +85,102 @@ func (s deliveryOrdersService) withRelations(db *gorm.DB) *gorm.DB {
|
||||
Preload("Products.DeliveryProduct")
|
||||
}
|
||||
|
||||
func (s deliveryOrdersService) marketingOwnerRelationQuery(ctx context.Context) *gorm.DB {
|
||||
return s.MarketingRepo.DB().
|
||||
WithContext(ctx).
|
||||
Table("marketing_products mp").
|
||||
Select("1").
|
||||
Joins("JOIN product_warehouses pw ON pw.id = mp.product_warehouse_id").
|
||||
Joins("LEFT JOIN project_flock_kandangs pfk ON pfk.id = pw.project_flock_kandang_id").
|
||||
Joins("LEFT JOIN project_flocks pf ON pf.id = pfk.project_flock_id").
|
||||
Joins("LEFT JOIN warehouses w ON w.id = pw.warehouse_id").
|
||||
Joins("LEFT JOIN kandangs k ON k.id = COALESCE(pfk.kandang_id, w.kandang_id)").
|
||||
Where("mp.marketing_id = marketings.id")
|
||||
}
|
||||
|
||||
func (s deliveryOrdersService) marketingAttributionRelationQuery(ctx context.Context) *gorm.DB {
|
||||
baseDB := s.MarketingRepo.DB().WithContext(ctx)
|
||||
return baseDB.
|
||||
Table("marketing_delivery_products mdp").
|
||||
Select("1").
|
||||
Joins("JOIN marketing_products mp ON mp.id = mdp.marketing_product_id").
|
||||
Joins("JOIN (?) AS mda ON mda.marketing_delivery_product_id = mdp.id", commonRepo.MarketingDeliveryAttributionRowsQuery(baseDB)).
|
||||
Joins("JOIN project_flock_kandangs pfk_attr ON pfk_attr.id = mda.project_flock_kandang_id").
|
||||
Joins("JOIN project_flocks pf_attr ON pf_attr.id = pfk_attr.project_flock_id").
|
||||
Joins("JOIN kandangs k_attr ON k_attr.id = pfk_attr.kandang_id").
|
||||
Where("mp.marketing_id = marketings.id")
|
||||
}
|
||||
|
||||
func (s deliveryOrdersService) applyMarketingProjectFlockFilter(ctx context.Context, db *gorm.DB, projectFlockID, projectFlockKandangID uint) *gorm.DB {
|
||||
if projectFlockID > 0 {
|
||||
db = db.Where(
|
||||
"(EXISTS (?) OR EXISTS (?))",
|
||||
s.marketingOwnerRelationQuery(ctx).Where("pfk.project_flock_id = ?", projectFlockID),
|
||||
s.marketingAttributionRelationQuery(ctx).Where("mda.project_flock_id = ?", projectFlockID),
|
||||
)
|
||||
}
|
||||
|
||||
if projectFlockKandangID > 0 {
|
||||
db = db.Where(
|
||||
"(EXISTS (?) OR EXISTS (?))",
|
||||
s.marketingOwnerRelationQuery(ctx).Where("pw.project_flock_kandang_id = ?", projectFlockKandangID),
|
||||
s.marketingAttributionRelationQuery(ctx).Where("mda.project_flock_kandang_id = ?", projectFlockKandangID),
|
||||
)
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
func (s deliveryOrdersService) applyMarketingSearchFilter(ctx context.Context, db *gorm.DB, rawSearch string) *gorm.DB {
|
||||
searchPattern := "%" + strings.TrimSpace(rawSearch) + "%"
|
||||
if searchPattern == "%%" {
|
||||
return db
|
||||
}
|
||||
|
||||
return db.Where(
|
||||
`(
|
||||
marketings.so_number ILIKE ? OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM customers c
|
||||
WHERE c.id = marketings.customer_id
|
||||
AND c.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM users su
|
||||
WHERE su.id = marketings.sales_person_id
|
||||
AND su.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM marketing_products mp
|
||||
JOIN product_warehouses pw ON pw.id = mp.product_warehouse_id
|
||||
JOIN products p ON p.id = pw.product_id
|
||||
WHERE mp.marketing_id = marketings.id
|
||||
AND p.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM marketing_products mp
|
||||
JOIN product_warehouses pw ON pw.id = mp.product_warehouse_id
|
||||
JOIN warehouses w ON w.id = pw.warehouse_id
|
||||
WHERE mp.marketing_id = marketings.id
|
||||
AND w.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (?) OR
|
||||
EXISTS (?)
|
||||
)`,
|
||||
searchPattern,
|
||||
searchPattern,
|
||||
searchPattern,
|
||||
searchPattern,
|
||||
searchPattern,
|
||||
s.marketingOwnerRelationQuery(ctx).Where("pf.flock_name ILIKE ? OR k.name ILIKE ?", searchPattern, searchPattern),
|
||||
s.marketingAttributionRelationQuery(ctx).Where("pf_attr.flock_name ILIKE ? OR k_attr.name ILIKE ?", searchPattern, searchPattern),
|
||||
)
|
||||
}
|
||||
|
||||
func (s deliveryOrdersService) getMarketingWithDeliveries(c *fiber.Ctx, marketingId uint) (*dto.MarketingDetailDTO, error) {
|
||||
if err := m.EnsureMarketingAccess(c, s.MarketingRepo.DB(), marketingId); err != nil {
|
||||
return nil, err
|
||||
@@ -158,41 +254,6 @@ func (s deliveryOrdersService) GetAll(c *fiber.Ctx, params *validation.DeliveryO
|
||||
}
|
||||
}
|
||||
|
||||
if params.Search != "" {
|
||||
searchPattern := "%" + params.Search + "%"
|
||||
db = db.Where(`(
|
||||
marketings.so_number ILIKE ? OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM customers c
|
||||
WHERE c.id = marketings.customer_id
|
||||
AND c.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM users su
|
||||
WHERE su.id = marketings.sales_person_id
|
||||
AND su.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM marketing_products mp
|
||||
JOIN product_warehouses pw ON pw.id = mp.product_warehouse_id
|
||||
JOIN products p ON p.id = pw.product_id
|
||||
WHERE mp.marketing_id = marketings.id
|
||||
AND p.name ILIKE ?
|
||||
) OR
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM marketing_products mp
|
||||
JOIN product_warehouses pw ON pw.id = mp.product_warehouse_id
|
||||
JOIN warehouses w ON w.id = pw.warehouse_id
|
||||
WHERE mp.marketing_id = marketings.id
|
||||
AND w.name ILIKE ?
|
||||
)
|
||||
)`, searchPattern, searchPattern, searchPattern, searchPattern, searchPattern)
|
||||
}
|
||||
|
||||
if len(params.ProductIDs) > 0 {
|
||||
db = db.Where(`EXISTS (
|
||||
SELECT 1
|
||||
@@ -208,6 +269,9 @@ func (s deliveryOrdersService) GetAll(c *fiber.Ctx, params *validation.DeliveryO
|
||||
db = db.Where("marketings.customer_id = ?", params.CustomerId)
|
||||
}
|
||||
|
||||
db = s.applyMarketingProjectFlockFilter(c.Context(), db, params.ProjectFlockID, params.ProjectFlockKandangID)
|
||||
db = s.applyMarketingSearchFilter(c.Context(), db, params.Search)
|
||||
|
||||
if scope.Restrict {
|
||||
if len(scope.IDs) == 0 {
|
||||
return db.Where("1 = 0")
|
||||
|
||||
Reference in New Issue
Block a user