diff --git a/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.down.sql b/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.down.sql new file mode 100644 index 00000000..2ef9aecd --- /dev/null +++ b/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.down.sql @@ -0,0 +1,9 @@ +BEGIN; + +DROP INDEX IF EXISTS idx_daily_checklists_unique_non_rejected; + +ALTER TABLE daily_checklists + ADD CONSTRAINT daily_checklists_date_kandang_category_key + UNIQUE (date, kandang_id, category); + +COMMIT; diff --git a/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.up.sql b/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.up.sql new file mode 100644 index 00000000..753deaef --- /dev/null +++ b/internal/database/migrations/20260402034456_adjust_daily_checklist_unique_for_rejected.up.sql @@ -0,0 +1,10 @@ +BEGIN; + +ALTER TABLE daily_checklists + DROP CONSTRAINT IF EXISTS daily_checklists_date_kandang_category_key; + +CREATE UNIQUE INDEX IF NOT EXISTS idx_daily_checklists_unique_non_rejected + ON daily_checklists (date, kandang_id, category) + WHERE (status IS NULL OR status <> 'REJECTED'); + +COMMIT; diff --git a/internal/modules/daily-checklists/services/daily-checklist.service.go b/internal/modules/daily-checklists/services/daily-checklist.service.go index 8e60ef8b..fdbe4c8b 100644 --- a/internal/modules/daily-checklists/services/daily-checklist.service.go +++ b/internal/modules/daily-checklists/services/daily-checklist.service.go @@ -277,7 +277,11 @@ func (s dailyChecklistService) GetAll(c *fiber.Ctx, params *validation.Query) ([ normalizedSearch := re.ReplaceAllString(params.Search, "") if normalizedSearch != "" { like := "%" + normalizedSearch + "%" - db = db.Where("(regexp_replace(k.name, '[^a-zA-Z0-9]', '', 'g') ILIKE ? OR regexp_replace(dc.category::text, '[^a-zA-Z0-9]', '', 'g') ILIKE ?)", like, like) + db = db.Where(`( + regexp_replace(k.name, '[^a-zA-Z0-9]', '', 'g') ILIKE ? OR + regexp_replace(dc.category::text, '[^a-zA-Z0-9]', '', 'g') ILIKE ? OR + (dc.category = 'empty_kandang' AND regexp_replace('Kandang Kosong', '[^a-zA-Z0-9]', '', 'g') ILIKE ?) + )`, like, like, like) } } diff --git a/internal/modules/master/employees/controllers/employees.controller.go b/internal/modules/master/employees/controllers/employees.controller.go index 3d0901c8..9b633803 100644 --- a/internal/modules/master/employees/controllers/employees.controller.go +++ b/internal/modules/master/employees/controllers/employees.controller.go @@ -24,9 +24,11 @@ func NewEmployeesController(employeesService service.EmployeesService) *Employee func (u *EmployeesController) GetAll(c *fiber.Ctx) error { query := &validation.Query{ - Page: c.QueryInt("page", 1), - Limit: c.QueryInt("limit", 10), - Search: c.Query("search", ""), + Page: c.QueryInt("page", 1), + Limit: c.QueryInt("limit", 10), + Search: c.Query("search", ""), + OrderBy: c.Query("order_by", "desc"), + SortBy: c.Query("sort_by", "updated_at"), } if query.Page < 1 || query.Limit < 1 { diff --git a/internal/modules/master/employees/services/employees.service.go b/internal/modules/master/employees/services/employees.service.go index a7a6cef3..a1f02c96 100644 --- a/internal/modules/master/employees/services/employees.service.go +++ b/internal/modules/master/employees/services/employees.service.go @@ -2,6 +2,7 @@ package service import ( "errors" + "fmt" "strings" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" @@ -126,11 +127,18 @@ func (s employeesService) GetAll(c *fiber.Ctx, params *validation.Query) ([]enti if params.IsActive != nil { db = db.Where("employees.is_active = ?", *params.IsActive) } - return db. + + db = db. Select("employees.id, employees.name, employees.is_active, employees.created_at, employees.updated_at"). - Group("employees.id, employees.name, employees.is_active, employees.created_at, employees.updated_at"). - Order("employees.created_at DESC"). - Order("employees.updated_at DESC") + Group("employees.id, employees.name, employees.is_active, employees.created_at, employees.updated_at") + + if params.OrderBy == "desc" || params.OrderBy == "" { + db = db.Order(fmt.Sprintf("employees.%s DESC", params.SortBy)) + } else { + db = db.Order(fmt.Sprintf("employees.%s ASC", params.SortBy)) + } + + return db }) if err != nil { diff --git a/internal/modules/master/employees/validations/employees.validation.go b/internal/modules/master/employees/validations/employees.validation.go index 83608071..09aa471e 100644 --- a/internal/modules/master/employees/validations/employees.validation.go +++ b/internal/modules/master/employees/validations/employees.validation.go @@ -18,4 +18,6 @@ type Query struct { Search string `query:"search" validate:"omitempty,max=50"` KandangId *uint `query:"kandang_id" validate:"omitempty"` IsActive *bool `query:"is_active" validate:"omitempty"` + SortBy string `query:"sort_by" validate:"omitempty,max=50,oneof=name created_at updated_at" default:"updated_at"` + OrderBy string `query:"order_by" validate:"omitempty,oneof=asc desc" default:"desc"` }