diff --git a/internal/modules/expenses/repositories/expense_realization.repository.go b/internal/modules/expenses/repositories/expense_realization.repository.go index d41c5dd7..e15f3247 100644 --- a/internal/modules/expenses/repositories/expense_realization.repository.go +++ b/internal/modules/expenses/repositories/expense_realization.repository.go @@ -177,10 +177,48 @@ func (r *ExpenseRealizationRepositoryImpl) GetAllWithFilters(ctx context.Context return nil, 0, err } + sortExpr := "expense_realizations.created_at" + order := "DESC" + if filters.SortOrder == "asc" { + order = "ASC" + } + switch filters.SortBy { + case "po_number": + sortExpr = "expenses.po_number" + case "reference_number": + sortExpr = "expenses.reference_number" + case "realization_date": + sortExpr = "expenses.realization_date" + case "transaction_date": + sortExpr = "expenses.transaction_date" + case "category": + sortExpr = "expenses.category" + case "product": + sortExpr = "(SELECT name FROM nonstocks WHERE id = expense_nonstocks.nonstock_id)" + case "supplier": + sortExpr = "suppliers.name" + case "location": + sortExpr = "(SELECT l.name FROM kandangs k JOIN locations l ON l.id = k.location_id WHERE k.id = expense_nonstocks.kandang_id)" + case "kandang": + sortExpr = "(SELECT name FROM kandangs WHERE id = expense_nonstocks.kandang_id)" + case "qty_pengajuan": + sortExpr = "expense_nonstocks.qty" + case "price_pengajuan": + sortExpr = "expense_nonstocks.price" + case "total_pengajuan": + sortExpr = "expense_nonstocks.qty * expense_nonstocks.price" + case "qty_realisasi": + sortExpr = "expense_realizations.qty" + case "price_realisasi": + sortExpr = "expense_realizations.price" + case "total_realisasi": + sortExpr = "expense_realizations.qty * expense_realizations.price" + } + if err := db. Offset(offset). Limit(limit). - Order("expense_realizations.created_at DESC"). + Order(sortExpr + " " + order). Find(&realizations).Error; err != nil { return nil, 0, err } diff --git a/internal/modules/repports/controllers/repport.controller.go b/internal/modules/repports/controllers/repport.controller.go index 72616519..cc505ee8 100644 --- a/internal/modules/repports/controllers/repport.controller.go +++ b/internal/modules/repports/controllers/repport.controller.go @@ -51,6 +51,8 @@ func (c *RepportController) GetExpense(ctx *fiber.Ctx) error { AreaId: int64(ctx.QueryInt("area_id", 0)), LocationId: int64(ctx.QueryInt("location_id", 0)), RealizationDate: ctx.Query("realization_date", ""), + SortBy: ctx.Query("sort_by", ""), + SortOrder: ctx.Query("sort_order", ""), } locationScope, err := m.ResolveLocationScope(ctx, c.RepportService.DB()) diff --git a/internal/modules/repports/validations/repport.validation.go b/internal/modules/repports/validations/repport.validation.go index fbe3c7a0..0ef458e1 100644 --- a/internal/modules/repports/validations/repport.validation.go +++ b/internal/modules/repports/validations/repport.validation.go @@ -13,6 +13,8 @@ type ExpenseQuery struct { AreaId int64 `query:"area_id" validate:"omitempty"` LocationId int64 `query:"location_id" validate:"omitempty"` RealizationDate string `query:"realization_date" validate:"omitempty"` + SortBy string `query:"sort_by" validate:"omitempty,oneof=po_number reference_number realization_date transaction_date category product supplier location kandang qty_pengajuan price_pengajuan total_pengajuan qty_realisasi price_realisasi total_realisasi"` + SortOrder string `query:"sort_order" validate:"omitempty,oneof=asc desc"` AllowedAreaIDs []int64 `query:"-"` AllowedLocationIDs []int64 `query:"-"` }