38960-vm/includes/pages/inventory_items.php
2026-03-21 17:39:37 +00:00

283 lines
16 KiB
PHP

<?php
// Handle Actions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (isset($_POST['action'])) {
if ($_POST['action'] === 'add_item') {
$name_en = $_POST['name_en'] ?? '';
$name_ar = $_POST['name_ar'] ?? '';
$category_id = $_POST['category_id'] ?? null;
$sku = $_POST['sku'] ?? '';
$unit = $_POST['unit'] ?? 'piece';
$min_level = $_POST['min_level'] ?? 10;
$reorder_level = $_POST['reorder_level'] ?? 20;
$description = $_POST['description'] ?? '';
if ($name_en && $category_id) {
try {
$stmt = $db->prepare("INSERT INTO inventory_items (name_en, name_ar, category_id, sku, unit, min_level, reorder_level, description) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
$stmt->execute([$name_en, $name_ar, $category_id, $sku, $unit, $min_level, $reorder_level, $description]);
$_SESSION['flash_message'] = '<div class="alert alert-success">' . __('item_added_successfully') . '</div>';
} catch (PDOException $e) {
$_SESSION['flash_message'] = '<div class="alert alert-danger">' . __('error_adding_item') . ': ' . $e->getMessage() . '</div>';
}
} else {
$_SESSION['flash_message'] = '<div class="alert alert-danger">' . __('fill_all_required_fields') . '</div>';
}
} elseif ($_POST['action'] === 'edit_item') {
$id = $_POST['id'] ?? 0;
$name_en = $_POST['name_en'] ?? '';
$name_ar = $_POST['name_ar'] ?? '';
$category_id = $_POST['category_id'] ?? null;
$sku = $_POST['sku'] ?? '';
$unit = $_POST['unit'] ?? 'piece';
$min_level = $_POST['min_level'] ?? 10;
$reorder_level = $_POST['reorder_level'] ?? 20;
$description = $_POST['description'] ?? '';
if ($name_en && $category_id) {
try {
$stmt = $db->prepare("UPDATE inventory_items SET name_en = ?, name_ar = ?, category_id = ?, sku = ?, unit = ?, min_level = ?, reorder_level = ?, description = ? WHERE id = ?");
$stmt->execute([$name_en, $name_ar, $category_id, $sku, $unit, $min_level, $reorder_level, $description, $id]);
$_SESSION['flash_message'] = '<div class="alert alert-success">' . __('item_updated_successfully') . '</div>';
} catch (PDOException $e) {
$_SESSION['flash_message'] = '<div class="alert alert-danger">' . __('error_updating_item') . ': ' . $e->getMessage() . '</div>';
}
}
} elseif ($_POST['action'] === 'delete_item') {
$id = $_POST['id'] ?? 0;
// Check usage
$stmt = $db->prepare("SELECT COUNT(*) FROM inventory_batches WHERE item_id = ? AND quantity > 0");
$stmt->execute([$id]);
if ($stmt->fetchColumn() > 0) {
$_SESSION['flash_message'] = '<div class="alert alert-danger">' . __('cannot_delete_item_with_stock') . '</div>';
} else {
$stmt = $db->prepare("DELETE FROM inventory_items WHERE id = ?");
$stmt->execute([$id]);
$_SESSION['flash_message'] = '<div class="alert alert-success">' . __('item_deleted_successfully') . '</div>';
}
}
header("Location: inventory_items.php");
exit;
}
}
// Fetch Items with Stock
$items = $db->query("
SELECT i.*, c.name_en as category_name,
COALESCE((SELECT SUM(quantity) FROM inventory_batches b WHERE b.item_id = i.id), 0) as current_stock
FROM inventory_items i
LEFT JOIN inventory_categories c ON i.category_id = c.id
ORDER BY i.name_en ASC
")->fetchAll(PDO::FETCH_ASSOC);
// Fetch Categories for Dropdown
$categories = $db->query("SELECT * FROM inventory_categories ORDER BY name_en ASC")->fetchAll(PDO::FETCH_ASSOC);
?>
<div class="d-flex justify-content-between align-items-center mb-4">
<h2 class="mb-0 fw-bold text-dark"><?php echo __('inventory_items'); ?></h2>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#addItemModal">
<i class="bi bi-plus-lg me-1"></i> <?php echo __('add_item'); ?>
</button>
</div>
<div class="card shadow-sm border-0">
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover align-middle">
<thead class="table-light">
<tr>
<th><?php echo __('sku'); ?></th>
<th><?php echo __('item_name'); ?></th>
<th><?php echo __('category'); ?></th>
<th><?php echo __('unit'); ?></th>
<th><?php echo __('min_level'); ?></th>
<th><?php echo __('current_stock'); ?></th>
<th class="text-end"><?php echo __('actions'); ?></th>
</tr>
</thead>
<tbody>
<?php if (empty($items)): ?>
<tr>
<td colspan="7" class="text-center py-4 text-muted"><?php echo __('no_items_found'); ?></td>
</tr>
<?php else: ?>
<?php foreach ($items as $item): ?>
<tr class="<?php echo ($item['current_stock'] <= $item['min_level']) ? 'table-warning' : ''; ?>">
<td><span class="badge bg-secondary"><?php echo htmlspecialchars($item['sku'] ?? '-'); ?></span></td>
<td>
<div class="fw-bold"><?php echo htmlspecialchars($item['name_en']); ?></div>
<small class="text-muted"><?php echo htmlspecialchars($item['name_ar']); ?></small>
</td>
<td><?php echo htmlspecialchars($item['category_name'] ?? '-'); ?></td>
<td><?php echo htmlspecialchars($item['unit']); ?></td>
<td><?php echo $item['min_level']; ?></td>
<td>
<?php if ($item['current_stock'] == 0): ?>
<span class="badge bg-danger"><?php echo __('out_of_stock'); ?></span>
<?php elseif ($item['current_stock'] <= $item['min_level']): ?>
<span class="badge bg-warning text-dark"><?php echo $item['current_stock']; ?> (Low)</span>
<?php else: ?>
<span class="badge bg-success"><?php echo $item['current_stock']; ?></span>
<?php endif; ?>
</td>
<td class="text-end">
<button class="btn btn-sm btn-outline-primary me-1"
onclick='editItem(<?php echo json_encode($item, JSON_HEX_APOS | JSON_HEX_QUOT); ?>)'>
<i class="bi bi-pencil"></i>
</button>
<form method="POST" class="d-inline" onsubmit="return confirm('<?php echo __('are_you_sure'); ?>');">
<input type="hidden" name="action" value="delete_item">
<input type="hidden" name="id" value="<?php echo $item['id']; ?>">
<button type="submit" class="btn btn-sm btn-outline-danger">
<i class="bi bi-trash"></i>
</button>
</form>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
</div>
<!-- Add Item Modal -->
<div class="modal fade" id="addItemModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form method="POST">
<div class="modal-header">
<h5 class="modal-title"><?php echo __('add_item'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="hidden" name="action" value="add_item">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label"><?php echo __('name_en'); ?> <span class="text-danger">*</span></label>
<input type="text" name="name_en" class="form-control" required>
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('name_ar'); ?></label>
<input type="text" name="name_ar" class="form-control">
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('category'); ?> <span class="text-danger">*</span></label>
<select name="category_id" class="form-select" required>
<option value=""><?php echo __('select_category'); ?></option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat['id']; ?>"><?php echo htmlspecialchars($cat['name_en']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('sku'); ?></label>
<input type="text" name="sku" class="form-control">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('unit'); ?></label>
<input type="text" name="unit" class="form-control" value="piece">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('min_level'); ?></label>
<input type="number" name="min_level" class="form-control" value="10">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('reorder_level'); ?></label>
<input type="number" name="reorder_level" class="form-control" value="20">
</div>
<div class="col-12">
<label class="form-label"><?php echo __('description'); ?></label>
<textarea name="description" class="form-control" rows="2"></textarea>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?php echo __('cancel'); ?></button>
<button type="submit" class="btn btn-primary"><?php echo __('save'); ?></button>
</div>
</form>
</div>
</div>
</div>
<!-- Edit Item Modal -->
<div class="modal fade" id="editItemModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<form method="POST">
<div class="modal-header">
<h5 class="modal-title"><?php echo __('edit_item'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="hidden" name="action" value="edit_item">
<input type="hidden" name="id" id="edit_id">
<div class="row g-3">
<div class="col-md-6">
<label class="form-label"><?php echo __('name_en'); ?> <span class="text-danger">*</span></label>
<input type="text" name="name_en" id="edit_name_en" class="form-control" required>
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('name_ar'); ?></label>
<input type="text" name="name_ar" id="edit_name_ar" class="form-control">
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('category'); ?> <span class="text-danger">*</span></label>
<select name="category_id" id="edit_category_id" class="form-select" required>
<option value=""><?php echo __('select_category'); ?></option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat['id']; ?>"><?php echo htmlspecialchars($cat['name_en']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-6">
<label class="form-label"><?php echo __('sku'); ?></label>
<input type="text" name="sku" id="edit_sku" class="form-control">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('unit'); ?></label>
<input type="text" name="unit" id="edit_unit" class="form-control">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('min_level'); ?></label>
<input type="number" name="min_level" id="edit_min_level" class="form-control">
</div>
<div class="col-md-4">
<label class="form-label"><?php echo __('reorder_level'); ?></label>
<input type="number" name="reorder_level" id="edit_reorder_level" class="form-control">
</div>
<div class="col-12">
<label class="form-label"><?php echo __('description'); ?></label>
<textarea name="description" id="edit_description" class="form-control" rows="2"></textarea>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal"><?php echo __('cancel'); ?></button>
<button type="submit" class="btn btn-primary"><?php echo __('update'); ?></button>
</div>
</form>
</div>
</div>
</div>
<script>
function editItem(item) {
document.getElementById('edit_id').value = item.id;
document.getElementById('edit_name_en').value = item.name_en;
document.getElementById('edit_name_ar').value = item.name_ar;
document.getElementById('edit_category_id').value = item.category_id;
document.getElementById('edit_sku').value = item.sku || '';
document.getElementById('edit_unit').value = item.unit || 'piece';
document.getElementById('edit_min_level').value = item.min_level;
document.getElementById('edit_reorder_level').value = item.reorder_level;
document.getElementById('edit_description').value = item.description || '';
var myModal = new bootstrap.Modal(document.getElementById('editItemModal'));
myModal.show();
}
</script>