• 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
Name
Last commit
Last update
..
migrations Loading commit data...
seeds Loading commit data...
schema.sql Loading commit data...