package dto import ( "time" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto" ) // === DTO Structs === type TransferRelationDTO struct { Id uint64 `json:"id"` TransferReason string `json:"transfer_reason"` TransferDate string `json:"transfer_date"` SourceWarehouse *WarehouseDetailDTO `json:"source_warehouse,omitempty"` DestinationWarehouse *WarehouseDetailDTO `json:"destination_warehouse,omitempty"` } // Only id and name for warehouse simple view type WarehouseSimpleDTO struct { Id uint `json:"id"` Name string `json:"name"` } type ProductSimpleDTO struct { Id uint `json:"id"` Name string `json:"name"` } type AreaDTO struct { Id uint `json:"id"` Name string `json:"name"` } type LocationDTO struct { Id uint `json:"id"` Name string `json:"name"` } type SupplierSimpleDTO struct { Id uint `json:"id"` Name string `json:"name"` } type WarehouseDetailDTO struct { Id uint `json:"id"` Name string `json:"name"` Location *LocationDTO `json:"location"` Area *AreaDTO `json:"area"` } type TransferListDTO struct { TransferRelationDTO CreatedUser *userDTO.UserRelationDTO `json:"created_user,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` Details []TransferDetailItemDTO `json:"details"` Deliveries []TransferDeliveryDTO `json:"deliveries"` } type TransferDetailDTO struct { TransferListDTO Details []TransferDetailItemDTO `json:"details"` Deliveries []TransferDeliveryDTO `json:"deliveries"` } // Detail produk type TransferDetailItemDTO struct { Id uint64 `json:"id"` Proudct ProductSimpleDTO `json:"product"` Quantity float64 `json:"quantity"` } // Delivery ekspedisi type TransferDeliveryDTO struct { Id uint64 `json:"id"` Supplier SupplierSimpleDTO `json:"supplier"` VehiclePlate string `json:"vehicle_plate"` DriverName string `json:"driver_name"` DocumentNumber string `json:"document_number"` DocumentPath string `json:"document_path"` ShippingCostItem float64 `json:"shipping_cost_item"` ShippingCostTotal float64 `json:"shipping_cost_total"` Items []TransferDeliveryItemDTO `json:"items"` } type TransferDeliveryItemDTO struct { Id uint64 `json:"id"` StockTransferDetailId uint64 `json:"stock_transfer_detail_id"` Quantity float64 `json:"quantity"` } // === Mapper Functions === func ToTransferRelationDTO(e entity.StockTransfer) TransferRelationDTO { var sourceWarehouse *WarehouseDetailDTO if e.FromWarehouse != nil && e.FromWarehouse.Id != 0 { sourceWarehouse = toWarehouseDetailDTO(e.FromWarehouse) } var destinationWarehouse *WarehouseDetailDTO if e.ToWarehouse != nil && e.ToWarehouse.Id != 0 { destinationWarehouse = toWarehouseDetailDTO(e.ToWarehouse) } return TransferRelationDTO{ Id: e.Id, TransferReason: e.Reason, TransferDate: e.CreatedAt.Format("2006-01-02"), SourceWarehouse: sourceWarehouse, DestinationWarehouse: destinationWarehouse, } } func toAreaDTO(a *entity.Area) *AreaDTO { if a == nil { return nil } return &AreaDTO{ Id: a.Id, Name: a.Name, } } func toLocationDTO(l *entity.Location) *LocationDTO { if l == nil { return nil } return &LocationDTO{ Id: l.Id, Name: l.Name, } } func toWarehouseDetailDTO(w *entity.Warehouse) *WarehouseDetailDTO { if w == nil { return nil } return &WarehouseDetailDTO{ Id: w.Id, Name: w.Name, Location: toLocationDTO(w.Location), Area: toAreaDTO(&w.Area), // Ambil area langsung dari warehouse (area_id) } } func ToTransferListDTO(e entity.StockTransfer) TransferListDTO { var createdUser *userDTO.UserRelationDTO if e.CreatedUser != nil { mapped := userDTO.ToUserRelationDTO(*e.CreatedUser) createdUser = &mapped } // Map details var details []TransferDetailItemDTO for _, d := range e.Details { details = append(details, TransferDetailItemDTO{ Id: d.Id, Proudct: ProductSimpleDTO{ Id: d.Product.Id, Name: d.Product.Name, }, Quantity: d.Quantity, }) } // Map deliveries var deliveries []TransferDeliveryDTO for _, del := range e.Deliveries { // Map delivery items var items []TransferDeliveryItemDTO for _, item := range del.Items { items = append(items, TransferDeliveryItemDTO{ Id: item.Id, StockTransferDetailId: item.StockTransferDetailId, Quantity: item.Quantity, }) } deliveries = append(deliveries, TransferDeliveryDTO{ Id: del.Id, Supplier: SupplierSimpleDTO{ Id: del.Supplier.Id, Name: del.Supplier.Name, }, VehiclePlate: del.VehiclePlate, DriverName: del.DriverName, DocumentNumber: del.DocumentNumber, DocumentPath: del.DocumentPath, ShippingCostItem: del.ShippingCostItem, ShippingCostTotal: del.ShippingCostTotal, Items: items, }) } return TransferListDTO{ TransferRelationDTO: ToTransferRelationDTO(e), CreatedUser: createdUser, CreatedAt: e.CreatedAt, UpdatedAt: e.UpdatedAt, Details: details, Deliveries: deliveries, } } func ToTransferListDTOs(e []entity.StockTransfer) []TransferListDTO { result := make([]TransferListDTO, len(e)) for i, r := range e { result[i] = ToTransferListDTO(r) } return result } func ToTransferDetailDTO(e entity.StockTransfer) TransferDetailDTO { // Map details var details []TransferDetailItemDTO for _, d := range e.Details { details = append(details, TransferDetailItemDTO{ Id: d.Id, Proudct: ProductSimpleDTO{ Id: d.Product.Id, Name: d.Product.Name, }, Quantity: d.Quantity, }) } // Map deliveries var deliveries []TransferDeliveryDTO for _, del := range e.Deliveries { deliveries = append(deliveries, TransferDeliveryDTO{ Id: del.Id, Supplier: SupplierSimpleDTO{ Id: del.Supplier.Id, Name: del.Supplier.Name, }, VehiclePlate: del.VehiclePlate, DriverName: del.DriverName, DocumentNumber: del.DocumentNumber, DocumentPath: del.DocumentPath, ShippingCostItem: del.ShippingCostItem, ShippingCostTotal: del.ShippingCostTotal, }) } return TransferDetailDTO{ TransferListDTO: ToTransferListDTO(e), Details: details, Deliveries: deliveries, } }