// src/pages/Laporan.tsx import { FileText, Download, User, MapPin, Layers, BadgeCheck, } from "lucide-react"; import { useEffect, useState } from "react"; import axios from "axios"; import jsPDF from "jspdf"; import autoTable from "jspdf-autotable"; import { FaHourglassEnd } from "react-icons/fa"; import { FaBox } from "react-icons/fa"; export default function Laporan() { /* ======================================================= STATE DATA LAPORAN (Diberikan default array kosong []) ======================================================= */ const [dataLaporan, setDataLaporan] = useState([]); const [loading, setLoading] = useState(true); /* ======================================================= GET DATA DATABASE (Ambil data dari endpoint /api/bast) ======================================================= */ useEffect(() => { setLoading(true); axios .get("http://localhost:5000/api/bast") .then((res) => { // PENGAMAN JALUR DATA: Memastikan data yang masuk ke state selalu bertipe Array if (res.data && res.data.success && Array.isArray(res.data.data)) { setDataLaporan(res.data.data); } else if (Array.isArray(res.data)) { setDataLaporan(res.data); } else { setDataLaporan([]); } }) .catch((err) => { console.error("Gagal memuat data laporan:", err); setDataLaporan([]); }) .finally(() => { setLoading(false); }); }, []); /* ======================================================= DOWNLOAD PDF LAPORAN KESELURUHAN (Sinkron Kolom Database) ======================================================= */ const downloadPDF = () => { const doc = new jsPDF("l", "mm", "a4"); // Menggunakan mode Landscape biar muat banyak kolom /* JUDUL DOKUMEN LAPORAN */ doc.setFont("helvetica", "bold"); doc.setFontSize(18); doc.text("LAPORAN DATA TRANSAKSI BAST", 148, 20, { align: "center" }); doc.setFont("helvetica", "normal"); doc.setFontSize(10); doc.text(`Dicetak pada: ${new Date().toLocaleDateString("id-ID")}`, 20, 28); /* GENERATE MASTER TABLE LAPORAN */ autoTable(doc, { startY: 33, styles: { fontSize: 9, halign: "center", valign: "middle", lineWidth: 0.3, lineColor: [180, 180, 180], }, headStyles: { fillColor: [41, 128, 185], // Warna biru premium standar industri textColor: [255, 255, 255], fontStyle: "bold", }, head: [[ "No", "ID BAST", "Kode Barang", "Nama Barang", "Kategori", "Lokasi", "Penyunting/Penyerah", "Penerima Aset", "Tanggal Dibuat", "Status Serah", "Status Terima" ]], body: dataLaporan.map((item, index) => [ index + 1, `#${item.bast_id}`, item.kode_barang || "-", item.nama_barang || "-", item.nama_kategori || "-", item.nama_lokasi || "-", item.nama_penyerah || "-", item.nama_penerima || "-", item.dibuat_pada ? new Date(item.dibuat_pada).toLocaleDateString("id-ID") : "-", item.status_serah || "Menunggu", item.status_terima || "Menunggu" ]), }); /* SAVE FILE PDF LAPORAN */ doc.save(`Laporan_Tahunan_BAST_${Date.now()}.pdf`); }; return (
{/* HEADER UTAMA */}

Laporan

Rekapitulasi data laporan mutasi transaksi BAST sekolah & CIFO.

{/* BUTTON GENERATE PDF */}
{/* RENDER KONDISIONAL KARTU LAPORAN */} {loading ? (
Sedang menarik data rekapan laporan dari server...
) : dataLaporan && dataLaporan.length > 0 ? (
{dataLaporan.map((item) => (
{/* ID DOKUMEN */}

ID BAST #{item.bast_id}

{item.kode_barang || "BLANK"}
{/* NAMA BARANG */}

{item.nama_barang}

{/* ATRIBUT RELASI DATA */}
Kategori: {item.nama_kategori || "-"}
Lokasi: {item.nama_lokasi || "-"}
Penyerah: {item.nama_penyerah || "-"}
Penerima: {item.nama_penerima || "-"}

Tanggal Transaksi: {item.dibuat_pada ? new Date(item.dibuat_pada).toLocaleString("id-ID") : "-"}

{/* SISI STATUS DOKUMEN DUAL APPROVAL */}
Serah: {item.status_serah} Terima: {item.status_terima}
))}
) : (
Tidak ditemukan rekapan laporan transaksi barang, Bang!
)}
); }