diff --git a/accounting/utils/format_test.go b/accounting/utils/format_test.go index f3e91ea8b..20cf1e8ab 100644 --- a/accounting/utils/format_test.go +++ b/accounting/utils/format_test.go @@ -20,3 +20,13 @@ func TestFormat_ValidateDateTimeFormat(t *testing.T) { require.False(t, res) } + +func TestFormat_ValidateQueryDate(t *testing.T) { + layout := "2006-01-02 15:04:05" + startDateStr := "2024-11-08 12:13:23" + endDateStr := "2024-11-09 12:13:23" + start, end, err := ValidateQueryDate(startDateStr, endDateStr, layout) + require.Nil(t, err) + require.Equal(t, startDateStr, start) + require.Equal(t, "2024-11-10 12:13:23", end) +} diff --git a/accounting/utils/scene.go b/accounting/utils/scene.go index c5b1483ef..5c17256fb 100644 --- a/accounting/utils/scene.go +++ b/accounting/utils/scene.go @@ -35,8 +35,6 @@ func GetSkuUnitTypeByScene(scene types.SceneType) types.SkuUnitType { return types.UnitToken case types.SceneGuiAgent: return types.UnitToken - case types.SceneSubscription: - return types.UnitMonth default: return types.UnitMinute } @@ -81,3 +79,17 @@ func IsNeedCheckMeteringInMinute(scene types.SceneType, valueType types.ChargeVa return false } } + +func IsNeedCheckUserSubscription(scene types.SceneType) bool { + switch types.SceneType(scene) { + case types.SceneModelInference, + types.SceneSpace, + types.SceneModelFinetune, + types.SceneEvaluation, + types.SceneModelServerless, + types.SceneStarship: + return true + default: + return false + } +} diff --git a/accounting/utils/scene_test.go b/accounting/utils/scene_test.go index 981e052a5..ba5a4c1ea 100644 --- a/accounting/utils/scene_test.go +++ b/accounting/utils/scene_test.go @@ -76,3 +76,20 @@ func TestScene_GetSKUTypeByScene(t *testing.T) { require.Equal(t, skuType, res) } } + +func TestAccountUsersStore_IsNeedCheckUserSubscription(t *testing.T) { + scenes := map[types.SceneType]bool{ + types.SceneModelInference: true, + types.SceneSpace: true, + types.SceneModelFinetune: true, + types.SceneEvaluation: true, + types.SceneModelServerless: true, + types.SceneGuiAgent: false, + types.SceneStarship: true, + } + + for scene, skuType := range scenes { + res := IsNeedCheckUserSubscription(scene) + require.Equal(t, skuType, res) + } +} diff --git a/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.down.sql b/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.down.sql new file mode 100644 index 000000000..d8705c090 --- /dev/null +++ b/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.down.sql @@ -0,0 +1,53 @@ +SET statement_timeout = 0; + +--bun:split + +ALTER TABLE account_prices DROP COLUMN IF EXISTS discount; + +--bun:split + +ALTER TABLE account_statements DROP COLUMN IF EXISTS discount; + +--bun:split + +ALTER TABLE account_statements DROP COLUMN IF EXISTS regular_value; + +--bun:split + +ALTER TABLE account_subscription_bills DROP COLUMN IF EXISTS sku_type; + +--bun:split + +ALTER TABLE account_subscription_bills DROP COLUMN IF EXISTS discount; + +--bun:split + +ALTER TABLE account_subscription_usages DROP COLUMN IF EXISTS value_type; + +--bun:split + +ALTER TABLE account_subscription_usages DROP COLUMN IF EXISTS sku_type; + +--bun:split + +DROP INDEX IF EXISTS idx_unique_account_subscription_useruuid_skutype; + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_subscription_useruuid_skutype ON account_subscriptions (user_uuid,sku_type); + +--bun:split + +DROP INDEX IF EXISTS idx_account_subscription_bill_createdat_useruuid_status_skutype; + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_subscription_bill_createdat_useruuid_status ON account_subscription_bills (created_at,user_uuid,status); + +--bun:split + +DROP INDEX IF EXISTS idx_account_sub_usage_billid_useruuid_skutype; + +--bun:split + +DROP INDEX IF EXISTS idx_account_sub_usage_billmonth_useruuid_skutype; diff --git a/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.up.sql b/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.up.sql new file mode 100644 index 000000000..c2b8f2a00 --- /dev/null +++ b/builder/store/database/migrations/20250904013752_update_columns_for_subscriptions.up.sql @@ -0,0 +1,54 @@ +SET statement_timeout = 0; + +--bun:split + +ALTER TABLE account_prices ADD COLUMN IF NOT EXISTS discount DOUBLE PRECISION; + +--bun:split + +ALTER TABLE account_statements ADD COLUMN IF NOT EXISTS discount DOUBLE PRECISION; + +--bun:split + +ALTER TABLE account_statements ADD COLUMN IF NOT EXISTS regular_value DOUBLE PRECISION; + +--bun:split + +ALTER TABLE account_subscription_bills ADD COLUMN IF NOT EXISTS sku_type BIGINT; + +--bun:split + +ALTER TABLE account_subscription_bills ADD COLUMN IF NOT EXISTS discount DOUBLE PRECISION; + +--bun:split + +ALTER TABLE account_subscription_usages ADD COLUMN IF NOT EXISTS value_type BIGINT; + +--bun:split + +ALTER TABLE account_subscription_usages ADD COLUMN IF NOT EXISTS sku_type BIGINT; + +--bun:split + +DROP INDEX IF EXISTS idx_account_subscription_useruuid_skutype; + +--bun:split + +CREATE UNIQUE INDEX IF NOT EXISTS idx_unique_account_subscription_useruuid_skutype ON account_subscriptions (user_uuid,sku_type); + +--bun:split + +DROP INDEX IF EXISTS idx_account_subscription_bill_createdat_useruuid_status; + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_subscription_bill_createdat_useruuid_status_skutype ON account_subscription_bills (created_at,user_uuid,status,sku_type); + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_sub_usage_billid_useruuid_skutype ON account_subscription_usages (bill_id,user_uuid,sku_type); + +--bun:split + +CREATE INDEX IF NOT EXISTS idx_account_sub_usage_billmonth_useruuid_skutype ON account_subscription_usages (bill_month,user_uuid,sku_type); +