-- 2026_08_07_complaint_resolution.sql -- -- ‏دورة الشكوى وأداة التعويض. -- -- ‏الوضع اليوم: serviceapp/update_complaint.php يقلب الحالة ويكتب نصّ -- ‏قرار. لا تعويض، لا تصنيف سبب، ولا قياس زمن. والموظف الذي يريد -- ‏تعويض راكب متضرر لا يملك أي أداة — فيَعِد شفهياً أو لا يفعل شيئاً. -- -- ‏كلمة "refund" لا ترد إطلاقاً في مسار الرحلات، فقط في وحدة الطعام. -- -- ‏هذا الترحيل يحوّل الدعم من "استقبال شكاوى" إلى "إغلاق قضايا". -- -- ⚠️ ‏يُنفَّذ على قاعدة primary (jorSiroDB) وحدها. -- ══════════════════════════════════════════════════════════════ -- ١) قياس الزمن (SLA) -- -- ‏date_resolved موجود أصلاً، لكن زمن **أول رد** هو المؤشر الذي يشعر به -- ‏العميل فعلاً — شكوى تُغلق بعد يومين بردٍّ خلال دقائق أفضل بكثير من -- ‏شكوى تُغلق بعد ساعة بلا أن يعلم صاحبها شيئاً. -- ══════════════════════════════════════════════════════════════ ALTER TABLE `complaint` ADD COLUMN `first_response_at` DATETIME NULL DEFAULT NULL COMMENT 'لحظة أول رد من الدعم — يُختم مرة واحدة ولا يتغيّر', ADD COLUMN `assigned_to` VARCHAR(100) NULL DEFAULT NULL COMMENT 'معرّف الموظف المسؤول عن القضية', ADD COLUMN `reason_code` VARCHAR(40) NULL DEFAULT NULL COMMENT 'تصنيف موحّد للسبب — قائمة مغلقة في resolve_complaint.php', ADD INDEX `idx_status_filed` (`statusComplaint`, `date_filed`), ADD INDEX `idx_ride` (`ride_id`); -- ══════════════════════════════════════════════════════════════ -- ٢) سجل التعويضات -- -- ‏جدول مستقل لا أعمدة في complaint: الشكوى الواحدة قد تُعوَّض أكثر من -- ‏مرة (استرجاع جزئي ثم رصيد اعتذار)، وكل حركة مالية تحتاج أثراً مستقلاً -- ‏يُراجَع ويُدقَّق. -- ══════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS `complaint_compensations` ( `id` INT NOT NULL AUTO_INCREMENT, `complaint_id` INT NOT NULL, `ride_id` VARCHAR(20) NULL DEFAULT NULL, `beneficiary_type` VARCHAR(20) NOT NULL COMMENT 'passenger | driver — لمن ذهب التعويض', `beneficiary_id` VARCHAR(100) NOT NULL, `kind` VARCHAR(20) NOT NULL COMMENT 'refund (استرجاع من قيمة الرحلة) | goodwill (رصيد اعتذار)', `amount` DECIMAL(12,3) NOT NULL, `currency` VARCHAR(5) NOT NULL DEFAULT 'SYP', `issued_by` VARCHAR(100) NOT NULL COMMENT 'الموظف الذي صرفه', `note` VARCHAR(500) NULL DEFAULT NULL, -- ‏نتيجة نداء المحفظة. الفشل يبقى مسجَّلاً للتسوية اليدوية بدل أن -- ‏يختفي في اللوجز — العميل وُعد بمبلغ ويجب أن يصله. `transfer_status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT 'pending | success | failed', `transfer_code` SMALLINT NULL DEFAULT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_complaint` (`complaint_id`), KEY `idx_beneficiary` (`beneficiary_type`, `beneficiary_id`), KEY `idx_failed` (`transfer_status`, `created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='تعويضات الشكاوى — كل حركة مالية بأثر مستقل قابل للتدقيق'; -- ‏للتراجع: -- ALTER TABLE `complaint` DROP COLUMN `first_response_at`, -- DROP COLUMN `assigned_to`, DROP COLUMN `reason_code`, -- DROP INDEX `idx_status_filed`, DROP INDEX `idx_ride`; -- DROP TABLE `complaint_compensations`;