diff --git a/src/components/pages/report/DailyMarketingReportContent.tsx b/src/components/pages/report/DailyMarketingReportContent.tsx index 1eba4ea3..3ddbd6cf 100644 --- a/src/components/pages/report/DailyMarketingReportContent.tsx +++ b/src/components/pages/report/DailyMarketingReportContent.tsx @@ -31,7 +31,10 @@ import { MarketingReportApi } from '@/services/api/report/marketing-report'; import { MARKETING_TYPE_OPTIONS } from '@/config/constant'; import { httpClient } from '@/services/http/client'; import { BaseApiResponse } from '@/types/api/api-general'; -import { DailyMarketingReport } from '@/types/api/report/marketing'; +import { + DailyMarketingReport, + DailyMarketingReportResponse, +} from '@/types/api/report/marketing'; import { isResponseError } from '@/lib/api-helper'; const DailyMarketingReportContent = () => { @@ -191,9 +194,10 @@ const DailyMarketingReportContent = () => { const queryString = `?${params.toString()}`; try { - const dailyMarketingsReport = await httpClient< - BaseApiResponse - >(`${MarketingReportApi.basePath}${queryString}`); + const dailyMarketingsReport = + await httpClient( + `${MarketingReportApi.basePath}${queryString}` + ); if (isResponseError(dailyMarketingsReport)) { toast.error('Gagal melakukan export penjualan harian! Coba lagi.'); @@ -202,7 +206,10 @@ const DailyMarketingReportContent = () => { const openPdf = async () => { const dailyMarketingReportPdfBlob = await pdf( - + ).toBlob(); const dailyMarketingReportPdfUrl = URL.createObjectURL( @@ -213,7 +220,10 @@ const DailyMarketingReportContent = () => { const downloadPdf = async () => { const blob = await pdf( - + ).toBlob(); const url = URL.createObjectURL(blob); diff --git a/src/components/pages/report/DailyMarketingReportPDF.tsx b/src/components/pages/report/DailyMarketingReportPDF.tsx index 337892b3..86ee29bc 100644 --- a/src/components/pages/report/DailyMarketingReportPDF.tsx +++ b/src/components/pages/report/DailyMarketingReportPDF.tsx @@ -9,11 +9,15 @@ import { View, } from '@react-pdf/renderer'; -import { DailyMarketingReport } from '@/types/api/report/marketing'; +import { + DailyMarketingReport, + SalesSummary, +} from '@/types/api/report/marketing'; import { formatCurrency, formatDate, formatNumber } from '@/lib/helper'; interface DailyMarketingReportPDFProps { data?: DailyMarketingReport; + total?: SalesSummary; } const DailyMarketingReportPDFStyle = StyleSheet.create({ @@ -267,9 +271,12 @@ const DailyMarketingReportPDFStyle = StyleSheet.create({ }, }); -const DailyMarketingReportPDF = ({ data }: DailyMarketingReportPDFProps) => { - const rows = data?.rows || []; - const summary = data?.summary; +const DailyMarketingReportPDF = ({ + data, + total, +}: DailyMarketingReportPDFProps) => { + const rows = data || []; + const summary = total; return ( @@ -409,7 +416,7 @@ const DailyMarketingReportPDF = ({ data }: DailyMarketingReportPDFProps) => { - {formatDate(row.do_date, 'DD/MM/YYYY')} + {formatDate(row.realization_date, 'DD/MM/YYYY')} @@ -429,7 +436,7 @@ const DailyMarketingReportPDF = ({ data }: DailyMarketingReportPDFProps) => { - {row.sales} + {row.sales.name} @@ -518,6 +525,19 @@ const DailyMarketingReportPDF = ({ data }: DailyMarketingReportPDFProps) => { {formatCurrency(summary?.total_sales_amount ?? 0)} + + + Total HPP Per KG: + + + {formatCurrency(summary?.total_hpp_price_per_kg ?? 0)} + + formatDate(props.row.original.do_date, 'DD-MMM-YYYY'), + accessorKey: 'realization_date', + header: 'Tanggal Realisasi', + cell: (props) => + formatDate(props.row.original.realization_date, 'DD-MMM-YYYY'), }, { accessorKey: 'aging_days', @@ -106,10 +107,10 @@ const DailyMarketingsTable = ({ cell: (props) => formatNumber(props.row.original.qty), footer: () => { const totalQty = isResponseSuccess(dailyMarketings) - ? dailyMarketings.data.summary.total_qty + ? dailyMarketings?.total?.total_qty : 0; - return formatNumber(totalQty); + return totalQty ? formatNumber(totalQty) : '-'; }, }, { @@ -123,10 +124,10 @@ const DailyMarketingsTable = ({ cell: (props) => formatNumber(props.row.original.total_weight_kg), footer: () => { const totalWeightKg = isResponseSuccess(dailyMarketings) - ? dailyMarketings.data.summary.total_weight_kg + ? dailyMarketings?.total?.total_weight_kg : 0; - return formatNumber(totalWeightKg); + return totalWeightKg ? formatNumber(totalWeightKg) : '-'; }, }, { @@ -138,6 +139,13 @@ const DailyMarketingsTable = ({ accessorKey: 'hpp_price_per_kg', header: 'HPP (Rp)', cell: (props) => formatCurrency(props.row.original.hpp_price_per_kg), + footer: () => { + const totalHppPricePerKg = isResponseSuccess(dailyMarketings) + ? dailyMarketings?.total?.total_hpp_price_per_kg + : 0; + + return totalHppPricePerKg ? formatCurrency(totalHppPricePerKg) : '-'; + }, }, { accessorKey: 'sales_amount', @@ -145,10 +153,10 @@ const DailyMarketingsTable = ({ cell: (props) => formatCurrency(props.row.original.sales_amount), footer: () => { const totalSalesAmount = isResponseSuccess(dailyMarketings) - ? dailyMarketings.data.summary.total_sales_amount + ? dailyMarketings?.total?.total_sales_amount : 0; - return formatCurrency(totalSalesAmount); + return totalSalesAmount ? formatCurrency(totalSalesAmount) : '-'; }, }, ]; @@ -167,7 +175,7 @@ const DailyMarketingsTable = ({ if (!open) { setOpen( isResponseSuccess(dailyMarketings) - ? dailyMarketings.data.rows.length > 0 + ? dailyMarketings.data.length > 0 : false ); } @@ -215,9 +223,7 @@ const DailyMarketingsTable = ({ data={ - isResponseSuccess(dailyMarketings) - ? dailyMarketings?.data.rows - : [] + isResponseSuccess(dailyMarketings) ? dailyMarketings?.data : [] } columns={dailyMarketingColumns} pageSize={pageSize} @@ -242,7 +248,7 @@ const DailyMarketingsTable = ({ containerClassName: cn({ 'w-full mb-20': isResponseSuccess(dailyMarketings) && - dailyMarketings?.data?.rows.length === 0, + dailyMarketings?.data?.length === 0, }), }} /> diff --git a/src/services/api/report/marketing-report.ts b/src/services/api/report/marketing-report.ts index 5d81605e..f55336ac 100644 --- a/src/services/api/report/marketing-report.ts +++ b/src/services/api/report/marketing-report.ts @@ -2,11 +2,14 @@ import * as XLSX from 'xlsx'; import toast from 'react-hot-toast'; import { BaseApiService } from '@/services/api/base'; -import { httpClient, httpClientFetcher } from '@/services/http/client'; +import { httpClientFetcher } from '@/services/http/client'; import { BaseApiResponse } from '@/types/api/api-general'; -import { DailyMarketingReport } from '@/types/api/report/marketing'; +import { + DailyMarketingReport, + DailyMarketingReportResponse, +} from '@/types/api/report/marketing'; import { isResponseError, isResponseSuccess } from '@/lib/api-helper'; -import { formatDate, sleep } from '@/lib/helper'; +import { formatDate } from '@/lib/helper'; export class MarketingReportApiService extends BaseApiService< DailyMarketingReport, @@ -19,10 +22,8 @@ export class MarketingReportApiService extends BaseApiService< async getAllDailyMarketingFetcher( endpoint: string - ): Promise> { - return await httpClientFetcher>( - endpoint - ); + ): Promise { + return await httpClientFetcher(endpoint); } async exportDailyMarketingToExcel(initialQueryString: string) { @@ -42,16 +43,19 @@ export class MarketingReportApiService extends BaseApiService< return; } - const rows = dailyMarketingsReport.data.rows; + const rows = dailyMarketingsReport.data; const formattedRows = []; for (let i = 0; i < rows.length; i++) { formattedRows.push({ ...rows[i], - created_user: rows[i].created_user.name, - created_at: formatDate(rows[i].created_at, 'YYYY-MM-DD'), - updated_at: formatDate(rows[i].updated_at, 'YYYY-MM-DD'), + // created_user: rows[i].created_user.name, + // created_at: formatDate(rows[i].created_at, 'YYYY-MM-DD'), + // updated_at: formatDate(rows[i].updated_at, 'YYYY-MM-DD'), + so_date: formatDate(rows[i].so_date, 'YYYY-MM-DD'), + realization_date: formatDate(rows[i].realization_date, 'YYYY-MM-DD'), + sales: rows[i].sales.name, warehouse: rows[i].warehouse.name, customer: rows[i].customer.name, product: rows[i].product.name, diff --git a/src/types/api/report/marketing.d.ts b/src/types/api/report/marketing.d.ts index d1e81f77..4a0ab306 100644 --- a/src/types/api/report/marketing.d.ts +++ b/src/types/api/report/marketing.d.ts @@ -1,4 +1,4 @@ -import { BaseMetadata } from '@/types/api/api-general'; +import { BaseApiResponse, BaseMetadata } from '@/types/api/api-general'; import { BaseCustomer, Customer } from '@/types/api/master-data/customer'; import { BaseWarehouseArea, @@ -9,16 +9,17 @@ import { import { Location } from '@/types/api/master-data/location'; import { Area } from '@/types/api/master-data/area'; import { BaseProduct } from '@/types/api/master-data/product'; +import { BaseUser } from '@/types/api/user'; export type BaseDailyMarketingRow = { - no: number; - so_date: string; // e.g. "01-Dec-2025" - do_date: string; // e.g. "08-Dec-2025" + id: number; + so_date: string; + realization_date: string; aging_days: number; warehouse: BaseWarehouseArea | BaseWarehouseLocation | BaseWarehouseKandang; customer: BaseCustomer; - sales: string; + sales: BaseUser; product: BaseProduct; do_number: string; @@ -43,12 +44,13 @@ export interface SalesSummary { total_weight_kg: number; total_sales_amount: number; total_hpp_amount: number; + total_hpp_price_per_kg: number; } -export type DailyMarketingReport = { - rows: DailyMarketingRow[]; - summary: SalesSummary; -}; +export type DailyMarketingReport = DailyMarketingRow[]; + +export type DailyMarketingReportResponse = + BaseApiResponse & { total: SalesSummary }; export type MarketingReportFilters = { area_id?: number;