Files
Siro/backend/migrations/2026_08_09_obligation_credit_gate.sql
T

56 lines
4.2 KiB
SQL

-- ============================================================
-- بوابة الائتمان: لا التزام إلا لمن تمرّ أرباحه بالمحفظة
--
-- ‏المشكلة التي يعالجها هذا الملف (قرار المالك 2026-08-09):
--
-- ‏سقف الخصم اليومي في محرك الالتزامات نسبة من أرباح اليوم، وأرباح اليوم
-- ‏تُقاس من الصفوف الموجبة في `driverWallet`. سائق الكاش الذي يحصّل نقداً
-- ‏ولا تمرّ أرباحه بالمحفظة يظهر بأرباح صفر كل يوم — فسقفه صفر، فلا
-- ‏يُحصَّل منه شيء أبداً.
--
-- ‏هذا محتمَل في التأمين (قسط صغير متكرر، والخسارة محدودة ومرئية). وهو
-- ‏غير محتمَل إطلاقاً في الوقود والصيانة والتمويل: هناك تسلّم السائق
-- ‏قيمةً فعلية — وقوداً في خزّان سيارته أو إصلاحاً في ورشة — مقابل وعد
-- ‏بالسداد من قناة لا يمرّ بها ماله. هذا ليس ائتماناً بل هبة.
--
-- ‏الحل: شرط أهلية إضافي مخزَّن مع المنتج لا في الكود، على غرار شروط
-- ‏الرحلات والتقييم القائمة. العتبة تختلف بطبيعة المنتج: قسط تأمين يومي
-- ‏صغير لا يحتاج ما يحتاجه قرض صيانة.
-- ============================================================
ALTER TABLE `obligation_products`
-- ‏المفتاح العام. تركه قابلاً للإطفاء ليس تساهلاً: منتج مستقبلي قد
-- ‏يُدفع مقدَّماً أو يموّله طرف ثالث، فلا معنى لبوابة ائتمان عليه.
ADD COLUMN `requires_wallet_income` TINYINT(1) NOT NULL DEFAULT 1
COMMENT 'يشترط أن تمرّ أرباح السائق بالمحفظة' AFTER `min_account_days`,
-- ‏عدد الأيام المتمايزة التي دخل فيها مالٌ محفظةَ السائق خلال آخر
-- ‏ثلاثين يوماً. المقياس أيام لا مبلغ لأن السؤال هنا ليس «كم يكسب؟»
-- ‏بل «هل قناة التحصيل تعمل؟» — سائق دخله مرة واحدة كبيرة قد يكون
-- ‏استرداداً أو حادثة، وسائق دخله اثنا عشر يوماً متفرّقاً قناته حيّة.
ADD COLUMN `min_wallet_days_30d` SMALLINT NOT NULL DEFAULT 10
COMMENT 'أيام دخل في المحفظة خلال آخر 30 يوماً' AFTER `requires_wallet_income`,
-- ‏الحد الأدنى للدخل المار بالمحفظة في آخر ثلاثين يوماً. يُقاس بعملة
-- ‏المنتج. صفر يعني «لا شرط مبلغ» ويُكتفى بشرط الأيام.
ADD COLUMN `min_wallet_income_30d` DECIMAL(12,3) NOT NULL DEFAULT 0
COMMENT 'إجمالي الدخل المار بالمحفظة خلال آخر 30 يوماً' AFTER `min_wallet_days_30d`;
-- ── عتبة التأمين ────────────────────────────────────────────
-- ‏منتجات التأمين المرحَّلة تخضع للبوابة أيضاً — القسط الذي تتحمّله
-- ‏الشركة ثم تسترده من الأرباح ائتمانٌ بالمعنى نفسه.
--
-- ‏لكن العتبة متساهلة عمداً (ثمانية أيام، بلا شرط مبلغ): التأمين مكافأة
-- ‏استمرار مشروطة أصلاً بمئتي رحلة وتقييم جيد، وتشديد بوابة ثانية فوقها
-- ‏يفرغ المنتج من غرضه.
--
-- ‏هذا يمسّ الاشتراكات **الجديدة** وحدها. الالتزامات القائمة لا تُفحص
-- ‏ثانيةً: سحب تغطية من سائق مؤمَّن اليوم بسبب شرط سُنّ اليوم عقوبة
-- ‏بأثر رجعي.
UPDATE `obligation_products` op
JOIN `insurance_plans` pl ON pl.`code` = op.`code`
SET op.`requires_wallet_income` = 1,
op.`min_wallet_days_30d` = 8,
op.`min_wallet_income_30d` = 0;