diff --git a/src/app/[lang]/(dashboard)/(private)/dashboards/daily-report/page.tsx b/src/app/[lang]/(dashboard)/(private)/dashboards/daily-report/page.tsx index 1ce1c53..9a5fd24 100644 --- a/src/app/[lang]/(dashboard)/(private)/dashboards/daily-report/page.tsx +++ b/src/app/[lang]/(dashboard)/(private)/dashboards/daily-report/page.tsx @@ -16,8 +16,8 @@ import ReportHeader from '@/views/dashboards/daily-report/report-header' import React, { useEffect, useRef, useState } from 'react' // Dummy HPP values — ganti dengan data real nantinya -const DUMMY_STD_HPP = 30 // 30% -const DUMMY_REAL_HPP = 28 // 28% +const DUMMY_STD_HPP = 0 // % — ganti dengan data real nantinya +const DUMMY_REAL_HPP = 0 // % — ganti dengan kalkulasi real nantinya const getHppStatus = (stdHpp: number, realHpp: number): 'Sehat' | 'Tidak Sehat' => realHpp <= stdHpp ? 'Sehat' : 'Tidak Sehat' @@ -276,7 +276,7 @@ const DailyPOSReport = () => {
- Biaya Layanan + Service Charge {formatCurrency(0)}
diff --git a/src/utils/excelGenerator.ts b/src/utils/excelGenerator.ts index ed1d5eb..c33bc22 100644 --- a/src/utils/excelGenerator.ts +++ b/src/utils/excelGenerator.ts @@ -115,8 +115,8 @@ const getStatusStyle = (status: 'Sehat' | 'Tidak Sehat', isAlt: boolean): Partia } // Dummy HPP values — ganti dengan data real nantinya -const DUMMY_STD_HPP = 0.3 // 30% -const DUMMY_REAL_HPP = 0.28 // 28% +const DUMMY_STD_HPP = 0 // 0% — ganti dengan data real nantinya +const DUMMY_REAL_HPP = 0 // 0% — ganti dengan kalkulasi real nantinya const getDummyStatus = (stdHpp: number, realHpp: number): 'Sehat' | 'Tidak Sehat' => realHpp <= stdHpp ? 'Sehat' : 'Tidak Sehat' @@ -183,7 +183,7 @@ export const generateExcel = async (params: ExcelGeneratorParams) => { ['Total Diskon', profitLoss?.summary.total_discount || 0], ['Total Pajak', profitLoss?.summary.total_tax || 0], ['PB1', 0], - ['Biaya Layanan', 0] + ['Service Charge', profitLoss?.summary.service_charge || 0] ] summaryData.forEach((row, idx) => { diff --git a/src/utils/pdfGenerator.ts b/src/utils/pdfGenerator.ts index b6e6f51..8a4fc8b 100644 --- a/src/utils/pdfGenerator.ts +++ b/src/utils/pdfGenerator.ts @@ -119,7 +119,7 @@ export const generatePDF = async (params: PDFGeneratorParams) => { ['Total Penjualan', formatCurrency(profitLoss?.summary.total_revenue ?? 0)], ['Total Diskon', formatCurrency(profitLoss?.summary.total_discount ?? 0)], ['Total Pajak', formatCurrency(profitLoss?.summary.total_tax ?? 0)], - ['Biaya Layanan', formatCurrency(0)], + ['Service Charge', formatCurrency(profitLoss?.summary.service_charge ?? 0)], ['Total', formatCurrency(profitLoss?.summary.total_revenue ?? 0)] ], theme: 'grid', @@ -238,12 +238,12 @@ export const generatePDF = async (params: PDFGeneratorParams) => { pdf.text('Ringkasan Kategori', 14, currentY) currentY += 15 - const DUMMY_STD_HPP = 30 // % (nilai dummy — ganti dengan data real nantinya) + const DUMMY_STD_HPP = 0 // % (nilai dummy — ganti dengan data real nantinya) const categoryBody = category?.data?.map((c: any) => { const stdHpp = DUMMY_STD_HPP - const realisasiHpp = 28 // dummy — ganti dengan kalkulasi real + const realisasiHpp = 0 // dummy — ganti dengan kalkulasi real const status = realisasiHpp <= stdHpp ? 'Sehat' : 'Tidak Sehat' return [ c.category_name, @@ -251,10 +251,17 @@ export const generatePDF = async (params: PDFGeneratorParams) => { formatCurrency(c.total_revenue), `${stdHpp}%`, `${realisasiHpp}%`, - status + '' // dikosongkan — status digambar manual via didDrawCell agar tidak double ] }) || [] + // Simpan status per baris untuk dipakai di didDrawCell + const categoryStatuses: string[] = + category?.data?.map(() => { + const realisasiHpp = 0 + return realisasiHpp <= DUMMY_STD_HPP ? 'Sehat' : 'Tidak Sehat' + }) || [] + autoTable(pdf, { startY: currentY, head: [['Nama', 'Qty', 'Pendapatan', '% Std HPP', '% Real HPP', 'Status']], @@ -308,17 +315,19 @@ export const generatePDF = async (params: PDFGeneratorParams) => { else if (data.column.index === 1) data.cell.styles.halign = 'center' else if (data.column.index === 2) data.cell.styles.halign = 'right' } + // Paksa teks status tidak dirender oleh autoTable (set textColor = white) + if (data.section === 'body' && data.column.index === 5) { + data.cell.styles.textColor = [255, 255, 255] + } }, didDrawCell: (data: any) => { - // Warna teks Status (kolom index 5) if (data.section === 'body' && data.column.index === 5) { - const status = data.cell.text[0] + const status = categoryStatuses[data.row.index] || 'Sehat' const color = getStatusColor(status) pdf.setTextColor(...color) pdf.setFontSize(9) pdf.setFont('helvetica', 'bold') pdf.text(status, data.cell.x + data.cell.width / 2, data.cell.y + data.cell.height / 2 + 1, { align: 'center' }) - // Reset warna pdf.setTextColor(0, 0, 0) pdf.setFont('helvetica', 'normal') } @@ -369,19 +378,21 @@ export const generatePDF = async (params: PDFGeneratorParams) => { // Kolom baru: % Standard HPP, % Realisasi HPP, Status — dummy visual const productBody = categoryProducts.map((item: any) => { - const stdHpp = 30 // dummy — ganti dengan data real - const realisasiHpp = 28 // dummy — ganti dengan kalkulasi real - const status = realisasiHpp <= stdHpp ? 'Sehat' : 'Tidak Sehat' + const stdHpp = 0 // dummy — ganti dengan data real + const realisasiHpp = 0 // dummy — ganti dengan kalkulasi real return [ item.product_name, String(item.quantity_sold), formatCurrency(item.revenue), `${stdHpp}%`, `${realisasiHpp}%`, - status + '' // dikosongkan — status digambar manual via didDrawCell agar tidak double ] }) + // Status per baris produk + const productStatuses: string[] = categoryProducts.map(() => (0 <= 0 ? 'Sehat' : 'Tidak Sehat')) + const estimatedHeight = (productBody.length + 3) * 12 if (currentY + estimatedHeight > 270) { pdf.addPage() @@ -426,9 +437,9 @@ export const generatePDF = async (params: PDFGeneratorParams) => { lineWidth: 0.1 }, columnStyles: { - 0: { cellWidth: 55 }, + 0: { cellWidth: 50 }, 1: { halign: 'center', cellWidth: 20 }, - 2: { halign: 'right', cellWidth: 35 }, + 2: { halign: 'right', cellWidth: 42 }, 3: { halign: 'center', cellWidth: 22 }, 4: { halign: 'center', cellWidth: 22 }, 5: { halign: 'center', cellWidth: 22 } @@ -439,11 +450,15 @@ export const generatePDF = async (params: PDFGeneratorParams) => { else if (data.column.index === 1) data.cell.styles.halign = 'center' else if (data.column.index === 2) data.cell.styles.halign = 'right' } + // Paksa teks status tidak dirender oleh autoTable (set textColor = white) + if (data.section === 'body' && data.column.index === 5) { + data.cell.styles.textColor = [255, 255, 255] + } }, didDrawCell: (data: any) => { - // Warna teks Status (kolom index 5) + // Warna teks Status (kolom index 5) — ambil dari array, bukan cell.text agar tidak double if (data.section === 'body' && data.column.index === 5) { - const status = data.cell.text[0] + const status = productStatuses[data.row.index] || 'Sehat' const color = getStatusColor(status) pdf.setTextColor(...color) pdf.setFontSize(9) @@ -490,9 +505,9 @@ export const generatePDF = async (params: PDFGeneratorParams) => { lineWidth: 0.2 }, columnStyles: { - 0: { cellWidth: 55 }, + 0: { cellWidth: 50 }, 1: { halign: 'center', cellWidth: 20 }, - 2: { halign: 'right', cellWidth: 35 }, + 2: { halign: 'right', cellWidth: 42 }, 3: { cellWidth: 22 }, 4: { cellWidth: 22 }, 5: { cellWidth: 22 }