From b938e287c6aad4a599295e325f00745a8e07f9cb Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 7 Aug 2026 05:05:46 +0300 Subject: [PATCH] Update: 2026-08-07 05:05:45 --- backend/migrations/2026_08_07_verify_all.sql | 49 +++++++++++++ backend/migrations/_helpers.sql | 75 ++++++++++++++++++++ backend/serviceapp/getComplaintAllData.php | 14 +--- 3 files changed, 127 insertions(+), 11 deletions(-) create mode 100644 backend/migrations/2026_08_07_verify_all.sql create mode 100644 backend/migrations/_helpers.sql diff --git a/backend/migrations/2026_08_07_verify_all.sql b/backend/migrations/2026_08_07_verify_all.sql new file mode 100644 index 00000000..535ad288 --- /dev/null +++ b/backend/migrations/2026_08_07_verify_all.sql @@ -0,0 +1,49 @@ +-- 2026_08_07_verify_all.sql — فحص حالة كل ترحيلات اليوم +-- +-- ‏قراءة خالصة لا تُعدّل شيئاً. شغّله على أي قاعدة لتعرف ما نُفِّذ وما لا. +-- ‏العمود ok: 1 = موجود، 0 = ناقص. +-- +-- sirodb jorSiroDB < backend/migrations/2026_08_07_verify_all.sql +-- sirodb 'intaleq-ridesDB' < backend/migrations/2026_08_07_verify_all.sql + +SELECT 'kazan.cancelCompensationCap' AS item, + COUNT(*) AS ok FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kazan' AND COLUMN_NAME='cancelCompensationCap' +UNION ALL SELECT 'kazan.cancelMinWaitMinutes', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kazan' AND COLUMN_NAME='cancelMinWaitMinutes' +UNION ALL SELECT 'kazan.passengerCancelCap', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kazan' AND COLUMN_NAME='passengerCancelCap' +UNION ALL SELECT 'kazan.passengerCancelFreeMinutes', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kazan' AND COLUMN_NAME='passengerCancelFreeMinutes' +UNION ALL SELECT 'kazan.driverLateExemptMinutes', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='kazan' AND COLUMN_NAME='driverLateExemptMinutes' + +UNION ALL SELECT 'ride.driverArrivedAt', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ride' AND COLUMN_NAME='driverArrivedAt' +UNION ALL SELECT 'ride.pickupApproachKm', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='ride' AND COLUMN_NAME='pickupApproachKm' + +UNION ALL SELECT 'driver.blockedUntil', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='driver' AND COLUMN_NAME='blockedUntil' +UNION ALL SELECT 'driver.safetyHoldIncidentId', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='driver' AND COLUMN_NAME='safetyHoldIncidentId' + +UNION ALL SELECT 'passengers.noShowCount', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='passengers' AND COLUMN_NAME='noShowCount' + +UNION ALL SELECT 'complaint.first_response_at', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='complaint' AND COLUMN_NAME='first_response_at' +UNION ALL SELECT 'complaint.assigned_to', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='complaint' AND COLUMN_NAME='assigned_to' +UNION ALL SELECT 'complaint.reason_code', COUNT(*) FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='complaint' AND COLUMN_NAME='reason_code' + +UNION ALL SELECT 'driver_orders.idx_order', COUNT(*) FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='driver_orders' AND INDEX_NAME='idx_order' + +UNION ALL SELECT 'TABLE driver_leak_events', COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='driver_leak_events' +UNION ALL SELECT 'TABLE safety_incidents', COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='safety_incidents' +UNION ALL SELECT 'TABLE complaint_compensations', COUNT(*) FROM information_schema.TABLES + WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='complaint_compensations'; diff --git a/backend/migrations/_helpers.sql b/backend/migrations/_helpers.sql new file mode 100644 index 00000000..eb6f0248 --- /dev/null +++ b/backend/migrations/_helpers.sql @@ -0,0 +1,75 @@ +-- _helpers.sql — إجراءات ترحيل قابلة لإعادة التشغيل +-- +-- ‏المشكلة: ALTER TABLE ... ADD COLUMN في MySQL يُجهض **كل** الجملة عند +-- ‏أول عمود مكرّر. فإعادة تشغيل ترحيل نُفِّذ جزئياً تفشل، وإعادة تشغيل +-- ‏ترحيل نُفِّذ كاملاً تفشل أيضاً — بلا أن تعرف أيّهما. +-- +-- ‏هذا لدغ نشرَ سيرو ثلاث مرات في يوم واحد، ويزداد سوءاً مع تعدد النسخ +-- ‏(intaleq / tripz / siro) حيث لا أحد يتذكّر ما نُفِّذ أين. +-- +-- ‏الحل: إجراءات تفحص information_schema أولاً فتتخطّى الموجود بصمت. +-- +-- ‏شغّل هذا الملف مرة واحدة على كل قاعدة قبل أي ترحيل يستخدمه. + +DELIMITER // + +DROP PROCEDURE IF EXISTS `siro_add_column` // +/** + * ‏يضيف عموداً إن لم يكن موجوداً. آمن لإعادة التشغيل. + * + * ‏مثال: + * CALL siro_add_column('ride', 'driverArrivedAt', + * 'DATETIME NULL DEFAULT NULL COMMENT ''لحظة الوصول'''); + */ +CREATE PROCEDURE `siro_add_column`( + IN p_table VARCHAR(64), + IN p_column VARCHAR(64), + IN p_definition TEXT +) +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = p_table + AND COLUMN_NAME = p_column + ) THEN + SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', + p_column, '` ', p_definition); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + SELECT CONCAT('أُضيف: ', p_table, '.', p_column) AS result; + ELSE + SELECT CONCAT('موجود مسبقاً: ', p_table, '.', p_column) AS result; + END IF; +END // + +DROP PROCEDURE IF EXISTS `siro_add_index` // +/** + * ‏يضيف فهرساً إن لم يكن موجوداً. + * CALL siro_add_index('driver_orders', 'idx_order', '(`order_id`)'); + */ +CREATE PROCEDURE `siro_add_index`( + IN p_table VARCHAR(64), + IN p_index VARCHAR(64), + IN p_columns TEXT +) +BEGIN + IF NOT EXISTS ( + SELECT 1 FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = p_table + AND INDEX_NAME = p_index + ) THEN + SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD INDEX `', + p_index, '` ', p_columns); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + SELECT CONCAT('أُضيف فهرس: ', p_table, '.', p_index) AS result; + ELSE + SELECT CONCAT('فهرس موجود مسبقاً: ', p_table, '.', p_index) AS result; + END IF; +END // + +DELIMITER ; diff --git a/backend/serviceapp/getComplaintAllData.php b/backend/serviceapp/getComplaintAllData.php index 4fe1b6fe..8da306cd 100644 --- a/backend/serviceapp/getComplaintAllData.php +++ b/backend/serviceapp/getComplaintAllData.php @@ -1,17 +1,9 @@ 'failure', - 'message' => 'Forbidden. Admin access required.', - ], JSON_UNESCAPED_UNICODE); - exit; -} +// ‏الحماية الآن من البوّابة المسارية في connect.php: كل ما تحت serviceapp/ +// ‏يتطلب service أو admin أو super_admin. كان هنا فحص admin وحده، وهو ما +// ‏منع موظفي خدمة العملاء — وهم أصحاب هذه الشاشة — من قراءة الشكاوى أصلاً. $sql = " SELECT