mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 21:41:55 +00:00
252 lines
7.8 KiB
Go
252 lines
7.8 KiB
Go
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 ClosingListItemDTO struct {
|
|
Id uint `json:"id"`
|
|
ProjectName string `json:"project_name"`
|
|
LocationID uint `json:"location_id"`
|
|
LocationName string `json:"location_name"`
|
|
ProjectCategory string `json:"project_category"`
|
|
Period int `json:"period"`
|
|
ClosingDate string `json:"closing_date"`
|
|
ShedLabel string `json:"shed_label"`
|
|
ShedCount int `json:"shed_count"`
|
|
// SalesPaidAmount int64 `json:"sales_paid_amount"`
|
|
// SalesRemainingAmount int64 `json:"sales_remaining_amount"`
|
|
// SalesPaymentStatus string `json:"sales_payment_status"`
|
|
ProjectStatus string `json:"project_status"`
|
|
}
|
|
|
|
type ClosingSummaryDTO struct {
|
|
FlockID uint `json:"flock_id"`
|
|
Period int `json:"period"`
|
|
// JenisProduk string `json:"jenis_produk"`
|
|
// LabelPopulasi string `json:"label_populasi"`
|
|
Population int `json:"population"`
|
|
PopulationFormatted string `json:"population_formatted"`
|
|
ProjectType string `json:"project_type"`
|
|
ActiveHouseCount int `json:"active_house_count"`
|
|
ActiveHouseLabel string `json:"active_house_label"`
|
|
SalesPaymentStatus string `json:"sales_payment_status"`
|
|
// StatusPembayaranMitra string `json:"status_pembayaran_mitra"`
|
|
StatusProject string `json:"project_status"`
|
|
StatusClosing string `json:"closing_status"`
|
|
}
|
|
|
|
type ClosingSummaryKandangDTO struct {
|
|
FlockID uint `json:"flock_id"`
|
|
Period int `json:"period"`
|
|
LocationName string `json:"location_name"`
|
|
Population int `json:"population"`
|
|
PopulationFormatted string `json:"population_formatted"`
|
|
ProjectType string `json:"project_type"`
|
|
ClosingDate string `json:"closing_date"`
|
|
KandangName string `json:"kandang_name"`
|
|
ChickInDate string `json:"chick_in_date"`
|
|
PicName string `json:"pic_name"`
|
|
ApprovalDate string `json:"approval_date"`
|
|
ProjectStatus string `json:"project_status"`
|
|
}
|
|
|
|
type ClosingPurchaseDTO struct {
|
|
InitialPopulation int `json:"initial_population"`
|
|
ClaimCulling int `json:"claim_culling"`
|
|
FinalPopulation int `json:"final_population"`
|
|
FeedIn float64 `json:"feed_in"`
|
|
FeedUsed float64 `json:"feed_used"`
|
|
// FeedUsedPerHead float64 `json:"feed_used_per_head"`
|
|
}
|
|
|
|
type ClosingSalesDTO struct {
|
|
SalesPopulation int `json:"sales_population"`
|
|
SalesWeight float64 `json:"sales_weight"`
|
|
AverageWeight float64 `json:"avg_weight"`
|
|
AverageSellingPrice float64 `json:"avg_selling_price"`
|
|
}
|
|
|
|
type ClosingEggSalesDTO struct {
|
|
EggPieces int `json:"egg_pieces"`
|
|
EggMassKg float64 `json:"egg_mass"`
|
|
AverageEggWeightKg float64 `json:"avg_egg_weight"`
|
|
AverageSellingPrice float64 `json:"avg_selling_price"`
|
|
}
|
|
|
|
type ClosingPerformanceDTO struct {
|
|
Depletion float64 `json:"depletion"`
|
|
Age float64 `json:"age_day"`
|
|
MortalityStd float64 `json:"mor_std"`
|
|
MortalityAct float64 `json:"mor_act"`
|
|
DeffMortality float64 `json:"mor_diff"`
|
|
FcrStd float64 `json:"fcr_std"`
|
|
FcrAct float64 `json:"fcr_act"`
|
|
DeffFcr float64 `json:"fcr_diff"`
|
|
AwgAct float64 `json:"awg_act"`
|
|
AwgStd float64 `json:"awg_std"`
|
|
FeedIntake float64 `json:"feed_intake"`
|
|
FeedIntakeStd float64 `json:"feed_intake_std"`
|
|
HenDayAct float64 `json:"hen_day_act,omitempty"`
|
|
HendayStd float64 `json:"hen_day_std"`
|
|
EggMass float64 `json:"egg_mass,omitempty"`
|
|
EggMassStd float64 `json:"egg_mass_std"`
|
|
EggWeight float64 `json:"egg_weight,omitempty"`
|
|
EggWeightStd float64 `json:"egg_weight_std"`
|
|
HenHouseAct float64 `json:"hen_housed_act,omitempty"`
|
|
HenHouseStd float64 `json:"hen_housed_std"`
|
|
}
|
|
|
|
type ClosingSalesGroupDTO struct {
|
|
Chicken ClosingSalesDTO `json:"chicken"`
|
|
Egg *ClosingEggSalesDTO `json:"egg,omitempty"`
|
|
}
|
|
|
|
type ClosingProductionReportDTO struct {
|
|
Purchase ClosingPurchaseDTO `json:"purchase"`
|
|
Sales ClosingSalesGroupDTO `json:"sales"`
|
|
Performance ClosingPerformanceDTO `json:"performance"`
|
|
}
|
|
|
|
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{
|
|
FlockID: project.Id,
|
|
Period: period,
|
|
// JenisProduk: project.Category,
|
|
// LabelPopulasi: "",
|
|
Population: populationInt,
|
|
PopulationFormatted: fmt.Sprintf("%d Ekor", populationInt),
|
|
ProjectType: project.Category,
|
|
ActiveHouseCount: kandangCount,
|
|
ActiveHouseLabel: fmt.Sprintf("%d Kandang", kandangCount),
|
|
SalesPaymentStatus: "Tempo",
|
|
// StatusPembayaranMitra: "",
|
|
StatusProject: statusProject,
|
|
StatusClosing: statusClosing,
|
|
}
|
|
}
|
|
|
|
func ToClosingListItemDTO(project entity.ProjectFlock, projectStatus string) ClosingListItemDTO {
|
|
shedCount := len(project.KandangHistory)
|
|
|
|
return ClosingListItemDTO{
|
|
Id: project.Id,
|
|
ProjectName: project.FlockName,
|
|
LocationID: project.LocationId,
|
|
LocationName: project.Location.Name,
|
|
ProjectCategory: project.Category,
|
|
Period: maxPeriod(project.KandangHistory),
|
|
ClosingDate: "17-Nov-2025",
|
|
ShedLabel: fmt.Sprintf("%d Kandang", shedCount),
|
|
ShedCount: shedCount,
|
|
// SalesPaidAmount: 21993726,
|
|
// SalesRemainingAmount: 11075919,
|
|
// SalesPaymentStatus: "Lunas",
|
|
ProjectStatus: projectStatus,
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|
|
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),
|
|
}
|
|
}
|
|
|
|
func CalculateAgeFromChickinDataProduksi(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
|
|
}
|