'use client'; import { useFormik } from 'formik'; import toast from 'react-hot-toast'; import { useSearchParams } from 'next/navigation'; import Link from 'next/link'; import { Icon } from '@iconify/react'; import Button from '@/components/Button'; import RequirePermission from '@/components/helper/RequirePermission'; import Card from '@/components/Card'; import DropFileInput from '@/components/input/DropFileInput'; import { Expense } from '@/types/api/expense'; import { formatCurrency, formatDate } from '@/lib/helper'; import { UploadRequestDocumentsFormSchema, UploadRequestDocumentsFormValues, } from '@/components/pages/expense/form/ExpenseRequestForm.schema'; import { ExpenseApi } from '@/services/api/expense'; import { isResponseSuccess } from '@/lib/api-helper'; import { buildExpenseActionHref } from '@/lib/expense-list-navigation'; import { ACCEPTED_FILE_TYPE, S3_PUBLIC_BASE_URL } from '@/config/constant'; interface ExpenseRealizationContentProps { initialValues?: Expense; } const ExpenseRealizationContent = ({ initialValues, }: ExpenseRealizationContentProps) => { const searchParams = useSearchParams(); const formik = useFormik({ initialValues: { documents: [], }, validationSchema: UploadRequestDocumentsFormSchema, onSubmit: async (values) => { const addRealizationDocumentsRes = await ExpenseApi.uploadRealizationDocuments( initialValues?.id as number, values.documents ); if (isResponseSuccess(addRealizationDocumentsRes)) { toast.success(addRealizationDocumentsRes.message); window.location.reload(); } else { toast.error(String(addRealizationDocumentsRes?.message)); } }, }); const realizationDocumentsChangeHandler = (val: File[]) => { formik.setFieldTouched('documents', true); const invalidFiles = val.filter((file) => file.size > 5 * 1024 * 1024); if (invalidFiles.length > 0) { toast.error('Ukuran dokumen maksimal 5 MB!'); return; } formik.setFieldValue('documents', val); }; const realizationDocumentsDeleteHandler = (deletedFileIdx: number) => { const newRealizationDocuments = formik.values.documents; newRealizationDocuments?.splice(deletedFileIdx, 1); formik.setFieldValue('documents', newRealizationDocuments); }; return (
Tanggal Realisasi : {initialValues?.realization_date ? formatDate(initialValues?.realization_date, 'DD MMMM YYYY') : '-'}
Dokumen Realisasi :
{!initialValues?.realization_docs || (initialValues?.realization_docs && initialValues?.realization_docs.length === 0 && '-')} {initialValues?.realization_docs && initialValues?.realization_docs.length > 0 && (
    {initialValues?.realization_docs.map( (realizationDocument, realizationDocumentIdx) => { const path = realizationDocument.path.startsWith( '/' ) ? realizationDocument.path.slice(1) : realizationDocument.path; const documentUrl = `${S3_PUBLIC_BASE_URL}/${path}`; return (
  • {realizationDocument.path}{' '}
  • ); } )}
)}
{formik.values.documents && formik.values.documents.length > 0 && ( )}

Nominal Pengajuan

{formatCurrency(initialValues?.total_pengajuan as number)} Terbayar{' '} {formatCurrency(initialValues?.total_realisasi as number)}

Nominal Realisasi

{formatCurrency(initialValues?.total_realisasi as number)} Selisih{' '} {formatCurrency( (initialValues?.total_realisasi as number) - (initialValues?.total_pengajuan as number) )}

Rincian Pengajuan Biaya Operasional

{initialValues?.kandangs.map( (kandangExpense, kandangExpenseIdx) => { let expenseGrandTotal = 0; kandangExpense.pengajuans?.forEach( (item) => (expenseGrandTotal += item.qty * item.price) ); return (
{kandangExpense.pengajuans?.map( (pengajuanItem, pengajuanIdx) => ( ) )}
Biaya {kandangExpense.name}
Nonstock Total Kuantitas Total Biaya Catatan
{pengajuanItem.nonstock.name} {pengajuanItem.qty} {formatCurrency(pengajuanItem.price)} {pengajuanItem.notes ?? '-'}
Total Biaya Keseluruhan: {formatCurrency(expenseGrandTotal)}
); } )}

Rincian Realisasi Biaya Operasional

{initialValues?.kandangs.map( (kandangExpense, kandangExpenseIdx) => { let expenseGrandTotal = 0; kandangExpense.realisasi?.forEach( (item) => (expenseGrandTotal += item.qty * item.price) ); return (
{kandangExpense.realisasi?.map( (realisasiItem, realisasiIdx) => ( ) )}
Biaya {kandangExpense.name}
Nonstock Total Kuantitas Total Biaya Catatan
{realisasiItem.nonstock.name} {realisasiItem.qty} {formatCurrency(realisasiItem.price)} {realisasiItem.notes ?? '-'}
Total Biaya Keseluruhan: {formatCurrency(expenseGrandTotal)}
); } )}
); }; export default ExpenseRealizationContent;