FEAT[BE]: create marketing report API

This commit is contained in:
aguhh18
2025-12-15 16:17:37 +07:00
parent efaeb89ca1
commit d5bc6838c8
9 changed files with 412 additions and 46 deletions
@@ -5,6 +5,8 @@ import (
"gitlab.com/mbugroup/lti-api.git/internal/common/repository"
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
validation "gitlab.com/mbugroup/lti-api.git/internal/modules/repports/validations"
"gitlab.com/mbugroup/lti-api.git/internal/utils"
"gorm.io/gorm"
)
@@ -13,6 +15,7 @@ type MarketingDeliveryProductRepository interface {
GetDeliveryProductsByProjectFlockID(ctx context.Context, projectFlockID uint, callback func(*gorm.DB) *gorm.DB) ([]entity.MarketingDeliveryProduct, error)
GetByMarketingId(ctx context.Context, marketingId uint) ([]entity.MarketingDeliveryProduct, error)
GetByMarketingProductID(ctx context.Context, marketingProductID uint) (*entity.MarketingDeliveryProduct, error)
GetAllWithFilters(ctx context.Context, offset, limit int, filters *validation.MarketingQuery) ([]entity.MarketingDeliveryProduct, int64, error)
}
type MarketingDeliveryProductRepositoryImpl struct {
@@ -74,3 +77,84 @@ func (r *MarketingDeliveryProductRepositoryImpl) GetByMarketingProductID(ctx con
return &deliveryProduct, nil
}
func (r *MarketingDeliveryProductRepositoryImpl) GetAllWithFilters(ctx context.Context, offset, limit int, filters *validation.MarketingQuery) ([]entity.MarketingDeliveryProduct, int64, error) {
var deliveryProducts []entity.MarketingDeliveryProduct
var total int64
db := r.DB().WithContext(ctx).
Model(&entity.MarketingDeliveryProduct{}).
Preload("MarketingProduct", func(db *gorm.DB) *gorm.DB {
return db.
Preload("Marketing").
Preload("Marketing.Customer").
Preload("Marketing.SalesPerson").
Preload("ProductWarehouse").
Preload("ProductWarehouse.Product").
Preload("ProductWarehouse.Warehouse")
}).
Joins("JOIN marketing_products ON marketing_products.id = marketing_delivery_products.marketing_product_id").
Joins("JOIN marketings ON marketings.id = marketing_products.marketing_id")
if filters.ProductId > 0 || filters.WarehouseId > 0 || filters.ProjectFlockKandangId > 0 {
db = db.Joins("LEFT JOIN product_warehouses ON product_warehouses.id = marketing_products.product_warehouse_id")
}
if filters.ProductId > 0 {
db = db.Joins("LEFT JOIN products ON products.id = product_warehouses.product_id")
}
if filters.WarehouseId > 0 {
db = db.Joins("LEFT JOIN warehouses ON warehouses.id = product_warehouses.warehouse_id")
}
if filters.Search != "" {
db = db.Where("marketing_delivery_products.vehicle_number ILIKE ?",
"%"+filters.Search+"%")
}
if filters.CustomerId > 0 {
db = db.Where("marketings.customer_id = ?", filters.CustomerId)
}
if filters.SalesPersonId > 0 {
db = db.Where("marketings.sales_person_id = ?", filters.SalesPersonId)
}
if filters.MarketingId > 0 {
db = db.Where("marketings.id = ?", filters.MarketingId)
}
if filters.ProductId > 0 {
db = db.Where("product_warehouses.product_id = ?", filters.ProductId)
}
if filters.WarehouseId > 0 {
db = db.Where("product_warehouses.warehouse_id = ?", filters.WarehouseId)
}
if filters.ProjectFlockKandangId > 0 {
db = db.Where("product_warehouses.project_flock_kandang_id = ?", filters.ProjectFlockKandangId)
}
if filters.DeliveryDate != "" {
if deliveryDate, err := utils.ParseDateString(filters.DeliveryDate); err == nil {
nextDate := deliveryDate.AddDate(0, 0, 1)
db = db.Where("marketing_delivery_products.delivery_date >= ? AND marketing_delivery_products.delivery_date < ?", deliveryDate, nextDate)
}
}
if err := db.Count(&total).Error; err != nil {
return nil, 0, err
}
if err := db.
Offset(offset).
Limit(limit).
Order("marketing_delivery_products.id DESC").
Find(&deliveryProducts).Error; err != nil {
return nil, 0, err
}
return deliveryProducts, total, nil
}