package dto import ( "fmt" "time" entity "gitlab.com/mbugroup/lti-api.git/internal/entities" userDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/users/dto" ) // === DTO Structs === type ClosingRelationDTO struct { Id uint `json:"id"` Name string `json:"name"` } type ClosingListDTO struct { Id uint `json:"id"` Name string `json:"name"` CreatedUser *userDTO.UserRelationDTO `json:"created_user"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } type ClosingDetailDTO struct { ClosingListDTO } type ClosingSummaryDTO struct { LocationID uint `json:"location_id"` Periode int `json:"periode"` JenisProduk string `json:"jenis_produk"` LabelPopulasi string `json:"label_populasi"` JumlahPopulasi int `json:"jumlah_populasi"` JumlahPopulasiFormatted string `json:"jumlah_populasi_formatted"` JenisProject string `json:"jenis_project"` KandangAktif int `json:"kandang_aktif"` KandangAktifFormatted string `json:"kandang_aktif_formatted"` StatusPembayaranPenjualan string `json:"status_pembayaran_penjualan"` StatusPembayaranMitra string `json:"status_pembayaran_mitra"` StatusProject string `json:"status_project"` StatusClosing string `json:"status_closing"` } func ToClosingSummaryDTO(project entity.ProjectFlock, statusProject, statusClosing string) ClosingSummaryDTO { history := project.KandangHistory period := maxPeriod(history) kandangCount := len(history) population := sumPopulation(history) populationInt := int(population) return ClosingSummaryDTO{ LocationID: project.LocationId, Periode: period, JenisProduk: project.Category, LabelPopulasi: "", JumlahPopulasi: populationInt, JumlahPopulasiFormatted: fmt.Sprintf("%d Ekor", populationInt), JenisProject: "", KandangAktif: kandangCount, KandangAktifFormatted: fmt.Sprintf("%d Kandang", kandangCount), StatusPembayaranPenjualan: "Tempo", StatusPembayaranMitra: "", StatusProject: statusProject, StatusClosing: statusClosing, } } func maxPeriod(history []entity.ProjectFlockKandang) int { max := 0 for _, h := range history { if h.Period > max { max = h.Period } } return max } func sumPopulation(history []entity.ProjectFlockKandang) float64 { var total float64 for _, h := range history { for _, chickin := range h.Chickins { total += chickin.UsageQty + chickin.PendingUsageQty } } return total } // === Mapper Functions === func ToClosingRelationDTO(e entity.ProjectFlock) ClosingRelationDTO { return ClosingRelationDTO{ Id: e.Id, } } func ToClosingListDTO(e entity.ProjectFlock) ClosingListDTO { var createdUser *userDTO.UserRelationDTO if e.CreatedUser.Id != 0 { mapped := userDTO.ToUserRelationDTO(e.CreatedUser) createdUser = &mapped } return ClosingListDTO{ Id: e.Id, CreatedAt: e.CreatedAt, UpdatedAt: e.UpdatedAt, CreatedUser: createdUser, } } func ToClosingListDTOs(e []entity.ProjectFlock) []ClosingListDTO { result := make([]ClosingListDTO, len(e)) for i, r := range e { result[i] = ToClosingListDTO(r) } return result } func ToClosingDetailDTO(e entity.ProjectFlock) ClosingDetailDTO { return ClosingDetailDTO{ ClosingListDTO: ToClosingListDTO(e), } }