Autosave: 20260223-131232
This commit is contained in:
parent
370ceb510e
commit
4bbeb16cfc
@ -65,6 +65,14 @@ include 'includes/header.php';
|
|||||||
<label class="form-label">Phone</label>
|
<label class="form-label">Phone</label>
|
||||||
<input type="text" name="phone" class="form-control" value="<?= htmlspecialchars($customer['phone']) ?>">
|
<input type="text" name="phone" class="form-control" value="<?= htmlspecialchars($customer['phone']) ?>">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label class="form-label">Loyalty Points</label>
|
||||||
|
<div class="form-control bg-light"><?= intval($customer['points']) ?></div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 mb-3">
|
||||||
|
<label class="form-label">Total Redemptions</label>
|
||||||
|
<div class="form-control bg-light"><?= intval($customer['loyalty_redemptions_count']) ?></div>
|
||||||
|
</div>
|
||||||
<div class="col-md-12 mb-3">
|
<div class="col-md-12 mb-3">
|
||||||
<label class="form-label">Address</label>
|
<label class="form-label">Address</label>
|
||||||
<textarea name="address" class="form-control" rows="3"><?= htmlspecialchars($customer['address']) ?></textarea>
|
<textarea name="address" class="form-control" rows="3"><?= htmlspecialchars($customer['address']) ?></textarea>
|
||||||
@ -78,4 +86,4 @@ include 'includes/header.php';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php include 'includes/footer.php'; ?>
|
<?php include 'includes/footer.php'; ?>
|
||||||
|
|||||||
@ -60,6 +60,7 @@ include 'includes/header.php';
|
|||||||
<th>Email</th>
|
<th>Email</th>
|
||||||
<th>Phone</th>
|
<th>Phone</th>
|
||||||
<th>Address</th>
|
<th>Address</th>
|
||||||
|
<th class="text-center">Redemptions</th>
|
||||||
<th>Actions</th>
|
<th>Actions</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@ -70,6 +71,9 @@ include 'includes/header.php';
|
|||||||
<td><?= htmlspecialchars($customer['email']) ?></td>
|
<td><?= htmlspecialchars($customer['email']) ?></td>
|
||||||
<td><?= htmlspecialchars($customer['phone']) ?></td>
|
<td><?= htmlspecialchars($customer['phone']) ?></td>
|
||||||
<td><?= htmlspecialchars(substr($customer['address'] ?? '', 0, 30)) ?>...</td>
|
<td><?= htmlspecialchars(substr($customer['address'] ?? '', 0, 30)) ?>...</td>
|
||||||
|
<td class="text-center">
|
||||||
|
<span class="badge bg-info text-dark"><?= intval($customer['loyalty_redemptions_count'] ?? 0) ?></span>
|
||||||
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<a href="customer_edit.php?id=<?= $customer['id'] ?>" class="btn btn-sm btn-outline-primary" title="Edit Customer"><i class="bi bi-pencil"></i></a>
|
<a href="customer_edit.php?id=<?= $customer['id'] ?>" class="btn btn-sm btn-outline-primary" title="Edit Customer"><i class="bi bi-pencil"></i></a>
|
||||||
@ -80,7 +84,7 @@ include 'includes/header.php';
|
|||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
<?php if (empty($customers)): ?>
|
<?php if (empty($customers)): ?>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="5" class="text-center py-4 text-muted">No customers found.</td>
|
<td colspan="6" class="text-center py-4 text-muted">No customers found.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -130,4 +134,4 @@ include 'includes/header.php';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php include 'includes/footer.php'; ?>
|
<?php include 'includes/footer.php'; ?>
|
||||||
|
|||||||
@ -6,6 +6,7 @@ require_once __DIR__ . '/../includes/functions.php';
|
|||||||
$pdo = db();
|
$pdo = db();
|
||||||
require_permission('orders_view');
|
require_permission('orders_view');
|
||||||
|
|
||||||
|
// Handle status updates
|
||||||
if (isset($_POST['action']) && $_POST['action'] === 'update_status') {
|
if (isset($_POST['action']) && $_POST['action'] === 'update_status') {
|
||||||
if (!has_permission('orders_add')) {
|
if (!has_permission('orders_add')) {
|
||||||
header("Location: orders.php?error=permission_denied");
|
header("Location: orders.php?error=permission_denied");
|
||||||
@ -19,6 +20,19 @@ if (isset($_POST['action']) && $_POST['action'] === 'update_status') {
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle stopping all promotions
|
||||||
|
if (isset($_POST['action']) && $_POST['action'] === 'stop_promotions') {
|
||||||
|
if (!has_permission('manage_products')) {
|
||||||
|
header("Location: orders.php?error=permission_denied");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
// Set promo_date_to to yesterday for all currently active promotions
|
||||||
|
$stmt = $pdo->prepare("UPDATE products SET promo_date_to = DATE_SUB(CURDATE(), INTERVAL 1 DAY) WHERE (promo_date_to >= CURDATE() OR promo_date_to IS NULL) AND promo_discount_percent IS NOT NULL");
|
||||||
|
$stmt->execute();
|
||||||
|
header("Location: orders.php?success=promotions_stopped");
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
// Fetch Outlets for Filter
|
// Fetch Outlets for Filter
|
||||||
$outlets = $pdo->query("SELECT id, name FROM outlets ORDER BY name")->fetchAll(PDO::FETCH_ASSOC);
|
$outlets = $pdo->query("SELECT id, name FROM outlets ORDER BY name")->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
@ -78,15 +92,31 @@ include 'includes/header.php';
|
|||||||
|
|
||||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
<h2 class="fw-bold mb-0">Order Management</h2>
|
<h2 class="fw-bold mb-0">Order Management</h2>
|
||||||
<span class="badge bg-success bg-opacity-10 text-success border border-success px-3 py-2 rounded-pill">
|
<div class="d-flex gap-2">
|
||||||
<i class="bi bi-circle-fill small me-1"></i> Live
|
<?php if (has_permission('manage_products')): ?>
|
||||||
</span>
|
<form method="POST" onsubmit="return confirm('Are you sure you want to stop all running promotions? This will end all active promotions by setting their end date to yesterday.');">
|
||||||
|
<input type="hidden" name="action" value="stop_promotions">
|
||||||
|
<button type="submit" class="btn btn-danger shadow-sm">
|
||||||
|
<i class="bi bi-stop-circle me-1"></i> Stop All Promotions
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
<?php endif; ?>
|
||||||
|
<span class="badge bg-success bg-opacity-10 text-success border border-success px-3 py-2 rounded-pill d-flex align-items-center">
|
||||||
|
<i class="bi bi-circle-fill small me-1"></i> Live
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php if (isset($_GET['error']) && $_GET['error'] === 'permission_denied'): ?>
|
<?php if (isset($_GET['error']) && $_GET['error'] === 'permission_denied'): ?>
|
||||||
<div class="alert alert-danger border-0 shadow-sm rounded-3">Access Denied: You do not have permission to perform this action.</div>
|
<div class="alert alert-danger border-0 shadow-sm rounded-3">Access Denied: You do not have permission to perform this action.</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<?php if (isset($_GET['success']) && $_GET['success'] === 'promotions_stopped'): ?>
|
||||||
|
<div class="alert alert-success border-0 shadow-sm rounded-3">
|
||||||
|
<i class="bi bi-check-circle-fill me-2"></i> All running promotions have been stopped successfully.
|
||||||
|
</div>
|
||||||
|
<?php endif; ?>
|
||||||
|
|
||||||
<!-- Summary Stats -->
|
<!-- Summary Stats -->
|
||||||
<div class="row mb-4">
|
<div class="row mb-4">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
@ -318,4 +348,4 @@ include 'includes/header.php';
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php include 'includes/footer.php'; ?>
|
<?php include 'includes/footer.php'; ?>
|
||||||
@ -102,6 +102,7 @@ try {
|
|||||||
}
|
}
|
||||||
// Deduct points
|
// Deduct points
|
||||||
$deductStmt = $pdo->prepare("UPDATE customers SET points = points - ? WHERE id = ?");
|
$deductStmt = $pdo->prepare("UPDATE customers SET points = points - ? WHERE id = ?");
|
||||||
|
$pdo->prepare("UPDATE customers SET loyalty_redemptions_count = loyalty_redemptions_count + 1 WHERE id = ?")->execute([$customer_id]);
|
||||||
$deductStmt->execute([$points_threshold, $customer_id]);
|
$deductStmt->execute([$points_threshold, $customer_id]);
|
||||||
$points_deducted = $points_threshold;
|
$points_deducted = $points_threshold;
|
||||||
|
|
||||||
|
|||||||
11
db/migrations/015_add_redemptions_to_customers.sql
Normal file
11
db/migrations/015_add_redemptions_to_customers.sql
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
-- Add loyalty_redemptions_count to customers table
|
||||||
|
ALTER TABLE customers ADD COLUMN loyalty_redemptions_count INT DEFAULT 0;
|
||||||
|
|
||||||
|
-- Optional: Initialize count from existing orders
|
||||||
|
UPDATE customers c
|
||||||
|
SET c.loyalty_redemptions_count = (
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM orders o
|
||||||
|
JOIN payment_types pt ON o.payment_type_id = pt.id
|
||||||
|
WHERE o.customer_id = c.id AND pt.name = 'Loyalty Redeem'
|
||||||
|
);
|
||||||
Loading…
x
Reference in New Issue
Block a user