From 995d585f543bbfe6473aa53c84c246570c920478 Mon Sep 17 00:00:00 2001 From: giovanni Date: Mon, 18 May 2026 22:45:30 +0700 Subject: [PATCH 1/2] fix get detail kandang kosong --- .../services/daily-checklist.service.go | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/internal/modules/daily-checklists/services/daily-checklist.service.go b/internal/modules/daily-checklists/services/daily-checklist.service.go index 24aeb471..91f43d06 100644 --- a/internal/modules/daily-checklists/services/daily-checklist.service.go +++ b/internal/modules/daily-checklists/services/daily-checklist.service.go @@ -1030,6 +1030,7 @@ func (s *dailyChecklistService) UpdateByPut(c *fiber.Ctx, req *validation.Create } } + var wasBranchC bool // non-empty_kandang → empty_kandang transition err = s.Repository.DB().WithContext(c.Context()).Transaction(func(tx *gorm.DB) error { if err := s.lockKandangForChecklistCreation(tx, req.KandangId); err != nil { return err @@ -1088,6 +1089,23 @@ func (s *dailyChecklistService) UpdateByPut(c *fiber.Ctx, req *validation.Create if err := s.upsertEmptyKandangRange(tx, id, req.KandangId, date, emptyEndDate, actorID); err != nil { return err } + // Branch C: non-empty → empty_kandang, hard-delete task/progress data + if !existingIsEmpty { + wasBranchC = true + if err := tx.Exec(` + DELETE FROM daily_checklist_activity_task_assignments + WHERE task_id IN ( + SELECT id FROM daily_checklist_activity_tasks WHERE checklist_id = ? + )`, id).Error; err != nil { + return err + } + if err := tx.Where("checklist_id = ?", id).Delete(&entity.DailyChecklistActivityTask{}).Error; err != nil { + return err + } + if err := tx.Where("daily_checklist_id = ?", id).Delete(&entity.DailyChecklistTask{}).Error; err != nil { + return err + } + } } else if existingIsEmpty { updates := map[string]any{ "deleted_at": time.Now(), @@ -1108,6 +1126,20 @@ func (s *dailyChecklistService) UpdateByPut(c *fiber.Ctx, req *validation.Create return nil, err } + // Branch C: delete DC documents outside transaction (storage is external) + if wasBranchC && s.DocumentSvc != nil { + docs, docErr := s.DocumentSvc.ListByTarget(c.Context(), string(utils.DocumentTypeDailyChecklist), uint64(id)) + if docErr == nil && len(docs) > 0 { + docIDs := make([]uint, 0, len(docs)) + for _, doc := range docs { + docIDs = append(docIDs, doc.Id) + } + if delErr := s.DocumentSvc.DeleteDocuments(c.Context(), docIDs, true); delErr != nil { + s.Log.Errorf("Failed to delete documents for DC %d during empty_kandang conversion: %+v", id, delErr) + } + } + } + return s.GetOne(c, id) } From 99e185a16add6088b2a17cc21ada2b289f21b610 Mon Sep 17 00:00:00 2001 From: giovanni Date: Tue, 19 May 2026 00:15:08 +0700 Subject: [PATCH 2/2] ad sorting to laporan biaya operasional --- .../expense_realization.repository.go | 40 ++++++++++++++++++- .../controllers/repport.controller.go | 2 + .../validations/repport.validation.go | 2 + 3 files changed, 43 insertions(+), 1 deletion(-) 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:"-"` }