Fix[BE]: availableqty not appeared

This commit is contained in:
aguhh18
2025-11-07 16:41:52 +07:00
parent 3785d52925
commit b2ed58c734
4 changed files with 44 additions and 24 deletions
@@ -73,7 +73,7 @@ func (u *ProjectFlockKandangController) GetOne(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid Id") return fiber.NewError(fiber.StatusBadRequest, "Invalid Id")
} }
result, availableQtys, err := u.ProjectFlockKandangService.GetOne(c, uint(id)) result, availableQtys, productWarehouses, err := u.ProjectFlockKandangService.GetOne(c, uint(id))
if err != nil { if err != nil {
return err return err
} }
@@ -83,6 +83,6 @@ func (u *ProjectFlockKandangController) GetOne(c *fiber.Ctx) error {
Code: fiber.StatusOK, Code: fiber.StatusOK,
Status: "success", Status: "success",
Message: "Get projectFlockKandang successfully", Message: "Get projectFlockKandang successfully",
Data: dto.ToProjectFlockKandangDetailDTOWithAvailableQty(*result, availableQtys), Data: dto.ToProjectFlockKandangDetailDTOWithAvailableQty(*result, availableQtys, productWarehouses),
}) })
} }
@@ -97,7 +97,7 @@ func toProjectFlockDTO(pf *projectFlockDTO.ProjectFlockListDTO) *ProjectFlockDTO
} }
} }
func ToProjectFlockKandangDetailDTOWithAvailableQty(e entity.ProjectFlockKandang, availableQtyMap map[uint]float64) ProjectFlockKandangDetailDTO { func ToProjectFlockKandangDetailDTOWithAvailableQty(e entity.ProjectFlockKandang, availableQtyMap map[uint]float64, productWarehouses []entity.ProductWarehouse) ProjectFlockKandangDetailDTO {
var projectFlockSummary *projectFlockDTO.ProjectFlockListDTO var projectFlockSummary *projectFlockDTO.ProjectFlockListDTO
if e.ProjectFlock.Id != 0 { if e.ProjectFlock.Id != 0 {
mapped := projectFlockDTO.ToProjectFlockListDTO(e.ProjectFlock) mapped := projectFlockDTO.ToProjectFlockListDTO(e.ProjectFlock)
@@ -116,7 +116,7 @@ func ToProjectFlockKandangDetailDTOWithAvailableQty(e entity.ProjectFlockKandang
return ProjectFlockKandangDetailDTO{ return ProjectFlockKandangDetailDTO{
ProjectFlockKandangListDTO: listDTO, ProjectFlockKandangListDTO: listDTO,
Chickins: toChickinDTOs(e.Chickins), Chickins: toChickinDTOs(e.Chickins),
AvailableQtys: toAvailableQtyDTOsFromMap(e.Chickins, availableQtyMap), AvailableQtys: toAvailableQtyDTOsFromMap(e.Chickins, availableQtyMap, productWarehouses),
} }
} }
@@ -190,11 +190,12 @@ func toChickinDTOs(chickins []entity.ProjectChickin) []chickinDTO.ChickinBaseDTO
return result return result
} }
func toAvailableQtyDTOsFromMap(chickins []entity.ProjectChickin, availableQtyMap map[uint]float64) []AvailableQtyDTO { func toAvailableQtyDTOsFromMap(chickins []entity.ProjectChickin, availableQtyMap map[uint]float64, productWarehouses []entity.ProductWarehouse) []AvailableQtyDTO {
if len(availableQtyMap) == 0 { if len(availableQtyMap) == 0 {
return nil return nil
} }
// First, build map from chickins
pwMap := make(map[uint]*entity.ProductWarehouse) pwMap := make(map[uint]*entity.ProductWarehouse)
for _, chickin := range chickins { for _, chickin := range chickins {
if chickin.ProductWarehouse != nil && chickin.ProductWarehouse.Id != 0 { if chickin.ProductWarehouse != nil && chickin.ProductWarehouse.Id != 0 {
@@ -202,6 +203,13 @@ func toAvailableQtyDTOsFromMap(chickins []entity.ProjectChickin, availableQtyMap
} }
} }
// Then, add productWarehouses that are not in chickins yet
for i := range productWarehouses {
if _, exists := pwMap[productWarehouses[i].Id]; !exists {
pwMap[productWarehouses[i].Id] = &productWarehouses[i]
}
}
result := make([]AvailableQtyDTO, 0, len(availableQtyMap)) result := make([]AvailableQtyDTO, 0, len(availableQtyMap))
for pwId, availableQty := range availableQtyMap { for pwId, availableQty := range availableQtyMap {
pw, exists := pwMap[pwId] pw, exists := pwMap[pwId]
@@ -19,7 +19,7 @@ import (
type ProjectFlockKandangService interface { type ProjectFlockKandangService interface {
GetAll(ctx *fiber.Ctx, params *validation.Query) ([]entity.ProjectFlockKandang, int64, error) GetAll(ctx *fiber.Ctx, params *validation.Query) ([]entity.ProjectFlockKandang, int64, error)
GetOne(ctx *fiber.Ctx, id uint) (*entity.ProjectFlockKandang, map[uint]float64, error) GetOne(ctx *fiber.Ctx, id uint) (*entity.ProjectFlockKandang, map[uint]float64, []entity.ProductWarehouse, error)
} }
// Note: map[uint]float64 adalah mapping dari ProductWarehouse ID ke calculated available quantity // Note: map[uint]float64 adalah mapping dari ProductWarehouse ID ke calculated available quantity
@@ -83,13 +83,13 @@ func (s projectFlockKandangService) GetAll(c *fiber.Ctx, params *validation.Quer
return projectFlockKandangs, total, nil return projectFlockKandangs, total, nil
} }
func (s projectFlockKandangService) GetOne(c *fiber.Ctx, id uint) (*entity.ProjectFlockKandang, map[uint]float64, error) { func (s projectFlockKandangService) GetOne(c *fiber.Ctx, id uint) (*entity.ProjectFlockKandang, map[uint]float64, []entity.ProductWarehouse, error) {
projectFlockKandang, err := s.Repository.GetByID(c.Context(), id) projectFlockKandang, err := s.Repository.GetByID(c.Context(), id)
if errors.Is(err, gorm.ErrRecordNotFound) { if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, nil, fiber.NewError(fiber.StatusNotFound, "ProjectFlockKandang not found") return nil, nil, nil, fiber.NewError(fiber.StatusNotFound, "ProjectFlockKandang not found")
} }
if err != nil { if err != nil {
return nil, nil, err return nil, nil, nil, err
} }
if len(projectFlockKandang.Chickins) > 0 && s.ApprovalSvc != nil { if len(projectFlockKandang.Chickins) > 0 && s.ApprovalSvc != nil {
@@ -109,7 +109,22 @@ func (s projectFlockKandangService) GetOne(c *fiber.Ctx, id uint) (*entity.Proje
availableQtyMap = nil availableQtyMap = nil
} }
return projectFlockKandang, availableQtyMap, nil var productWarehouses []entity.ProductWarehouse
if len(availableQtyMap) > 0 {
pwIds := make([]uint, 0, len(availableQtyMap))
for pwId := range availableQtyMap {
pwIds = append(pwIds, pwId)
}
productWarehouses, err = s.ProductWarehouseRepo.GetByIDs(c.Context(), pwIds, func(db *gorm.DB) *gorm.DB {
return db.Preload("Product").Preload("Warehouse")
})
if err != nil {
s.Log.Warnf("Failed to fetch product warehouses: %+v", err)
productWarehouses = []entity.ProductWarehouse{}
}
}
return projectFlockKandang, availableQtyMap, productWarehouses, nil
} }
func (s projectFlockKandangService) getAvailableQuantities(c *fiber.Ctx, projectFlockKandang *entity.ProjectFlockKandang) (map[uint]float64, error) { func (s projectFlockKandangService) getAvailableQuantities(c *fiber.Ctx, projectFlockKandang *entity.ProjectFlockKandang) (map[uint]float64, error) {
@@ -28,13 +28,12 @@ type ProjectFlockWithPivotDTO struct {
} }
type ProjectFlockKandangDTO struct { type ProjectFlockKandangDTO struct {
Id uint `json:"id"` Id uint `json:"id"`
ProjectFlockKandangId uint `json:"project_flock_kandang_id"`
ProjectFlockId uint `json:"project_flock_id"` KandangId uint `json:"kandang_id"`
KandangId uint `json:"kandang_id"` Kandang *kandangDTO.KandangBaseDTO `json:"kandang,omitempty"`
Kandang *kandangDTO.KandangBaseDTO `json:"kandang,omitempty"` ProjectFlock *ProjectFlockWithPivotDTO `json:"project_flock,omitempty"`
ProjectFlock *ProjectFlockWithPivotDTO `json:"project_flock,omitempty"` AvailableQuantity float64 `json:"available_quantity"`
AvailableQuantity float64 `json:"available_quantity"`
} }
func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangDTO { func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangDTO {
@@ -89,12 +88,10 @@ func ToProjectFlockKandangDTO(e entity.ProjectFlockKandang) ProjectFlockKandangD
} }
return ProjectFlockKandangDTO{ return ProjectFlockKandangDTO{
Id: e.Id, Id: e.Id,
ProjectFlockKandangId: e.Id, KandangId: e.KandangId,
ProjectFlockId: e.ProjectFlockId, Kandang: kandang,
KandangId: e.KandangId, ProjectFlock: pf,
Kandang: kandang, AvailableQuantity: 0,
ProjectFlock: pf,
AvailableQuantity: 0,
} }
} }