diff --git a/internal/modules/production/recordings/dto/recording.dto.go b/internal/modules/production/recordings/dto/recording.dto.go index e8d04758..99afc013 100644 --- a/internal/modules/production/recordings/dto/recording.dto.go +++ b/internal/modules/production/recordings/dto/recording.dto.go @@ -2,10 +2,12 @@ package dto import ( "math" + "strings" "time" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" approvalDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/approvals/dto" + productWarehouseDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/inventory/adjustments/dto" userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto" "gitlab.com/mbugroup/lti-api.git/internal/utils" approvalutils "gitlab.com/mbugroup/lti-api.git/internal/utils/approvals" @@ -17,19 +19,19 @@ type RecordingBaseDTO struct { Id uint `json:"id"` ProjectFlockKandangId uint `json:"project_flock_kandang_id"` RecordDatetime time.Time `json:"record_datetime"` - Day *int `json:"day,omitempty"` - ProjectFlockCategory *string `json:"project_flock_category,omitempty"` - TotalDepletionQty *float64 `json:"total_depletion_qty,omitempty"` - CumDepletionRate *float64 `json:"cum_depletion_rate,omitempty"` - DailyGain *float64 `json:"daily_gain,omitempty"` - AvgDailyGain *float64 `json:"avg_daily_gain,omitempty"` - CumIntake *int `json:"cum_intake,omitempty"` - FcrValue *float64 `json:"fcr_value,omitempty"` - TotalChickQty *float64 `json:"total_chick_qty,omitempty"` + Day int `json:"day"` + ProjectFlockCategory string `json:"project_flock_category"` + TotalDepletionQty float64 `json:"total_depletion_qty"` + CumDepletionRate float64 `json:"cum_depletion_rate"` + DailyGain float64 `json:"daily_gain"` + AvgDailyGain float64 `json:"avg_daily_gain"` + CumIntake int `json:"cum_intake"` + FcrValue float64 `json:"fcr_value"` + TotalChickQty float64 `json:"total_chick_qty"` Approval approvalDTO.ApprovalBaseDTO `json:"approval"` - EggGradingStatus *string `json:"egg_grading_status,omitempty"` - EggGradingPendingQty *int `json:"egg_grading_pending_qty,omitempty"` - EggGradingCompletedQty *int `json:"egg_grading_completed_qty,omitempty"` + EggGradingStatus *string `json:"egg_grading_status"` + EggGradingPendingQty *int `json:"egg_grading_pending_qty"` + EggGradingCompletedQty *int `json:"egg_grading_completed_qty"` } type RecordingListDTO struct { @@ -54,31 +56,23 @@ type RecordingBodyWeightDTO struct { } type RecordingDepletionDTO struct { - ProductWarehouseId uint `json:"product_warehouse_id"` - Qty float64 `json:"qty"` - ProductWarehouse *RecordingProductWarehouseDTO `json:"product_warehouse,omitempty"` + ProductWarehouseId uint `json:"product_warehouse_id"` + Qty float64 `json:"qty"` + ProductWarehouse productWarehouseDTO.ProductWarehouseDTO `json:"product_warehouse"` } type RecordingStockDTO struct { - ProductWarehouseId uint `json:"product_warehouse_id"` - UsageAmount *float64 `json:"usage_amount,omitempty"` - PendingQty *float64 `json:"pending_qty,omitempty"` - ProductWarehouse *RecordingProductWarehouseDTO `json:"product_warehouse,omitempty"` + ProductWarehouseId uint `json:"product_warehouse_id"` + UsageAmount float64 `json:"usage_amount"` + PendingQty *float64 `json:"pending_qty,omitempty"` + ProductWarehouse productWarehouseDTO.ProductWarehouseDTO `json:"product_warehouse"` } type RecordingEggDTO struct { - ProductWarehouseId uint `json:"product_warehouse_id"` - Qty int `json:"qty"` - ProductWarehouse *RecordingProductWarehouseDTO `json:"product_warehouse,omitempty"` - Gradings []RecordingEggGradingDTO `json:"gradings,omitempty"` -} - -type RecordingProductWarehouseDTO struct { - Id uint `json:"id"` - ProductId uint `json:"product_id"` - ProductName string `json:"product_name"` - WarehouseId uint `json:"warehouse_id"` - WarehouseName string `json:"warehouse_name"` + ProductWarehouseId uint `json:"product_warehouse_id"` + Qty int `json:"qty"` + ProductWarehouse productWarehouseDTO.ProductWarehouseDTO `json:"product_warehouse"` + Gradings []RecordingEggGradingDTO `json:"gradings,omitempty"` } type RecordingEggGradingDTO struct { @@ -89,12 +83,46 @@ type RecordingEggGradingDTO struct { // === Mapper Functions === func ToRecordingBaseDTO(e entity.Recording) RecordingBaseDTO { - var projectFlockCategory *string + var ( + projectFlockCategory string + day int + totalDepletionQty float64 + cumDepletionRate float64 + dailyGain float64 + avgDailyGain float64 + cumIntake int + fcrValue float64 + totalChickQty float64 + ) + + if e.Day != nil { + day = *e.Day + } + if e.TotalDepletionQty != nil { + totalDepletionQty = *e.TotalDepletionQty + } + if e.CumDepletionRate != nil { + cumDepletionRate = *e.CumDepletionRate + } + if e.DailyGain != nil { + dailyGain = *e.DailyGain + } + if e.AvgDailyGain != nil { + avgDailyGain = *e.AvgDailyGain + } + if e.CumIntake != nil { + cumIntake = *e.CumIntake + } + if e.FcrValue != nil { + fcrValue = *e.FcrValue + } + if e.TotalChickQty != nil { + totalChickQty = *e.TotalChickQty + } + if e.ProjectFlockKandang != nil && e.ProjectFlockKandang.ProjectFlock.Id != 0 { category := e.ProjectFlockKandang.ProjectFlock.Category - if category != "" { - projectFlockCategory = &category - } + projectFlockCategory = category } latestApproval := defaultRecordingLatestApproval(e) @@ -109,15 +137,15 @@ func ToRecordingBaseDTO(e entity.Recording) RecordingBaseDTO { Id: e.Id, ProjectFlockKandangId: e.ProjectFlockKandangId, RecordDatetime: e.RecordDatetime, - Day: e.Day, + Day: day, ProjectFlockCategory: projectFlockCategory, - TotalDepletionQty: e.TotalDepletionQty, - CumDepletionRate: e.CumDepletionRate, - DailyGain: e.DailyGain, - AvgDailyGain: e.AvgDailyGain, - CumIntake: e.CumIntake, - FcrValue: e.FcrValue, - TotalChickQty: e.TotalChickQty, + TotalDepletionQty: totalDepletionQty, + CumDepletionRate: cumDepletionRate, + DailyGain: dailyGain, + AvgDailyGain: avgDailyGain, + CumIntake: cumIntake, + FcrValue: fcrValue, + TotalChickQty: totalChickQty, Approval: latestApproval, EggGradingStatus: gradingStatus, EggGradingPendingQty: gradingPending, @@ -149,12 +177,21 @@ func ToRecordingListDTOs(e []entity.Recording) []RecordingListDTO { } func ToRecordingDetailDTO(e entity.Recording) RecordingDetailDTO { + listDTO := ToRecordingListDTO(e) + + var eggs []RecordingEggDTO + if strings.EqualFold(listDTO.ProjectFlockCategory, string(utils.ProjectFlockCategoryLaying)) { + eggs = ToRecordingEggDTOs(e.Eggs) + } else if len(e.Eggs) > 0 { + eggs = ToRecordingEggDTOs(e.Eggs) + } + return RecordingDetailDTO{ - RecordingListDTO: ToRecordingListDTO(e), + RecordingListDTO: listDTO, BodyWeights: ToRecordingBodyWeightDTOs(e.BodyWeights), Depletions: ToRecordingDepletionDTOs(e.Depletions), Stocks: ToRecordingStockDTOs(e.Stocks), - Eggs: ToRecordingEggDTOs(e.Eggs), + Eggs: eggs, } } @@ -176,7 +213,7 @@ func ToRecordingDepletionDTOs(depletions []entity.RecordingDepletion) []Recordin result[i] = RecordingDepletionDTO{ ProductWarehouseId: d.ProductWarehouseId, Qty: d.Qty, - ProductWarehouse: toRecordingProductWarehouseDTO(&d.ProductWarehouse), + ProductWarehouse: mapProductWarehouseDTO(&d.ProductWarehouse), } } return result @@ -185,11 +222,16 @@ func ToRecordingDepletionDTOs(depletions []entity.RecordingDepletion) []Recordin func ToRecordingStockDTOs(stocks []entity.RecordingStock) []RecordingStockDTO { result := make([]RecordingStockDTO, len(stocks)) for i, s := range stocks { + var usageAmount float64 + if s.UsageQty != nil { + usageAmount = *s.UsageQty + } + result[i] = RecordingStockDTO{ ProductWarehouseId: s.ProductWarehouseId, - UsageAmount: s.UsageQty, + UsageAmount: usageAmount, PendingQty: s.PendingQty, - ProductWarehouse: toRecordingProductWarehouseDTO(&s.ProductWarehouse), + ProductWarehouse: mapProductWarehouseDTO(&s.ProductWarehouse), } } return result @@ -201,7 +243,7 @@ func ToRecordingEggDTOs(eggs []entity.RecordingEgg) []RecordingEggDTO { result[i] = RecordingEggDTO{ ProductWarehouseId: egg.ProductWarehouseId, Qty: egg.Qty, - ProductWarehouse: toRecordingProductWarehouseDTO(&egg.ProductWarehouse), + ProductWarehouse: mapProductWarehouseDTO(&egg.ProductWarehouse), Gradings: ToRecordingEggGradingDTOs(egg.GradingEggs), } } @@ -224,25 +266,17 @@ func ToRecordingEggGradingDTOs(gradings []entity.GradingEgg) []RecordingEggGradi return result } -func toRecordingProductWarehouseDTO(pw *entity.ProductWarehouse) *RecordingProductWarehouseDTO { - if pw == nil || pw.Id == 0 { - return nil +func mapProductWarehouseDTO(pw *entity.ProductWarehouse) productWarehouseDTO.ProductWarehouseDTO { + if pw == nil { + return productWarehouseDTO.ProductWarehouseDTO{} } - dto := RecordingProductWarehouseDTO{ - Id: pw.Id, - ProductId: pw.ProductId, - WarehouseId: pw.WarehouseId, + mapped := productWarehouseDTO.ToProductWarehouseDTO(pw) + if mapped == nil { + return productWarehouseDTO.ProductWarehouseDTO{} } - if pw.Product.Id != 0 { - dto.ProductName = pw.Product.Name - } - if pw.Warehouse.Id != 0 { - dto.WarehouseName = pw.Warehouse.Name - } - - return &dto + return *mapped } const goodEggProductWarehouseID uint = 5 diff --git a/internal/modules/production/recordings/validations/recording.validation.go b/internal/modules/production/recordings/validations/recording.validation.go index f058248c..62e5f8df 100644 --- a/internal/modules/production/recordings/validations/recording.validation.go +++ b/internal/modules/production/recordings/validations/recording.validation.go @@ -2,14 +2,14 @@ package validation type ( BodyWeight struct { - AvgWeight float64 `json:"avg_weight" validate:"required"` - Qty float64 `json:"qty" validate:"required,gt=0"` - TotalWeight *float64 `json:"total_weight,omitempty" validate:"omitempty,gt=0"` + AvgWeight float64 `json:"avg_weight" validate:"required"` + Qty float64 `json:"qty" validate:"required,gt=0"` + TotalWeight float64 `json:"total_weight" validate:"required,gte=0"` } Stock struct { ProductWarehouseId uint `json:"product_warehouse_id" validate:"required,number,min=1"` - Qty *float64 `json:"qty,omitempty" validate:"required_without=UsageAmount,gte=0"` + Qty float64 `json:"qty" validate:"required,gte=0"` PendingQty *float64 `json:"pending_qty,omitempty" validate:"omitempty,gte=0"` } @@ -26,10 +26,10 @@ type ( type Create struct { ProjectFlockKandangId uint `json:"project_flock_kandang_id" validate:"required,number,min=1"` - BodyWeights []BodyWeight `json:"body_weights,omitempty" validate:"omitempty,dive"` - Stocks []Stock `json:"stocks,omitempty" validate:"omitempty,dive"` - Depletions []Depletion `json:"depletions,omitempty" validate:"omitempty,dive"` - Eggs []Egg `json:"eggs,omitempty" validate:"omitempty,dive"` + BodyWeights []BodyWeight `json:"body_weights" validate:"dive"` + Stocks []Stock `json:"stocks" validate:"dive"` + Depletions []Depletion `json:"depletions" validate:"dive"` + Eggs []Egg `json:"eggs" validate:"omitempty,dive"` } type Update struct { diff --git a/internal/utils/recording/util.recording.go b/internal/utils/recording/util.recording.go index fd463cf9..e9ae371c 100644 --- a/internal/utils/recording/util.recording.go +++ b/internal/utils/recording/util.recording.go @@ -13,16 +13,15 @@ func MapBodyWeights(recordingID uint, items []validation.BodyWeight) []entity.Re result := make([]entity.RecordingBW, 0, len(items)) for _, item := range items { totalWeight := item.TotalWeight - if totalWeight == nil { - calculated := item.AvgWeight * item.Qty - totalWeight = &calculated + if totalWeight <= 0 { + totalWeight = item.AvgWeight * item.Qty } result = append(result, entity.RecordingBW{ RecordingId: recordingID, AvgWeight: item.AvgWeight, Qty: item.Qty, - TotalWeight: *totalWeight, + TotalWeight: totalWeight, }) } return result @@ -35,12 +34,8 @@ func MapStocks(recordingID uint, items []validation.Stock) []entity.RecordingSto result := make([]entity.RecordingStock, 0, len(items)) for _, item := range items { - var usageAmount float64 - if item.Qty != nil { - usageAmount = *item.Qty - } usagePtr := new(float64) - *usagePtr = usageAmount + *usagePtr = item.Qty pending := item.PendingQty if pending == nil { pending = new(float64)