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 = <<
$formattedTotalWeightHarvested kg
🐟 Tilapia:
$formattedTotalTilapia kg
🐠 Small Fish:
$formattedTotalSmallFish kg
🐡 Big Fish:
$formattedTotalBigFish kg
$formattedAverageRatePerKg
| Fortnight |
Tilapia (kg) |
Small Fish (kg) |
Big Fish (kg) |
Total Weight (kg) |
Harvest Charges |
$fortnightlyRows
| Buyer |
Total Sales |
Total Payments |
Balance |
$buyerRows
| Month |
Sales Value |
Expenses |
Payments |
Harvested Weight |
Rate/Kg |
$monthlyRows
HTML;
} catch (Exception $e) {
$content = " An error occurred while loading dashboard data.
";
error_log("Dashboard error: " . $e->getMessage());
}
include 'main_layout.php';
$conn->close();
?>