From e79fde240889bfec9efd5bfdfc33a83167b67bff Mon Sep 17 00:00:00 2001 From: Adnan Zahir Date: Sat, 25 Apr 2026 12:15:55 +0700 Subject: [PATCH 1/2] feat: add more filters --- .../controllers/product-stock.controller.go | 7 ++++--- .../product-stocks/services/product-stock.service.go | 3 +++ .../validations/product-stock.validation.go | 7 ++++--- .../transfers/controllers/transfer.controller.go | 8 +++++--- .../inventory/transfers/services/transfer.service.go | 6 ++++++ .../transfers/validations/transfer.validation.go | 8 +++++--- 6 files changed, 27 insertions(+), 12 deletions(-) diff --git a/internal/modules/inventory/product-stocks/controllers/product-stock.controller.go b/internal/modules/inventory/product-stocks/controllers/product-stock.controller.go index 430941ae..91003b44 100644 --- a/internal/modules/inventory/product-stocks/controllers/product-stock.controller.go +++ b/internal/modules/inventory/product-stocks/controllers/product-stock.controller.go @@ -25,9 +25,10 @@ func NewProductStockController(productStockService service.ProductStockService) func (u *ProductStockController) GetAll(c *fiber.Ctx) error { query := &validation.Query{ - Page: c.QueryInt("page", 1), - Limit: c.QueryInt("limit", 10), - Search: c.Query("search", ""), + Page: c.QueryInt("page", 1), + Limit: c.QueryInt("limit", 10), + Search: c.Query("search", ""), + ProductCategoryID: uint(c.QueryInt("product_category_id", 0)), } if query.Page < 1 || query.Limit < 1 { diff --git a/internal/modules/inventory/product-stocks/services/product-stock.service.go b/internal/modules/inventory/product-stocks/services/product-stock.service.go index c2463cdc..a63711e8 100644 --- a/internal/modules/inventory/product-stocks/services/product-stock.service.go +++ b/internal/modules/inventory/product-stocks/services/product-stock.service.go @@ -129,6 +129,9 @@ func (s productStockService) GetAll(c *fiber.Ctx, params *validation.Query) ([]e if params.Search != "" { db = db.Where("products.name ILIKE ?", "%"+params.Search+"%") } + if params.ProductCategoryID > 0 { + db = db.Where("products.product_category_id = ?", params.ProductCategoryID) + } return db.Order("products.created_at DESC").Order("products.updated_at DESC") }) diff --git a/internal/modules/inventory/product-stocks/validations/product-stock.validation.go b/internal/modules/inventory/product-stocks/validations/product-stock.validation.go index 7d16d3ee..a3c6b9a7 100644 --- a/internal/modules/inventory/product-stocks/validations/product-stock.validation.go +++ b/internal/modules/inventory/product-stocks/validations/product-stock.validation.go @@ -9,7 +9,8 @@ type Update struct { } type Query struct { - Page int `query:"page" validate:"omitempty,number,min=1,gt=0"` - Limit int `query:"limit" validate:"omitempty,number,min=1,max=100,gt=0"` - Search string `query:"search" validate:"omitempty,max=50"` + Page int `query:"page" validate:"omitempty,number,min=1,gt=0"` + Limit int `query:"limit" validate:"omitempty,number,min=1,max=100,gt=0"` + Search string `query:"search" validate:"omitempty,max=50"` + ProductCategoryID uint `query:"product_category_id" validate:"omitempty"` } diff --git a/internal/modules/inventory/transfers/controllers/transfer.controller.go b/internal/modules/inventory/transfers/controllers/transfer.controller.go index 64efeada..ca37959a 100644 --- a/internal/modules/inventory/transfers/controllers/transfer.controller.go +++ b/internal/modules/inventory/transfers/controllers/transfer.controller.go @@ -25,9 +25,11 @@ func NewTransferController(transferService service.TransferService) *TransferCon func (u *TransferController) GetAll(c *fiber.Ctx) error { query := &validation.Query{ - Page: c.QueryInt("page", 1), - Limit: c.QueryInt("limit", 10), - Search: c.Query("search", ""), + Page: c.QueryInt("page", 1), + Limit: c.QueryInt("limit", 10), + Search: c.Query("search", ""), + ProductID: uint(c.QueryInt("product_id", 0)), + WarehouseID: uint(c.QueryInt("warehouse_id", 0)), } result, totalResults, err := u.TransferService.GetAll(c, query) diff --git a/internal/modules/inventory/transfers/services/transfer.service.go b/internal/modules/inventory/transfers/services/transfer.service.go index 9294a9fd..6fb958ba 100644 --- a/internal/modules/inventory/transfers/services/transfer.service.go +++ b/internal/modules/inventory/transfers/services/transfer.service.go @@ -157,6 +157,12 @@ func (s transferService) GetAll(c *fiber.Ctx, params *validation.Query) ([]entit Where("movement_number ILIKE ? OR from_warehouses.name ILIKE ? OR to_warehouses.name ILIKE ?", searchTerm, searchTerm, searchTerm) } + if params.ProductID > 0 { + db = db.Joins("JOIN stock_transfer_details AS filter_std ON filter_std.stock_transfer_id = stock_transfers.id AND filter_std.deleted_at IS NULL AND filter_std.product_id = ?", params.ProductID) + } + if params.WarehouseID > 0 { + db = db.Where("stock_transfers.from_warehouse_id = ? OR stock_transfers.to_warehouse_id = ?", params.WarehouseID, params.WarehouseID) + } return db.Order("created_at DESC").Order("updated_at DESC") }) diff --git a/internal/modules/inventory/transfers/validations/transfer.validation.go b/internal/modules/inventory/transfers/validations/transfer.validation.go index 89676a41..218f6d81 100644 --- a/internal/modules/inventory/transfers/validations/transfer.validation.go +++ b/internal/modules/inventory/transfers/validations/transfer.validation.go @@ -5,9 +5,11 @@ type Create struct { } type Query struct { - Page int `query:"page" validate:"omitempty,number,min=1"` - Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` - Search string `query:"search" validate:"omitempty,max=50"` + Page int `query:"page" validate:"omitempty,number,min=1"` + Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` + Search string `query:"search" validate:"omitempty,max=50"` + ProductID uint `query:"product_id" validate:"omitempty"` + WarehouseID uint `query:"warehouse_id" validate:"omitempty"` } type TransferProduct struct { From f6b37926e915292a6e1185d5a6376084cd5fd367 Mon Sep 17 00:00:00 2001 From: Adnan Zahir Date: Sat, 25 Apr 2026 14:02:22 +0700 Subject: [PATCH 2/2] feat: add flag ayam for chickin --- .../product_warehouse.repository.go | 22 +++++++++++++++++++ .../services/project_flock_kandang.service.go | 20 +++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/internal/modules/inventory/product-warehouses/repositories/product_warehouse.repository.go b/internal/modules/inventory/product-warehouses/repositories/product_warehouse.repository.go index 2659533d..f4c7d045 100644 --- a/internal/modules/inventory/product-warehouses/repositories/product_warehouse.repository.go +++ b/internal/modules/inventory/product-warehouses/repositories/product_warehouse.repository.go @@ -23,6 +23,7 @@ type ProductWarehouseRepository interface { GetByCategoryCodeAndWarehouseID(ctx context.Context, categoryCode string, warehouseId uint) ([]entity.ProductWarehouse, error) GetLatestByCategoryCodeAndWarehouseID(ctx context.Context, categoryCode string, warehouseId uint, db *gorm.DB) (*entity.ProductWarehouse, error) GetByFlagAndWarehouseID(ctx context.Context, flagName string, warehouseId uint) ([]entity.ProductWarehouse, error) + GetByFlagsAndWarehouseID(ctx context.Context, flagNames []string, excludeFlagNames []string, warehouseId uint) ([]entity.ProductWarehouse, error) GetFirstProductByFlag(ctx context.Context, flagName string) (*entity.Product, error) ListProductIDsByFlagPrefixes(ctx context.Context, prefixes []string, visibleStatus *bool) ([]uint, error) ApplyFlagsFilter(db *gorm.DB, flags []string) *gorm.DB @@ -430,6 +431,27 @@ func (r *ProductWarehouseRepositoryImpl) GetByFlagAndWarehouseID(ctx context.Con return productWarehouses, nil } +func (r *ProductWarehouseRepositoryImpl) GetByFlagsAndWarehouseID(ctx context.Context, flagNames []string, excludeFlagNames []string, warehouseId uint) ([]entity.ProductWarehouse, error) { + var productWarehouses []entity.ProductWarehouse + q := r.DB().WithContext(ctx).Model(&entity.ProductWarehouse{}). + 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 ? AND product_warehouses.warehouse_id = ?", flagNames, warehouseId) + if len(excludeFlagNames) > 0 { + q = q.Where("NOT EXISTS (SELECT 1 FROM flags ef WHERE ef.flagable_id = products.id AND ef.flagable_type = 'products' AND ef.name IN ?)", excludeFlagNames) + } + err := q.Order("product_warehouses.id DESC"). + Preload("Product"). + Preload("Product.ProductCategory"). + Preload("Product.Uom"). + Preload("Warehouse"). + Find(&productWarehouses).Error + if err != nil { + return nil, err + } + return productWarehouses, nil +} + func (r *ProductWarehouseRepositoryImpl) GetFirstProductByFlag(ctx context.Context, flagName string) (*entity.Product, error) { var product entity.Product err := r.DB().WithContext(ctx). diff --git a/internal/modules/production/project-flock-kandangs/services/project_flock_kandang.service.go b/internal/modules/production/project-flock-kandangs/services/project_flock_kandang.service.go index f80022b4..33d7ba8c 100644 --- a/internal/modules/production/project-flock-kandangs/services/project_flock_kandang.service.go +++ b/internal/modules/production/project-flock-kandangs/services/project_flock_kandang.service.go @@ -302,16 +302,22 @@ func (s projectFlockKandangService) getAvailableQuantities(c *fiber.Ctx, project return nil, nil } - var productCategoryCode string - if projectFlockKandang.ProjectFlock.Category == string(utils.ProjectFlockCategoryGrowing) { - productCategoryCode = "DOC" - } else if projectFlockKandang.ProjectFlock.Category == string(utils.ProjectFlockCategoryLaying) { - productCategoryCode = "PULLET" - } else { + if projectFlockKandang.ProjectFlock.Category != string(utils.ProjectFlockCategoryGrowing) && + projectFlockKandang.ProjectFlock.Category != string(utils.ProjectFlockCategoryLaying) { return nil, nil } - products, err := s.ProductWarehouseRepo.GetByFlagAndWarehouseID(c.Context(), productCategoryCode, warehouse.Id) + ayamFlags := []string{ + string(utils.FlagAyam), + string(utils.FlagDOC), + string(utils.FlagPullet), + } + ayamSubFlags := []string{ + string(utils.FlagAyamAfkir), + string(utils.FlagAyamCulling), + string(utils.FlagAyamMati), + } + products, err := s.ProductWarehouseRepo.GetByFlagsAndWarehouseID(c.Context(), ayamFlags, ayamSubFlags, warehouse.Id) if err != nil || len(products) == 0 { return nil, nil }