1800)) { header("Location: logout.php"); exit(); } $_SESSION['last_activity'] = time(); require_once 'db_connection.php'; $pageTitle = "Dashboard"; // Helper function to safely format currency function formatCurrency($value) { if (is_numeric($value)) { return '₹' . number_format((float)$value, 2, '.', ','); } return '₹0.00'; } // Function to safely execute SQL queries function executeQuery($conn, $query) { $result = $conn->query($query); if ($result === false) { error_log("Query failed: " . $conn->error); throw new Exception("Database query failed."); } return $result; } try { // Get total sales value - use override amount if set $result = executeQuery($conn, "SELECT SUM(COALESCE(NULLIF(final_amount_override, 0), final_amount)) as total FROM sales"); $totalSales = $result->fetch_assoc()['total'] ?? 0; // Get total expense value $result = executeQuery($conn, "SELECT SUM(amount) as total FROM expenses"); $totalExpenses = $result->fetch_assoc()['total'] ?? 0; // Get total payments value $result = executeQuery($conn, "SELECT SUM(amount_paid) as total FROM payments"); $totalPayments = $result->fetch_assoc()['total'] ?? 0; // Get total weight harvested and breakdown by fish type $result = executeQuery($conn, "SELECT SUM(weight_tilapia + weight_small_fish + weight_big_fish) as total, SUM(weight_tilapia) as total_tilapia, SUM(weight_small_fish) as total_small_fish, SUM(weight_big_fish) as total_big_fish FROM sales"); $weightData = $result->fetch_assoc(); $totalWeightHarvested = $weightData['total'] ?? 0; $totalTilapia = $weightData['total_tilapia'] ?? 0; $totalSmallFish = $weightData['total_small_fish'] ?? 0; $totalBigFish = $weightData['total_big_fish'] ?? 0; // Get average rate per kg - use override amount if set $result = executeQuery($conn, "SELECT SUM(COALESCE(NULLIF(final_amount_override, 0), final_amount)) / NULLIF(SUM(weight_tilapia + weight_small_fish + weight_big_fish), 0) as avg_rate FROM sales"); $averageRatePerKg = $result->fetch_assoc()['avg_rate'] ?? 0; // Get initial values $result = executeQuery($conn, "SELECT * FROM initial_values LIMIT 1"); $initialValues = $result->fetch_assoc(); $initialCash = $initialValues['cash_in_hand'] ?? 0; // Calculate cash in hand $cashInHand = $initialCash + $totalPayments - $totalExpenses; // Format values for display $formattedTotalSales = formatCurrency($totalSales); $formattedTotalExpenses = formatCurrency($totalExpenses); $formattedTotalPayments = formatCurrency($totalPayments); $formattedCashInHand = formatCurrency($cashInHand); $formattedTotalWeightHarvested = number_format($totalWeightHarvested, 2); $formattedTotalTilapia = number_format($totalTilapia, 2); $formattedTotalSmallFish = number_format($totalSmallFish, 2); $formattedTotalBigFish = number_format($totalBigFish, 2); $formattedAverageRatePerKg = formatCurrency($averageRatePerKg); // Generate Fortnightly Harvest Charges rows - Starting from Oct 1, 2025 $fortnightlyRows = ''; $query = "SELECT DATE_FORMAT(date, '%Y-%m') as month_year, YEAR(date) as year, MONTH(date) as month, CASE WHEN DAY(date) <= 15 THEN 1 ELSE 2 END as half_number, MIN(date) as start_date, MAX(date) as end_date, SUM(weight_tilapia) as total_tilapia, SUM(weight_small_fish) as total_small_fish, SUM(weight_big_fish) as total_big_fish, SUM(harvesting_charges) as total_charges FROM sales WHERE date >= '2025-10-01' GROUP BY YEAR(date), MONTH(date), CASE WHEN DAY(date) <= 15 THEN 1 ELSE 2 END ORDER BY YEAR(date) DESC, MONTH(date) DESC, half_number DESC"; $result = executeQuery($conn, $query); while ($row = $result->fetch_assoc()) { $startDate = $row['start_date']; $endDate = $row['end_date']; $year = $row['year']; $month = $row['month']; $halfNumber = $row['half_number']; // Format the fortnight name if ($halfNumber == 1) { // First half: 1st to 15th $fortnightStart = date('M d', strtotime("$year-$month-01")); $fortnightEnd = date('M d', strtotime("$year-$month-15")); } else { // Second half: 16th to end of month $fortnightStart = date('M d', strtotime("$year-$month-16")); $lastDay = date('t', strtotime("$year-$month-01")); $fortnightEnd = date('M d', strtotime("$year-$month-$lastDay")); } $fortnightName = "$fortnightStart - $fortnightEnd"; $totalWeight = $row['total_tilapia'] + $row['total_small_fish'] + $row['total_big_fish']; $fortnightlyRows .= " " . htmlspecialchars($fortnightName) . " " . number_format($row['total_tilapia'], 2) . " " . number_format($row['total_small_fish'], 2) . " " . number_format($row['total_big_fish'], 2) . " " . number_format($totalWeight, 2) . " " . formatCurrency($row['total_charges']) . " "; } // Generate Buyer Data rows - use override amount if set $buyerRows = ''; $madhuBalance = $initialValues['madhu_balance'] ?? 0; $rathnaBalance = $initialValues['rathna_balance'] ?? 0; $jambukkuttiBalance = $initialValues['jambukkutti_balance'] ?? 0; $query = "SELECT b.name as buyer_name, COALESCE(SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)), 0) as total_sales, COALESCE((SELECT SUM(amount_paid) FROM payments p WHERE p.buyer_id = b.id), 0) as total_payments, CASE WHEN b.name = 'Madhu' THEN COALESCE(SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)), 0) - COALESCE((SELECT SUM(amount_paid) FROM payments p WHERE p.buyer_id = b.id), 0) + $madhuBalance WHEN b.name = 'Rathna' THEN COALESCE(SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)), 0) - COALESCE((SELECT SUM(amount_paid) FROM payments p WHERE p.buyer_id = b.id), 0) + $rathnaBalance WHEN b.name = 'Jambukkutti' THEN COALESCE(SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)), 0) - COALESCE((SELECT SUM(amount_paid) FROM payments p WHERE p.buyer_id = b.id), 0) + $jambukkuttiBalance ELSE COALESCE(SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)), 0) - COALESCE((SELECT SUM(amount_paid) FROM payments p WHERE p.buyer_id = b.id), 0) END as balance FROM buyers b LEFT JOIN sales s ON b.id = s.buyer_id GROUP BY b.id ORDER BY b.name"; $result = executeQuery($conn, $query); while ($row = $result->fetch_assoc()) { $buyerRows .= " " . htmlspecialchars($row['buyer_name']) . " " . formatCurrency($row['total_sales']) . " " . formatCurrency($row['total_payments']) . " " . formatCurrency($row['balance']) . " "; } // Get monthly data for the table - use override amount if set $query = "SELECT DATE_FORMAT(s.date, '%Y-%m') as month, SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)) as sales_value, (SELECT SUM(amount) FROM expenses e WHERE DATE_FORMAT(e.date, '%Y-%m') = DATE_FORMAT(s.date, '%Y-%m')) as expense_value, (SELECT SUM(amount_paid) FROM payments p WHERE DATE_FORMAT(p.date, '%Y-%m') = DATE_FORMAT(s.date, '%Y-%m')) as payments_value, SUM(s.weight_tilapia + s.weight_small_fish + s.weight_big_fish) as harvested_weight, SUM(COALESCE(NULLIF(s.final_amount_override, 0), s.final_amount)) / NULLIF(SUM(s.weight_tilapia + s.weight_small_fish + s.weight_big_fish), 0) as rate_per_kg FROM sales s GROUP BY DATE_FORMAT(s.date, '%Y-%m') ORDER BY s.date DESC"; $monthlyData = executeQuery($conn, $query); // Generate monthly report rows $monthlyRows = ''; while ($row = $monthlyData->fetch_assoc()) { $monthlyRows .= " " . date('M Y', strtotime($row['month'] . '-01')) . " " . formatCurrency($row['sales_value']) . " " . formatCurrency($row['expense_value']) . " " . formatCurrency($row['payments_value']) . " " . number_format($row['harvested_weight'], 2) . " kg " . formatCurrency($row['rate_per_kg']) . " "; } $content = <<
Total Sales Value
$formattedTotalSales
Total Expenses
$formattedTotalExpenses
Total Payments Received
$formattedTotalPayments
Cash in Hand
$formattedCashInHand
Total Weight Harvested
$formattedTotalWeightHarvested kg
🐟 Tilapia: $formattedTotalTilapia kg
🐠 Small Fish: $formattedTotalSmallFish kg
🐡 Big Fish: $formattedTotalBigFish kg
Average Rate per Kg
$formattedAverageRatePerKg

Fortnightly Harvest Charges (from Oct 1, 2025)

$fortnightlyRows
Fortnight Tilapia (kg) Small Fish (kg) Big Fish (kg) Total Weight (kg) Harvest Charges

Buyer Data

$buyerRows
Buyer Total Sales Total Payments Balance

Monthly Report

Export CSV
$monthlyRows
Month Sales Value Expenses Payments Harvested Weight Rate/Kg
HTML; } catch (Exception $e) { $content = "
An error occurred while loading dashboard data.
"; error_log("Dashboard error: " . $e->getMessage()); } include 'main_layout.php'; $conn->close(); ?>