[ 'label' => 'Hari Ini', 'start' => date('Y-m-d'), 'end' => date('Y-m-d'), ], 'yesterday' => [ 'label' => 'Kemarin', 'start' => date('Y-m-d', strtotime('-1 day')), 'end' => date('Y-m-d', strtotime('-1 day')), ], 'this_week' => [ 'label' => 'Minggu Ini', 'start' => date('Y-m-d', strtotime('monday this week')), 'end' => date('Y-m-d'), ], 'last_week' => [ 'label' => 'Minggu Lalu', 'start' => date('Y-m-d', strtotime('monday last week')), 'end' => date('Y-m-d', strtotime('sunday last week')), ], 'this_month' => [ 'label' => 'Bulan Ini', 'start' => date('Y-m-01'), 'end' => date('Y-m-d'), ], ]; // Admin-only presets if ($isAdmin) { $presets['last_month'] = [ 'label' => 'Bulan Lalu', 'start' => date('Y-m-d', strtotime('first day of last month')), 'end' => date('Y-m-d', strtotime('last day of last month')), ]; $presets['last_90_days'] = [ 'label' => '90 Hari Terakhir', 'start' => date('Y-m-d', strtotime('-90 days')), 'end' => date('Y-m-d'), ]; $presets['this_year'] = [ 'label' => 'Tahun Ini', 'start' => date('Y') . '-01-01', 'end' => date('Y-m-d'), ]; $presets['all_time'] = [ 'label' => 'Sepanjang Waktu', 'start' => '2000-01-01', // Set a reasonable start date 'end' => date('Y-m-d'), ]; } return $presets; } // Function to check if an employee has permission for a specific report feature function canAccessFeature($feature) { // Default permissions based on role $permissions = [ 'admin' => [ 'export_excel' => true, 'export_pdf' => true, 'print_report' => true, 'view_financial' => true, 'view_payment_methods' => true, 'view_all_time' => true, 'view_summary' => true, 'view_popular_products' => true, ], 'manager' => [ 'export_excel' => true, 'export_pdf' => false, 'print_report' => true, 'view_financial' => true, 'view_payment_methods' => true, 'view_all_time' => false, 'view_summary' => true, 'view_popular_products' => true, ], 'employee' => [ 'export_excel' => false, 'export_pdf' => false, 'print_report' => false, 'view_financial' => false, 'view_payment_methods' => false, 'view_all_time' => false, 'view_summary' => false, 'view_popular_products' => false, ], 'user' => [ 'export_excel' => false, 'export_pdf' => false, 'print_report' => false, 'view_financial' => false, 'view_payment_methods' => false, 'view_all_time' => false, 'view_summary' => false, 'view_popular_products' => false, ], ]; $role = getUserRole(); // If role doesn't exist in our permissions, default to employee if (!isset($permissions[$role])) { $role = 'employee'; } // Return permission status return isset($permissions[$role][$feature]) ? $permissions[$role][$feature] : false; } // Function to get popular products - UPDATED for barang_kasir table function getPopularProducts($startDate, $endDate, $limit = 20, $sortBy = 'quantity', $isAdmin = false) { global $conn; // Add time components to make the date range inclusive $startDateTime = $startDate . ' 00:00:00'; $endDateTime = $endDate . ' 23:59:59'; // Base query for popular products - modified to join jenis_barang for category // UPDATED to use barang_kasir instead of barang $baseQuery = " SELECT b.id_barangK, b.kode_barang, b.nama_barang, b.harga, j.nama_jenis as kategori, SUM(dt.jumlah) as total_quantity, SUM(dt.total_harga) as total_revenue FROM barang_kasir b JOIN jenis_barang j ON b.id_jenis = j.id_jenis JOIN detail_transaksi dt ON b.id_barangK = dt.id_barangK JOIN transaksi t ON dt.id_transaksi = t.id_transaksi WHERE t.tanggal BETWEEN ? AND ? GROUP BY b.id_barangK ORDER BY "; // Add the appropriate ORDER BY clause if ($sortBy == 'revenue') { $baseQuery .= "total_revenue DESC"; } else { $baseQuery .= "total_quantity DESC"; } // Add limit $baseQuery .= " LIMIT ?"; // Prepare and execute query $stmt = mysqli_prepare($conn, $baseQuery); if (!$stmt) { return [ 'result' => false, 'error' => 'Failed to prepare query: ' . mysqli_error($conn), 'has_data' => false, ]; } mysqli_stmt_bind_param($stmt, "ssi", $startDateTime, $endDateTime, $limit); $execResult = mysqli_stmt_execute($stmt); if (!$execResult) { return [ 'result' => false, 'error' => 'Failed to execute query: ' . mysqli_stmt_error($stmt), 'has_data' => false, ]; } $result = mysqli_stmt_get_result($stmt); $rowCount = mysqli_num_rows($result); // Get summary totals - UPDATED for barang_kasir $summaryQuery = " SELECT COUNT(DISTINCT dt.id_barangK) as total_products, SUM(dt.jumlah) as total_items_sold, SUM(dt.total_harga) as total_revenue FROM detail_transaksi dt JOIN transaksi t ON dt.id_transaksi = t.id_transaksi WHERE t.tanggal BETWEEN ? AND ? "; $summaryStmt = mysqli_prepare($conn, $summaryQuery); if (!$summaryStmt) { return [ 'result' => $result, 'summary' => null, 'error' => 'Failed to prepare summary query: ' . mysqli_error($conn), 'has_data' => ($rowCount > 0), ]; } mysqli_stmt_bind_param($summaryStmt, "ss", $startDateTime, $endDateTime); $summaryExecResult = mysqli_stmt_execute($summaryStmt); if (!$summaryExecResult) { return [ 'result' => $result, 'summary' => null, 'error' => 'Failed to execute summary query: ' . mysqli_stmt_error($summaryStmt), 'has_data' => ($rowCount > 0), ]; } $summaryResult = mysqli_stmt_get_result($summaryStmt); $summary = mysqli_fetch_assoc($summaryResult); // Handle case where no data is found if (!$summary) { $summary = [ 'total_products' => 0, 'total_items_sold' => 0, 'total_revenue' => 0, ]; } // For non-admin users, potentially mask certain financial data if (!$isAdmin) { // Keep the summary accessible but hide financial details if needed if (!canAccessFeature('view_financial')) { $summary['total_revenue'] = 0; } } // Get category breakdown for pie chart - UPDATED for barang_kasir $categoryQuery = " SELECT j.nama_jenis as kategori, SUM(dt.jumlah) as total_quantity, SUM(dt.total_harga) as total_revenue, COUNT(DISTINCT b.id_barangK) as unique_products FROM barang_kasir b JOIN jenis_barang j ON b.id_jenis = j.id_jenis JOIN detail_transaksi dt ON b.id_barangK = dt.id_barangK JOIN transaksi t ON dt.id_transaksi = t.id_transaksi WHERE t.tanggal BETWEEN ? AND ? GROUP BY j.nama_jenis ORDER BY total_quantity DESC "; $categoryStmt = mysqli_prepare($conn, $categoryQuery); if (!$categoryStmt) { return [ 'result' => $result, 'summary' => $summary, 'categories' => null, 'error' => 'Failed to prepare category query: ' . mysqli_error($conn), 'has_data' => ($rowCount > 0), ]; } mysqli_stmt_bind_param($categoryStmt, "ss", $startDateTime, $endDateTime); $categoryExecResult = mysqli_stmt_execute($categoryStmt); if (!$categoryExecResult) { return [ 'result' => $result, 'summary' => $summary, 'categories' => null, 'error' => 'Failed to execute category query: ' . mysqli_stmt_error($categoryStmt), 'has_data' => ($rowCount > 0), ]; } $categoryResult = mysqli_stmt_get_result($categoryStmt); return [ 'result' => $result, 'summary' => $summary, 'categories' => $categoryResult, 'has_data' => ($rowCount > 0), ]; } // Function to apply date ranges based on preset or manual selection function getStartDate($datePresets, $activePreset) { // If preset is selected, use preset dates if (!empty($activePreset) && isset($datePresets[$activePreset])) { return $datePresets[$activePreset]['start']; } // Otherwise use the date parameters if provided $startDate = isset($_GET['start_date']) && !empty($_GET['start_date']) ? $_GET['start_date'] : date('Y-m-01'); // Default to first day of current month // Make sure date is in YYYY-MM-DD format if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $startDate)) { $startDate = date('Y-m-01'); } return $startDate; } function getEndDate($datePresets, $activePreset) { // If preset is selected, use preset dates if (!empty($activePreset) && isset($datePresets[$activePreset])) { return $datePresets[$activePreset]['end']; } // Otherwise use the date parameters if provided $endDate = isset($_GET['end_date']) && !empty($_GET['end_date']) ? $_GET['end_date'] : date('Y-m-d'); // Default to today // Make sure date is in YYYY-MM-DD format if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $endDate)) { $endDate = date('Y-m-d'); } return $endDate; } // Handle PDF export functionality function exportToPDF($startDate, $endDate, $limit, $sortBy, $isAdmin) { // Check permissions if (!($isAdmin || canAccessFeature('export_pdf'))) { die("Access denied. You don't have permission to export to PDF."); } // Get the data $queryData = getPopularProducts($startDate, $endDate, $limit, $sortBy, $isAdmin); // Here you would implement PDF generation with a library like FPDF or TCPDF // For example: /* require('fpdf/fpdf.php'); $pdf = new FPDF(); $pdf->AddPage(); $pdf->SetFont('Arial', 'B', 16); $pdf->Cell(40, 10, 'Ayula Store - Laporan Produk Terlaris'); // Add more PDF generation code here $pdf->Output('D', 'produk_terlaris.pdf'); exit; */ // For now, just return a message echo "

PDF Export

"; echo "

This functionality would generate a PDF for the selected date range: $startDate to $endDate

"; echo "

Implementation with a PDF library is required to complete this feature.

"; exit; }