refactor(FE-208,212,213): update approval steps and improve PurchaseOrderDetail component structure

This commit is contained in:
rstubryan
2025-11-18 14:49:30 +07:00
parent f6cf22f885
commit 00c432a918
2 changed files with 30 additions and 49 deletions
@@ -3,7 +3,9 @@
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
import { ColumnDef, SortingState } from '@tanstack/react-table'; import { ColumnDef, SortingState } from '@tanstack/react-table';
import ApprovalSteps from '@/components/pages/ApprovalSteps'; import ApprovalSteps, {
useApprovalSteps,
} from '@/components/pages/ApprovalSteps';
import Table from '@/components/Table'; import Table from '@/components/Table';
import Button from '@/components/Button'; import Button from '@/components/Button';
import { Icon } from '@iconify/react'; import { Icon } from '@iconify/react';
@@ -33,6 +35,7 @@ import { isResponseError } from '@/lib/api-helper';
import { toast } from 'react-hot-toast'; import { toast } from 'react-hot-toast';
import { useSearchParams } from 'next/navigation'; import { useSearchParams } from 'next/navigation';
import { formatCurrency, formatNumber, formatDate } from '@/lib/helper'; import { formatCurrency, formatNumber, formatDate } from '@/lib/helper';
import { PURCHASE_ORDER_APPROVAL_LINE } from '@/config/approval-line';
const ItemPembelianDropdown = ({ onEdit }: { onEdit: () => void }) => { const ItemPembelianDropdown = ({ onEdit }: { onEdit: () => void }) => {
return ( return (
@@ -104,30 +107,21 @@ const PurchaseOrderDetail = ({
return purchaseOrderItems.filter((item) => item.received_date); return purchaseOrderItems.filter((item) => item.received_date);
}, [purchaseOrderItems]); }, [purchaseOrderItems]);
const approvalSteps = useMemo(() => { const {
if (!initialValues?.approval) return []; approvals,
isLoading: approvalsLoading,
const status = rawDataApprovals,
initialValues.approval.action === 'APPROVED' refresh: refreshApprovals,
? 'APPROVED' } = useApprovalSteps({
: initialValues.approval.action === 'REJECTED' latestApproval: initialValues?.approval,
? 'REJECTED' approvalLines: PURCHASE_ORDER_APPROVAL_LINE,
: 'WAITING'; moduleName: 'PURCHASES',
moduleId: initialValues?.id?.toString() ?? '',
return [ params: {
{ limit: 100,
name: initialValues.approval.step_name, group_step_number: true,
status: status as ApprovalStepStatus, },
logs: [ });
{
action_by: initialValues.approval.action_by?.name,
date: initialValues.approval.action_at,
notes: initialValues.approval.notes,
},
],
},
];
}, [initialValues?.approval]);
const totalBeforeTax = useMemo(() => { const totalBeforeTax = useMemo(() => {
return purchaseOrderItems.reduce( return purchaseOrderItems.reduce(
@@ -262,7 +256,7 @@ const PurchaseOrderDetail = ({
}, },
}, },
{ {
accessorKey: 'quantity', accessorKey: 'sub_qty',
header: 'Jumlah', header: 'Jumlah',
cell: (props) => formatNumber(props.getValue() as number), cell: (props) => formatNumber(props.getValue() as number),
}, },
@@ -370,12 +364,7 @@ const PurchaseOrderDetail = ({
cell: (props) => props.row.original.vehicle_number || '-', cell: (props) => props.row.original.vehicle_number || '-',
}, },
{ {
accessorKey: 'pengangkut', accessorKey: 'total_qty',
header: 'Pengangkut',
cell: (props) => props.row.original.product?.name || '-',
},
{
accessorKey: 'quantity',
header: 'Jumlah Total', header: 'Jumlah Total',
cell: (props) => formatNumber(props.getValue() as number), cell: (props) => formatNumber(props.getValue() as number),
}, },
@@ -384,11 +373,6 @@ const PurchaseOrderDetail = ({
header: 'Jumlah Diterima', header: 'Jumlah Diterima',
cell: (props) => formatNumber(props.getValue() as number), cell: (props) => formatNumber(props.getValue() as number),
}, },
{
accessorKey: 'ekspedisi',
header: 'Ekspedisi',
cell: (props) => 'Ekspedisi 1',
},
{ {
accessorKey: 'price', accessorKey: 'price',
header: 'Transport /Item', header: 'Transport /Item',
@@ -475,13 +459,9 @@ const PurchaseOrderDetail = ({
</div> </div>
{/* Steps */} {/* Steps */}
{approvalSteps.length > 0 ? ( {approvals && !approvalsLoading && (
<div className='my-8'> <div className='my-8'>
<ApprovalSteps approvals={approvalSteps} /> <ApprovalSteps approvals={approvals} />
</div>
) : (
<div className='text-center py-8'>
<p className='text-gray-500'>Status approval tidak tersedia</p>
</div> </div>
)} )}
@@ -543,17 +523,18 @@ const PurchaseOrderDetail = ({
<div className='group'> <div className='group'>
<div className='flex items-start'> <div className='flex items-start'>
<span className='font-medium text-gray-600 min-w-[140px] flex-shrink-0'> <span className='font-medium text-gray-600 min-w-[140px] flex-shrink-0'>
Nama Supplier Nama Vendor
</span> </span>
<span className='text-gray-900 font-medium ml-3 break-all'> <span className='text-gray-900 font-medium ml-3 break-all'>
: {purchaseData.supplier?.name || '-'} : {purchaseData.supplier?.name || '-'} (
{purchaseData.supplier?.alias || ''})
</span> </span>
</div> </div>
</div> </div>
<div className='group'> <div className='group'>
<div className='flex items-start'> <div className='flex items-start'>
<span className='font-medium text-gray-600 min-w-[140px] flex-shrink-0'> <span className='font-medium text-gray-600 min-w-[140px] flex-shrink-0'>
Kategori Supplier Kategori Vendor
</span> </span>
<span className='text-gray-900 ml-3 break-all'> <span className='text-gray-900 ml-3 break-all'>
: {purchaseData.supplier?.category || '-'} : {purchaseData.supplier?.category || '-'}
+3 -3
View File
@@ -40,15 +40,15 @@ export const PURCHASE_ORDER_APPROVAL_LINE: ApprovalLine = [
}, },
{ {
step_number: 2, step_number: 2,
step_name: 'Approval Purchasing', step_name: 'Staff Purchase',
}, },
{ {
step_number: 3, step_number: 3,
step_name: 'Approval Manager Purchasing', step_name: 'Manager Purchase',
}, },
{ {
step_number: 4, step_number: 4,
step_name: 'Produk Diterima', step_name: 'Penerimaan Produk',
}, },
{ {
step_number: 5, step_number: 5,