Files
tripz-llc/backend/migrations/2026_08_07_complaint_resolution.sql
2026-08-09 16:56:13 +03:00

76 lines
4.4 KiB
SQL
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- 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`;