mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-25 15:55:44 +00:00
codex/fix: recheck and fix purchase receive failed and farm stock not shown on recording
This commit is contained in:
+36
-3
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"gitlab.com/mbugroup/lti-api.git/internal/common/repository"
|
||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||
"gitlab.com/mbugroup/lti-api.git/internal/utils"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -164,10 +165,42 @@ func (r *ProductWarehouseRepositoryImpl) ApplyFlagsFilter(db *gorm.DB, flags []s
|
||||
return db
|
||||
}
|
||||
|
||||
return db.
|
||||
fallbackCategoryCodes := utils.LegacyProductCategoryCodesForFlags(flags)
|
||||
|
||||
db = db.
|
||||
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).
|
||||
Joins("LEFT JOIN product_categories pc_flag ON pc_flag.id = p_flag.product_category_id")
|
||||
|
||||
actualFlagFilter := `
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM flags f_flag
|
||||
WHERE f_flag.flagable_id = p_flag.id
|
||||
AND f_flag.flagable_type = ?
|
||||
AND f_flag.name IN ?
|
||||
)
|
||||
`
|
||||
|
||||
if len(fallbackCategoryCodes) == 0 {
|
||||
return db.Where(actualFlagFilter, entity.FlagableTypeProduct, flags).Distinct()
|
||||
}
|
||||
|
||||
return db.
|
||||
Where(
|
||||
`(`+actualFlagFilter+`) OR (
|
||||
NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM flags f_any
|
||||
WHERE f_any.flagable_id = p_flag.id
|
||||
AND f_any.flagable_type = ?
|
||||
)
|
||||
AND pc_flag.code IN ?
|
||||
)`,
|
||||
entity.FlagableTypeProduct,
|
||||
flags,
|
||||
entity.FlagableTypeProduct,
|
||||
fallbackCategoryCodes,
|
||||
).
|
||||
Distinct()
|
||||
}
|
||||
|
||||
|
||||
+73
@@ -5,6 +5,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
entity "gitlab.com/mbugroup/lti-api.git/internal/entities"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
@@ -115,3 +116,75 @@ func insertProductWarehouseTestFixtures(t *testing.T, db *gorm.DB) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyFlagsFilterIncludesLegacyCategoryFallback(t *testing.T) {
|
||||
db := setupProductWarehouseFlagFilterTestDB(t)
|
||||
repo := NewProductWarehouseRepository(db)
|
||||
ctx := context.Background()
|
||||
|
||||
var ids []uint
|
||||
err := repo.ApplyFlagsFilter(
|
||||
db.WithContext(ctx).Model(&entity.ProductWarehouse{}),
|
||||
[]string{"PAKAN"},
|
||||
).Order("product_warehouses.id").Pluck("product_warehouses.id", &ids).Error
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if len(ids) != 2 || ids[0] != 1 || ids[1] != 2 {
|
||||
t.Fatalf("expected flagged and legacy RAW rows to match, got %v", ids)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyFlagsFilterDoesNotFallbackWhenProductAlreadyHasDifferentFlags(t *testing.T) {
|
||||
db := setupProductWarehouseFlagFilterTestDB(t)
|
||||
repo := NewProductWarehouseRepository(db)
|
||||
ctx := context.Background()
|
||||
|
||||
var ids []uint
|
||||
err := repo.ApplyFlagsFilter(
|
||||
db.WithContext(ctx).Model(&entity.ProductWarehouse{}),
|
||||
[]string{"PAKAN"},
|
||||
).Where("product_warehouses.id = ?", 3).Pluck("product_warehouses.id", &ids).Error
|
||||
if err != nil {
|
||||
t.Fatalf("unexpected error: %v", err)
|
||||
}
|
||||
|
||||
if len(ids) != 0 {
|
||||
t.Fatalf("expected OVK-flagged product not to match PAKAN fallback, got %v", ids)
|
||||
}
|
||||
}
|
||||
|
||||
func setupProductWarehouseFlagFilterTestDB(t *testing.T) *gorm.DB {
|
||||
t.Helper()
|
||||
|
||||
db, err := gorm.Open(sqlite.Open("file:"+t.Name()+"?mode=memory&cache=private"), &gorm.Config{})
|
||||
if err != nil {
|
||||
t.Fatalf("failed opening sqlite db: %v", err)
|
||||
}
|
||||
|
||||
statements := []string{
|
||||
`CREATE TABLE product_categories (id INTEGER PRIMARY KEY, code TEXT NOT NULL)`,
|
||||
`CREATE TABLE products (id INTEGER PRIMARY KEY, product_category_id INTEGER NOT NULL)`,
|
||||
`CREATE TABLE flags (id INTEGER PRIMARY KEY, flagable_id INTEGER NOT NULL, flagable_type TEXT NOT NULL, name TEXT NOT NULL)`,
|
||||
`CREATE TABLE product_warehouses (id INTEGER PRIMARY KEY, product_id INTEGER NOT NULL, warehouse_id INTEGER NOT NULL, project_flock_kandang_id INTEGER NULL, qty NUMERIC(15,3) NOT NULL DEFAULT 0)`,
|
||||
`INSERT INTO product_categories (id, code) VALUES (1, 'STR'), (2, 'RAW'), (3, 'OBT')`,
|
||||
`INSERT INTO products (id, product_category_id) VALUES (10, 1), (20, 2), (30, 2), (40, 3)`,
|
||||
`INSERT INTO flags (id, flagable_id, flagable_type, name) VALUES
|
||||
(1, 10, 'products', 'PAKAN'),
|
||||
(2, 10, 'products', 'STARTER'),
|
||||
(3, 40, 'products', 'OVK'),
|
||||
(4, 40, 'products', 'OBAT')`,
|
||||
`INSERT INTO product_warehouses (id, product_id, warehouse_id, project_flock_kandang_id, qty) VALUES
|
||||
(1, 10, 1, NULL, 10),
|
||||
(2, 20, 1, NULL, 20),
|
||||
(3, 40, 1, NULL, 30)`,
|
||||
}
|
||||
for _, stmt := range statements {
|
||||
if err := db.Exec(stmt).Error; err != nil {
|
||||
t.Fatalf("failed preparing schema: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
return db
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user