• DevPilot's avatar
    feat(accounting): شاشة متابعة خطابات الضمان — سجل تجديدات كامل + تنبيه 45 يوم · 46b84589
    DevPilot authored
    التجديد كان بيكتب فوق تاريخ الانتهاء القديم ويسيب renewal_date واحد، يعني
    تاريخ الخطاب بيضيع: مش عارف اتجدّد كام مرة ولا التواريخ السابقة كانت إيه.
    
    المطلوب اتنفّذ بالكامل:
    - جدول letter_of_guarantee_renewals: كل تجديد صف مستقل فيه رقم التجديد
      وتاريخه وتاريخ الانتهاء السابق والجديد وعمولة التجديد ومين سجّله.
    - الخطاب نفسه ما بيتغيّرش: نفس الرقم ونفس المورد ونفس المشروع. اللي
      بيتحدّث هو تاريخ الانتهاء الحالي وعدّاد التجديدات بس.
    - أعمدة جديدة: supplier_id (المورد/الشركة)، purpose (الغرض)،
      project_name (المشروع)، renewal_count، original_expiry_date.
    - الحالة بقت محسوبة من تاريخ الانتهاء الحالي مش متخزّنة: ساري / قريب
      الانتهاء / منتهي / مُجدد — فـ«قريب الانتهاء» بتتحدّث لوحدها، ولو الخطاب
      اتجدّد التنبيه بيتقاس على التاريخ الجديد تلقائياً.
    - تنبيه قبل الانتهاء بـ45 يوم: بانر في شاشة الخطابات (وكمان بانر أحمر
      للخطابات اللي فات ميعادها ولسه مفتوحة)، وقاعدة في محرك التنبيهات
      (guarantee_expiry) عشان تطلع في الإشعارات كمان.
    - updateStatus بقى يرفض حالة 'renewed' ويوجّه لزر التجديد، عشان محدش
      يغيّر تاريخ الانتهاء من غير ما يتسجّل في السجل.
    
    وباجّات كانت في نفس الشاشة:
    - فلاتر الحالة والنوع كانت بقيم مش موجودة في الـ ENUM أصلاً
      (claimed/cancelled/bid_bond/performance_bond/retention) — يعني الفلترة
      ما كانتش بترجّع حاجة أبداً. اتظبطت على القيم الحقيقية.
    - عمود البنك كان بيقرا issuing_bank والكويري بترجّع bank_name، فكان
      بيطلع «—» دايماً.
    - زر «خطاب ضمان جديد» كان بيتحكم بصلاحية accounting.instruments.manage
      بينما الـ route محتاج accounting.guarantee.manage.
    
    الـ migration اتطبّقت على قاعدة البيانات الحية واتسجّلت (batch 130).
    46b84589
GuaranteeRenewalService.php 8.44 KB