Sindbad~EG File Manager
<?php
session_start();
require_once __DIR__ . '/../config/database.php';
require_once __DIR__ . '/../includes/functions.php';
if (!isset($_SESSION['user_id'])) {
header('Location: ../login.php');
exit();
}
// Check permission for reports
if (!checkPermission('viewer')) {
header('Location: ' . $_SESSION['user_level'] . '.php?error=access_denied');
exit();
}
$page_title = 'Demography Reports';
$page_description = 'Generate and export demographic reports';
$success_message = '';
$error_message = '';
$report_data = [];
$summary_stats = [];
$summary_data = [];
// Determine current tab
$current_tab = isset($_GET['tab']) ? $_GET['tab'] : 'reports';
$valid_tabs = ['reports', 'summary', 'exact'];
if (!in_array($current_tab, $valid_tabs)) {
$current_tab = 'reports';
}
// Get accessible areas, districts, and assemblies
$areas = getAccessibleAreas($_SESSION['user_level'], $_SESSION['area_id']);
// Handle report generation
if ($_POST && isset($_POST['generate_report'])) {
$report_category = sanitizeInput($_POST['report_category']);
$date_from = sanitizeInput($_POST['date_from']);
$date_to = sanitizeInput($_POST['date_to']);
$area_filter = !empty($_POST['area_filter']) ? (int)$_POST['area_filter'] : null;
$district_filter = !empty($_POST['district_filter']) ? (int)$_POST['district_filter'] : null;
$assembly_filter = !empty($_POST['assembly_filter']) ? (int)$_POST['assembly_filter'] : null;
$output_format = sanitizeInput($_POST['output_format']);
// Build query based on report category
$table_name = '';
$query = '';
switch ($report_category) {
case 'membership':
$table_name = 'demography_data';
$query = "SELECT d.*, a.name as area_name, dist.name as district_name, ass.name as assembly_name,
u.first_name, u.last_name, d.created_at, d.updated_at
FROM demography_data d
JOIN areas a ON d.area_id = a.id
JOIN districts dist ON d.district_id = dist.id
JOIN assemblies ass ON d.assembly_id = ass.id
JOIN users u ON d.created_by = u.id
WHERE 1=1";
break;
case 'souls':
$table_name = 'souls_data';
$query = "SELECT s.*, a.name as area_name, dist.name as district_name, ass.name as assembly_name,
u.first_name, u.last_name, s.created_at, s.updated_at
FROM souls_data s
JOIN areas a ON s.area_id = a.id
JOIN districts dist ON s.district_id = dist.id
JOIN assemblies ass ON s.assembly_id = ass.id
JOIN users u ON s.created_by = u.id
WHERE 1=1";
break;
case 'transfers':
$table_name = 'transfers_data';
$query = "SELECT t.*, a.name as area_name, dist.name as district_name, ass.name as assembly_name,
u.first_name, u.last_name, t.created_at, t.updated_at
FROM transfers_data t
JOIN areas a ON t.area_id = a.id
JOIN districts dist ON t.district_id = dist.id
JOIN assemblies ass ON t.assembly_id = ass.id
JOIN users u ON t.created_by = u.id
WHERE 1=1";
break;
default:
$error_message = 'Invalid report category selected.';
break;
}
if (empty($query)) {
$error_message = 'Please select a valid report category.';
} else {
$params = [];
// Date range filter
$table_alias = substr($table_name, 0, 1); // d, s, or t
if (!empty($date_from)) {
$query .= " AND DATE({$table_alias}.created_at) >= :date_from";
$params[':date_from'] = $date_from;
}
if (!empty($date_to)) {
$query .= " AND DATE({$table_alias}.created_at) <= :date_to";
$params[':date_to'] = $date_to;
}
// Location filters
if ($area_filter) {
$query .= " AND {$table_alias}.area_id = :area_filter";
$params[':area_filter'] = $area_filter;
}
if ($district_filter) {
$query .= " AND {$table_alias}.district_id = :district_filter";
$params[':district_filter'] = $district_filter;
}
if ($assembly_filter) {
$query .= " AND {$table_alias}.assembly_id = :assembly_filter";
$params[':assembly_filter'] = $assembly_filter;
}
$query .= " ORDER BY {$table_alias}.created_at DESC";
try {
$stmt = $db->prepare($query);
foreach ($params as $key => $value) {
$stmt->bindValue($key, $value);
}
$stmt->execute();
$report_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Calculate summary statistics based on report category
if (!empty($report_data)) {
$total_records = count($report_data);
$summary_stats = ['total_records' => $total_records];
switch ($report_category) {
case 'membership':
$total_children = array_sum(array_column($report_data, 'children_total'));
$total_youth = array_sum(array_column($report_data, 'youth_total'));
$total_other_adults = array_sum(array_column($report_data, 'other_adults_total'));
$total_overall = array_sum(array_column($report_data, 'overall_members'));
$summary_stats = array_merge($summary_stats, [
'total_children' => $total_children,
'total_youth' => $total_youth,
'total_other_adults' => $total_other_adults,
'total_overall' => $total_overall,
'avg_per_assembly' => $total_records > 0 ? round($total_overall / $total_records, 2) : 0
]);
break;
case 'souls':
$total_souls_won = array_sum(array_column($report_data, 'outreach_program')) +
array_sum(array_column($report_data, 'adult_souls_won_cop')) +
array_sum(array_column($report_data, 'other_souls_won'));
$total_baptized_water = array_sum(array_column($report_data, 'baptized_in_water'));
$total_baptized_spirit = array_sum(array_column($report_data, 'holy_spirit_baptism'));
$summary_stats = array_merge($summary_stats, [
'total_souls_won' => $total_souls_won,
'total_baptized_water' => $total_baptized_water,
'total_baptized_spirit' => $total_baptized_spirit,
'avg_per_assembly' => $total_records > 0 ? round($total_souls_won / $total_records, 2) : 0
]);
break;
case 'transfers':
$total_transfers_in = array_sum(array_column($report_data, 'transfers_in_total'));
$total_transfers_out = array_sum(array_column($report_data, 'transfers_out_total'));
$net_transfers = $total_transfers_in - $total_transfers_out;
$summary_stats = array_merge($summary_stats, [
'total_transfers_in' => $total_transfers_in,
'total_transfers_out' => $total_transfers_out,
'net_transfers' => $net_transfers,
'avg_per_assembly' => $total_records > 0 ? round($total_transfers_in / $total_records, 2) : 0
]);
break;
}
}
// Handle export formats
if ($output_format !== 'screen' && !empty($report_data)) {
handleExport($report_data, $summary_stats, $output_format, $report_category);
exit();
}
if (empty($report_data)) {
$error_message = 'No data found matching the selected criteria.';
} else {
$success_message = "Report generated successfully! Found {$total_records} record(s).";
}
} catch (Exception $e) {
$error_message = 'Error generating report: ' . $e->getMessage();
}
} // Close the else statement
}
// Handle summary report generation
if ($_POST && isset($_POST['generate_summary'])) {
$date_from = sanitizeInput($_POST['summary_date_from']);
$date_to = sanitizeInput($_POST['summary_date_to']);
$area_filter = !empty($_POST['summary_area_filter']) ? (int)$_POST['summary_area_filter'] : null;
$district_filter = !empty($_POST['summary_district_filter']) ? (int)$_POST['summary_district_filter'] : null;
$assembly_filter = !empty($_POST['summary_assembly_filter']) ? (int)$_POST['summary_assembly_filter'] : null;
$output_format = sanitizeInput($_POST['summary_output_format']);
try {
// Build comprehensive query to get data from all three tables
$summary_query = "
SELECT
a.name as area_name,
d.name as district_name,
ass.name as assembly_name,
ass.id as assembly_id,
-- Membership data
COALESCE(mem.children_total, 0) as children_total,
COALESCE(mem.youth_total, 0) as youth_total,
COALESCE(mem.other_adults_total, 0) as other_adults_total,
COALESCE(mem.overall_members, 0) as overall_members,
mem.created_at as membership_date,
-- Souls data
COALESCE(souls.outreach_program, 0) as outreach_program,
COALESCE(souls.adult_souls_won_cop, 0) as adult_souls_won_cop,
COALESCE(souls.other_souls_won, 0) as other_souls_won,
COALESCE(souls.baptized_in_water, 0) as baptized_in_water,
COALESCE(souls.holy_spirit_baptism, 0) as holy_spirit_baptism,
souls.created_at as souls_date,
-- Transfers data
COALESCE(trans.transfers_in_total, 0) as transfers_in_total,
COALESCE(trans.transfers_out_total, 0) as transfers_out_total,
trans.created_at as transfers_date
FROM assemblies ass
JOIN districts d ON ass.district_id = d.id
JOIN areas a ON d.area_id = a.id
LEFT JOIN demography_data mem ON ass.id = mem.assembly_id
LEFT JOIN souls_data souls ON ass.id = souls.assembly_id
LEFT JOIN transfers_data trans ON ass.id = trans.assembly_id
WHERE 1=1";
$params = [];
// Apply filters
if ($area_filter) {
$summary_query .= " AND a.id = :area_filter";
$params[':area_filter'] = $area_filter;
}
if ($district_filter) {
$summary_query .= " AND d.id = :district_filter";
$params[':district_filter'] = $district_filter;
}
if ($assembly_filter) {
$summary_query .= " AND ass.id = :assembly_filter";
$params[':assembly_filter'] = $assembly_filter;
}
// Date filters for any of the three tables
if (!empty($date_from)) {
$summary_query .= " AND (
(mem.created_at IS NOT NULL AND DATE(mem.created_at) >= :date_from) OR
(souls.created_at IS NOT NULL AND DATE(souls.created_at) >= :date_from) OR
(trans.created_at IS NOT NULL AND DATE(trans.created_at) >= :date_from)
)";
$params[':date_from'] = $date_from;
}
if (!empty($date_to)) {
$summary_query .= " AND (
(mem.created_at IS NOT NULL AND DATE(mem.created_at) <= :date_to) OR
(souls.created_at IS NOT NULL AND DATE(souls.created_at) <= :date_to) OR
(trans.created_at IS NOT NULL AND DATE(trans.created_at) <= :date_to)
)";
$params[':date_to'] = $date_to;
}
$summary_query .= " ORDER BY a.name, d.name, ass.name";
$stmt = $db->prepare($summary_query);
foreach ($params as $key => $value) {
$stmt->bindValue($key, $value);
}
$stmt->execute();
$summary_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Calculate overall statistics
if (!empty($summary_data)) {
$total_assemblies = count(array_unique(array_column($summary_data, 'assembly_id')));
$total_members = array_sum(array_column($summary_data, 'overall_members'));
$total_children = array_sum(array_column($summary_data, 'children_total'));
$total_youth = array_sum(array_column($summary_data, 'youth_total'));
$total_other_adults = array_sum(array_column($summary_data, 'other_adults_total'));
$total_souls_won = array_sum(array_column($summary_data, 'outreach_program')) +
array_sum(array_column($summary_data, 'adult_souls_won_cop')) +
array_sum(array_column($summary_data, 'other_souls_won'));
$total_baptized_water = array_sum(array_column($summary_data, 'baptized_in_water'));
$total_baptized_spirit = array_sum(array_column($summary_data, 'holy_spirit_baptism'));
$total_transfers_in = array_sum(array_column($summary_data, 'transfers_in_total'));
$total_transfers_out = array_sum(array_column($summary_data, 'transfers_out_total'));
$net_transfers = $total_transfers_in - $total_transfers_out;
$summary_stats = [
'total_assemblies' => $total_assemblies,
'total_members' => $total_members,
'total_children' => $total_children,
'total_youth' => $total_youth,
'total_other_adults' => $total_other_adults,
'total_souls_won' => $total_souls_won,
'total_baptized_water' => $total_baptized_water,
'total_baptized_spirit' => $total_baptized_spirit,
'total_transfers_in' => $total_transfers_in,
'total_transfers_out' => $total_transfers_out,
'net_transfers' => $net_transfers,
'avg_members_per_assembly' => $total_assemblies > 0 ? round($total_members / $total_assemblies, 2) : 0,
'avg_souls_per_assembly' => $total_assemblies > 0 ? round($total_souls_won / $total_assemblies, 2) : 0
];
}
// Handle export formats for summary
if ($output_format !== 'screen' && !empty($summary_data)) {
handleSummaryExport($summary_data, $summary_stats, $output_format);
exit();
}
if (empty($summary_data)) {
$error_message = 'No data found matching the selected criteria.';
} else {
$success_message = "Summary report generated successfully! Found data for {$total_assemblies} assemblies.";
}
} catch (Exception $e) {
$error_message = 'Error generating summary report: ' . $e->getMessage();
}
}
// Handle exact report generation (End-of-Year Statistical Report format)
if ($_POST && isset($_POST['generate_exact'])) {
$date_from = sanitizeInput($_POST['exact_date_from']);
$date_to = sanitizeInput($_POST['exact_date_to']);
$area_filter = !empty($_POST['exact_area_filter']) ? (int)$_POST['exact_area_filter'] : null;
$district_filter = !empty($_POST['exact_district_filter']) ? (int)$_POST['exact_district_filter'] : null;
$assembly_filter = !empty($_POST['exact_assembly_filter']) ? (int)$_POST['exact_assembly_filter'] : null;
$output_format = sanitizeInput($_POST['exact_output_format']);
$report_year = sanitizeInput($_POST['report_year']) ?: date('Y');
try {
// Build comprehensive query for exact report format
$exact_query = "
SELECT
a.name as area_name,
d.name as district_name,
ass.name as assembly_name,
ass.id as assembly_id,
-- Membership data with detailed breakdown
COALESCE(mem.children_male, 0) as children_male,
COALESCE(mem.children_female, 0) as children_female,
COALESCE(mem.children_total, 0) as children_total,
COALESCE(mem.teens_male, 0) as teens_male,
COALESCE(mem.teens_female, 0) as teens_female,
COALESCE(mem.teens_total, 0) as teens_total,
COALESCE(mem.young_adults_male, 0) as young_adults_male,
COALESCE(mem.young_adults_female, 0) as young_adults_female,
COALESCE(mem.young_adults_total, 0) as young_adults_total,
COALESCE(mem.youth_total, 0) as youth_total,
COALESCE(mem.other_adults_male, 0) as other_adults_male,
COALESCE(mem.other_adults_female, 0) as other_adults_female,
COALESCE(mem.other_adults_total, 0) as other_adults_total,
COALESCE(mem.total_adult_members, 0) as total_adult_members,
COALESCE(mem.overall_members, 0) as overall_members,
-- Souls data with detailed breakdown
COALESCE(souls.outreach_program, 0) as outreach_program,
COALESCE(souls.adult_souls_won_cop, 0) as adult_souls_won_cop,
COALESCE(souls.other_souls_won, 0) as other_souls_won,
COALESCE(souls.gospel_sunday_morning, 0) as gospel_sunday_morning,
COALESCE(souls.hum, 0) as hum,
COALESCE(souls.mpwds, 0) as mpwds,
COALESCE(souls.chaplaincy, 0) as chaplaincy,
COALESCE(souls.chieftancy, 0) as chieftancy,
COALESCE(souls.som, 0) as som,
COALESCE(souls.digital_space, 0) as digital_space,
COALESCE(souls.baptized_in_water, 0) as baptized_in_water,
COALESCE(souls.holy_spirit_baptism, 0) as holy_spirit_baptism,
COALESCE(souls.old_members_now_baptized_holy_spirit, 0) as old_members_baptized,
-- Transfers data with age group breakdown
COALESCE(trans.transfers_in_13_19, 0) as transfers_in_13_19,
COALESCE(trans.transfers_in_20_35, 0) as transfers_in_20_35,
COALESCE(trans.transfers_in_above_35, 0) as transfers_in_above_35,
COALESCE(trans.transfers_in_total, 0) as transfers_in_total,
COALESCE(trans.transfers_out_13_19, 0) as transfers_out_13_19,
COALESCE(trans.transfers_out_20_35, 0) as transfers_out_20_35,
COALESCE(trans.transfers_out_above_35, 0) as transfers_out_above_35,
COALESCE(trans.transfers_out_total, 0) as transfers_out_total,
-- Data dates for reference
mem.created_at as membership_date,
souls.created_at as souls_date,
trans.created_at as transfers_date
FROM assemblies ass
JOIN districts d ON ass.district_id = d.id
JOIN areas a ON d.area_id = a.id
LEFT JOIN demography_data mem ON ass.id = mem.assembly_id
LEFT JOIN souls_data souls ON ass.id = souls.assembly_id
LEFT JOIN transfers_data trans ON ass.id = trans.assembly_id
WHERE 1=1";
$params = [];
// Apply filters
if ($area_filter) {
$exact_query .= " AND a.id = :area_filter";
$params[':area_filter'] = $area_filter;
}
if ($district_filter) {
$exact_query .= " AND d.id = :district_filter";
$params[':district_filter'] = $district_filter;
}
if ($assembly_filter) {
$exact_query .= " AND ass.id = :assembly_filter";
$params[':assembly_filter'] = $assembly_filter;
}
// Date filters for any of the three tables
if (!empty($date_from)) {
$exact_query .= " AND (
(mem.created_at IS NOT NULL AND DATE(mem.created_at) >= :date_from) OR
(souls.created_at IS NOT NULL AND DATE(souls.created_at) >= :date_from) OR
(trans.created_at IS NOT NULL AND DATE(trans.created_at) >= :date_from)
)";
$params[':date_from'] = $date_from;
}
if (!empty($date_to)) {
$exact_query .= " AND (
(mem.created_at IS NOT NULL AND DATE(mem.created_at) <= :date_to) OR
(souls.created_at IS NOT NULL AND DATE(souls.created_at) <= :date_to) OR
(trans.created_at IS NOT NULL AND DATE(trans.created_at) <= :date_to)
)";
$params[':date_to'] = $date_to;
}
$exact_query .= " ORDER BY a.name, d.name, ass.name";
$stmt = $db->prepare($exact_query);
foreach ($params as $key => $value) {
$stmt->bindValue($key, $value);
}
$stmt->execute();
$exact_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Calculate district and area totals for the exact report
if (!empty($exact_data)) {
$district_totals = [];
$area_totals = [];
$grand_totals = [
'assemblies' => 0,
'children_male' => 0, 'children_female' => 0, 'children_total' => 0,
'teens_male' => 0, 'teens_female' => 0, 'teens_total' => 0,
'young_adults_male' => 0, 'young_adults_female' => 0, 'young_adults_total' => 0,
'youth_total' => 0, 'other_adults_male' => 0, 'other_adults_female' => 0,
'other_adults_total' => 0, 'total_adult_members' => 0, 'overall_members' => 0,
'souls_won_total' => 0, 'baptized_water' => 0, 'baptized_spirit' => 0,
'transfers_in' => 0, 'transfers_out' => 0, 'net_transfers' => 0
];
foreach ($exact_data as $row) {
$district_key = $row['area_name'] . '|' . $row['district_name'];
$area_key = $row['area_name'];
// Initialize district totals if not exists
if (!isset($district_totals[$district_key])) {
$district_totals[$district_key] = array_merge($grand_totals, [
'area_name' => $row['area_name'],
'district_name' => $row['district_name']
]);
}
// Initialize area totals if not exists
if (!isset($area_totals[$area_key])) {
$area_totals[$area_key] = array_merge($grand_totals, [
'area_name' => $row['area_name']
]);
}
// Add to totals
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
$fields_to_sum = [
'children_male', 'children_female', 'children_total',
'teens_male', 'teens_female', 'teens_total',
'young_adults_male', 'young_adults_female', 'young_adults_total',
'youth_total', 'other_adults_male', 'other_adults_female',
'other_adults_total', 'total_adult_members', 'overall_members'
];
// Handle assemblies count separately
$district_totals[$district_key]['assemblies'] += 1;
$area_totals[$area_key]['assemblies'] += 1;
$grand_totals['assemblies'] += 1;
// Sum the numeric fields
foreach ($fields_to_sum as $field) {
$district_totals[$district_key][$field] += $row[$field];
$area_totals[$area_key][$field] += $row[$field];
$grand_totals[$field] += $row[$field];
}
// Special calculations
$district_totals[$district_key]['souls_won_total'] += $souls_won;
$district_totals[$district_key]['baptized_water'] += $row['baptized_in_water'];
$district_totals[$district_key]['baptized_spirit'] += $row['holy_spirit_baptism'];
$district_totals[$district_key]['transfers_in'] += $row['transfers_in_total'];
$district_totals[$district_key]['transfers_out'] += $row['transfers_out_total'];
$district_totals[$district_key]['net_transfers'] += $net_transfers;
$area_totals[$area_key]['souls_won_total'] += $souls_won;
$area_totals[$area_key]['baptized_water'] += $row['baptized_in_water'];
$area_totals[$area_key]['baptized_spirit'] += $row['holy_spirit_baptism'];
$area_totals[$area_key]['transfers_in'] += $row['transfers_in_total'];
$area_totals[$area_key]['transfers_out'] += $row['transfers_out_total'];
$area_totals[$area_key]['net_transfers'] += $net_transfers;
$grand_totals['souls_won_total'] += $souls_won;
$grand_totals['baptized_water'] += $row['baptized_in_water'];
$grand_totals['baptized_spirit'] += $row['holy_spirit_baptism'];
$grand_totals['transfers_in'] += $row['transfers_in_total'];
$grand_totals['transfers_out'] += $row['transfers_out_total'];
$grand_totals['net_transfers'] += $net_transfers;
}
$exact_stats = [
'data' => $exact_data,
'district_totals' => $district_totals,
'area_totals' => $area_totals,
'grand_totals' => $grand_totals,
'report_year' => $report_year
];
}
// Handle export formats for exact report
if ($output_format !== 'screen' && !empty($exact_data)) {
handleExactExport($exact_stats, $output_format);
exit();
}
if (empty($exact_data)) {
$error_message = 'No data found matching the selected criteria.';
} else {
$success_message = "Exact report generated successfully! Found data for {$grand_totals['assemblies']} assemblies.";
}
} catch (Exception $e) {
$error_message = 'Error generating exact report: ' . $e->getMessage();
}
}
// Handle AJAX requests for location dropdowns
if (isset($_GET['get_districts']) && isset($_GET['area_id'])) {
$area_id = (int)$_GET['area_id'];
$districts = getAccessibleDistricts($_SESSION['user_level'], $area_id, $_SESSION['district_id']);
header('Content-Type: application/json');
echo json_encode($districts);
exit();
}
if (isset($_GET['get_assemblies']) && isset($_GET['district_id'])) {
$district_id = (int)$_GET['district_id'];
$assemblies = getAccessibleAssemblies($_SESSION['user_level'], $_SESSION['area_id'], $district_id, $_SESSION['assembly_id']);
header('Content-Type: application/json');
echo json_encode($assemblies);
exit();
}
// Export handling function
function handleExport($data, $stats, $format, $category) {
$filename = $category . "_report_" . date('Y-m-d_H-i-s');
switch ($format) {
case 'csv':
exportCSV($data, $stats, $filename, $category);
break;
case 'excel':
exportExcel($data, $stats, $filename, $category);
break;
case 'pdf':
exportPDF($data, $stats, $filename, $category);
break;
}
}
function exportCSV($data, $stats, $filename, $category) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
$output = fopen('php://output', 'w');
// Write summary stats based on category
fputcsv($output, [strtoupper($category) . ' REPORT SUMMARY']);
fputcsv($output, ['Total Records', $stats['total_records']]);
if ($category == 'membership') {
fputcsv($output, ['Total Children', isset($stats['total_children']) ? $stats['total_children'] : 0]);
fputcsv($output, ['Total Youth', isset($stats['total_youth']) ? $stats['total_youth'] : 0]);
fputcsv($output, ['Total Other Adults', isset($stats['total_other_adults']) ? $stats['total_other_adults'] : 0]);
fputcsv($output, ['Total Overall Members', isset($stats['total_overall']) ? $stats['total_overall'] : 0]);
} elseif ($category == 'souls') {
fputcsv($output, ['Total Souls Won', isset($stats['total_souls_won']) ? $stats['total_souls_won'] : 0]);
fputcsv($output, ['Total Baptized in Water', isset($stats['total_baptized_water']) ? $stats['total_baptized_water'] : 0]);
fputcsv($output, ['Total Baptized in Spirit', isset($stats['total_baptized_spirit']) ? $stats['total_baptized_spirit'] : 0]);
} elseif ($category == 'transfers') {
fputcsv($output, ['Total Transfers In', isset($stats['total_transfers_in']) ? $stats['total_transfers_in'] : 0]);
fputcsv($output, ['Total Transfers Out', isset($stats['total_transfers_out']) ? $stats['total_transfers_out'] : 0]);
fputcsv($output, ['Net Transfers', isset($stats['net_transfers']) ? $stats['net_transfers'] : 0]);
}
fputcsv($output, ['Average per Assembly', isset($stats['avg_per_assembly']) ? $stats['avg_per_assembly'] : 0]);
fputcsv($output, []);
// Write headers based on category
if ($category == 'membership') {
fputcsv($output, [
'Area', 'District', 'Assembly', 'Children Male', 'Children Female', 'Children Total',
'Teens Male', 'Teens Female', 'Teens Total', 'Young Adults Male', 'Young Adults Female',
'Young Adults Total', 'Youth Total', 'Other Adults Male', 'Other Adults Female',
'Other Adults Total', 'Total Adult Members', 'Overall Members', 'Created By', 'Created Date'
]);
} elseif ($category == 'souls') {
fputcsv($output, [
'Area', 'District', 'Assembly', 'Outreach Program', 'Adult Souls Won (COP)', 'Other Souls Won',
'Gospel Sunday Morning', 'HUM', 'MPWDs', 'Chaplaincy', 'Chieftancy', 'SOM', 'Digital Space',
'Baptized in Water', 'Holy Spirit Baptism', 'Old Members Baptized', 'Created By', 'Created Date'
]);
} elseif ($category == 'transfers') {
fputcsv($output, [
'Area', 'District', 'Assembly', 'Transfers In 13-19', 'Transfers In 20-35', 'Transfers In Above 35',
'Transfers In Total', 'Transfers Out 13-19', 'Transfers Out 20-35', 'Transfers Out Above 35',
'Transfers Out Total', 'Net Transfers', 'Created By', 'Created Date'
]);
}
// Write data based on category
foreach ($data as $row) {
if ($category == 'membership') {
fputcsv($output, [
$row['area_name'], $row['district_name'], $row['assembly_name'],
$row['children_male'], $row['children_female'], $row['children_total'],
$row['teens_male'], $row['teens_female'], $row['teens_total'],
$row['young_adults_male'], $row['young_adults_female'], $row['young_adults_total'],
$row['youth_total'], $row['other_adults_male'], $row['other_adults_female'],
$row['other_adults_total'], $row['total_adult_members'], $row['overall_members'],
$row['first_name'] . ' ' . $row['last_name'], $row['created_at']
]);
} elseif ($category == 'souls') {
fputcsv($output, [
$row['area_name'], $row['district_name'], $row['assembly_name'],
$row['outreach_program'], $row['adult_souls_won_cop'], $row['other_souls_won'],
$row['gospel_sunday_morning'], $row['hum'], $row['mpwds'], $row['chaplaincy'],
$row['chieftancy'], $row['som'], $row['digital_space'], $row['baptized_in_water'],
$row['holy_spirit_baptism'], $row['old_members_now_baptized_holy_spirit'],
$row['first_name'] . ' ' . $row['last_name'], $row['created_at']
]);
} elseif ($category == 'transfers') {
fputcsv($output, [
$row['area_name'], $row['district_name'], $row['assembly_name'],
$row['transfers_in_13_19'], $row['transfers_in_20_35'], $row['transfers_in_above_35'],
$row['transfers_in_total'], $row['transfers_out_13_19'], $row['transfers_out_20_35'],
$row['transfers_out_above_35'], $row['transfers_out_total'],
($row['transfers_in_total'] - $row['transfers_out_total']),
$row['first_name'] . ' ' . $row['last_name'], $row['created_at']
]);
}
}
fclose($output);
}
function exportExcel($data, $stats, $filename, $category) {
// For now, export as CSV with .xls extension (can be enhanced with PHPSpreadsheet later)
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
exportCSV($data, $stats, $filename, $category);
}
function exportPDF($data, $stats, $filename, $category) {
// Basic HTML to PDF conversion (can be enhanced with libraries like TCPDF or mPDF)
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '.pdf"');
// For now, create a simple HTML version that browsers can print to PDF
echo '<html><head><title>Demography Report</title><style>
body { font-family: Arial, sans-serif; font-size: 12px; }
table { width: 100%; border-collapse: collapse; margin-top: 20px; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
.summary { background-color: #e8f4f8; padding: 15px; margin-bottom: 20px; }
</style></head><body>';
echo '<h1>Demography Report</h1>';
echo '<div class="summary">';
echo '<h3>Summary Statistics</h3>';
echo '<p>Total Records: ' . $stats['total_records'] . '</p>';
echo '<p>Total Children: ' . number_format($stats['total_children']) . '</p>';
echo '<p>Total Youth: ' . number_format($stats['total_youth']) . '</p>';
echo '<p>Total Other Adults: ' . number_format($stats['total_other_adults']) . '</p>';
echo '<p>Total Overall Members: ' . number_format($stats['total_overall']) . '</p>';
echo '<p>Average per Assembly: ' . $stats['avg_per_assembly'] . '</p>';
echo '</div>';
echo '<table>';
echo '<tr><th>Area</th><th>District</th><th>Assembly</th><th>Children</th><th>Youth</th><th>Other Adults</th><th>Total</th><th>Created</th></tr>';
foreach ($data as $row) {
echo '<tr>';
echo '<td>' . htmlspecialchars($row['area_name']) . '</td>';
echo '<td>' . htmlspecialchars($row['district_name']) . '</td>';
echo '<td>' . htmlspecialchars($row['assembly_name']) . '</td>';
echo '<td>' . number_format($row['children_total']) . '</td>';
echo '<td>' . number_format($row['youth_total']) . '</td>';
echo '<td>' . number_format($row['other_adults_total']) . '</td>';
echo '<td>' . number_format($row['overall_members']) . '</td>';
echo '<td>' . date('M j, Y', strtotime($row['created_at'])) . '</td>';
echo '</tr>';
}
echo '</table></body></html>';
}
// Summary export handling function
function handleSummaryExport($data, $stats, $format) {
$filename = "demography_summary_" . date('Y-m-d_H-i-s');
switch ($format) {
case 'csv':
exportSummaryCSV($data, $stats, $filename);
break;
case 'excel':
exportSummaryExcel($data, $stats, $filename);
break;
case 'pdf':
exportSummaryPDF($data, $stats, $filename);
break;
}
}
function exportSummaryCSV($data, $stats, $filename) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
$output = fopen('php://output', 'w');
// Write summary stats
fputcsv($output, ['DEMOGRAPHY 1 SUMMARY REPORT']);
fputcsv($output, ['Generated on', date('Y-m-d H:i:s')]);
fputcsv($output, []);
fputcsv($output, ['OVERALL STATISTICS']);
fputcsv($output, ['Total Assemblies', $stats['total_assemblies']]);
fputcsv($output, ['Total Members', $stats['total_members']]);
fputcsv($output, ['Total Children', $stats['total_children']]);
fputcsv($output, ['Total Youth', $stats['total_youth']]);
fputcsv($output, ['Total Other Adults', $stats['total_other_adults']]);
fputcsv($output, ['Total Souls Won', $stats['total_souls_won']]);
fputcsv($output, ['Total Baptized (Water)', $stats['total_baptized_water']]);
fputcsv($output, ['Total Baptized (Spirit)', $stats['total_baptized_spirit']]);
fputcsv($output, ['Total Transfers In', $stats['total_transfers_in']]);
fputcsv($output, ['Total Transfers Out', $stats['total_transfers_out']]);
fputcsv($output, ['Net Transfers', $stats['net_transfers']]);
fputcsv($output, ['Average Members per Assembly', $stats['avg_members_per_assembly']]);
fputcsv($output, ['Average Souls per Assembly', $stats['avg_souls_per_assembly']]);
fputcsv($output, []);
// Write headers
fputcsv($output, [
'Area', 'District', 'Assembly', 'Members', 'Children', 'Youth', 'Other Adults',
'Souls Won', 'Water Baptized', 'Spirit Baptized', 'Transfers In', 'Transfers Out', 'Net Transfers'
]);
// Write data
foreach ($data as $row) {
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
fputcsv($output, [
$row['area_name'], $row['district_name'], $row['assembly_name'],
$row['overall_members'], $row['children_total'], $row['youth_total'], $row['other_adults_total'],
$souls_won, $row['baptized_in_water'], $row['holy_spirit_baptism'],
$row['transfers_in_total'], $row['transfers_out_total'], $net_transfers
]);
}
fclose($output);
}
function exportSummaryExcel($data, $stats, $filename) {
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
exportSummaryCSV($data, $stats, $filename);
}
function exportSummaryPDF($data, $stats, $filename) {
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '.pdf"');
echo '<html><head><title>Demography 1 Summary Report</title><style>
body { font-family: Arial, sans-serif; font-size: 11px; }
table { width: 100%; border-collapse: collapse; margin-top: 15px; }
th, td { border: 1px solid #ddd; padding: 6px; text-align: left; font-size: 10px; }
th { background-color: #f2f2f2; font-weight: bold; }
.summary { background-color: #e8f4f8; padding: 15px; margin-bottom: 20px; }
.stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
</style></head><body>';
echo '<h1>Demography 1 Summary Report</h1>';
echo '<p>Generated on: ' . date('Y-m-d H:i:s') . '</p>';
echo '<div class="summary">';
echo '<h3>Overall Statistics</h3>';
echo '<div class="stats-grid">';
echo '<div>';
echo '<p><strong>Total Assemblies:</strong> ' . number_format($stats['total_assemblies']) . '</p>';
echo '<p><strong>Total Members:</strong> ' . number_format($stats['total_members']) . '</p>';
echo '<p><strong>Total Children:</strong> ' . number_format($stats['total_children']) . '</p>';
echo '<p><strong>Total Youth:</strong> ' . number_format($stats['total_youth']) . '</p>';
echo '<p><strong>Total Other Adults:</strong> ' . number_format($stats['total_other_adults']) . '</p>';
echo '<p><strong>Average Members/Assembly:</strong> ' . $stats['avg_members_per_assembly'] . '</p>';
echo '</div>';
echo '<div>';
echo '<p><strong>Total Souls Won:</strong> ' . number_format($stats['total_souls_won']) . '</p>';
echo '<p><strong>Water Baptized:</strong> ' . number_format($stats['total_baptized_water']) . '</p>';
echo '<p><strong>Spirit Baptized:</strong> ' . number_format($stats['total_baptized_spirit']) . '</p>';
echo '<p><strong>Transfers In:</strong> ' . number_format($stats['total_transfers_in']) . '</p>';
echo '<p><strong>Transfers Out:</strong> ' . number_format($stats['total_transfers_out']) . '</p>';
echo '<p><strong>Net Transfers:</strong> ' . number_format($stats['net_transfers']) . '</p>';
echo '</div>';
echo '</div>';
echo '</div>';
echo '<table>';
echo '<tr><th>Location</th><th>Members</th><th>Children</th><th>Youth</th><th>Adults</th><th>Souls</th><th>Baptized</th><th>Transfers</th></tr>';
foreach ($data as $row) {
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
echo '<tr>';
echo '<td>' . htmlspecialchars($row['area_name'] . ' > ' . $row['district_name'] . ' > ' . $row['assembly_name']) . '</td>';
echo '<td>' . number_format($row['overall_members']) . '</td>';
echo '<td>' . number_format($row['children_total']) . '</td>';
echo '<td>' . number_format($row['youth_total']) . '</td>';
echo '<td>' . number_format($row['other_adults_total']) . '</td>';
echo '<td>' . number_format($souls_won) . '</td>';
echo '<td>' . number_format($row['baptized_in_water'] + $row['holy_spirit_baptism']) . '</td>';
echo '<td>' . number_format($net_transfers) . '</td>';
echo '</tr>';
}
echo '</table></body></html>';
}
// Exact report export handling function
function handleExactExport($stats, $format) {
$filename = "end_of_year_statistical_report_" . $stats['report_year'] . "_" . date('Y-m-d_H-i-s');
switch ($format) {
case 'csv':
exportExactCSV($stats, $filename);
break;
case 'excel':
exportExactExcel($stats, $filename);
break;
case 'pdf':
exportExactPDF($stats, $filename);
break;
}
}
function exportExactCSV($stats, $filename) {
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="' . $filename . '.csv"');
$output = fopen('php://output', 'w');
// Write header information
fputcsv($output, ['THE CHURCH OF PENTECOST - MADINA AREA']);
fputcsv($output, ['END-OF-YEAR STATISTICAL REPORT ' . $stats['report_year']]);
fputcsv($output, ['Generated on: ' . date('Y-m-d H:i:s')]);
fputcsv($output, []);
// Write detailed headers
fputcsv($output, [
'Area', 'District', 'Assembly',
'Children M', 'Children F', 'Children Total',
'Teens M', 'Teens F', 'Teens Total',
'Young Adults M', 'Young Adults F', 'Young Adults Total',
'Youth Total', 'Other Adults M', 'Other Adults F', 'Other Adults Total',
'Total Adult Members', 'Overall Members',
'Outreach Program', 'Adult Souls Won (COP)', 'Other Souls Won',
'Gospel Sunday Morning', 'HUM', 'MPWDs', 'Chaplaincy', 'Chieftancy', 'SOM', 'Digital Space',
'Baptized Water', 'Baptized Spirit', 'Old Members Baptized Spirit',
'Transfers In 13-19', 'Transfers In 20-35', 'Transfers In Above 35', 'Transfers In Total',
'Transfers Out 13-19', 'Transfers Out 20-35', 'Transfers Out Above 35', 'Transfers Out Total',
'Net Transfers'
]);
// Write assembly data
foreach ($stats['data'] as $row) {
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
fputcsv($output, [
$row['area_name'], $row['district_name'], $row['assembly_name'],
$row['children_male'], $row['children_female'], $row['children_total'],
$row['teens_male'], $row['teens_female'], $row['teens_total'],
$row['young_adults_male'], $row['young_adults_female'], $row['young_adults_total'],
$row['youth_total'], $row['other_adults_male'], $row['other_adults_female'], $row['other_adults_total'],
$row['total_adult_members'], $row['overall_members'],
$row['outreach_program'], $row['adult_souls_won_cop'], $row['other_souls_won'],
$row['gospel_sunday_morning'], $row['hum'], $row['mpwds'], $row['chaplaincy'],
$row['chieftancy'], $row['som'], $row['digital_space'],
$row['baptized_in_water'], $row['holy_spirit_baptism'], $row['old_members_baptized'],
$row['transfers_in_13_19'], $row['transfers_in_20_35'], $row['transfers_in_above_35'], $row['transfers_in_total'],
$row['transfers_out_13_19'], $row['transfers_out_20_35'], $row['transfers_out_above_35'], $row['transfers_out_total'],
$net_transfers
]);
}
fclose($output);
}
function exportExactExcel($stats, $filename) {
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="' . $filename . '.xls"');
exportExactCSV($stats, $filename);
}
function exportExactPDF($stats, $filename) {
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename="' . $filename . '.pdf"');
echo '<html><head><title>End-of-Year Statistical Report ' . $stats['report_year'] . '</title><style>
body { font-family: Arial, sans-serif; font-size: 10px; margin: 20px; }
.header { text-align: center; margin-bottom: 30px; }
.header h1 { font-size: 16px; margin: 5px 0; }
.header h2 { font-size: 14px; margin: 5px 0; }
table { width: 100%; border-collapse: collapse; margin-bottom: 20px; font-size: 8px; }
th, td { border: 1px solid #000; padding: 3px; text-align: center; }
th { background-color: #f0f0f0; font-weight: bold; }
.summary-table { width: 50%; margin: 0 auto 30px auto; }
.summary-table th, .summary-table td { text-align: left; padding: 5px; }
</style></head><body>';
echo '<div class="header">';
echo '<h1>THE CHURCH OF PENTECOST - MADINA AREA</h1>';
echo '<h2>END-OF-YEAR STATISTICAL REPORT ' . $stats['report_year'] . '</h2>';
echo '<p>Generated on: ' . date('Y-m-d H:i:s') . '</p>';
echo '</div>';
// Main data table (simplified for PDF)
echo '<table>';
echo '<tr>';
echo '<th rowspan="2">Location</th>';
echo '<th colspan="3">Children</th>';
echo '<th colspan="3">Youth</th>';
echo '<th colspan="3">Adults</th>';
echo '<th rowspan="2">Total Members</th>';
echo '<th rowspan="2">Souls Won</th>';
echo '<th rowspan="2">Baptized</th>';
echo '<th rowspan="2">Net Transfers</th>';
echo '</tr>';
echo '<tr>';
echo '<th>M</th><th>F</th><th>Total</th>';
echo '<th>Teens</th><th>YA</th><th>Total</th>';
echo '<th>M</th><th>F</th><th>Total</th>';
echo '</tr>';
foreach ($stats['data'] as $row) {
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$baptized_total = $row['baptized_in_water'] + $row['holy_spirit_baptism'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
echo '<tr>';
echo '<td style="text-align:left;">' . htmlspecialchars($row['area_name'] . ' > ' . $row['district_name'] . ' > ' . $row['assembly_name']) . '</td>';
echo '<td>' . number_format($row['children_male']) . '</td>';
echo '<td>' . number_format($row['children_female']) . '</td>';
echo '<td>' . number_format($row['children_total']) . '</td>';
echo '<td>' . number_format($row['teens_total']) . '</td>';
echo '<td>' . number_format($row['young_adults_total']) . '</td>';
echo '<td>' . number_format($row['youth_total']) . '</td>';
echo '<td>' . number_format($row['other_adults_male']) . '</td>';
echo '<td>' . number_format($row['other_adults_female']) . '</td>';
echo '<td>' . number_format($row['other_adults_total']) . '</td>';
echo '<td><strong>' . number_format($row['overall_members']) . '</strong></td>';
echo '<td>' . number_format($souls_won) . '</td>';
echo '<td>' . number_format($baptized_total) . '</td>';
echo '<td>' . number_format($net_transfers) . '</td>';
echo '</tr>';
}
echo '</table>';
echo '</body></html>';
}
include __DIR__ . '/../includes/header.php';
?>
<!-- Tab Navigation -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 mb-6">
<div class="border-b border-gray-200">
<nav class="flex space-x-8 px-6" aria-label="Tabs">
<a href="?tab=reports" class="border-b-2 <?php echo $current_tab == 'reports' ? 'border-cop-blue text-cop-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'; ?> py-4 px-1 text-sm font-medium">
<i class="fas fa-chart-bar mr-2"></i>Individual Reports
</a>
<a href="?tab=summary" class="border-b-2 <?php echo $current_tab == 'summary' ? 'border-cop-blue text-cop-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'; ?> py-4 px-1 text-sm font-medium">
<i class="fas fa-chart-pie mr-2"></i>Demography 1 Summary
</a>
<a href="?tab=exact" class="border-b-2 <?php echo $current_tab == 'exact' ? 'border-cop-blue text-cop-blue' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300'; ?> py-4 px-1 text-sm font-medium">
<i class="fas fa-file-excel mr-2"></i>Exact Report
</a>
</nav>
</div>
</div>
<div class="space-y-6">
<?php if ($current_tab == 'reports'): ?>
<!-- Individual Reports Tab -->
<!-- Report Categories Overview -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200 p-6">
<h3 class="text-lg font-semibold text-gray-800 mb-4">Available Report Categories</h3>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<div class="bg-blue-50 p-4 rounded-lg border border-blue-200">
<div class="flex items-center">
<i class="fas fa-users text-blue-600 text-2xl mr-3"></i>
<div>
<h4 class="font-semibold text-gray-800">Membership</h4>
<p class="text-sm text-gray-600">Age-based membership statistics</p>
<span class="inline-block mt-2 px-2 py-1 bg-green-100 text-green-800 text-xs rounded-full">Active</span>
</div>
</div>
</div>
<div class="bg-green-50 p-4 rounded-lg border border-green-200">
<div class="flex items-center">
<i class="fas fa-heart text-green-600 text-2xl mr-3"></i>
<div>
<h4 class="font-semibold text-gray-800">Souls</h4>
<p class="text-sm text-gray-600">Souls won and conversion data</p>
<span class="inline-block mt-2 px-2 py-1 bg-green-100 text-green-800 text-xs rounded-full">Active</span>
</div>
</div>
</div>
<div class="bg-purple-50 p-4 rounded-lg border border-purple-200">
<div class="flex items-center">
<i class="fas fa-exchange-alt text-purple-600 text-2xl mr-3"></i>
<div>
<h4 class="font-semibold text-gray-800">Transfers</h4>
<p class="text-sm text-gray-600">Member transfer statistics</p>
<span class="inline-block mt-2 px-2 py-1 bg-green-100 text-green-800 text-xs rounded-full">Active</span>
</div>
</div>
</div>
</div>
</div>
<!-- Report Builder Interface -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">Report Builder</h3>
<p class="text-sm text-gray-600">Configure and generate custom demographic reports</p>
</div>
<div class="p-6">
<?php if ($success_message): ?>
<div class="mb-6 bg-green-50 border border-green-200 text-green-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-check-circle mr-2"></i>
<?php echo htmlspecialchars($success_message); ?>
</div>
</div>
<?php endif; ?>
<?php if ($error_message): ?>
<div class="mb-6 bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-exclamation-circle mr-2"></i>
<?php echo htmlspecialchars($error_message); ?>
</div>
</div>
<?php endif; ?>
<form method="POST" id="reportForm" class="space-y-6">
<!-- Report Configuration -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- Left Column -->
<div class="space-y-6">
<!-- Report Category -->
<div>
<label for="report_category" class="block text-sm font-medium text-gray-700 mb-2">Report Category *</label>
<select name="report_category" id="report_category" required
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="membership">Membership - Age-based Statistics</option>
<option value="souls">Souls - Souls Won and Conversions</option>
<option value="transfers">Transfers - Member Transfer Data</option>
</select>
</div>
<!-- Date Range -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Date Range</label>
<div class="grid grid-cols-2 gap-4">
<div>
<label for="date_from" class="block text-xs text-gray-500 mb-1">From</label>
<input type="date" name="date_from" id="date_from"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
<div>
<label for="date_to" class="block text-xs text-gray-500 mb-1">To</label>
<input type="date" name="date_to" id="date_to"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
</div>
</div>
<!-- Output Format -->
<div>
<label for="output_format" class="block text-sm font-medium text-gray-700 mb-2">Output Format *</label>
<select name="output_format" id="output_format" required
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="screen">View on Screen</option>
<option value="pdf">PDF Download</option>
<option value="excel">Excel Download</option>
<option value="csv">CSV Download</option>
</select>
</div>
</div>
<!-- Right Column -->
<div class="space-y-6">
<!-- Location Filters -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Location Filters</label>
<div class="space-y-4">
<div>
<label for="area_filter" class="block text-xs text-gray-500 mb-1">Area</label>
<select name="area_filter" id="area_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Areas</option>
<?php foreach ($areas as $area): ?>
<option value="<?php echo $area['id']; ?>"><?php echo htmlspecialchars($area['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div>
<label for="district_filter" class="block text-xs text-gray-500 mb-1">District</label>
<select name="district_filter" id="district_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Districts</option>
</select>
</div>
<div>
<label for="assembly_filter" class="block text-xs text-gray-500 mb-1">Assembly</label>
<select name="assembly_filter" id="assembly_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Assemblies</option>
</select>
</div>
</div>
</div>
</div>
</div>
<!-- Generate Button -->
<div class="flex justify-end">
<button type="submit" name="generate_report"
class="px-8 py-3 bg-cop-blue text-white rounded-lg hover:bg-cop-dark-blue transition duration-200">
<i class="fas fa-chart-line mr-2"></i>Generate Report
</button>
</div>
</form>
</div>
</div>
<!-- Report Results -->
<?php if (!empty($report_data)): ?>
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">Report Results</h3>
</div>
<div class="p-6">
<!-- Summary Statistics -->
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4 mb-6">
<div class="bg-blue-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-blue-600"><?php echo number_format($summary_stats['total_records']); ?></div>
<div class="text-sm text-gray-600">Records</div>
</div>
<?php if ($report_category == 'membership'): ?>
<div class="bg-green-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($summary_stats['total_children']); ?></div>
<div class="text-sm text-gray-600">Children</div>
</div>
<div class="bg-yellow-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-yellow-600"><?php echo number_format($summary_stats['total_youth']); ?></div>
<div class="text-sm text-gray-600">Youth</div>
</div>
<div class="bg-purple-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-purple-600"><?php echo number_format($summary_stats['total_other_adults']); ?></div>
<div class="text-sm text-gray-600">Other Adults</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-gray-600"><?php echo number_format($summary_stats['total_overall']); ?></div>
<div class="text-sm text-gray-600">Total Members</div>
</div>
<?php elseif ($report_category == 'souls'): ?>
<div class="bg-green-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($summary_stats['total_souls_won']); ?></div>
<div class="text-sm text-gray-600">Souls Won</div>
</div>
<div class="bg-blue-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-blue-600"><?php echo number_format($summary_stats['total_baptized_water']); ?></div>
<div class="text-sm text-gray-600">Water Baptized</div>
</div>
<div class="bg-purple-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-purple-600"><?php echo number_format($summary_stats['total_baptized_spirit']); ?></div>
<div class="text-sm text-gray-600">Spirit Baptized</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-gray-600">-</div>
<div class="text-sm text-gray-600">-</div>
</div>
<?php elseif ($report_category == 'transfers'): ?>
<div class="bg-green-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($summary_stats['total_transfers_in']); ?></div>
<div class="text-sm text-gray-600">Transfers In</div>
</div>
<div class="bg-red-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-red-600"><?php echo number_format($summary_stats['total_transfers_out']); ?></div>
<div class="text-sm text-gray-600">Transfers Out</div>
</div>
<div class="bg-<?php echo $summary_stats['net_transfers'] >= 0 ? 'green' : 'red'; ?>-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-<?php echo $summary_stats['net_transfers'] >= 0 ? 'green' : 'red'; ?>-600"><?php echo number_format($summary_stats['net_transfers']); ?></div>
<div class="text-sm text-gray-600">Net Transfers</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-gray-600">-</div>
<div class="text-sm text-gray-600">-</div>
</div>
<?php endif; ?>
<div class="bg-indigo-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-indigo-600"><?php echo $summary_stats['avg_per_assembly']; ?></div>
<div class="text-sm text-gray-600">Avg/Assembly</div>
</div>
</div>
<!-- Data Table -->
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Location</th>
<?php if ($report_category == 'membership'): ?>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Children</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Youth</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Other Adults</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Total</th>
<?php elseif ($report_category == 'souls'): ?>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Souls Won</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Water Baptized</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Spirit Baptized</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Digital/SOM</th>
<?php elseif ($report_category == 'transfers'): ?>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Transfers In</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Transfers Out</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Net Transfer</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Age Groups</th>
<?php endif; ?>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Created</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<?php foreach ($report_data as $row): ?>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900"><?php echo htmlspecialchars($row['assembly_name']); ?></div>
<div class="text-sm text-gray-500"><?php echo htmlspecialchars($row['district_name'] . ', ' . $row['area_name']); ?></div>
</td>
<?php if ($report_category == 'membership'): ?>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['children_total']); ?>
<div class="text-xs text-gray-500">M: <?php echo $row['children_male']; ?> | F: <?php echo $row['children_female']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['youth_total']); ?>
<div class="text-xs text-gray-500">T: <?php echo $row['teens_total']; ?> | YA: <?php echo $row['young_adults_total']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['other_adults_total']); ?>
<div class="text-xs text-gray-500">M: <?php echo $row['other_adults_male']; ?> | F: <?php echo $row['other_adults_female']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
<?php echo number_format($row['overall_members']); ?>
</td>
<?php elseif ($report_category == 'souls'): ?>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won']); ?>
<div class="text-xs text-gray-500">Out: <?php echo $row['outreach_program']; ?> | COP: <?php echo $row['adult_souls_won_cop']; ?> | Other: <?php echo $row['other_souls_won']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['baptized_in_water']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['holy_spirit_baptism']); ?>
<div class="text-xs text-gray-500">Old: <?php echo $row['old_members_now_baptized_holy_spirit']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['digital_space'] + $row['som']); ?>
<div class="text-xs text-gray-500">Digital: <?php echo $row['digital_space']; ?> | SOM: <?php echo $row['som']; ?></div>
</td>
<?php elseif ($report_category == 'transfers'): ?>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['transfers_in_total']); ?>
<div class="text-xs text-gray-500">13-19: <?php echo $row['transfers_in_13_19']; ?> | 20-35: <?php echo $row['transfers_in_20_35']; ?> | 35+: <?php echo $row['transfers_in_above_35']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['transfers_out_total']); ?>
<div class="text-xs text-gray-500">13-19: <?php echo $row['transfers_out_13_19']; ?> | 20-35: <?php echo $row['transfers_out_20_35']; ?> | 35+: <?php echo $row['transfers_out_above_35']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium <?php echo ($row['transfers_in_total'] - $row['transfers_out_total']) >= 0 ? 'text-green-600' : 'text-red-600'; ?>">
<?php echo number_format($row['transfers_in_total'] - $row['transfers_out_total']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<div class="text-xs text-gray-500">
In: 13-19(<?php echo $row['transfers_in_13_19']; ?>) 20-35(<?php echo $row['transfers_in_20_35']; ?>) 35+(<?php echo $row['transfers_in_above_35']; ?>)<br>
Out: 13-19(<?php echo $row['transfers_out_13_19']; ?>) 20-35(<?php echo $row['transfers_out_20_35']; ?>) 35+(<?php echo $row['transfers_out_above_35']; ?>)
</div>
</td>
<?php endif; ?>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<?php echo formatDateTime($row['created_at']); ?>
<div class="text-xs">by <?php echo htmlspecialchars($row['first_name'] . ' ' . $row['last_name']); ?></div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php endif; ?>
<?php elseif ($current_tab == 'summary'): ?>
<!-- Summary Tab -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">Demography 1 Summary Report</h3>
<p class="text-sm text-gray-600">Comprehensive overview of all demographic data (Membership, Souls, Transfers)</p>
</div>
<div class="p-6">
<?php if ($success_message): ?>
<div class="mb-6 bg-green-50 border border-green-200 text-green-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-check-circle mr-2"></i>
<?php echo htmlspecialchars($success_message); ?>
</div>
</div>
<?php endif; ?>
<?php if ($error_message): ?>
<div class="mb-6 bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-exclamation-circle mr-2"></i>
<?php echo htmlspecialchars($error_message); ?>
</div>
</div>
<?php endif; ?>
<form method="POST" id="summaryForm" class="space-y-6">
<!-- Summary Configuration -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- Left Column -->
<div class="space-y-6">
<!-- Date Range -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Date Range</label>
<div class="grid grid-cols-2 gap-4">
<div>
<label for="summary_date_from" class="block text-xs text-gray-500 mb-1">From</label>
<input type="date" name="summary_date_from" id="summary_date_from"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
<div>
<label for="summary_date_to" class="block text-xs text-gray-500 mb-1">To</label>
<input type="date" name="summary_date_to" id="summary_date_to"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
</div>
</div>
<!-- Output Format -->
<div>
<label for="summary_output_format" class="block text-sm font-medium text-gray-700 mb-2">Output Format *</label>
<select name="summary_output_format" id="summary_output_format" required
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="screen">View on Screen</option>
<option value="pdf">PDF Download</option>
<option value="excel">Excel Download</option>
<option value="csv">CSV Download</option>
</select>
</div>
</div>
<!-- Right Column -->
<div class="space-y-6">
<!-- Location Filters -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Location Filters (Based on Access Level)</label>
<div class="space-y-4">
<div>
<label for="summary_area_filter" class="block text-xs text-gray-500 mb-1">Area</label>
<select name="summary_area_filter" id="summary_area_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Areas</option>
<?php foreach ($areas as $area): ?>
<option value="<?php echo $area['id']; ?>"><?php echo htmlspecialchars($area['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div>
<label for="summary_district_filter" class="block text-xs text-gray-500 mb-1">District</label>
<select name="summary_district_filter" id="summary_district_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Districts</option>
</select>
</div>
<div>
<label for="summary_assembly_filter" class="block text-xs text-gray-500 mb-1">Assembly</label>
<select name="summary_assembly_filter" id="summary_assembly_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Assemblies</option>
</select>
</div>
</div>
</div>
</div>
</div>
<!-- Generate Button -->
<div class="flex justify-end">
<button type="submit" name="generate_summary"
class="px-8 py-3 bg-cop-blue text-white rounded-lg hover:bg-cop-dark-blue transition duration-200">
<i class="fas fa-chart-pie mr-2"></i>Generate Summary Report
</button>
</div>
</form>
</div>
</div>
<!-- Summary Results -->
<?php if (!empty($summary_data) && $current_tab == 'summary'): ?>
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">Summary Report Results</h3>
<p class="text-sm text-gray-600">Comprehensive demographic overview from all data sources</p>
</div>
<div class="p-6">
<!-- Overall Statistics -->
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4 mb-8">
<div class="bg-blue-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-blue-600"><?php echo number_format($summary_stats['total_assemblies']); ?></div>
<div class="text-sm text-gray-600">Assemblies</div>
</div>
<div class="bg-green-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($summary_stats['total_members']); ?></div>
<div class="text-sm text-gray-600">Total Members</div>
</div>
<div class="bg-yellow-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-yellow-600"><?php echo number_format($summary_stats['total_children']); ?></div>
<div class="text-sm text-gray-600">Children</div>
</div>
<div class="bg-purple-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-purple-600"><?php echo number_format($summary_stats['total_youth']); ?></div>
<div class="text-sm text-gray-600">Youth</div>
</div>
<div class="bg-indigo-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-indigo-600"><?php echo number_format($summary_stats['total_other_adults']); ?></div>
<div class="text-sm text-gray-600">Other Adults</div>
</div>
<div class="bg-gray-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-gray-600"><?php echo $summary_stats['avg_members_per_assembly']; ?></div>
<div class="text-sm text-gray-600">Avg/Assembly</div>
</div>
</div>
<!-- Souls & Transfers Statistics -->
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-7 gap-4 mb-8">
<div class="bg-red-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-red-600"><?php echo number_format($summary_stats['total_souls_won']); ?></div>
<div class="text-sm text-gray-600">Souls Won</div>
</div>
<div class="bg-blue-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-blue-600"><?php echo number_format($summary_stats['total_baptized_water']); ?></div>
<div class="text-sm text-gray-600">Water Baptized</div>
</div>
<div class="bg-purple-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-purple-600"><?php echo number_format($summary_stats['total_baptized_spirit']); ?></div>
<div class="text-sm text-gray-600">Spirit Baptized</div>
</div>
<div class="bg-green-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($summary_stats['total_transfers_in']); ?></div>
<div class="text-sm text-gray-600">Transfers In</div>
</div>
<div class="bg-red-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-red-600"><?php echo number_format($summary_stats['total_transfers_out']); ?></div>
<div class="text-sm text-gray-600">Transfers Out</div>
</div>
<div class="bg-<?php echo $summary_stats['net_transfers'] >= 0 ? 'green' : 'red'; ?>-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-<?php echo $summary_stats['net_transfers'] >= 0 ? 'green' : 'red'; ?>-600"><?php echo number_format($summary_stats['net_transfers']); ?></div>
<div class="text-sm text-gray-600">Net Transfers</div>
</div>
<div class="bg-orange-50 p-4 rounded-lg text-center">
<div class="text-2xl font-bold text-orange-600"><?php echo $summary_stats['avg_souls_per_assembly']; ?></div>
<div class="text-sm text-gray-600">Avg Souls/Assembly</div>
</div>
</div>
<!-- Detailed Data Table -->
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Location</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Members</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Children</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Youth</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Adults</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Souls Won</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Baptized</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Net Transfers</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Data Dates</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<?php foreach ($summary_data as $row): ?>
<?php
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$total_baptized = $row['baptized_in_water'] + $row['holy_spirit_baptism'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
?>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900"><?php echo htmlspecialchars($row['assembly_name']); ?></div>
<div class="text-sm text-gray-500"><?php echo htmlspecialchars($row['district_name'] . ', ' . $row['area_name']); ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
<?php echo number_format($row['overall_members']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['children_total']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['youth_total']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['other_adults_total']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($souls_won); ?>
<div class="text-xs text-gray-500">Out: <?php echo $row['outreach_program']; ?> | COP: <?php echo $row['adult_souls_won_cop']; ?> | Other: <?php echo $row['other_souls_won']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($total_baptized); ?>
<div class="text-xs text-gray-500">Water: <?php echo $row['baptized_in_water']; ?> | Spirit: <?php echo $row['holy_spirit_baptism']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium <?php echo $net_transfers >= 0 ? 'text-green-600' : 'text-red-600'; ?>">
<?php echo number_format($net_transfers); ?>
<div class="text-xs text-gray-500">In: <?php echo $row['transfers_in_total']; ?> | Out: <?php echo $row['transfers_out_total']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
<div class="text-xs">
<?php if ($row['membership_date']): ?>
<div>Mem: <?php echo date('M j', strtotime($row['membership_date'])); ?></div>
<?php endif; ?>
<?php if ($row['souls_date']): ?>
<div>Souls: <?php echo date('M j', strtotime($row['souls_date'])); ?></div>
<?php endif; ?>
<?php if ($row['transfers_date']): ?>
<div>Trans: <?php echo date('M j', strtotime($row['transfers_date'])); ?></div>
<?php endif; ?>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php endif; ?>
<?php elseif ($current_tab == 'exact'): ?>
<!-- Exact Report Tab -->
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">End-of-Year Statistical Report</h3>
<p class="text-sm text-gray-600">Generate comprehensive statistical report in the exact format required for official submissions</p>
</div>
<div class="p-6">
<?php if ($success_message): ?>
<div class="mb-6 bg-green-50 border border-green-200 text-green-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-check-circle mr-2"></i>
<?php echo htmlspecialchars($success_message); ?>
</div>
</div>
<?php endif; ?>
<?php if ($error_message): ?>
<div class="mb-6 bg-red-50 border border-red-200 text-red-700 px-4 py-3 rounded-lg">
<div class="flex items-center">
<i class="fas fa-exclamation-circle mr-2"></i>
<?php echo htmlspecialchars($error_message); ?>
</div>
</div>
<?php endif; ?>
<form method="POST" id="exactForm" class="space-y-6">
<!-- Exact Report Configuration -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
<!-- Left Column -->
<div class="space-y-6">
<!-- Report Year -->
<div>
<label for="report_year" class="block text-sm font-medium text-gray-700 mb-2">Report Year *</label>
<select name="report_year" id="report_year" required
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<?php
$currentYear = date('Y');
for ($year = $currentYear; $year >= $currentYear - 5; $year--): ?>
<option value="<?php echo $year; ?>" <?php echo $year == $currentYear ? 'selected' : ''; ?>><?php echo $year; ?></option>
<?php endfor; ?>
</select>
</div>
<!-- Date Range -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Date Range</label>
<div class="grid grid-cols-2 gap-4">
<div>
<label for="exact_date_from" class="block text-xs text-gray-500 mb-1">From</label>
<input type="date" name="exact_date_from" id="exact_date_from"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
<div>
<label for="exact_date_to" class="block text-xs text-gray-500 mb-1">To</label>
<input type="date" name="exact_date_to" id="exact_date_to"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
</div>
</div>
</div>
<!-- Output Format -->
<div>
<label for="exact_output_format" class="block text-sm font-medium text-gray-700 mb-2">Output Format *</label>
<select name="exact_output_format" id="exact_output_format" required
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="screen">View on Screen</option>
<option value="excel">Excel Download (.xls)</option>
<option value="csv">CSV Download</option>
<option value="pdf">PDF Download</option>
</select>
</div>
</div>
<!-- Right Column -->
<div class="space-y-6">
<!-- Location Filters -->
<div>
<label class="block text-sm font-medium text-gray-700 mb-2">Location Filters (Based on Access Level)</label>
<div class="space-y-4">
<div>
<label for="exact_area_filter" class="block text-xs text-gray-500 mb-1">Area</label>
<select name="exact_area_filter" id="exact_area_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Areas</option>
<?php foreach ($areas as $area): ?>
<option value="<?php echo $area['id']; ?>"><?php echo htmlspecialchars($area['name']); ?></option>
<?php endforeach; ?>
</select>
</div>
<div>
<label for="exact_district_filter" class="block text-xs text-gray-500 mb-1">District</label>
<select name="exact_district_filter" id="exact_district_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Districts</option>
</select>
</div>
<div>
<label for="exact_assembly_filter" class="block text-xs text-gray-500 mb-1">Assembly</label>
<select name="exact_assembly_filter" id="exact_assembly_filter"
class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-cop-blue focus:border-transparent">
<option value="">All Assemblies</option>
</select>
</div>
</div>
</div>
<!-- Report Features -->
<div class="bg-blue-50 p-4 rounded-lg">
<h4 class="font-semibold text-blue-800 mb-2">Report Features</h4>
<ul class="text-sm text-blue-700 space-y-1">
<li>• Complete demographic breakdown by age groups</li>
<li>• Detailed souls won statistics</li>
<li>• Baptism and conversion data</li>
<li>• Transfer statistics with age categories</li>
<li>• District and area totals</li>
<li>• Grand totals summary</li>
<li>• Official format for submissions</li>
</ul>
</div>
</div>
</div>
<!-- Generate Button -->
<div class="flex justify-end">
<button type="submit" name="generate_exact"
class="px-8 py-3 bg-cop-blue text-white rounded-lg hover:bg-cop-dark-blue transition duration-200">
<i class="fas fa-file-excel mr-2"></i>Generate Exact Report
</button>
</div>
</form>
</div>
</div>
<!-- Exact Report Results -->
<?php if (!empty($exact_stats) && $current_tab == 'exact'): ?>
<div class="bg-white rounded-lg shadow-sm border border-gray-200">
<div class="border-b border-gray-200 px-6 py-4">
<h3 class="text-lg font-semibold text-gray-800">End-of-Year Statistical Report <?php echo $exact_stats['report_year']; ?></h3>
<p class="text-sm text-gray-600">Official format statistical report with comprehensive data breakdown</p>
</div>
<div class="p-6">
<!-- Grand Totals Summary -->
<div class="bg-gray-50 p-6 rounded-lg mb-8">
<h4 class="text-lg font-semibold text-gray-800 mb-4">Grand Totals Summary</h4>
<div class="grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4">
<div class="text-center">
<div class="text-2xl font-bold text-blue-600"><?php echo number_format($exact_stats['grand_totals']['assemblies']); ?></div>
<div class="text-sm text-gray-600">Assemblies</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-green-600"><?php echo number_format($exact_stats['grand_totals']['overall_members']); ?></div>
<div class="text-sm text-gray-600">Total Members</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-yellow-600"><?php echo number_format($exact_stats['grand_totals']['children_total']); ?></div>
<div class="text-sm text-gray-600">Children</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-purple-600"><?php echo number_format($exact_stats['grand_totals']['youth_total']); ?></div>
<div class="text-sm text-gray-600">Youth</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-indigo-600"><?php echo number_format($exact_stats['grand_totals']['other_adults_total']); ?></div>
<div class="text-sm text-gray-600">Other Adults</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-red-600"><?php echo number_format($exact_stats['grand_totals']['souls_won_total']); ?></div>
<div class="text-sm text-gray-600">Souls Won</div>
</div>
</div>
</div>
<!-- Detailed Data Table (Simplified for Screen View) -->
<div class="overflow-x-auto">
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Location</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Children</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Youth</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Adults</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Total Members</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Souls Won</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Baptized</th>
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Net Transfers</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">
<?php foreach ($exact_stats['data'] as $row): ?>
<?php
$souls_won = $row['outreach_program'] + $row['adult_souls_won_cop'] + $row['other_souls_won'];
$total_baptized = $row['baptized_in_water'] + $row['holy_spirit_baptism'];
$net_transfers = $row['transfers_in_total'] - $row['transfers_out_total'];
?>
<tr class="hover:bg-gray-50">
<td class="px-6 py-4 whitespace-nowrap">
<div class="text-sm font-medium text-gray-900"><?php echo htmlspecialchars($row['assembly_name']); ?></div>
<div class="text-sm text-gray-500"><?php echo htmlspecialchars($row['district_name'] . ', ' . $row['area_name']); ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['children_total']); ?>
<div class="text-xs text-gray-500">M: <?php echo $row['children_male']; ?> | F: <?php echo $row['children_female']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['youth_total']); ?>
<div class="text-xs text-gray-500">T: <?php echo $row['teens_total']; ?> | YA: <?php echo $row['young_adults_total']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($row['other_adults_total']); ?>
<div class="text-xs text-gray-500">M: <?php echo $row['other_adults_male']; ?> | F: <?php echo $row['other_adults_female']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">
<?php echo number_format($row['overall_members']); ?>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($souls_won); ?>
<div class="text-xs text-gray-500">Out: <?php echo $row['outreach_program']; ?> | COP: <?php echo $row['adult_souls_won_cop']; ?> | Other: <?php echo $row['other_souls_won']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-900">
<?php echo number_format($total_baptized); ?>
<div class="text-xs text-gray-500">Water: <?php echo $row['baptized_in_water']; ?> | Spirit: <?php echo $row['holy_spirit_baptism']; ?></div>
</td>
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium <?php echo $net_transfers >= 0 ? 'text-green-600' : 'text-red-600'; ?>">
<?php echo number_format($net_transfers); ?>
<div class="text-xs text-gray-500">In: <?php echo $row['transfers_in_total']; ?> | Out: <?php echo $row['transfers_out_total']; ?></div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- Export Notice -->
<div class="mt-6 bg-yellow-50 border border-yellow-200 rounded-lg p-4">
<div class="flex">
<div class="flex-shrink-0">
<i class="fas fa-info-circle text-yellow-400"></i>
</div>
<div class="ml-3">
<h3 class="text-sm font-medium text-yellow-800">Export Information</h3>
<div class="mt-2 text-sm text-yellow-700">
<p>For complete detailed breakdown with all fields, use the Excel or CSV export options. The exported file will include:</p>
<ul class="mt-1 list-disc list-inside">
<li>Complete demographic breakdown by gender and age groups</li>
<li>Detailed souls won statistics by category</li>
<li>Full baptism and conversion data</li>
<li>Transfer statistics with age group breakdown</li>
<li>District totals and area totals</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<?php endif; ?>
<?php endif; ?>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Helper function to handle dropdown changes
function setupLocationDropdowns(prefix = '') {
const areaSelect = document.getElementById(prefix + 'area_filter');
const districtSelect = document.getElementById(prefix + 'district_filter');
const assemblySelect = document.getElementById(prefix + 'assembly_filter');
if (!areaSelect || !districtSelect || !assemblySelect) return;
// Area change handler
areaSelect.addEventListener('change', function() {
const areaId = this.value;
// Clear districts and assemblies
districtSelect.innerHTML = '<option value="">All Districts</option>';
assemblySelect.innerHTML = '<option value="">All Assemblies</option>';
if (areaId) {
fetch(`?get_districts=1&area_id=${areaId}`)
.then(response => response.json())
.then(districts => {
districts.forEach(district => {
const option = document.createElement('option');
option.value = district.id;
option.textContent = district.name;
districtSelect.appendChild(option);
});
});
}
});
// District change handler
districtSelect.addEventListener('change', function() {
const districtId = this.value;
// Clear assemblies
assemblySelect.innerHTML = '<option value="">All Assemblies</option>';
if (districtId) {
fetch(`?get_assemblies=1&district_id=${districtId}`)
.then(response => response.json())
.then(assemblies => {
assemblies.forEach(assembly => {
const option = document.createElement('option');
option.value = assembly.id;
option.textContent = assembly.name;
assemblySelect.appendChild(option);
});
});
}
});
}
// Setup dropdowns for regular reports
setupLocationDropdowns('');
// Setup dropdowns for summary reports
setupLocationDropdowns('summary_');
// Setup dropdowns for exact reports
setupLocationDropdowns('exact_');
// Set default date ranges
const today = new Date();
const thirtyDaysAgo = new Date(today.getTime() - (30 * 24 * 60 * 60 * 1000));
const todayStr = today.toISOString().split('T')[0];
const thirtyDaysAgoStr = thirtyDaysAgo.toISOString().split('T')[0];
// Regular reports date fields
const dateToField = document.getElementById('date_to');
const dateFromField = document.getElementById('date_from');
if (dateToField) dateToField.value = todayStr;
if (dateFromField) dateFromField.value = thirtyDaysAgoStr;
// Summary reports date fields
const summaryDateToField = document.getElementById('summary_date_to');
const summaryDateFromField = document.getElementById('summary_date_from');
if (summaryDateToField) summaryDateToField.value = todayStr;
if (summaryDateFromField) summaryDateFromField.value = thirtyDaysAgoStr;
// Exact reports date fields
const exactDateToField = document.getElementById('exact_date_to');
const exactDateFromField = document.getElementById('exact_date_from');
if (exactDateToField) exactDateToField.value = todayStr;
if (exactDateFromField) exactDateFromField.value = thirtyDaysAgoStr;
});
</script>
<?php include __DIR__ . '/../includes/footer.php'; ?>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists