diff --git a/db/migrations/001_initial_schema.sql b/db/migrations/001_initial_schema.sql new file mode 100644 index 0000000..eaf474f --- /dev/null +++ b/db/migrations/001_initial_schema.sql @@ -0,0 +1,52 @@ +-- Migration: Initial Schema +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + full_name VARCHAR(100), + role ENUM('admin', 'clerk', 'staff') DEFAULT 'staff', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS mailbox ( + id INT AUTO_INCREMENT PRIMARY KEY, + type ENUM('inbound', 'outbound') NOT NULL, + ref_no VARCHAR(50) NOT NULL UNIQUE, + date_registered DATE NOT NULL, + sender VARCHAR(255), + recipient VARCHAR(255), + subject VARCHAR(255) NOT NULL, + description TEXT, + status ENUM('received', 'in_progress', 'closed') DEFAULT 'received', + assigned_to INT, + created_by INT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + FOREIGN KEY (assigned_to) REFERENCES users(id) ON DELETE SET NULL, + FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS attachments ( + id INT AUTO_INCREMENT PRIMARY KEY, + mail_id INT NOT NULL, + file_path VARCHAR(255) NOT NULL, + file_name VARCHAR(255) NOT NULL, + file_size INT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (mail_id) REFERENCES mailbox(id) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS comments ( + id INT AUTO_INCREMENT PRIMARY KEY, + mail_id INT NOT NULL, + user_id INT, + comment TEXT NOT NULL, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (mail_id) REFERENCES mailbox(id) ON DELETE CASCADE, + FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Initial Admin User (password: admin123) +INSERT INTO users (username, password, full_name, role) +VALUES ('admin', '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', 'مدير النظام', 'admin') +ON DUPLICATE KEY UPDATE username=username; diff --git a/db/migrations/migrate.php b/db/migrations/migrate.php new file mode 100644 index 0000000..7f47a3a --- /dev/null +++ b/db/migrations/migrate.php @@ -0,0 +1,21 @@ +exec($sql); + echo "Successfully applied migration: " . basename($file) . PHP_EOL; + } catch (PDOException $e) { + echo "Error applying migration " . basename($file) . ": " . $e->getMessage() . PHP_EOL; + } + } +} + +runMigrations(); diff --git a/inbound.php b/inbound.php new file mode 100644 index 0000000..2974ae3 --- /dev/null +++ b/inbound.php @@ -0,0 +1,301 @@ +prepare("INSERT INTO mailbox (type, ref_no, date_registered, sender, recipient, subject, description, status, assigned_to, created_by) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + $stmt->execute([$type, $ref_no, $date_registered, $sender, $recipient, $subject, $description, $status, $assigned_to, $_SESSION['user_id']]); + $success = 'تمت إضافة البريد بنجاح'; + } elseif ($action === 'edit') { + $stmt = db()->prepare("UPDATE mailbox SET ref_no = ?, date_registered = ?, sender = ?, recipient = ?, subject = ?, description = ?, status = ?, assigned_to = ? WHERE id = ? AND type = 'inbound'"); + $stmt->execute([$ref_no, $date_registered, $sender, $recipient, $subject, $description, $status, $assigned_to, $id]); + $success = 'تم تحديث البيانات بنجاح'; + } + } catch (PDOException $e) { + if ($e->getCode() == 23000) { + $error = 'رقم القيد مستخدم مسبقاً'; + } else { + $error = 'حدث خطأ: ' . $e->getMessage(); + } + } + } else { + $error = 'يرجى ملء الحقول المطلوبة (رقم القيد، الموضوع)'; + } +} + +// Delete action +if (isset($_GET['action']) && $_GET['action'] === 'delete' && isset($_GET['id'])) { + $id = $_GET['id']; + $stmt = db()->prepare("DELETE FROM mailbox WHERE id = ? AND type = 'inbound'"); + $stmt->execute([$id]); + $success = 'تم حذف البريد بنجاح'; +} + +$search = $_GET['search'] ?? ''; +$query = "SELECT * FROM mailbox WHERE type = 'inbound'"; +$params = []; +if ($search) { + $query .= " AND (ref_no LIKE ? OR sender LIKE ? OR subject LIKE ?)"; + $params = ["%$search%", "%$search%", "%$search%"]; +} +$query .= " ORDER BY created_at DESC"; +$stmt = db()->prepare($query); +$stmt->execute($params); +$mails = $stmt->fetchAll(); + +$users_list = db()->query("SELECT id, full_name FROM users ORDER BY full_name")->fetchAll(); + +// Handle Deep Link for Edit +$deepLinkData = null; +if (isset($_GET['action']) && $_GET['action'] === 'edit' && isset($_GET['id'])) { + $stmt = db()->prepare("SELECT * FROM mailbox WHERE id = ? AND type = 'inbound'"); + $stmt->execute([$_GET['id']]); + $deepLinkData = $stmt->fetch(); +} +?> + +