mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
226 lines
6.0 KiB
Go
226 lines
6.0 KiB
Go
package dto
|
|
|
|
import (
|
|
"strings"
|
|
|
|
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
|
"gitlab.com/mbugroup/lti-api.git/internal/utils"
|
|
)
|
|
|
|
type ClosingHPPCode string
|
|
|
|
const (
|
|
HPPCodePakan ClosingHPPCode = "PAKAN"
|
|
HPPCodeOVK ClosingHPPCode = "OVK"
|
|
HPPCodeDOC ClosingHPPCode = "DOC"
|
|
HPPCodeDepresiasi ClosingHPPCode = "DEPRESIASI"
|
|
HPPCodeOverhead ClosingHPPCode = "OVERHEAD"
|
|
HPPCodeEkspedisi ClosingHPPCode = "EKSPEDISI"
|
|
)
|
|
|
|
type ClosingProfitLossCode string
|
|
|
|
const (
|
|
PLCodeSales ClosingProfitLossCode = "SALES"
|
|
PLCodeSapronak ClosingProfitLossCode = "SAPRONAK"
|
|
PLCodeOverhead ClosingProfitLossCode = "OVERHEAD"
|
|
PLCodeEkspedisi ClosingProfitLossCode = "EKSPEDISI"
|
|
)
|
|
|
|
type FinancialMetrics struct {
|
|
RpPerBird float64 `json:"rp_per_bird"`
|
|
RpPerKg float64 `json:"rp_per_kg"`
|
|
Amount float64 `json:"amount"`
|
|
}
|
|
|
|
type HPPItem struct {
|
|
ID uint `json:"id"`
|
|
Category string `json:"category"`
|
|
Code string `json:"code"`
|
|
Label string `json:"label"`
|
|
Budgeting FinancialMetrics `json:"budgeting"`
|
|
Realization FinancialMetrics `json:"realization"`
|
|
}
|
|
|
|
type HPPSummary struct {
|
|
Label string `json:"label"`
|
|
Budgeting FinancialMetrics `json:"budgeting"`
|
|
Realization FinancialMetrics `json:"realization"`
|
|
EggBudgeting *FinancialMetrics `json:"egg_budgeting,omitempty"`
|
|
EggRealization *FinancialMetrics `json:"egg_realization,omitempty"`
|
|
}
|
|
|
|
type HPPSection struct {
|
|
Items []HPPItem `json:"items"`
|
|
Summary HPPSummary `json:"summary"`
|
|
}
|
|
|
|
type ProfitLossItem struct {
|
|
Code string `json:"code"`
|
|
Label string `json:"label"`
|
|
Type string `json:"type"`
|
|
RpPerBird float64 `json:"rp_per_bird"`
|
|
RpPerKg float64 `json:"rp_per_kg"`
|
|
Amount float64 `json:"amount"`
|
|
}
|
|
|
|
type ProfitLossSummary struct {
|
|
GrossProfit FinancialMetrics `json:"gross_profit"`
|
|
SubTotal FinancialMetrics `json:"sub_total"`
|
|
NetProfit FinancialMetrics `json:"net_profit"`
|
|
}
|
|
|
|
type ProfitLossSection struct {
|
|
Items []ProfitLossItem `json:"items"`
|
|
Summary ProfitLossSummary `json:"summary"`
|
|
}
|
|
|
|
type ClosingKeuanganData struct {
|
|
HPP HPPSection `json:"hpp"`
|
|
ProfitLoss ProfitLossSection `json:"profit_loss"`
|
|
}
|
|
type MetricsCalculator struct {
|
|
TotalPopulation float64
|
|
ActualPopulation float64
|
|
TotalWeightProduced float64
|
|
}
|
|
|
|
func ToFinancialMetrics(rpPerBird, rpPerKg, amount float64) FinancialMetrics {
|
|
return FinancialMetrics{
|
|
RpPerBird: rpPerBird,
|
|
RpPerKg: rpPerKg,
|
|
Amount: amount,
|
|
}
|
|
}
|
|
|
|
func ToHPPItem(id uint, category, code, label string, budgeting, realization FinancialMetrics) HPPItem {
|
|
return HPPItem{
|
|
ID: id,
|
|
Category: category,
|
|
Code: code,
|
|
Label: label,
|
|
Budgeting: budgeting,
|
|
Realization: realization,
|
|
}
|
|
}
|
|
|
|
func ToHPPSummary(label string, budgeting, realization FinancialMetrics, eggBudgeting, eggRealization *FinancialMetrics) HPPSummary {
|
|
return HPPSummary{
|
|
Label: label,
|
|
Budgeting: budgeting,
|
|
Realization: realization,
|
|
EggBudgeting: eggBudgeting,
|
|
EggRealization: eggRealization,
|
|
}
|
|
}
|
|
|
|
func ToHPPSection(items []HPPItem, summary HPPSummary) HPPSection {
|
|
return HPPSection{
|
|
Items: items,
|
|
Summary: summary,
|
|
}
|
|
}
|
|
|
|
func ToProfitLossItem(code, label, itemType string, rpPerBird, rpPerKg, amount float64) ProfitLossItem {
|
|
return ProfitLossItem{
|
|
Code: code,
|
|
Label: label,
|
|
Type: itemType,
|
|
RpPerBird: rpPerBird,
|
|
RpPerKg: rpPerKg,
|
|
Amount: amount,
|
|
}
|
|
}
|
|
|
|
func ToProfitLossSummary(grossProfit, subTotal, netProfit FinancialMetrics) ProfitLossSummary {
|
|
return ProfitLossSummary{
|
|
GrossProfit: grossProfit,
|
|
SubTotal: subTotal,
|
|
NetProfit: netProfit,
|
|
}
|
|
}
|
|
|
|
func ToProfitLossSection(items []ProfitLossItem, summary ProfitLossSummary) ProfitLossSection {
|
|
return ProfitLossSection{
|
|
Items: items,
|
|
Summary: summary,
|
|
}
|
|
}
|
|
|
|
func ToClosingKeuanganData(hpp HPPSection, profitLoss ProfitLossSection) ClosingKeuanganData {
|
|
return ClosingKeuanganData{
|
|
HPP: hpp,
|
|
ProfitLoss: profitLoss,
|
|
}
|
|
}
|
|
|
|
func (mc *MetricsCalculator) CalculateMetrics(amount float64) (rpPerBird, rpPerKg float64) {
|
|
if mc.ActualPopulation > 0 {
|
|
rpPerBird = amount / mc.ActualPopulation
|
|
}
|
|
if mc.TotalWeightProduced > 0 {
|
|
rpPerKg = amount / mc.TotalWeightProduced
|
|
}
|
|
return
|
|
}
|
|
|
|
func (mc *MetricsCalculator) CalculateProfitLossMetrics(amount float64) (rpPerBird, rpPerKg float64) {
|
|
if mc.TotalPopulation > 0 {
|
|
rpPerBird = amount / mc.TotalPopulation
|
|
}
|
|
if mc.TotalWeightProduced > 0 {
|
|
rpPerKg = amount / mc.TotalWeightProduced
|
|
}
|
|
return
|
|
}
|
|
|
|
type ProductFilter struct {
|
|
ProjectFlockCategory string
|
|
}
|
|
|
|
func (pf *ProductFilter) IsEggProduct(product entity.Product) bool {
|
|
for _, flag := range product.Flags {
|
|
flagName := strings.ToUpper(flag.Name)
|
|
if flagName == string(utils.FlagTelur) ||
|
|
flagName == string(utils.FlagTelurUtuh) ||
|
|
flagName == string(utils.FlagTelurPecah) ||
|
|
flagName == string(utils.FlagTelurPutih) ||
|
|
flagName == string(utils.FlagTelurRetak) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (pf *ProductFilter) IsChickenProduct(product entity.Product) bool {
|
|
for _, flag := range product.Flags {
|
|
flagName := strings.ToUpper(flag.Name)
|
|
if flagName == string(utils.FlagAyamAfkir) ||
|
|
flagName == string(utils.FlagAyamCulling) ||
|
|
flagName == string(utils.FlagAyamMati) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (pf *ProductFilter) ShouldIncludeProduct(product entity.Product) bool {
|
|
if pf.ProjectFlockCategory == string(utils.ProjectFlockCategoryLaying) {
|
|
return pf.IsEggProduct(product)
|
|
}
|
|
return pf.IsChickenProduct(product) || (!pf.IsEggProduct(product) && !pf.IsChickenProduct(product))
|
|
}
|
|
|
|
func (pf *ProductFilter) FilterDeliveryProducts(deliveries []entity.MarketingDeliveryProduct) []entity.MarketingDeliveryProduct {
|
|
filtered := make([]entity.MarketingDeliveryProduct, 0)
|
|
for _, delivery := range deliveries {
|
|
if delivery.MarketingProduct.ProductWarehouse.Product.Id == 0 {
|
|
continue
|
|
}
|
|
if pf.ShouldIncludeProduct(delivery.MarketingProduct.ProductWarehouse.Product) {
|
|
filtered = append(filtered, delivery)
|
|
}
|
|
}
|
|
return filtered
|
|
}
|