131 lines
4.1 KiB
PHP
131 lines
4.1 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Models;
|
|
|
|
use App\Core\Database\Database;
|
|
use PDO;
|
|
|
|
class EmployeeOrder
|
|
{
|
|
public static function getBySessionId(int $sessionId): array
|
|
{
|
|
$db = Database::getConnection();
|
|
$stmt = $db->prepare("
|
|
SELECT eo.*, u.name as user_name, u.username as mattermost_username, u.email as user_email
|
|
FROM employee_orders eo
|
|
JOIN users u ON eo.user_id = u.id
|
|
WHERE eo.session_id = ?
|
|
ORDER BY eo.id ASC
|
|
");
|
|
$stmt->execute([$sessionId]);
|
|
$orders = $stmt->fetchAll();
|
|
|
|
foreach ($orders as &$order) {
|
|
$order['items'] = self::getItemsByOrderId((int)$order['id']);
|
|
}
|
|
|
|
return $orders;
|
|
}
|
|
|
|
public static function getItemsByOrderId(int $orderId): array
|
|
{
|
|
$db = Database::getConnection();
|
|
$stmt = $db->prepare("SELECT * FROM employee_order_items WHERE employee_order_id = ? ORDER BY id ASC");
|
|
$stmt->execute([$orderId]);
|
|
return $stmt->fetchAll();
|
|
}
|
|
|
|
public static function findUserOrderBySession(int $sessionId, int $userId): ?array
|
|
{
|
|
$db = Database::getConnection();
|
|
$stmt = $db->prepare("SELECT * FROM employee_orders WHERE session_id = ? AND user_id = ?");
|
|
$stmt->execute([$sessionId, $userId]);
|
|
$order = $stmt->fetch();
|
|
|
|
if (!$order) {
|
|
return null;
|
|
}
|
|
|
|
$order['items'] = self::getItemsByOrderId((int)$order['id']);
|
|
return $order;
|
|
}
|
|
|
|
public static function createOrder(int $sessionId, int $userId, ?string $notes, array $items): int
|
|
{
|
|
$db = Database::getConnection();
|
|
$db->beginTransaction();
|
|
|
|
try {
|
|
$stmtOrder = $db->prepare("
|
|
INSERT INTO employee_orders (session_id, user_id, status, notes, total_bill)
|
|
VALUES (?, ?, 'unpaid', ?, 0.00)
|
|
");
|
|
$stmtOrder->execute([$sessionId, $userId, $notes]);
|
|
$orderId = (int)$db->lastInsertId();
|
|
|
|
$stmtItem = $db->prepare("
|
|
INSERT INTO employee_order_items (employee_order_id, session_menu_id, item_name, quantity, unit_price, total_price, notes)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
");
|
|
|
|
$totalBill = 0.0;
|
|
|
|
foreach ($items as $item) {
|
|
$menuId = !empty($item['session_menu_id']) ? (int)$item['session_menu_id'] : null;
|
|
$name = trim((string)($item['item_name'] ?? ''));
|
|
$qty = max(1, (int)($item['quantity'] ?? 1));
|
|
$unitPrice = (float)($item['unit_price'] ?? 0.0);
|
|
$lineTotal = $qty * $unitPrice;
|
|
$itemNotes = trim((string)($item['notes'] ?? ''));
|
|
|
|
if (empty($name)) {
|
|
continue;
|
|
}
|
|
|
|
$stmtItem->execute([
|
|
$orderId,
|
|
$menuId,
|
|
$name,
|
|
$qty,
|
|
$unitPrice,
|
|
$lineTotal,
|
|
$itemNotes
|
|
]);
|
|
|
|
$totalBill += $lineTotal;
|
|
}
|
|
|
|
// Update total bill
|
|
$stmtUpdateTotal = $db->prepare("UPDATE employee_orders SET total_bill = ? WHERE id = ?");
|
|
$stmtUpdateTotal->execute([$totalBill, $orderId]);
|
|
|
|
$db->commit();
|
|
return $orderId;
|
|
} catch (\Throwable $e) {
|
|
$db->rollBack();
|
|
throw $e;
|
|
}
|
|
}
|
|
|
|
public static function togglePaid(int $orderId): bool
|
|
{
|
|
$db = Database::getConnection();
|
|
$stmt = $db->prepare("
|
|
UPDATE employee_orders
|
|
SET status = CASE WHEN status = 'paid' THEN 'unpaid' ELSE 'paid' END,
|
|
updated_at = datetime('now', 'localtime')
|
|
WHERE id = ?
|
|
");
|
|
return $stmt->execute([$orderId]);
|
|
}
|
|
|
|
public static function delete(int $orderId): bool
|
|
{
|
|
$db = Database::getConnection();
|
|
$stmt = $db->prepare("DELETE FROM employee_orders WHERE id = ?");
|
|
return $stmt->execute([$orderId]);
|
|
}
|
|
}
|