-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDatabase.php
More file actions
251 lines (221 loc) · 10.4 KB
/
Database.php
File metadata and controls
251 lines (221 loc) · 10.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
<?php
class Database {
private $conn;
public function __construct() {
$this->connect();
}
private function connect() {
try {
$host = 'localhost';
$port = 3307;
$dbname = 'delivery_foodx';
$user = 'root';
$password = '';
// Create connection without database first
$dsn = "mysql:host=$host;port=$port;charset=utf8mb4";
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Create database if it doesn't exist
$pdo->exec("CREATE DATABASE IF NOT EXISTS `$dbname` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
// Connect to the database
$dsn = "mysql:host=$host;port=$port;dbname=$dbname;charset=utf8mb4";
$this->conn = new PDO($dsn, $user, $password);
$this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch(PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
}
public function getConnection() {
return $this->conn;
}
public function generateID($prefix) {
$random = str_pad(mt_rand(1, 999999), 6, '0', STR_PAD_LEFT);
return $prefix . '-' . $random;
}
public function createTables() {
$queries = [
// Admin users table
"CREATE TABLE IF NOT EXISTS admin_users (
admin_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
full_name VARCHAR(255),
email VARCHAR(255),
role VARCHAR(50) DEFAULT 'admin',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Categories table
"CREATE TABLE IF NOT EXISTS categories (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(100) UNIQUE NOT NULL,
description TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Customers table
"CREATE TABLE IF NOT EXISTS customers (
customer_id VARCHAR(50) PRIMARY KEY,
username VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
full_name VARCHAR(255),
nic VARCHAR(20),
contact_no VARCHAR(20),
dob DATE,
location_no VARCHAR(50),
lane VARCHAR(100),
street VARCHAR(100),
city VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Items table
"CREATE TABLE IF NOT EXISTS items (
item_id VARCHAR(50) PRIMARY KEY,
item_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
category_id INT,
description TEXT,
item_image VARCHAR(255),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Ingredients table
"CREATE TABLE IF NOT EXISTS ingredients (
ingredient_id INT AUTO_INCREMENT PRIMARY KEY,
item_id VARCHAR(50),
ingredient_name VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Riders table
"CREATE TABLE IF NOT EXISTS riders (
employee_id VARCHAR(50) PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
middle_name VARCHAR(100),
last_name VARCHAR(100) NOT NULL,
dob DATE,
age INT,
contact_no VARCHAR(20),
license_no VARCHAR(50),
location_no VARCHAR(50),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Vehicles table
"CREATE TABLE IF NOT EXISTS vehicles (
vehicle_id VARCHAR(50) PRIMARY KEY,
vehicle_no VARCHAR(50) UNIQUE NOT NULL,
vehicle_type VARCHAR(50),
assigned_rider VARCHAR(50),
current_meter DECIMAL(10, 2) DEFAULT 0,
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (assigned_rider) REFERENCES riders(employee_id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Orders table
"CREATE TABLE IF NOT EXISTS orders (
order_id VARCHAR(50) PRIMARY KEY,
customer_id VARCHAR(50),
employee_id VARCHAR(50),
total_amount DECIMAL(10, 2) DEFAULT 0,
order_status VARCHAR(50) DEFAULT 'Pending',
payment_method VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE,
FOREIGN KEY (employee_id) REFERENCES riders(employee_id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Order items table
"CREATE TABLE IF NOT EXISTS order_items (
order_item_id INT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(50),
item_id VARCHAR(50),
quantity INT NOT NULL,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (item_id) REFERENCES items(item_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Payments table
"CREATE TABLE IF NOT EXISTS payments (
payment_id INT AUTO_INCREMENT PRIMARY KEY,
order_id VARCHAR(50),
customer_id VARCHAR(50),
amount DECIMAL(10, 2) NOT NULL,
card_type VARCHAR(50),
payment_status VARCHAR(50) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Vehicle meter table
"CREATE TABLE IF NOT EXISTS vehicle_meter (
meter_id INT AUTO_INCREMENT PRIMARY KEY,
vehicle_id VARCHAR(50),
total_distance DECIMAL(10, 2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (vehicle_id) REFERENCES vehicles(vehicle_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci",
// Dependents table
"CREATE TABLE IF NOT EXISTS dependents (
dependent_id VARCHAR(50) PRIMARY KEY,
employee_id VARCHAR(50),
dependent_name VARCHAR(255) NOT NULL,
dob DATE,
relationship VARCHAR(50),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (employee_id) REFERENCES riders(employee_id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"
];
foreach ($queries as $query) {
try {
$this->conn->exec($query);
} catch(PDOException $e) {
error_log("Error creating table: " . $e->getMessage());
}
}
// Insert default admin if not exists
$this->createDefaultAdmin();
// Insert default categories if not exist
$this->createDefaultCategories();
}
private function createDefaultAdmin() {
try {
$stmt = $this->conn->query("SELECT COUNT(*) as count FROM admin_users");
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if ($result['count'] == 0) {
$password = password_hash('admin123', PASSWORD_DEFAULT);
$stmt = $this->conn->prepare("
INSERT INTO admin_users (username, password, full_name, email, role)
VALUES ('admin', :password, 'System Administrator', 'admin@foodhub.com', 'admin')
");
$stmt->execute(['password' => $password]);
}
} catch(PDOException $e) {
error_log("Error creating default admin: " . $e->getMessage());
}
}
private function createDefaultCategories() {
try {
$stmt = $this->conn->query("SELECT COUNT(*) as count FROM categories");
$result = $stmt->fetch(PDO::FETCH_ASSOC);
if ($result['count'] == 0) {
$categories = [
['Fast Food', 'Burgers, fries, pizza, etc.'],
['Drinks', 'Soft drinks, juices, shakes'],
['Desserts', 'Cakes, ice cream, sweets']
];
$stmt = $this->conn->prepare("
INSERT INTO categories (category_name, description)
VALUES (:name, :description)
");
foreach ($categories as $category) {
$stmt->execute([
'name' => $category[0],
'description' => $category[1]
]);
}
}
} catch(PDOException $e) {
error_log("Error creating default categories: " . $e->getMessage());
}
}
}