From 4bf9b126803c451c7d19734ff8399fca260e5e23 Mon Sep 17 00:00:00 2001 From: ragilap Date: Fri, 20 Feb 2026 14:46:01 +0700 Subject: [PATCH] [FEAT/BE] fix response closing and fix status rejected filter --- .../services/deliveryorder.service.go | 27 ++++++++++++++----- .../marketing/services/salesorder.service.go | 25 +++++++++++++++++ 2 files changed, 45 insertions(+), 7 deletions(-) diff --git a/internal/modules/marketing/services/deliveryorder.service.go b/internal/modules/marketing/services/deliveryorder.service.go index 677ef965..3fe0dd3b 100644 --- a/internal/modules/marketing/services/deliveryorder.service.go +++ b/internal/modules/marketing/services/deliveryorder.service.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "strings" "time" commonRepo "gitlab.com/mbugroup/lti-api.git/internal/common/repository" @@ -117,18 +118,30 @@ func (s deliveryOrdersService) GetAll(c *fiber.Ctx, params *validation.DeliveryO Preload("Products.DeliveryProduct") if params.Status != "" { + status := strings.TrimSpace(params.Status) latestApprovalSubQuery := s.MarketingRepo.DB(). WithContext(c.Context()). Table("approvals"). - Select("DISTINCT ON (approvable_id) approvable_id, step_name"). + Select("DISTINCT ON (approvable_id) approvable_id, step_name, action"). Where("approvable_type = ?", utils.ApprovalWorkflowMarketing.String()). Order("approvable_id, id DESC") - db = db.Where(`EXISTS ( - SELECT 1 - FROM (?) AS latest_approval - WHERE latest_approval.approvable_id = marketings.id - AND LOWER(latest_approval.step_name) = LOWER(?) - )`, latestApprovalSubQuery, params.Status) + + if strings.EqualFold(status, "DITOLAK") { + db = db.Where(`EXISTS ( + SELECT 1 + FROM (?) AS latest_approval + WHERE latest_approval.approvable_id = marketings.id + AND latest_approval.action = ? + )`, latestApprovalSubQuery, string(entity.ApprovalActionRejected)) + } else { + db = db.Where(`EXISTS ( + SELECT 1 + FROM (?) AS latest_approval + WHERE latest_approval.approvable_id = marketings.id + AND LOWER(latest_approval.step_name) = LOWER(?) + AND (latest_approval.action IS NULL OR latest_approval.action <> ?) + )`, latestApprovalSubQuery, status, string(entity.ApprovalActionRejected)) + } } if params.Search != "" { diff --git a/internal/modules/marketing/services/salesorder.service.go b/internal/modules/marketing/services/salesorder.service.go index eb2e4f5b..7d032c86 100644 --- a/internal/modules/marketing/services/salesorder.service.go +++ b/internal/modules/marketing/services/salesorder.service.go @@ -152,6 +152,31 @@ func (s *salesOrdersService) CreateOne(c *fiber.Ctx, req *validation.Create) (*e } } + requestedByWarehouse := make(map[uint]float64) + for _, item := range req.MarketingProducts { + if item.ProductWarehouseId == 0 { + continue + } + requestedByWarehouse[item.ProductWarehouseId] += item.Qty + } + + for pwID, requestedQty := range requestedByWarehouse { + productWarehouse, err := s.ProductWarehouseRepo.GetDetailByID(c.Context(), pwID) + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return nil, fiber.NewError(fiber.StatusNotFound, fmt.Sprintf("Product warehouse %d not found", pwID)) + } + return nil, fiber.NewError(fiber.StatusInternalServerError, "Failed to check stock availability") + } + availableQty := productWarehouse.Quantity + if availableQty+1e-6 < requestedQty { + return nil, fiber.NewError( + fiber.StatusBadRequest, + fmt.Sprintf("Stok tidak mencukupi untuk gudang %d: diminta %.3f, tersedia %.3f", pwID, requestedQty, availableQty), + ) + } + } + soDate, err := utils.ParseDateString(req.Date) if err != nil { return nil, fiber.NewError(fiber.StatusBadRequest, "Invalid date format")