« Back to History
daily_folding_report.php
|
20260722_120325.php
Initial Domain Snapshot
Copy Code
<?php // File: /erp/daily_folding_report.php // Daily Folding Report (dynamic quality columns) + Print (HTML) + PDF export (Dompdf if available) // Replace existing file with this content. error_reporting(E_ALL); ini_set('display_errors', 1); require_once __DIR__ . '/modules/auth/page_acl.php'; $ctx = page_require_access('folding_entry_report'); $pdo = $ctx['pdo'] ?? null; $company_id = (int)($ctx['company_id'] ?? 0); function e($s){ return htmlspecialchars((string)$s, ENT_QUOTES, 'UTF-8'); } function contrast_text_color(string $hex): string { $hex = ltrim(trim($hex), '#'); if (strlen($hex) !== 6) return '#111111'; $r = hexdec(substr($hex, 0, 2)); $g = hexdec(substr($hex, 2, 2)); $b = hexdec(substr($hex, 4, 2)); $luminance = ((0.299 * $r) + (0.587 * $g) + (0.114 * $b)) / 255; return $luminance > 0.62 ? '#111111' : '#ffffff'; } // ---------------- DATE RANGE ---------------- $today = date('Y-m-d'); $from = $_GET['from'] ?? $today; $to = $_GET['to'] ?? $today; if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $from)) $from = $today; if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $to)) $to = $today; $reportDateLabel = $from !== $to ? ($from . ' - ' . $to) : $from; // ---------------- FETCH ENTRIES ---------------- $rows = []; if ($pdo) { $sql = "SELECT fe.*, k.name AS khata_name, q.quality_name AS quality FROM folding_entry fe LEFT JOIN khatas k ON k.id = fe.khata_id AND k.company_id = fe.company_id LEFT JOIN qualities q ON q.id = fe.quality_id AND q.company_id = fe.company_id WHERE fe.company_id = :cid AND fe.entry_date BETWEEN :f AND :t ORDER BY k.name, q.quality_name"; $stmt = $pdo->prepare($sql); $stmt->execute([':cid'=>$company_id, ':f'=>$from, ':t'=>$to]); $rows = $stmt->fetchAll(PDO::FETCH_ASSOC); } // ---------------- GROUP & AGGREGATE ---------------- $khatas = []; $qualities = []; $agg = []; foreach ($rows as $r) { $kh = trim((string)($r['khata_name'] ?? 'Unknown')); $q = strtoupper(trim((string)($r['quality'] ?? 'OTHER'))); if ($kh === '') $kh = 'Unknown'; if ($q === '') $q = 'OTHER'; if (!in_array($kh, $khatas, true)) $khatas[] = $kh; if (!in_array($q, $qualities, true)) $qualities[] = $q; if (!isset($agg[$kh][$q])) $agg[$kh][$q] = ['taka'=>0,'meter'=>0,'saree'=>0,'weight'=>0]; $agg[$kh][$q]['taka'] += (float)($r['total_taka'] ?? 0); $agg[$kh][$q]['meter'] += (float)($r['total_meter'] ?? 0); $agg[$kh][$q]['saree'] += (float)($r['total_saree'] ?? 0); $agg[$kh][$q]['weight'] += (float)($r['total_weight'] ?? 0); } sort($qualities); // totals per quality $qualityTotals = []; foreach ($qualities as $q) { $qualityTotals[$q] = ['taka'=>0,'meter'=>0,'saree'=>0,'weight'=>0]; foreach ($khatas as $kh) { if (!empty($agg[$kh][$q])) { $qualityTotals[$q]['taka'] += $agg[$kh][$q]['taka']; $qualityTotals[$q]['meter'] += $agg[$kh][$q]['meter']; $qualityTotals[$q]['saree'] += $agg[$kh][$q]['saree']; $qualityTotals[$q]['weight'] += $agg[$kh][$q]['weight']; } } } // ---------------- COLOR PALETTE ---------------- $palette = [ '#2ecc71', '#eafaf1', '#95a5a6', '#b3e5f5', '#fff3b0', '#cdebd6', '#2f7f66', '#a8e6cf', '#7ea8c2', '#ffd6be', '#3b4b4f', '#e6f0ea', '#d6f0d6', '#f9b6b6' ]; $qualityColors = []; foreach ($qualities as $i => $q) { $base = $palette[$i % count($palette)]; list($r,$g,$b) = sscanf($base, "#%02x%02x%02x"); $tint = "rgba($r,$g,$b,0.10)"; // light tint for cells $qualityColors[$q] = [ 'base' => $base, 'tint' => $tint, 'text' => contrast_text_color($base), 'cls' => "qcol-$i" ]; } // ---------------- DOMPDF detection ---------------- $dompdfAvailable = false; $dompdfAutoloads = [ __DIR__ . '/lib/dompdf/autoload.inc.php', __DIR__ . '/lib/dompdf/vendor/autoload.php', __DIR__ . '/vendor/autoload.php', dirname(__DIR__) . '/vendor/autoload.php' ]; foreach ($dompdfAutoloads as $dompdfAutoload) { if (!file_exists($dompdfAutoload)) { continue; } try { require_once $dompdfAutoload; } catch (Throwable $ex) { continue; } if (class_exists('Dompdf\Dompdf')) { $dompdfAvailable = true; break; } } if (!$dompdfAvailable && class_exists('Dompdf\Dompdf')) $dompdfAvailable = true; // ---------------- PRINT VIEW (HTML only, auto print) ---------------- if (isset($_GET['print_view'])) { // Build printable HTML and auto call window.print() ob_start(); ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>Print - Folding Report <?= e($reportDateLabel) ?></title> <style> body{font-family: DejaVu Sans, Arial, sans-serif; font-size:12px; color:#111; padding:12px;} h2,h4{margin:6px 0;} table{width:100%;border-collapse:collapse;margin-top:8px;} th,td{padding:6px;border:1px solid #ccc;font-size:12px;} thead th{font-weight:700;text-align:center;} .dy-total{background:#222;color:#fff;font-weight:700;} </style> </head> <body> <h2 style="text-align:center;">Daily Folding Report</h2> <div style="text-align:center;"><?= e($reportDateLabel) ?></div> <table> <thead> <tr> <th rowspan="2">Khata</th> <?php foreach ($qualities as $q): ?> <th colspan="4" style="background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= e($q) ?></th> <?php endforeach; ?> </tr> <tr> <?php foreach ($qualities as $q): ?> <th>Taka</th><th>MTR</th><th>Saree</th><th>Weight</th> <?php endforeach; ?> </tr> </thead> <tbody> <?php if (empty($khatas)): ?> <tr><td colspan="<?= 1 + count($qualities)*4 ?>" style="text-align:center;padding:12px;">No records found.</td></tr> <?php else: ?> <?php foreach ($khatas as $kh): ?> <tr> <td style="font-weight:700;"><?= e($kh) ?></td> <?php foreach ($qualities as $q): $v = $agg[$kh][$q] ?? ['taka'=>0,'meter'=>0,'saree'=>0,'weight'=>0]; ?> <td style="text-align:right;"><?= number_format($v['taka'],2) ?></td> <td style="text-align:right;"><?= number_format($v['meter'],2) ?></td> <td style="text-align:right;"><?= number_format($v['saree'],0) ?></td> <td style="text-align:right;"><?= number_format($v['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> <tr class="dy-total"> <td style="text-align:right;">TOTAL</td> <?php foreach ($qualities as $q): ?> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['taka'],2) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['meter'],2) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['saree'],0) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endif; ?> </tbody> </table> <script>window.print();</script> </body> </html> <?php echo ob_get_clean(); exit; } // ---------------- PDF EXPORT (server-side if available) ---------------- if (isset($_GET['export']) && $_GET['export'] === 'pdf') { // Create same printable HTML (no auto window.print) ob_start(); ?> <!doctype html> <html> <head> <meta charset="utf-8"> <title>Folding Report <?= e($reportDateLabel) ?></title> <style> body{font-family: DejaVu Sans, Arial, sans-serif; font-size:12px; color:#111; padding:12px;} h2,h4{margin:6px 0;} table{width:100%;border-collapse:collapse;margin-top:8px;} th,td{padding:6px;border:1px solid #ccc;font-size:12px;} thead th{font-weight:700;text-align:center;} .dy-total{background:#222;color:#fff;font-weight:700;} </style> </head> <body> <h2 style="text-align:center;">Daily Folding Report</h2> <div style="text-align:center;"><?= e($reportDateLabel) ?></div> <table> <thead> <tr> <th rowspan="2">Khata</th> <?php foreach ($qualities as $q): ?> <th colspan="4" style="background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= e($q) ?></th> <?php endforeach; ?> </tr> <tr> <?php foreach ($qualities as $q): ?> <th style="text-align:right;">Taka</th><th style="text-align:right;">MTR</th><th style="text-align:right;">Saree</th><th style="text-align:right;">Weight</th> <?php endforeach; ?> </tr> </thead> <tbody> <?php if (empty($khatas)): ?> <tr><td colspan="<?= 1 + count($qualities)*4 ?>" style="text-align:center;padding:12px;">No records found.</td></tr> <?php else: ?> <?php foreach ($khatas as $kh): ?> <tr> <td style="font-weight:700;"><?= e($kh) ?></td> <?php foreach ($qualities as $q): $v = $agg[$kh][$q] ?? ['taka'=>0,'meter'=>0,'saree'=>0,'weight'=>0]; ?> <td style="text-align:right;"><?= number_format($v['taka'],2) ?></td> <td style="text-align:right;"><?= number_format($v['meter'],2) ?></td> <td style="text-align:right;"><?= number_format($v['saree'],0) ?></td> <td style="text-align:right;"><?= number_format($v['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> <tr class="dy-total"> <td style="text-align:right;">TOTAL</td> <?php foreach ($qualities as $q): ?> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['taka'],2) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['meter'],2) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['saree'],0) ?></td> <td style="text-align:right;background:<?= e($qualityColors[$q]['base']) ?>;color:<?= e($qualityColors[$q]['text']) ?>;"><?= number_format($qualityTotals[$q]['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endif; ?> </tbody> </table> <div style="font-size:11px;color:#666;margin-top:8px;">Generated by Mr manager</div> </body> </html> <?php $html = ob_get_clean(); if ($dompdfAvailable) { try { $options = null; if (class_exists('Dompdf\Options')) { $options = new Dompdf\Options(); $options->set('isRemoteEnabled', true); $options->set('isHtml5ParserEnabled', true); $dompdf = new Dompdf\Dompdf($options); } else { $dompdf = new Dompdf\Dompdf(); } $dompdf->setPaper('A4', 'landscape'); $dompdf->loadHtml($html, 'UTF-8'); $dompdf->render(); $pdf = $dompdf->output(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename="folding_report_'.$from.'_to_'.$to.'.pdf"'); echo $pdf; exit; } catch (Throwable $ex) { error_log('Dompdf error: '.$ex->getMessage()); // fallback to HTML printable view } } // fallback: output HTML (user can Save as PDF) echo $html; exit; } // ---------------- NORMAL PAGE RENDER ---------------- require_once __DIR__ . '/partials/header.php'; ?> <div class="container-fluid py-4"> <!-- Filter Card --> <div class="card shadow-sm mb-4"> <div class="card-body"> <form method="get" class="row g-3 align-items-end"> <div class="col-md-3"> <label class="form-label fw-semibold">From</label> <input type="date" name="from" value="<?= e($from) ?>" class="form-control"> </div> <div class="col-md-3"> <label class="form-label fw-semibold">To</label> <input type="date" name="to" value="<?= e($to) ?>" class="form-control"> </div> <div class="col-md-3"> <button class="btn btn-primary w-100" type="submit"> Show Report </button> </div> <div class="col-md-3 d-flex gap-2"> <a class="btn btn-outline-secondary w-100" href="?from=<?= urlencode($from) ?>&to=<?= urlencode($to) ?>&print_view=1" target="_blank"> Print </a> <a class="btn btn-outline-success w-100" href="?from=<?= urlencode($from) ?>&to=<?= urlencode($to) ?>&export=pdf"> Export PDF </a> </div> </form> </div> </div> <!-- Title --> <div class="text-center mb-3"> <h4 class="fw-bold">Daily Folding Report</h4> <div class="text-muted"> <?= e($from) ?><?= $from != $to ? ' — '.e($to) : '' ?> </div> </div> <!-- Report Table --> <div class="card shadow-sm"> <div class="card-body p-0"> <div class="table-responsive"> <table class="table table-bordered table-striped align-middle mb-0 text-nowrap"> <thead class="table-dark text-center"> <tr> <th rowspan="2">Khata</th> <?php foreach ($qualities as $q): ?> <th colspan="4"><?= e($q) ?></th> <?php endforeach; ?> </tr> <tr> <?php foreach ($qualities as $q): ?> <th class="text-end">Taka</th> <th class="text-end">MTR</th> <th class="text-end">Saree</th> <th class="text-end">Weight</th> <?php endforeach; ?> </tr> </thead> <tbody> <?php if (empty($khatas)): ?> <tr> <td colspan="<?= 1 + count($qualities)*4 ?>" class="text-center py-4"> No records found for selected date(s). </td> </tr> <?php else: ?> <?php foreach ($khatas as $kh): ?> <tr> <td class="fw-semibold"><?= e($kh) ?></td> <?php foreach ($qualities as $q): $v = $agg[$kh][$q] ?? ['taka'=>0,'meter'=>0,'saree'=>0,'weight'=>0]; ?> <td class="text-end"><?= number_format($v['taka'],2) ?></td> <td class="text-end"><?= number_format($v['meter'],2) ?></td> <td class="text-end"><?= number_format($v['saree'],0) ?></td> <td class="text-end"><?= number_format($v['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endforeach; ?> <!-- TOTAL ROW --> <tr class="table-dark fw-bold"> <td class="text-end">TOTAL</td> <?php foreach ($qualities as $q): ?> <td class="text-end"><?= number_format($qualityTotals[$q]['taka'],2) ?></td> <td class="text-end"><?= number_format($qualityTotals[$q]['meter'],2) ?></td> <td class="text-end"><?= number_format($qualityTotals[$q]['saree'],0) ?></td> <td class="text-end"><?= number_format($qualityTotals[$q]['weight'],2) ?></td> <?php endforeach; ?> </tr> <?php endif; ?> </tbody> </table> </div> </div> </div> </div> <?php require_once __DIR__ . '/partials/footer.php'; ?>