Devco1
Home
Console
Upload
New File
New Folder
Tools
Info
About
/
home
/
wifiyecu
/
www
/
admin
/
Filename :
add_order.php
back
Copy
<?php session_start(); include '../includes/config.php'; // التحقق من صلاحيات المدير if (!isset($_SESSION['admin_logged_in'])) { header('Location: login.php'); exit; } // الحصول على قائمة المنتجات try { $products_stmt = $pdo->query(" SELECT p.*, pi.image_url, c.color_name, c.color_code FROM products p LEFT JOIN product_images pi ON p.id = pi.product_id AND pi.is_main = 1 LEFT JOIN colors c ON p.id = c.product_id WHERE p.stock_quantity > 0 ORDER BY p.name "); $products = $products_stmt->fetchAll(); // تجميع المنتجات مع ألوانها $products_with_colors = []; foreach ($products as $product) { $product_id = $product['id']; if (!isset($products_with_colors[$product_id])) { $products_with_colors[$product_id] = [ 'id' => $product['id'], 'name' => $product['name'], 'price' => $product['price'], 'stock_quantity' => $product['stock_quantity'], 'image_url' => $product['image_url'], 'colors' => [] ]; } if ($product['color_name']) { $products_with_colors[$product_id]['colors'][] = [ 'color_name' => $product['color_name'], 'color_code' => $product['color_code'] ]; } } } catch (PDOException $e) { die("خطأ في تحميل المنتجات: " . $e->getMessage()); } // معالجة إضافة الطلب if ($_SERVER['REQUEST_METHOD'] === 'POST') { $customer_name = trim($_POST['customer_name']); $customer_email = trim($_POST['customer_email']); $customer_phone = trim($_POST['customer_phone']); $customer_address = trim($_POST['customer_address']); $order_items = $_POST['items'] ?? []; $total_amount = 0; // التحقق من البيانات $errors = []; if (empty($customer_name)) { $errors[] = 'اسم العميل مطلوب'; } if (empty($customer_email) || !filter_var($customer_email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'البريد الإلكتروني غير صحيح'; } if (empty($customer_phone)) { $errors[] = 'رقم الهاتف مطلوب'; } if (empty($customer_address)) { $errors[] = 'العنوان مطلوب'; } if (empty($order_items)) { $errors[] = 'يجب إضافة منتجات على الأقل إلى الطلب'; } // حساب المجموع والتحقق من المخزون foreach ($order_items as $item) { if (empty($item['product_id']) || empty($item['quantity']) || $item['quantity'] <= 0) { $errors[] = 'بيانات المنتجات غير صحيحة'; break; } $product_id = intval($item['product_id']); $quantity = intval($item['quantity']); // التحقق من المخزون $stock_stmt = $pdo->prepare("SELECT stock_quantity, name FROM products WHERE id = ?"); $stock_stmt->execute([$product_id]); $product = $stock_stmt->fetch(); if (!$product) { $errors[] = 'المنتج غير موجود'; } elseif ($product['stock_quantity'] < $quantity) { $errors[] = "الكمية المطلوبة للمنتج {$product['name']} تتجاوز المخزون المتاح ({$product['stock_quantity']})"; } $price_stmt = $pdo->prepare("SELECT price FROM products WHERE id = ?"); $price_stmt->execute([$product_id]); $price_data = $price_stmt->fetch(); $total_amount += $price_data['price'] * $quantity; } // إذا لا توجد أخطاء، إضافة الطلب if (empty($errors)) { try { $pdo->beginTransaction(); // إضافة الطلب $order_stmt = $pdo->prepare(" INSERT INTO orders (customer_name, customer_email, customer_phone, customer_address, total_amount, status) VALUES (?, ?, ?, ?, ?, 'pending') "); $order_stmt->execute([$customer_name, $customer_email, $customer_phone, $customer_address, $total_amount]); $order_id = $pdo->lastInsertId(); // إضافة عناصر الطلب وتحديث المخزون foreach ($order_items as $item) { $product_id = intval($item['product_id']); $quantity = intval($item['quantity']); // الحصول على سعر واسم المنتج $product_stmt = $pdo->prepare("SELECT price, name FROM products WHERE id = ?"); $product_stmt->execute([$product_id]); $product = $product_stmt->fetch(); // إضافة عنصر الطلب $item_stmt = $pdo->prepare(" INSERT INTO order_items (order_id, product_id, product_name, quantity, price) VALUES (?, ?, ?, ?, ?) "); $item_stmt->execute([$order_id, $product_id, $product['name'], $quantity, $product['price']]); // تحديث المخزون $update_stmt = $pdo->prepare("UPDATE products SET stock_quantity = stock_quantity - ? WHERE id = ?"); $update_stmt->execute([$quantity, $product_id]); } $pdo->commit(); $_SESSION['message'] = [ 'text' => "تم إضافة الطلب #" . str_pad($order_id, 6, '0', STR_PAD_LEFT) . " بنجاح", 'type' => 'success' ]; header('Location: orders.php'); exit; } catch (PDOException $e) { $pdo->rollBack(); $errors[] = "خطأ في إضافة الطلب: " . $e->getMessage(); } } } ?> <!DOCTYPE html> <html lang="ar" dir="rtl"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>إضافة طلب جديد - لوحة التحكم</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"> <style> .product-card { transition: all 0.3s ease; border: 1px solid #dee2e6; border-radius: 8px; margin-bottom: 15px; } .product-card:hover { box-shadow: 0 4px 15px rgba(0,0,0,0.1); border-color: #007bff; } .product-image { width: 60px; height: 60px; object-fit: cover; border-radius: 6px; } .color-option { width: 20px; height: 20px; border-radius: 50%; display: inline-block; margin-left: 5px; border: 2px solid #fff; box-shadow: 0 0 3px rgba(0,0,0,0.3); } .order-item { background: #f8f9fa; border-radius: 8px; padding: 15px; margin-bottom: 10px; border-right: 4px solid #007bff; } .quantity-controls { display: flex; align-items: center; gap: 10px; } .stock-badge { font-size: 0.75rem; } </style> </head> <body> <nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <div class="container"> <a class="navbar-brand" href="index.php"> <i class="fas fa-cog"></i> لوحة التحكم </a> <div class="navbar-nav ms-auto"> <a class="nav-link" href="orders.php"> <i class="fas fa-arrow-right me-1"></i> رجوع للطلبات </a> </div> </div> </nav> <div class="container mt-4"> <div class="row"> <div class="col-12"> <div class="card"> <div class="card-header bg-primary text-white"> <h4 class="card-title mb-0"> <i class="fas fa-plus-circle me-2"></i> إضافة طلب جديد </h4> </div> <div class="card-body"> <?php if (!empty($errors)): ?> <div class="alert alert-danger"> <h6>يوجد الأخطاء التالية:</h6> <ul class="mb-0"> <?php foreach ($errors as $error): ?> <li><?php echo $error; ?></li> <?php endforeach; ?> </ul> </div> <?php endif; ?> <form method="POST" id="orderForm"> <!-- معلومات العميل --> <div class="row mb-4"> <div class="col-12"> <h5 class="border-bottom pb-2 mb-3"> <i class="fas fa-user me-2"></i> معلومات العميل </h5> </div> <div class="col-md-6 mb-3"> <label for="customer_name" class="form-label">اسم العميل *</label> <input type="text" class="form-control" id="customer_name" name="customer_name" value="<?php echo $_POST['customer_name'] ?? ''; ?>" required> </div> <div class="col-md-6 mb-3"> <label for="customer_email" class="form-label">البريد الإلكتروني *</label> <input type="email" class="form-control" id="customer_email" name="customer_email" value="<?php echo $_POST['customer_email'] ?? ''; ?>" required> </div> <div class="col-md-6 mb-3"> <label for="customer_phone" class="form-label">رقم الهاتف *</label> <input type="tel" class="form-control" id="customer_phone" name="customer_phone" value="<?php echo $_POST['customer_phone'] ?? ''; ?>" required> </div> <div class="col-md-6 mb-3"> <label for="customer_address" class="form-label">العنوان *</label> <textarea class="form-control" id="customer_address" name="customer_address" rows="2" required><?php echo $_POST['customer_address'] ?? ''; ?></textarea> </div> </div> <!-- المنتجات --> <div class="row mb-4"> <div class="col-12"> <div class="d-flex justify-content-between align-items-center mb-3"> <h5 class="border-bottom pb-2 mb-0"> <i class="fas fa-shopping-bag me-2"></i> اختيار المنتجات </h5> <button type="button" class="btn btn-outline-primary btn-sm" id="addProductBtn"> <i class="fas fa-plus me-1"></i> إضافة منتج </button> </div> <!-- قائمة المنتجات المضافة --> <div id="orderItems" class="mb-3"> <!-- سيتم إضافة العناصر هنا ديناميكياً --> </div> <!-- المجموع --> <div class="row"> <div class="col-md-6 offset-md-6"> <div class="card bg-light"> <div class="card-body"> <div class="d-flex justify-content-between align-items-center"> <h5 class="mb-0">المجموع الإجمالي:</h5> <h4 class="mb-0 text-success" id="totalAmount">$0.00</h4> </div> </div> </div> </div> </div> </div> </div> <!-- أزرار --> <div class="row"> <div class="col-12"> <div class="d-flex gap-2 justify-content-end"> <button type="submit" class="btn btn-success btn-lg"> <i class="fas fa-save me-2"></i> حفظ الطلب </button> <a href="orders.php" class="btn btn-secondary btn-lg"> <i class="fas fa-times me-2"></i> إلغاء </a> </div> </div> </div> </form> </div> </div> </div> </div> </div> <!-- نموذج اختيار المنتج --> <div class="modal fade" id="productModal" tabindex="-1"> <div class="modal-dialog modal-lg"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">اختر المنتج</h5> <button type="button" class="btn-close" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> <div class="row" id="productsList"> <?php foreach ($products_with_colors as $product): ?> <div class="col-md-6 mb-3"> <div class="product-card p-3"> <div class="d-flex align-items-center"> <img src="../<?php echo $product['image_url'] ?: 'images/placeholder.jpg'; ?>" alt="<?php echo htmlspecialchars($product['name']); ?>" class="product-image me-3"> <div class="flex-grow-1"> <h6 class="mb-1"><?php echo htmlspecialchars($product['name']); ?></h6> <p class="mb-1 text-success">$<?php echo $product['price']; ?></p> <div class="d-flex align-items-center"> <span class="stock-badge badge bg-<?php echo $product['stock_quantity'] > 10 ? 'success' : 'warning'; ?>"> متوفر: <?php echo $product['stock_quantity']; ?> </span> <?php if (!empty($product['colors'])): ?> <div class="me-2"> <?php foreach ($product['colors'] as $color): ?> <span class="color-option" style="background-color: <?php echo $color['color_code']; ?>" title="<?php echo htmlspecialchars($color['color_name']); ?>"></span> <?php endforeach; ?> </div> <?php endif; ?> </div> </div> <button type="button" class="btn btn-primary btn-sm add-to-order" data-product-id="<?php echo $product['id']; ?>" data-product-name="<?php echo htmlspecialchars($product['name']); ?>" data-product-price="<?php echo $product['price']; ?>" data-product-stock="<?php echo $product['stock_quantity']; ?>"> <i class="fas fa-plus"></i> </button> </div> </div> </div> <?php endforeach; ?> </div> </div> </div> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> <script> let itemCounter = 0; const orderItems = []; // فتح نافذة اختيار المنتج document.getElementById('addProductBtn').addEventListener('click', function() { const modal = new bootstrap.Modal(document.getElementById('productModal')); modal.show(); }); // إضافة منتج إلى الطلب document.addEventListener('click', function(e) { if (e.target.classList.contains('add-to-order') || e.target.closest('.add-to-order')) { const button = e.target.classList.contains('add-to-order') ? e.target : e.target.closest('.add-to-order'); const productId = button.dataset.productId; const productName = button.dataset.productName; const productPrice = parseFloat(button.dataset.productPrice); const productStock = parseInt(button.dataset.productStock); // التحقق إذا كان المنتج مضاف بالفعل const existingItem = orderItems.find(item => item.productId === productId); if (existingItem) { if (existingItem.quantity >= productStock) { alert('الكمية المطلوبة تتجاوز المخزون المتاح'); return; } existingItem.quantity += 1; updateOrderItem(existingItem); } else { if (productStock < 1) { alert('المنتج غير متوفر في المخزون'); return; } const newItem = { id: itemCounter++, productId: productId, productName: productName, price: productPrice, quantity: 1, stock: productStock }; orderItems.push(newItem); addOrderItem(newItem); } updateTotal(); const modal = bootstrap.Modal.getInstance(document.getElementById('productModal')); modal.hide(); } }); // إضافة عنصر طلب إلى الواجهة function addOrderItem(item) { const orderItemsDiv = document.getElementById('orderItems'); const itemDiv = document.createElement('div'); itemDiv.className = 'order-item'; itemDiv.id = `item-${item.id}`; itemDiv.innerHTML = ` <div class="row align-items-center"> <div class="col-md-4"> <strong>${item.productName}</strong> <br> <small class="text-muted">السعر: $${item.price.toFixed(2)}</small> </div> <div class="col-md-3"> <div class="quantity-controls"> <button type="button" class="btn btn-sm btn-outline-secondary decrease" data-item-id="${item.id}" ${item.quantity <= 1 ? 'disabled' : ''}> <i class="fas fa-minus"></i> </button> <span class="quantity">${item.quantity}</span> <button type="button" class="btn btn-sm btn-outline-secondary increase" data-item-id="${item.id}" ${item.quantity >= item.stock ? 'disabled' : ''}> <i class="fas fa-plus"></i> </button> </div> </div> <div class="col-md-3"> <strong class="text-success">$${(item.price * item.quantity).toFixed(2)}</strong> </div> <div class="col-md-2"> <button type="button" class="btn btn-sm btn-danger remove-item" data-item-id="${item.id}"> <i class="fas fa-trash"></i> </button> </div> </div> <input type="hidden" name="items[${item.id}][product_id]" value="${item.productId}"> <input type="hidden" name="items[${item.id}][quantity]" value="${item.quantity}"> `; orderItemsDiv.appendChild(itemDiv); } // تحديث عنصر طلب موجود function updateOrderItem(item) { const itemDiv = document.getElementById(`item-${item.id}`); if (itemDiv) { const quantitySpan = itemDiv.querySelector('.quantity'); const totalSpan = itemDiv.querySelector('.text-success'); const decreaseBtn = itemDiv.querySelector('.decrease'); const increaseBtn = itemDiv.querySelector('.increase'); const quantityInput = itemDiv.querySelector('input[name*="quantity"]'); quantitySpan.textContent = item.quantity; totalSpan.textContent = `$${(item.price * item.quantity).toFixed(2)}`; quantityInput.value = item.quantity; decreaseBtn.disabled = item.quantity <= 1; increaseBtn.disabled = item.quantity >= item.stock; } } // تحديث المجموع الإجمالي function updateTotal() { const total = orderItems.reduce((sum, item) => sum + (item.price * item.quantity), 0); document.getElementById('totalAmount').textContent = `$${total.toFixed(2)}`; } // إدارة الكمية والحذف document.addEventListener('click', function(e) { if (e.target.classList.contains('decrease') || e.target.closest('.decrease')) { const button = e.target.classList.contains('decrease') ? e.target : e.target.closest('.decrease'); const itemId = parseInt(button.dataset.itemId); const item = orderItems.find(item => item.id === itemId); if (item && item.quantity > 1) { item.quantity -= 1; updateOrderItem(item); updateTotal(); } } if (e.target.classList.contains('increase') || e.target.closest('.increase')) { const button = e.target.classList.contains('increase') ? e.target : e.target.closest('.increase'); const itemId = parseInt(button.dataset.itemId); const item = orderItems.find(item => item.id === itemId); if (item && item.quantity < item.stock) { item.quantity += 1; updateOrderItem(item); updateTotal(); } } if (e.target.classList.contains('remove-item') || e.target.closest('.remove-item')) { const button = e.target.classList.contains('remove-item') ? e.target : e.target.closest('.remove-item'); const itemId = parseInt(button.dataset.itemId); const itemIndex = orderItems.findIndex(item => item.id === itemId); if (itemIndex > -1) { orderItems.splice(itemIndex, 1); document.getElementById(`item-${itemId}`).remove(); updateTotal(); } } }); // التحقق من النموذج قبل الإرسال document.getElementById('orderForm').addEventListener('submit', function(e) { if (orderItems.length === 0) { e.preventDefault(); alert('يجب إضافة منتجات على الأقل إلى الطلب'); return; } }); </script> </body> </html>