-- ============================================================ -- بوابة الائتمان: لا التزام إلا لمن تمرّ أرباحه بالمحفظة -- -- ‏المشكلة التي يعالجها هذا الملف (قرار المالك 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;