mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-20 13:31:56 +00:00
Merge branch 'FEAT/BE/marketing' into 'development'
FEAT[BE] : update new concept of marketing See merge request mbugroup/lti-api!307
This commit is contained in:
+1
@@ -32,6 +32,7 @@ func (u *ProductWarehouseController) GetAll(c *fiber.Ctx) error {
|
||||
Flags: c.Query("flags", ""),
|
||||
KandangId: uint(c.QueryInt("kandang_id", 0)),
|
||||
TransferContext: c.Query(utils.TransferContextKey, ""),
|
||||
Type: c.Query("type", ""),
|
||||
}
|
||||
|
||||
if query.Page < 1 || query.Limit < 1 {
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||
productDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/products/dto"
|
||||
warehouseDTO "gitlab.com/mbugroup/lti-api.git/internal/modules/master/warehouses/dto"
|
||||
"gitlab.com/mbugroup/lti-api.git/internal/utils"
|
||||
)
|
||||
|
||||
// === DTO Structs ===
|
||||
@@ -22,6 +23,7 @@ type ProductWarehouseListDTO struct {
|
||||
Product *productDTO.ProductRelationDTO `json:"product,omitempty"`
|
||||
Warehouse *warehouseDTO.WarehouseRelationDTO `json:"warehouse,omitempty"`
|
||||
ProjectFlockKandang *ProjectFlockKandangRelationDTO `json:"project_flock_kandang,omitempty"`
|
||||
Week int `json:"week"`
|
||||
CreatedUser *UserRelationDTO `json:"created_user,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
@@ -109,6 +111,22 @@ func ToProductWarehouseListDTO(e entity.ProductWarehouse) ProductWarehouseListDT
|
||||
}
|
||||
|
||||
dto.ProjectFlockKandang = pfkDTO
|
||||
|
||||
// Calculate week for AYAM_PULLET/AYAM products
|
||||
productFlags := make([]string, len(e.Product.Flags))
|
||||
for i, f := range e.Product.Flags {
|
||||
productFlags[i] = f.Name
|
||||
}
|
||||
|
||||
var category string
|
||||
if e.ProjectFlockKandang.ProjectFlock.Id != 0 {
|
||||
category = e.ProjectFlockKandang.ProjectFlock.Category
|
||||
}
|
||||
|
||||
now := time.Now()
|
||||
_, ageInWeeks := calculateAgeFromChickin(e.ProjectFlockKandang, &now, productFlags, category)
|
||||
|
||||
dto.Week = ageInWeeks
|
||||
}
|
||||
|
||||
return dto
|
||||
@@ -138,3 +156,58 @@ func ToProductWarehouseNestedDTO(e entity.ProductWarehouse) ProductWarehousNeste
|
||||
Warehouse: &warehouse,
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to calculate age from chickin (same logic as closingMarketing.dto.go)
|
||||
func calculateAgeFromChickin(projectFlockKandang *entity.ProjectFlockKandang, currentDate *time.Time, productFlags []string, category string) (int, int) {
|
||||
if projectFlockKandang == nil || currentDate == nil || len(projectFlockKandang.Chickins) == 0 {
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
// Return 0 for TRADING, TELUR, and AYAM flags (only AYAM_PULLET should have week)
|
||||
for _, flag := range productFlags {
|
||||
if flag == string(utils.FlagOVK) ||
|
||||
flag == string(utils.FlagPakan) ||
|
||||
flag == string(utils.FlagPreStarter) ||
|
||||
flag == string(utils.FlagStarter) ||
|
||||
flag == string(utils.FlagFinisher) ||
|
||||
flag == string(utils.FlagObat) ||
|
||||
flag == string(utils.FlagVitamin) ||
|
||||
flag == string(utils.FlagKimia) ||
|
||||
flag == string(utils.FlagEkspedisi) ||
|
||||
flag == string(utils.FlagTelur) ||
|
||||
flag == string(utils.FlagTelurUtuh) ||
|
||||
flag == string(utils.FlagTelurPecah) ||
|
||||
flag == string(utils.FlagTelurPutih) ||
|
||||
flag == string(utils.FlagTelurRetak) ||
|
||||
flag == string(utils.FlagAyamAfkir) ||
|
||||
flag == string(utils.FlagAyamCulling) ||
|
||||
flag == string(utils.FlagAyamMati) {
|
||||
return 0, 0
|
||||
}
|
||||
}
|
||||
|
||||
// Find earliest chickin date
|
||||
earliestChickinDate := projectFlockKandang.Chickins[0].ChickInDate
|
||||
for _, chickin := range projectFlockKandang.Chickins {
|
||||
if chickin.ChickInDate.Before(earliestChickinDate) {
|
||||
earliestChickinDate = chickin.ChickInDate
|
||||
}
|
||||
}
|
||||
|
||||
diff := currentDate.Sub(earliestChickinDate)
|
||||
ageInDays := int(diff.Hours() / 24)
|
||||
|
||||
var ageInWeeks int
|
||||
if ageInDays <= 0 {
|
||||
ageInWeeks = 0
|
||||
} else {
|
||||
if category == string(utils.ProjectFlockCategoryLaying) {
|
||||
ageInDays = ageInDays + 119
|
||||
ageInWeeks = ((ageInDays - 1) / 7) + 1
|
||||
} else {
|
||||
ageInWeeks = ((ageInDays - 1) / 7) + 1
|
||||
}
|
||||
}
|
||||
|
||||
return ageInDays, ageInWeeks
|
||||
}
|
||||
|
||||
+4
-3
@@ -168,9 +168,10 @@ func (r *ProductWarehouseRepositoryImpl) ApplyFlagsFilter(db *gorm.DB, flags []s
|
||||
}
|
||||
|
||||
return db.
|
||||
Joins("JOIN products ON products.id = product_warehouses.product_id").
|
||||
Joins("JOIN flags ON flags.flagable_id = products.id AND flags.flagable_type = ?", "products").
|
||||
Where("flags.name IN ?", flags)
|
||||
Joins("JOIN products p_flag ON p_flag.id = product_warehouses.product_id").
|
||||
Joins("JOIN flags f_flag ON f_flag.flagable_id = p_flag.id AND f_flag.flagable_type = ?", "products").
|
||||
Where("f_flag.name IN ?", flags).
|
||||
Distinct()
|
||||
}
|
||||
|
||||
func (r *ProductWarehouseRepositoryImpl) AdjustQuantities(ctx context.Context, deltas map[uint]float64, modifier func(*gorm.DB) *gorm.DB) error {
|
||||
|
||||
+24
-2
@@ -46,7 +46,8 @@ func (s productWarehouseService) withRelations(db *gorm.DB) *gorm.DB {
|
||||
Preload("Warehouse.Area").
|
||||
Preload("Warehouse.Kandang").
|
||||
Preload("ProjectFlockKandang").
|
||||
Preload("ProjectFlockKandang.ProjectFlock")
|
||||
Preload("ProjectFlockKandang.ProjectFlock").
|
||||
Preload("ProjectFlockKandang.Chickins")
|
||||
}
|
||||
|
||||
func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entity.ProductWarehouse, int64, error) {
|
||||
@@ -99,6 +100,12 @@ func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query)
|
||||
|
||||
offset := (params.Page - 1) * params.Limit
|
||||
|
||||
if params.Type != "" {
|
||||
if !utils.IsValidMarketingType(params.Type) {
|
||||
return nil, 0, fiber.NewError(fiber.StatusBadRequest, "Invalid marketing type")
|
||||
}
|
||||
}
|
||||
|
||||
cleanFlags := utils.ParseFlags(params.Flags)
|
||||
|
||||
productWarehouses, total, err := s.Repository.GetAll(c.Context(), offset, params.Limit, func(db *gorm.DB) *gorm.DB {
|
||||
@@ -128,7 +135,22 @@ func (s productWarehouseService) GetAll(c *fiber.Ctx, params *validation.Query)
|
||||
db = db.Where("warehouse_id = ?", params.WarehouseId)
|
||||
}
|
||||
|
||||
db = s.Repository.ApplyFlagsFilter(db, cleanFlags)
|
||||
if params.Type != "" {
|
||||
switch params.Type {
|
||||
case string(utils.MarketingTypeAyamPullet):
|
||||
db = s.Repository.ApplyFlagsFilter(db, []string{string(utils.FlagDOC), string(utils.FlagPullet), string(utils.FlagLayer)})
|
||||
case string(utils.MarketingTypeAyam):
|
||||
db = s.Repository.ApplyFlagsFilter(db, []string{string(utils.FlagAyamAfkir), string(utils.FlagAyamCulling), string(utils.FlagAyamMati)})
|
||||
case string(utils.MarketingTypeTelur):
|
||||
db = s.Repository.ApplyFlagsFilter(db, []string{string(utils.FlagTelur), string(utils.FlagTelurUtuh), string(utils.FlagTelurPecah), string(utils.FlagTelurPutih), string(utils.FlagTelurRetak)})
|
||||
case string(utils.MarketingTypeTrading):
|
||||
db = s.Repository.ApplyFlagsFilter(db, []string{string(utils.FlagPakan), string(utils.FlagPreStarter), string(utils.FlagStarter), string(utils.FlagFinisher), string(utils.FlagOVK), string(utils.FlagObat), string(utils.FlagVitamin), string(utils.FlagKimia), string(utils.FlagEkspedisi)})
|
||||
}
|
||||
}
|
||||
|
||||
if len(cleanFlags) > 0 {
|
||||
db = s.Repository.ApplyFlagsFilter(db, cleanFlags)
|
||||
}
|
||||
|
||||
return db.Order("product_warehouses.id DESC")
|
||||
})
|
||||
|
||||
+1
@@ -20,4 +20,5 @@ type Query struct {
|
||||
Flags string `query:"flags" validate:"omitempty"`
|
||||
KandangId uint `query:"kandang_id" validate:"omitempty,number,min=1"`
|
||||
TransferContext string `query:"transfer_context" validate:"omitempty,oneof=inventory_transfer"`
|
||||
Type string `query:"type" validate:"omitempty,oneof=AYAM TELUR TRADING AYAM_PULLET"`
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user