refactor(FE-327): Map Indonesian sales fields and add API sample

This commit is contained in:
rstubryan
2025-12-05 11:15:41 +07:00
parent c31b284cf4
commit 46e072bbcf
@@ -7,7 +7,7 @@ import Table, { CustomHeaderRow } from '@/components/Table';
import Card from '@/components/Card'; import Card from '@/components/Card';
import Badge from '@/components/Badge'; import Badge from '@/components/Badge';
import { formatCurrency, formatNumber, formatDate } from '@/lib/helper'; import { formatCurrency, formatNumber, formatDate } from '@/lib/helper';
import { BaseClosingSales } from '@/types/api/closing/closing'; import { BaseClosingSales, BaseSales } from '@/types/api/closing/closing';
interface SalesReportTableProps { interface SalesReportTableProps {
type?: 'detail'; type?: 'detail';
@@ -110,8 +110,7 @@ const generateCustomHeaders = (template: {
}; };
// TODO: TEMPORARY - Remove this when backend API returns English field names // TODO: TEMPORARY - Remove this when backend API returns English field names
// eslint-disable-next-line @typescript-eslint/no-explicit-any const mapIndonesianDataToEnglish = (data: BaseClosingSales): BaseSales[] => {
const mapIndonesianDataToEnglish = (data: any): BaseClosingSales[] => {
if (!data || !data.penjualan || !Array.isArray(data.penjualan)) { if (!data || !data.penjualan || !Array.isArray(data.penjualan)) {
return []; return [];
} }
@@ -120,11 +119,11 @@ const mapIndonesianDataToEnglish = (data: any): BaseClosingSales[] => {
return data.penjualan.map((item: any) => ({ return data.penjualan.map((item: any) => ({
id: item.id, id: item.id,
realization_date: item.tanggal_realisasi, realization_date: item.tanggal_realisasi,
week_age: item.umur_minggu,
age_label: item.umur_label, age_label: item.umur_label,
umur_minggu: item.umur_minggu,
delivery_order_number: item.no_do, delivery_order_number: item.no_do,
product: item.produk, product: item.produk,
jenis_produk: item.jenis_produk, product_category: item.jenis_produk,
customer: item.customer, customer: item.customer,
quantity: item.qty, quantity: item.qty,
weight: item.kg, weight: item.kg,
@@ -132,6 +131,7 @@ const mapIndonesianDataToEnglish = (data: any): BaseClosingSales[] => {
price: item.harga, price: item.harga,
total: item.total, total: item.total,
kandang: item.kandang, kandang: item.kandang,
kandang_id: item.kandang_id,
payment_status: item.status_pembayaran, payment_status: item.status_pembayaran,
})); }));
}; };
@@ -143,16 +143,14 @@ const SalesReportTable = ({
}: SalesReportTableProps) => { }: SalesReportTableProps) => {
const [activeTabId, setActiveTabId] = useState<string>('penjualan'); const [activeTabId, setActiveTabId] = useState<string>('penjualan');
const salesBroilerData: BaseClosingSales[] = useMemo(() => { const salesBroilerData: BaseSales[] = useMemo(() => {
if (activeTabId === 'penjualan' && initialValues) { if (activeTabId === 'penjualan' && initialValues) {
// TODO: TEMPORARY - Remove this when backend API returns English field names // TODO: TEMPORARY - Remove this when backend API returns English field names
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
if (initialValues.penjualan && Array.isArray(initialValues.penjualan)) { if (initialValues.penjualan && Array.isArray(initialValues.penjualan)) {
return mapIndonesianDataToEnglish(initialValues); return mapIndonesianDataToEnglish(initialValues);
} }
// END TODO // END TODO
return [initialValues]; return [];
} }
return []; return [];
}, [initialValues, activeTabId]); }, [initialValues, activeTabId]);
@@ -208,7 +206,7 @@ const SalesReportTable = ({
}; };
}, [salesBroilerData]); }, [salesBroilerData]);
const salesColumns: ColumnDef<BaseClosingSales>[] = useMemo( const salesColumns: ColumnDef<BaseSales>[] = useMemo(
() => [ () => [
{ {
id: 'realization_date', id: 'realization_date',
@@ -418,9 +416,7 @@ const SalesReportTable = ({
label: 'Penjualan', label: 'Penjualan',
content: ( content: (
<div className='p-4'> <div className='p-4'>
<h2 className='text-xl font-semibold mb-4'> <h2 className='text-xl font-semibold mb-4'>Penjualan</h2>
Penjualan {'(diisi dengan jenis penjualan)'}
</h2>
<Card <Card
className={{ className={{
wrapper: 'w-full bg-base-100', wrapper: 'w-full bg-base-100',
@@ -486,6 +482,78 @@ const SalesReportTable = ({
variant='lifted' variant='lifted'
/> />
</section> </section>
<section className='w-ful'>
<Card
collapsible={true}
defaultCollapsed={true}
className={{ wrapper: 'w-full bg-base-100' }}
title='(Latest) API Response Sample BE for Sales Report Data'
>
<pre>
{JSON.stringify(
{
code: 200,
status: 'success',
message: 'Retrieved sales report successfully',
data: {
project_type: 'GROWING',
flock_id: '1',
period: 10,
sales: [
{
id: 1,
realization_date: '2025-12-05T02:22:17.443165Z',
age: 20,
do_number: 'SO-DO-10001',
product: {
id: 1,
name: 'Laptop Gaming X500',
product_price: 15000000,
selling_price: 16500000.5,
uom: {
id: 1,
name: 'KG',
},
flags: ['Best Seller', 'New Arrival'],
product_category: {
id: 5,
name: 'Elektronik',
code: 'DOC',
},
},
customer: {
id: 12345,
name: 'PT. Solusi Teknologi Nusantara',
type: 'Perusahaan',
account_number: 'ACC1234567890',
balance: 5000000.75,
pic: {
id: 101,
name: 'Budi Santoso',
email: 'budi.santoso@example.com',
role: 'Manajer Akun',
},
},
qty: 6348,
weight: 19142,
avg_weight: 3.02,
price: 26419,
total_price: 505712498,
kandang: {
id: 1,
name: 'cibeber 1',
},
payment_status: 'Paid',
},
],
},
},
null,
2
)}
</pre>
</Card>
</section>
</> </>
); );
}; };