'use client'; import Button from '@/components/Button'; import Card from '@/components/Card'; import { FormHeader } from '@/components/helper/form/FormHeader'; import { useModal } from '@/components/Modal'; import ConfirmationModal from '@/components/modal/ConfirmationModal'; import ConfirmationModalWithNotes from '@/components/modal/ConfirmationModalWithNotes'; import ApprovalSteps, { useApprovalSteps, } from '@/components/pages/ApprovalSteps'; import Table from '@/components/Table'; import { MARKETING_APPROVAL_LINE } from '@/config/approval-line'; import { cn, formatCurrency, formatDate, formatNumber, formatVechicleNumber, } from '@/lib/helper'; import { MarketingApi, SalesOrderApi, } from '@/services/api/marketing/marketing'; import { BaseDelivery, BaseSalesOrder, Marketing, } from '@/types/api/marketing/marketing'; import { Icon } from '@iconify/react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import toast from 'react-hot-toast'; import SalesOrderExport from '@/components/pages/marketing/pdf/SalesOrderExport'; import DeliveryOrderExport from '@/components/pages/marketing/pdf/DeliveryOrderExport'; import RequirePermission from '@/components/helper/RequirePermission'; const MarketingDetail = ({ initialValues, refresh, }: { initialValues?: Marketing; refresh?: () => void; }) => { const router = useRouter(); const [approvalAction, setApprovalAction] = useState<'APPROVED' | 'REJECTED'>( 'APPROVED' ); const [grandTotal, setGrandTotal] = useState( initialValues?.sales_order ?.map((item) => item.total_price) .reduce((a, b) => a + b, 0) ); const [isLoading, setIsLoading] = useState(false); const deleteModal = useModal(); const confirmationModal = useModal(); const deliveryModal = useModal(); const { approvals, isLoading: isLoadingApproval, refresh: refreshApproval, } = useApprovalSteps({ latestApproval: initialValues?.latest_approval, approvalLines: MARKETING_APPROVAL_LINE, moduleName: 'MARKETINGS', moduleId: initialValues?.id as number as unknown as string, }); const approveClickHandler = () => { setApprovalAction('APPROVED'); confirmationModal.openModal(); }; const rejectClickHandler = () => { setApprovalAction('REJECTED'); confirmationModal.openModal(); }; const deleteClickHandler = () => { deleteModal.openModal(); }; const confirmationModalDeleteClickHandler = async () => { setIsLoading(true); const res = await MarketingApi.delete(initialValues?.id as number); deleteModal.closeModal(); router.push('/marketing'); toast.success(res?.message as string); refresh?.(); setIsLoading(false); }; const confirmationModalApproveClickHandler = async (notes: string) => { setIsLoading(true); const res = await SalesOrderApi.singleApproval( initialValues?.id as number, approvalAction, notes ); setIsLoading(false); confirmationModal.closeModal(); toast.success(res?.message as string); refresh?.(); refreshApproval?.(); }; const confirmationModalDeliveryClickHandler = async (notes: string) => { setIsLoading(true); const res = await SalesOrderApi.delivery( initialValues?.id as number, notes ); setIsLoading(false); deliveryModal.closeModal(); toast.success(res?.message as string); refresh?.(); refreshApproval?.(); router.push( `/marketing/detail/delivery-orders/edit?marketingId=${initialValues?.id}` ); }; return ( <>
{!isLoadingApproval && approvals && ( )}
{initialValues?.latest_approval?.step_number == 1 && ( <> )} {initialValues?.latest_approval?.step_number != 1 && ( <> )}
No. Sales Order : {initialValues?.so_number}
Nama Pelanggan : {initialValues?.customer?.name}
Status : {initialValues?.latest_approval?.step_name}
Tanggal Penjualan : {formatDate(initialValues?.so_date, 'DD MMM yyyy')}
Total Penjualan : {formatCurrency(grandTotal as number)}
Catatan : {initialValues?.notes ?? '-'}
Dokumen :
{initialValues?.sales_order && ( data={initialValues?.sales_order} columns={[ { header: 'Kandang', accessorFn(row) { return row.product_warehouse.warehouse.name; }, }, { header: 'Produk', accessorFn(row) { return row.product_warehouse.product.name; }, }, { header: 'Harga Satuan (Rp)', accessorFn(row) { return formatCurrency(row.unit_price); }, }, { header: 'Total Bobot (Kg)', accessorFn(row) { return formatNumber(row.total_weight); }, }, { header: 'Kuantitas', accessorFn(row) { return formatNumber(row.qty); }, }, { header: 'Avg. Bobot (Kg)', accessorFn(row) { return formatNumber(row.avg_weight); }, }, { header: 'Total Penjualan (Rp)', accessorFn(row) { return formatCurrency(row.total_price); }, }, ]} className={{ containerClassName: cn({ 'mb-20': initialValues?.sales_order && initialValues?.sales_order?.length === 0, }), tableWrapperClassName: 'overflow-x-auto min-h-full!', tableClassName: 'font-inter w-full table-auto min-h-full!', headerRowClassName: 'border-b border-b-gray-200', headerColumnClassName: 'px-6 py-3 text-xs font-semibold text-gray-500 last:flex last:flex-row last:justify-end', bodyRowClassName: 'border-b border-b-gray-200', bodyColumnClassName: 'px-6 py-3 last:flex last:flex-row last:justify-end', paginationClassName: 'hidden', }} /> )} {initialValues?.delivery_order && ( {initialValues?.delivery_order.map((delivery, index) => { return (
Nomor DO : {delivery.do_number}
data={delivery.deliveries} columns={[ { header: 'Tanggal Pengiriman', accessorFn() { return formatDate( delivery.delivery_date, 'DD MMM yyyy' ); }, }, { header: 'No. Polisi', accessorFn(row) { return formatVechicleNumber(row.vehicle_number); }, }, { header: 'Kandang', accessorFn(row) { return row.product_warehouse.warehouse.name; }, }, { header: 'Produk', accessorFn(row) { return row.product_warehouse.product.name; }, }, { header: 'Harga Satuan (Rp)', accessorFn(row) { return formatCurrency(row.unit_price); }, }, { header: 'Total Bobot (Kg)', accessorFn(row) { return formatNumber(row.total_weight); }, }, { header: 'Kuantitas', accessorFn(row) { return formatNumber(row.qty); }, }, { header: 'Avg. Bobot (Kg)', accessorFn(row) { return formatNumber(row.avg_weight); }, }, { header: 'Total Penjualan (Rp)', accessorFn(row) { return formatCurrency(row.total_price); }, }, ]} className={{ containerClassName: cn({ 'mb-20': initialValues?.sales_order && initialValues?.sales_order?.length === 0, }), tableWrapperClassName: 'overflow-x-auto min-h-full!', tableClassName: 'font-inter w-full table-auto min-h-full!', headerRowClassName: 'border-b border-b-gray-200', headerColumnClassName: 'px-6 py-3 text-xs font-semibold text-gray-500 last:flex last:flex-row last:justify-end', bodyRowClassName: 'border-b border-b-gray-200', bodyColumnClassName: 'px-6 py-3 last:flex last:flex-row last:justify-end', paginationClassName: 'hidden', }} />
); })}
)}
{initialValues?.latest_approval?.step_number != 3 && ( <> )}
); }; export default MarketingDetail;