Update: 2026-08-07 05:05:45
This commit is contained in:
@@ -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';
|
||||
@@ -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 ;
|
||||
@@ -1,17 +1,9 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../connect.php';
|
||||
|
||||
// شاشة إدارة الشكاوى في لوحة التحكم. لم يكن فيها أي فحص للدور، و connect.php
|
||||
// لا يفرض بوّابة عامة — فأي مستخدم يملك JWT صالحاً كان يقرأ كل الشكاوى
|
||||
// بأسماء الطرفين وتقييماتهم وتوكنات الإشعارات.
|
||||
if ($role !== 'admin' && $role !== 'super_admin') {
|
||||
http_response_code(403);
|
||||
echo json_encode([
|
||||
'status' => 'failure',
|
||||
'message' => 'Forbidden. Admin access required.',
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
exit;
|
||||
}
|
||||
// الحماية الآن من البوّابة المسارية في connect.php: كل ما تحت serviceapp/
|
||||
// يتطلب service أو admin أو super_admin. كان هنا فحص admin وحده، وهو ما
|
||||
// منع موظفي خدمة العملاء — وهم أصحاب هذه الشاشة — من قراءة الشكاوى أصلاً.
|
||||
|
||||
$sql = "
|
||||
SELECT
|
||||
|
||||
Reference in New Issue
Block a user