76 lines
4.4 KiB
SQL
76 lines
4.4 KiB
SQL
-- 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`;
|