මොඩියුලය 7

විකුණුම් වාර්තා (Sales Reports)


1 MySQL සමූහ ශ්‍රිත (Aggregate Functions) භාවිතය

වාර්තා ජනනය කිරීමේදී, දත්ත පේළි රාශියක් එකතු කර තනි අගයක් (උදා: මුළු ආදායම) ලබා ගැනීමට Aggregate Functions අත්‍යවශ්‍ය වේ.

  • SUM(): තීරුවක (column) ඇති සියලුම අගයන්ගේ එකතුව ලබා දෙයි. (උදා: SUM(total) මගින් මුළු විකුණුම් ආදායම).
  • COUNT(): පේළි ගණන ගණනය කරයි. (උදා: COUNT(id) මගින් මුළු ගනුදෙනු ගණන).
  • AVG(): තීරුවක ඇති අගයන්ගේ සාමාන්‍යය ලබා දෙයි. (උදා: AVG(total) මගින් එක් ගනුදෙනුවක සාමාන්‍ය වටිනාකම).
  • GROUP BY: දත්ත කාණ්ඩ කිරීමට භාවිතා කරයි. (උදා: GROUP BY DATE(sale_date) මගින් එක් එක් දිනයට අදාළව දත්ත කාණ්ඩ කරයි).
උදාහරණ SQL විමසුම (Query):

සෑම දිනයකම සිදු වූ මුළු විකුණුම් ආදායම සහ ගනුදෙනු ගණන ලබාගැනීම:

SELECT DATE(sale_date) AS sale_day, SUM(total) AS total_revenue, COUNT(id) AS number_of_sales FROM sales GROUP BY DATE(sale_date) ORDER BY sale_day DESC;
2 දින පරාසයකට අනුව වාර්තා පෙරීම (Filtering)

ව්‍යාපාරික තීරණ ගැනීමේදී නිශ්චිත කාල සීමාවකට අදාළ දත්ත බැලීම ඉතා වැදගත් වේ. පරිශීලකයාට ආරම්භක සහ අවසන් දින තෝරාගැනීමට HTML ෆෝරමයක් ලබා දී, එම දින පරාසය SQL විමසුමේ WHERE clause එකට යෙදිය හැක.

HTML ෆෝරමය:
<form method="GET" action="reports.php"> <input type="date" name="start_date"> <input type="date" name="end_date"> <button type="submit">Generate Report</button> </form>
PHP සහ SQL:
<?php $start_date = $_GET['start_date']; $end_date = $_GET['end_date']; $sql = "SELECT * FROM sales WHERE DATE(sale_date) BETWEEN ? AND ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); // ... execute query ?>

⭐ ප්‍රායෝගික පැවරුම: මුද්‍රණය කළ හැකි "විකුණුම් වාර්තා" පිටුවක් සෑදීම

මෙම කාර්යයේදී අපි දින පරාසයක් තෝරා වාර්තාවක් ජනනය කර, එය මුද්‍රණය කිරීමට පහසුකම් සලසන තනි පිටුවක් (`reports.php`) නිර්මාණය කරමු.

`reports.php` ගොනුව:

පහත කේතය `reports.php` නමින් ගොනුවක් සාදා ඇතුළත් කරන්න. මෙහි HTML, PHP සහ JavaScript යන සියල්ලම අඩංගු වේ.

<?php session_start(); // ... (Check if user is logged in) ... include 'includes/db_connect.php'; // Set default dates $start_date = isset($_GET['start_date']) ? $_GET['start_date'] : date('Y-m-01'); $end_date = isset($_GET['end_date']) ? $_GET['end_date'] : date('Y-m-d'); // SQL to fetch sales data within the date range $sql = "SELECT s.id, s.sale_date, s.total, u.name AS cashier_name FROM sales s JOIN users u ON s.user_id = u.id WHERE DATE(s.sale_date) BETWEEN ? AND ? ORDER BY s.sale_date DESC"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $start_date, $end_date); $stmt->execute(); $sales_result = $stmt->get_result(); // SQL for summary cards $summary_sql = "SELECT COUNT(id) AS total_sales_count, SUM(total) AS total_revenue FROM sales WHERE DATE(sale_date) BETWEEN ? AND ?"; $summary_stmt = $conn->prepare($summary_sql); $summary_stmt->bind_param("ss", $start_date, $end_date); $summary_stmt->execute(); $summary_result = $summary_stmt->get_result()->fetch_assoc(); ?> <!DOCTYPE html> <html> <head><title>Sales Reports</title><!-- Bootstrap CSS & Custom Print CSS --></head> <body> <div class="container"> <div class="no-print"> <h1 class="my-4">Sales Reports</h1> <form method="GET" action="reports.php" class="row g-3"> <div class="col-auto"><label>Start Date:</label><input type="date" name="start_date" class="form-control" value="<?php echo $start_date; ?>"></div> <div class="col-auto"><label>End Date:</label><input type="date" name="end_date" class="form-control" value="<?php echo $end_date; ?>"></div> <div class="col-auto align-self-end"><button type="submit" class="btn btn-primary">Filter</button></div> <div class="col-auto align-self-end"><button onclick="window.print()" class="btn btn-secondary">Print Report</button></div> </form> <hr> </div> <div class="printable-area"> <h2 class="text-center">Sales Report (<?php echo $start_date . ' to ' . $end_date; ?>)</h2> <!-- Summary Cards --> <div class="row my-4"> <div class="col-md-6"><div class="card text-center text-white bg-success"><div class="card-body"><h5>Total Revenue</h5><p class="card-text fs-4">Rs. <?php echo number_format($summary_result['total_revenue'], 2); ?></p></div></div></div> <div class="col-md-6"><div class="card text-center text-white bg-info"><div class="card-body"><h5>Total Sales</h5><p class="card-text fs-4"><?php echo $summary_result['total_sales_count']; ?></p></div></div></div> </div> <!-- Sales Table --> <table class="table table-bordered"> <thead><tr><th>Sale ID</th><th>Date</th><th>Cashier</th><th>Total Amount</th></tr></thead> <tbody> <?php while($row = $sales_result->fetch_assoc()): ?> <tr> <td><?php echo $row['id']; ?></td> <td><?php echo $row['sale_date']; ?></td> <td><?php echo $row['cashier_name']; ?></td> <td><?php echo number_format($row['total'], 2); ?></td> </tr> <?php endwhile; ?> </tbody> </table> </div> </div> </body> </html>

මෙම `reports.php` පිටුවට පිවිසීමෙන් ඔබට දින පරාසයක් තෝරා අදාළ වාර්තාව බැලීමටත්, "Print Report" බොත්තම මගින් එය පහසුවෙන් මුද්‍රණය කිරීමටත් හැකි වනු ඇත.

‹‹ පෙර මොඩියුලය (Module 6) ඊළඟ මොඩියුලය (Module 8) ››