mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
125 lines
4.3 KiB
Go
125 lines
4.3 KiB
Go
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
|
|
}
|