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 }