'Sales Management'] ]; $success = ''; $error = ''; $currentUser = getCurrentUser(); // Handle form submissions if ($_SERVER['REQUEST_METHOD'] === 'POST') { try { $action = $_POST['action'] ?? ''; switch ($action) { case 'add_sale': $title = sanitizeInput($_POST['title']); $amount = (float)$_POST['amount']; $quantity = (float)($_POST['quantity'] ?? 1); $unitPrice = $quantity > 0 ? $amount / $quantity : $amount; $categoryId = !empty($_POST['category_id']) ? (int)$_POST['category_id'] : null; $segmentId = !empty($_POST['segment_id']) ? (int)$_POST['segment_id'] : null; $saleDate = $_POST['sale_date']; $customerName = sanitizeInput($_POST['customer_name'] ?? ''); $customerPhone = sanitizeInput($_POST['customer_phone'] ?? ''); $description = sanitizeInput($_POST['description'] ?? ''); // Validation if (empty($title) || $amount <= 0 || empty($saleDate)) { throw new Exception('Title, amount, and sale date are required.'); } if ($customerPhone && !isValidPhone($customerPhone)) { throw new Exception('Please enter a valid customer phone number.'); } // Generate invoice number $invoiceNumber = generateInvoiceNumber(); // Handle receipt image upload $receiptImage = null; if (isset($_FILES['receipt_image']) && $_FILES['receipt_image']['error'] === UPLOAD_ERR_OK) { try { $receiptImage = handleFileUpload('receipt_image', '../uploads/receipts/'); } catch (Exception $e) { // Log error but don't fail the transaction error_log("Receipt upload failed: " . $e->getMessage()); } } $saleData = [ 'title' => $title, 'amount' => $amount, 'quantity' => $quantity, 'unit_price' => $unitPrice, 'category_id' => $categoryId, 'segment_id' => $segmentId, 'sale_date' => $saleDate, 'customer_name' => $customerName, 'customer_phone' => $customerPhone, 'description' => $description, 'invoice_number' => $invoiceNumber, 'receipt_image' => $receiptImage, 'created_by' => $currentUser['id'], 'created_at' => date('Y-m-d H:i:s') ]; $saleId = insertData('sales', $saleData); if ($saleId) { logSystemActivity('Add Sale', "Added sale: {$title} - " . formatIndianCurrency($amount)); $success = 'Sale recorded successfully! Invoice: ' . $invoiceNumber; } else { throw new Exception('Failed to record sale.'); } break; case 'update_sale': $saleId = (int)$_POST['sale_id']; $title = sanitizeInput($_POST['title']); $amount = (float)$_POST['amount']; $quantity = (float)($_POST['quantity'] ?? 1); $unitPrice = $quantity > 0 ? $amount / $quantity : $amount; $categoryId = !empty($_POST['category_id']) ? (int)$_POST['category_id'] : null; $segmentId = !empty($_POST['segment_id']) ? (int)$_POST['segment_id'] : null; $saleDate = $_POST['sale_date']; $customerName = sanitizeInput($_POST['customer_name'] ?? ''); $customerPhone = sanitizeInput($_POST['customer_phone'] ?? ''); $description = sanitizeInput($_POST['description'] ?? ''); // Validation if (empty($title) || $amount <= 0 || empty($saleDate)) { throw new Exception('Title, amount, and sale date are required.'); } if ($customerPhone && !isValidPhone($customerPhone)) { throw new Exception('Please enter a valid customer phone number.'); } // Check if user can edit this sale $existingSale = fetchRow("SELECT * FROM sales WHERE id = ?", [$saleId]); if (!$existingSale) { throw new Exception('Sale not found.'); } if ($currentUser['role'] !== 'admin' && $existingSale['created_by'] != $currentUser['id']) { throw new Exception('You can only edit your own sales records.'); } $updateData = [ 'title' => $title, 'amount' => $amount, 'quantity' => $quantity, 'unit_price' => $unitPrice, 'category_id' => $categoryId, 'segment_id' => $segmentId, 'sale_date' => $saleDate, 'customer_name' => $customerName, 'customer_phone' => $customerPhone, 'description' => $description ]; updateData('sales', $updateData, 'id = ?', [$saleId]); logSystemActivity('Update Sale', "Updated sale ID: {$saleId}"); $success = 'Sale updated successfully!'; break; case 'delete_sale': $saleId = (int)$_POST['sale_id']; // Check if user can delete this sale $existingSale = fetchRow("SELECT * FROM sales WHERE id = ?", [$saleId]); if (!$existingSale) { throw new Exception('Sale not found.'); } if ($currentUser['role'] !== 'admin' && $existingSale['created_by'] != $currentUser['id']) { throw new Exception('You can only delete your own sales records.'); } // Delete associated receipt image if ($existingSale['receipt_image'] && file_exists('../' . $existingSale['receipt_image'])) { unlink('../' . $existingSale['receipt_image']); } executeQuery("DELETE FROM sales WHERE id = ?", [$saleId]); logSystemActivity('Delete Sale', "Deleted sale: {$existingSale['title']}"); $success = 'Sale deleted successfully!'; break; } } catch (Exception $e) { $error = $e->getMessage(); } } // Get filter parameters $dateFrom = $_GET['date_from'] ?? date('Y-m-01'); // First day of current month $dateTo = $_GET['date_to'] ?? date('Y-m-d'); // Today $segmentFilter = $_GET['segment'] ?? ''; $categoryFilter = $_GET['category'] ?? ''; $search = $_GET['search'] ?? ''; // Build query for sales list $whereConditions = []; $params = []; // Date range filter if ($dateFrom) { $whereConditions[] = "s.sale_date >= ?"; $params[] = $dateFrom; } if ($dateTo) { $whereConditions[] = "s.sale_date <= ?"; $params[] = $dateTo; } // Segment filter if ($segmentFilter) { $whereConditions[] = "s.segment_id = ?"; $params[] = $segmentFilter; } // Category filter if ($categoryFilter) { $whereConditions[] = "s.category_id = ?"; $params[] = $categoryFilter; } // Search filter if ($search) { $whereConditions[] = "(s.title LIKE ? OR s.customer_name LIKE ? OR s.invoice_number LIKE ?)"; $params[] = "%$search%"; $params[] = "%$search%"; $params[] = "%$search%"; } // User-specific filter for non-admin users if ($currentUser['role'] !== 'admin' && !hasPermission('manage_sales')) { $whereConditions[] = "s.created_by = ?"; $params[] = $currentUser['id']; } $whereClause = !empty($whereConditions) ? 'WHERE ' . implode(' AND ', $whereConditions) : ''; // Get sales with related data $salesQuery = " SELECT s.*, bs.name as segment_name, c.name as category_name, u.full_name as created_by_name FROM sales s LEFT JOIN business_segments bs ON s.segment_id = bs.id LEFT JOIN categories c ON s.category_id = c.id LEFT JOIN users u ON s.created_by = u.id {$whereClause} ORDER BY s.sale_date DESC, s.created_at DESC LIMIT 100 "; $sales = fetchAll($salesQuery, $params); // Calculate totals for the filtered data $totalQuery = " SELECT COUNT(*) as total_count, SUM(amount) as total_amount, AVG(amount) as avg_amount, SUM(quantity) as total_quantity FROM sales s {$whereClause} "; $totals = fetchRow($totalQuery, $params); // Get data for dropdowns $businessSegments = getBusinessSegments(); $revenueCategories = getCategories('revenue'); include '../includes/header.php'; ?>
Record, track, and manage your fish sales transactions.
Try adjusting your filters or search criteria. Start by recording your first sale.
| Invoice/Details | Customer | Category | Amount | Quantity | Date | Actions |
|---|---|---|---|---|---|---|
|
•
Qty:
|
Walk-in Customer
|
- |
1): ?>
@
|
|