// resources/js/composables/usePrintStruk.js import { computed, nextTick } from "vue"; export function usePrintStruk( transaksi, itemsWithMinimal, formatDate, formatNumber ) { const handlePrint = async () => { const printWindow = window.open("", "_blank", "width=900,height=600"); // Filter item yang valid const items = itemsWithMinimal.value.filter((i) => i.harga_deal > 0); const imageUrls = items .map((i) => i.produk?.foto?.[0]?.url) .filter(Boolean); // 1. Kompresi & encode semua gambar ke base64 (40x40, JPEG 80%) const compressedImages = await Promise.all( imageUrls.map((url) => compressImageToBase64(url, 40, 40, 0.8)) ); // Ganti URL dengan base64 (fallback ke placeholder jika gagal) const imageMap = {}; imageUrls.forEach((url, i) => { imageMap[url] = compressedImages[i] || "https://via.placeholder.com/40x40?text=No+Img"; }); const item = itemsWithMinimal.value[0] const imgSrc = imageMap[item.produk?.foto?.[0]?.url] || 'https://via.placeholder.com/100x100?text=No+Img' const printContent = ` Struk #${transaksi.value.kode_transaksi || 'N/A'}
${escapeHtml(transaksi.value.kode_transaksi || 'N/A')}
${formatDate(transaksi.value.created_at)}
${escapeHtml(transaksi.value.nama_pembeli || '-')}
${escapeHtml(transaksi.value.alamat || '-')}
${escapeHtml(transaksi.value.no_hp || '-')}
1
Produk
${escapeHtml(item.produk?.nama || '')}
${escapeHtml(item.posisi_asal || 'Brankas')} ${item.produk?.berat ? formatNumber(item.produk.berat)+'g' : ''} ${item.produk?.kadar ? item.produk.kadar+'k' : ''} Rp${formatNumber(item.harga_deal)}
${escapeHtml(transaksi.value.nama_sales || '-')}
${(transaksi.value.ongkos_bikin||0).toLocaleString()},-
${(transaksi.value.total_harga||0).toLocaleString()},-
`; printWindow.document.write(printContent); printWindow.document.close(); printWindow.onload = () => { setTimeout(() => { printWindow.focus(); printWindow.print(); printWindow.close(); }, 300); }; }; return { handlePrint }; } // === Helper: Kompresi Gambar ke Base64 === async function compressImageToBase64(url, width, height, quality = 0.8) { return new Promise((resolve) => { const img = new Image(); img.crossOrigin = "anonymous"; img.onload = () => { const canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; const ctx = canvas.getContext("2d"); ctx.drawImage(img, 0, 0, width, height); const base64 = canvas.toDataURL("image/jpeg", quality); resolve(base64); }; img.onerror = () => resolve(null); img.src = url + (url.includes("?") ? "&" : "?") + "t=" + Date.now(); }); } function escapeHtml(text) { if (!text) return ""; const div = document.createElement("div"); div.textContent = text; return div.innerHTML; }