nama = $nama; $this->alamat = $alamat; $this->telepon = $telepon; $this->logo = $logo; } function Header() { // Logo $this->Image($this->logo, 10, 8, 22, 22); // Path ke logo Anda, x, y, width $this->SetXY(35, 11); $this->SetFont('Arial', 'B', 14); $this->Cell(0, 6, $this->nama, 0, 1, 'L'); $this->SetFont('Arial', 'I', 10); $this->SetXY(35, 17); $this->Cell(0, 6, $this->alamat, 0, 1, 'L'); $this->SetXY(35, 23); $this->Cell(0, 6, 'Phone: '.$this->telepon, 0, 1, 'L'); $this->Ln(14); // Garis Horizontal $this->SetLineWidth(0.8); // Ketebalan garis $this->Line(10, 33, 200, 33); // x1, y1, x2, y2 (x1, y1 = start; x2, y2 = end) $this->SetLineWidth(0.4); $this->Line(10, 34, 200, 34); $this->SetTextColor(255, 140, 0); $this->SetFont('Arial', 'B', 20); $this->Cell(0, -56, 'INVOICE', 0, 1, 'R'); $this->Ln(50); } function Footer() { $this->SetY(-15); $this->SetFont('Arial', 'I', 8); $this->Cell(0, 10, 'Page ' . $this->PageNo(), 0, 0, 'C'); } function CustomerDetails($customerName, $customerAddress, $invoiceNumber, $invoiceDate, $customerNumber, $invoiceLimit) { $this->SetFont('Arial', 'B', 11); $this->Cell(0, 6, 'Bill To:', 0, 1); $this->SetFont('Arial', '', 11); $this->Cell(0, 6, $customerName, 0, 1); $this->MultiCell(0, 7, $customerAddress); $this->Cell(0, 6, $customerNumber, 0, 1); $this->Ln(10); $this->SetFont('Arial', '', 11); $this->SetXY(140, 37); $this->Cell(0, 6, "No Invoice : $invoiceNumber", 0, 1); $this->SetXY(140, 44); $this->Cell(0, 6, "Invoice Date : $invoiceDate", 0, 1); $this->SetXY(140, 51); $this->Cell(0, 6, "Limit Invoice : $invoiceLimit", 0, 1); $this->Ln(10); } function InvoiceTable($header, $data) { // 🔥 7 kolom sekarang $columnWidths = array(8, 22, 30, 70, 15, 20, 25); $totalWidth = array_sum($columnWidths); // scaling biar tetap muat $scalingFactor = $this->maxWidth / $totalWidth; // header style $this->SetFillColor(255, 140, 0); $this->SetFont('Arial', '', 10); // ================= HEADER ================= for ($i = 0; $i < count($header); $i++) { $this->Cell($columnWidths[$i] * $scalingFactor, 8, $header[$i], 1, 0, 'C', true); } $this->Ln(); // ================= DATA ================= $this->SetFont('Arial', '', 10); foreach ($data as $row) { // hitung multiline $nbDesc = $this->NbLines($columnWidths[2] * $scalingFactor, $row[2]); $nbKet = $this->NbLines($columnWidths[3] * $scalingFactor, $row[3]); $maxHeight = 8 * max($nbDesc, $nbKet); // pagination if ($this->GetY() + $maxHeight > $this->PageBreakTrigger) { $this->AddPage(); $this->SetFillColor(255, 140, 0); $this->SetFont('Arial', '', 10); for ($i = 0; $i < count($header); $i++) { $this->Cell($columnWidths[$i] * $scalingFactor, 8, $header[$i], 1, 0, 'C', true); } $this->Ln(); $this->SetFont('Arial', '', 10); } $x = $this->GetX(); $y = $this->GetY(); // 1. No $this->Cell($columnWidths[0] * $scalingFactor, $maxHeight, $row[0], 1, 0, 'C'); // 2. Tanggal $this->Cell($columnWidths[1] * $scalingFactor, $maxHeight, $row[1], 1, 0, 'C'); // 3. Nama Item (multiline) $this->SetXY($x + ($columnWidths[0] + $columnWidths[1]) * $scalingFactor, $y); $this->MultiCell( $columnWidths[2] * $scalingFactor, $maxHeight / max(1, $nbDesc), $row[2], 1, 'L' ); // 4. Keterangan (multiline) $this->SetXY($x + ($columnWidths[0] + $columnWidths[1] + $columnWidths[2]) * $scalingFactor, $y); $this->MultiCell( $columnWidths[3] * $scalingFactor, $maxHeight / max(1, $nbKet), $row[3], 1, 'L' ); // 5. Qty $this->SetXY($x + ($columnWidths[0] + $columnWidths[1] + $columnWidths[2] + $columnWidths[3]) * $scalingFactor, $y); $this->Cell($columnWidths[4] * $scalingFactor, $maxHeight, $row[4], 1, 0, 'C'); // 6. Harga $this->Cell($columnWidths[5] * $scalingFactor, $maxHeight, $row[5], 1, 0, 'R'); // 7. Subtotal $this->Cell($columnWidths[6] * $scalingFactor, $maxHeight, $row[6], 1, 0, 'R'); $this->Ln($maxHeight); } } // Fungsi tambahan untuk menghitung jumlah baris Multicell function NbLines($w, $txt) { // Hitung jumlah baris dalam MultiCell $cw = &$this->CurrentFont['cw']; if ($w == 0) { $w = $this->w - $this->rMargin - $this->x; } $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize; $s = str_replace("\r", '', $txt); $nb = strlen($s); if ($nb > 0 && $s[$nb - 1] == "\n") { $nb--; } $sep = -1; $i = 0; $j = 0; $l = 0; $nl = 1; while ($i < $nb) { $c = $s[$i]; if ($c == "\n") { $i++; $sep = -1; $j = $i; $l = 0; $nl++; continue; } if ($c == ' ') { $sep = $i; } $l += $cw[$c]; if ($l > $wmax) { if ($sep == -1) { if ($i == $j) { $i++; } } else { $i = $sep + 1; } $sep = -1; $j = $i; $l = 0; $nl++; } else { $i++; } } return $nl; } function Total($subtotal,$lainnya,$totalAmount,$terbilang,$keteranganlain) { $this->Ln(1); $this->SetFont('Arial', '', 11); $this->Cell($this->maxWidth - 25, 9, 'Sub Total', 1, 0, 'R'); $this->Cell(25, 9, $subtotal, 1, 1, 'R'); $this->Cell($this->maxWidth - 25, 9, $keteranganlain, 1, 0, 'R'); $this->Cell(25, 9, $lainnya, 1, 1, 'R'); $this->SetFont('Arial', 'B', 11); $this->Cell($this->maxWidth - 25, 9, 'Total', 1, 0, 'R'); $this->Cell(25, 9, $totalAmount, 1, 1, 'R'); $this->Ln(1); $this->SetFont('Arial', 'I', 11); $this->Cell(0, 9, 'Terbilang : ', 0, 1); $this->SetFont('Arial', 'I', 11); $this->MultiCell(190, 9, $terbilang, 1, 'L'); } function Keterangan($Keterangan) { $this->Ln(10); $this->SetFont('Arial', '', 11); $this->SetFillColor(255, 140, 0); $this->MultiCell(100, 6, $Keterangan, 0, 'L', true); } function Pembuat($Pembuat) { $this->Ln(-25); $this->SetFont('Arial', '', 11); $this->Cell(300, 6, 'Mengetahui,', 0, 1, 'C'); $this->Ln(18); $this->SetFont('Arial', 'B', 11); $this->Cell(300, 6, '( '.$Pembuat.' )', 0, 1, 'C'); $this->SetFont('Arial', 'I', 11); $this->Cell(300, 6, 'financial department', 0, 1, 'C'); } } ?>