From 6cac4f0243374189ab80cb9da2bd76d03653ecc2 Mon Sep 17 00:00:00 2001 From: aguhh18 Date: Tue, 27 Jan 2026 16:57:36 +0700 Subject: [PATCH] [FEAT] Update StockTransferDelivery and TransferDeliveryDTO to allow optional SupplierId --- internal/entities/stock_transfer_delivery.go | 2 +- .../inventory/transfers/dto/transfer.dto.go | 52 +++++++++++-------- .../transfers/services/transfer.service.go | 19 ++++++- .../validations/transfer.validation.go | 2 +- 4 files changed, 50 insertions(+), 25 deletions(-) diff --git a/internal/entities/stock_transfer_delivery.go b/internal/entities/stock_transfer_delivery.go index 0eeccc04..f7ca8a30 100644 --- a/internal/entities/stock_transfer_delivery.go +++ b/internal/entities/stock_transfer_delivery.go @@ -6,7 +6,7 @@ import "time" type StockTransferDelivery struct { Id uint64 `gorm:"primaryKey;autoIncrement"` StockTransferId uint64 - SupplierId uint64 + SupplierId *uint64 VehiclePlate string DriverName string DocumentNumber string diff --git a/internal/modules/inventory/transfers/dto/transfer.dto.go b/internal/modules/inventory/transfers/dto/transfer.dto.go index 73b1a66c..1d29c48d 100644 --- a/internal/modules/inventory/transfers/dto/transfer.dto.go +++ b/internal/modules/inventory/transfers/dto/transfer.dto.go @@ -9,12 +9,12 @@ import ( ) type TransferRelationDTO struct { - Id uint64 `json:"id"` - MovementNumber string `json:"movement_number"` - TransferReason string `json:"transfer_reason"` - TransferDate string `json:"transfer_date"` - SourceWarehouse *warehouseDTO.WarehouseRelationDTO `json:"source_warehouse,omitempty"` - DestinationWarehouse *warehouseDTO.WarehouseRelationDTO `json:"destination_warehouse,omitempty"` + Id uint64 `json:"id"` + MovementNumber string `json:"movement_number"` + TransferReason string `json:"transfer_reason"` + TransferDate string `json:"transfer_date"` + SourceWarehouse *warehouseDTO.WarehouseRelationDTO `json:"source_warehouse,omitempty"` + DestinationWarehouse *warehouseDTO.WarehouseRelationDTO `json:"destination_warehouse,omitempty"` } type ProductSimpleDTO struct { @@ -51,16 +51,16 @@ type TransferDetailDTO struct { } type TransferDetailItemDTO struct { - Id uint64 `json:"id"` - Product ProductSimpleDTO `json:"product"` - Quantity float64 `json:"quantity"` - TransportPerItem *float64 `json:"transport_per_item,omitempty"` // Biaya ekspedisi per item - ExpeditionVendor *SupplierSimpleDTO `json:"expedition_vendor,omitempty"` // Vendor ekspedisi + Id uint64 `json:"id"` + Product ProductSimpleDTO `json:"product"` + Quantity float64 `json:"quantity"` + TransportPerItem *float64 `json:"transport_per_item,omitempty"` // Biaya ekspedisi per item + ExpeditionVendor *SupplierSimpleDTO `json:"expedition_vendor,omitempty"` // Vendor ekspedisi } type TransferDeliveryDTO struct { Id uint64 `json:"id"` - Supplier SupplierSimpleDTO `json:"supplier"` + Supplier *SupplierSimpleDTO `json:"supplier,omitempty"` VehiclePlate string `json:"vehicle_plate"` DriverName string `json:"driver_name"` DocumentNumber string `json:"document_number"` @@ -115,7 +115,6 @@ func ToTransferListDTO(e entity.StockTransfer) TransferListDTO { Quantity: d.UsageQty + d.PendingQty, // Total actual quantity allocated } - if d.ExpenseNonstock != nil { priceCopy := d.ExpenseNonstock.Price detailDTO.TransportPerItem = &priceCopy @@ -155,12 +154,17 @@ func ToTransferListDTO(e entity.StockTransfer) TransferListDTO { } } - deliveries = append(deliveries, TransferDeliveryDTO{ - Id: del.Id, - Supplier: SupplierSimpleDTO{ + var supplier *SupplierSimpleDTO + if del.Supplier != nil { + supplier = &SupplierSimpleDTO{ Id: del.Supplier.Id, Name: del.Supplier.Name, - }, + } + } + + deliveries = append(deliveries, TransferDeliveryDTO{ + Id: del.Id, + Supplier: supplier, VehiclePlate: del.VehiclePlate, DriverName: del.DriverName, DocumentNumber: del.DocumentNumber, @@ -201,7 +205,6 @@ func ToTransferDetailDTO(e entity.StockTransfer) TransferDetailDTO { Quantity: d.UsageQty + d.PendingQty, // Total actual quantity allocated } - if d.ExpenseNonstock != nil { priceCopy := d.ExpenseNonstock.Price detailDTO.TransportPerItem = &priceCopy @@ -241,12 +244,17 @@ func ToTransferDetailDTO(e entity.StockTransfer) TransferDetailDTO { } } - deliveries = append(deliveries, TransferDeliveryDTO{ - Id: del.Id, - Supplier: SupplierSimpleDTO{ + var supplier *SupplierSimpleDTO + if del.Supplier != nil { + supplier = &SupplierSimpleDTO{ Id: del.Supplier.Id, Name: del.Supplier.Name, - }, + } + } + + deliveries = append(deliveries, TransferDeliveryDTO{ + Id: del.Id, + Supplier: supplier, VehiclePlate: del.VehiclePlate, DriverName: del.DriverName, DocumentNumber: del.DocumentNumber, diff --git a/internal/modules/inventory/transfers/services/transfer.service.go b/internal/modules/inventory/transfers/services/transfer.service.go index fe5f8f5a..8278ce9f 100644 --- a/internal/modules/inventory/transfers/services/transfer.service.go +++ b/internal/modules/inventory/transfers/services/transfer.service.go @@ -196,6 +196,11 @@ func (s *transferService) CreateOne(c *fiber.Ctx, req *validation.TransferReques } for _, delivery := range req.Deliveries { + // Skip supplier validation if SupplierID is 0 (optional) + if delivery.SupplierID == 0 { + continue + } + supplier, err := s.SupplierRepo.GetByID(c.Context(), uint(delivery.SupplierID), nil) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { @@ -310,9 +315,16 @@ func (s *transferService) CreateOne(c *fiber.Ctx, req *validation.TransferReques var deliveries []*entity.StockTransferDelivery for _, delivery := range req.Deliveries { + supplierId := func() *uint64 { + if delivery.SupplierID > 0 { + id := uint64(delivery.SupplierID) + return &id + } + return nil + }() deliveries = append(deliveries, &entity.StockTransferDelivery{ StockTransferId: entityTransfer.Id, - SupplierId: uint64(delivery.SupplierID), + SupplierId: supplierId, VehiclePlate: delivery.VehiclePlate, DriverName: delivery.DriverName, ShippingCostItem: delivery.DeliveryCostPerItem, @@ -458,6 +470,11 @@ func (s *transferService) CreateOne(c *fiber.Ctx, req *validation.TransferReques if len(req.Deliveries) > 0 { for _, delivery := range req.Deliveries { + // Skip adding to expensePayloads if SupplierID is 0 (optional) + if delivery.SupplierID == 0 { + continue + } + for _, prod := range delivery.Products { detail := detailMap[uint64(prod.ProductID)] if detail == nil { diff --git a/internal/modules/inventory/transfers/validations/transfer.validation.go b/internal/modules/inventory/transfers/validations/transfer.validation.go index 785295e2..e2f357f3 100644 --- a/internal/modules/inventory/transfers/validations/transfer.validation.go +++ b/internal/modules/inventory/transfers/validations/transfer.validation.go @@ -26,7 +26,7 @@ type TransferDelivery struct { DocumentIndex int `json:"document_index" validate:"omitempty,min=-1" default:"-1"` DriverName string `json:"driver_name" validate:"required"` VehiclePlate string `json:"vehicle_plate" validate:"required"` - SupplierID uint `json:"supplier_id" validate:"required"` + SupplierID uint `json:"supplier_id" ` Products []TransferDeliveryProduct `json:"products" validate:"required,dive"` }