package dto import ( "time" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" deliveryOrdersDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/marketing/dto" customerDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/customers/dto" kandangDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/kandangs/dto" productDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/products/dto" ) // === Response DTO === type SalesDTO struct { Id uint `json:"id"` RealizationDate time.Time `json:"realization_date"` Age int `json:"age"` DoNumber string `json:"do_number"` Product *productDTO.ProductRelationDTO `json:"product,omitempty"` Customer *customerDTO.CustomerRelationDTO `json:"customer,omitempty"` Qty float64 `json:"qty"` Weight float64 `json:"weight"` AvgWeight float64 `json:"avg_weight"` Price float64 `json:"price"` TotalPrice float64 `json:"total_price"` Kandang *kandangDTO.KandangRelationDTO `json:"kandang,omitempty"` PaymentStatus string `json:"payment_status"` } type PenjualanRealisasiResponseDTO struct { Sales []SalesDTO `json:"sales"` } // === Mapper Functions === func ToSalesDTO(e entity.MarketingDeliveryProduct) SalesDTO { age := calculateAgeFromChickin(e.MarketingProduct.ProductWarehouse.ProjectFlockKandang, e.DeliveryDate) var product *productDTO.ProductRelationDTO if e.MarketingProduct.ProductWarehouse.Product.Id != 0 { mapped := productDTO.ToProductRelationDTO(e.MarketingProduct.ProductWarehouse.Product) product = &mapped } var customer *customerDTO.CustomerRelationDTO if e.MarketingProduct.Marketing.Customer.Id != 0 { mapped := customerDTO.ToCustomerRelationDTO(e.MarketingProduct.Marketing.Customer) customer = &mapped } var kandang *kandangDTO.KandangRelationDTO if e.MarketingProduct.ProductWarehouse.ProjectFlockKandang != nil && e.MarketingProduct.ProductWarehouse.ProjectFlockKandang.Kandang.Id != 0 { mapped := kandangDTO.ToKandangRelationDTO(e.MarketingProduct.ProductWarehouse.ProjectFlockKandang.Kandang) kandang = &mapped } var realizationDate time.Time if e.DeliveryDate != nil { realizationDate = *e.DeliveryDate } doNumber := deliveryOrdersDTO.GenerateDeliveryOrderNumber(e.MarketingProduct.Marketing.SoNumber, e.DeliveryDate, e.MarketingProduct.ProductWarehouse.Warehouse.Id) return SalesDTO{ Id: e.Id, RealizationDate: realizationDate, Age: age, DoNumber: doNumber, Product: product, Customer: customer, Qty: e.UsageQty, Weight: e.TotalWeight, AvgWeight: e.AvgWeight, Price: e.UnitPrice, TotalPrice: e.TotalPrice, Kandang: kandang, PaymentStatus: "Paid", } } func ToSalesDTOs(e []entity.MarketingDeliveryProduct) []SalesDTO { result := make([]SalesDTO, len(e)) for i, r := range e { result[i] = ToSalesDTO(r) } return result } func ToPenjualanRealisasiResponseDTO(projectFlockID uint, e []entity.MarketingDeliveryProduct) PenjualanRealisasiResponseDTO { return PenjualanRealisasiResponseDTO{ Sales: ToSalesDTOs(e), } } func extractPeriodFromRealisasi(realisasi []entity.MarketingDeliveryProduct) int { if len(realisasi) > 0 { for _, item := range realisasi { if item.MarketingProduct.ProductWarehouse.ProjectFlockKandang != nil { return item.MarketingProduct.ProductWarehouse.ProjectFlockKandang.Period } } } return 0 } func calculateAgeFromChickin(projectFlockKandang *entity.ProjectFlockKandang, deliveryDate *time.Time) int { if projectFlockKandang == nil || deliveryDate == nil || len(projectFlockKandang.Chickins) == 0 { return 0 } earliestChickinDate := projectFlockKandang.Chickins[0].ChickInDate for _, chickin := range projectFlockKandang.Chickins { if chickin.ChickInDate.Before(earliestChickinDate) { earliestChickinDate = chickin.ChickInDate } } ageInDays := int(deliveryDate.Sub(earliestChickinDate).Hours() / 24) ageInWeeks := ageInDays / 7 return ageInWeeks }