'use client' import React, { useState } from 'react' import { Card, CardContent, Typography, Button, Box, Accordion, AccordionSummary, AccordionDetails, Tooltip, IconButton, CardHeader } from '@mui/material' import Grid from '@mui/material/Grid2' import CustomTextField from '@/@core/components/mui/TextField' import CustomAutocomplete from '@/@core/components/mui/Autocomplete' import ImageUpload from '@/components/ImageUpload' interface PaymentFormData { totalDibayar: string tglTransaksi: string referensi: string nomor: string dibayarDari: string } interface PemotonganItem { id: string dipotong: string persentase: string nominal: string tipe: 'persen' | 'rupiah' } const ExpenseDetailSendPayment: React.FC = () => { const [formData, setFormData] = useState({ totalDibayar: '849.000', tglTransaksi: '10/09/2025', referensi: '', nomor: 'PP/00025', dibayarDari: '1-10001 Kas' }) const [expanded, setExpanded] = useState(false) const [pemotonganItems, setPemotonganItems] = useState([]) const dibayarDariOptions = [ { label: '1-10001 Kas', value: '1-10001 Kas' }, { label: '1-10002 Bank BCA', value: '1-10002 Bank BCA' }, { label: '1-10003 Bank Mandiri', value: '1-10003 Bank Mandiri' }, { label: '1-10004 Petty Cash', value: '1-10004 Petty Cash' } ] const pemotonganOptions = [ { label: 'PPN 11%', value: 'ppn' }, { label: 'PPh 21', value: 'pph21' }, { label: 'PPh 23', value: 'pph23' }, { label: 'Biaya Admin', value: 'admin' } ] const handleChange = (field: keyof PaymentFormData) => (event: React.ChangeEvent | any) => { setFormData(prev => ({ ...prev, [field]: event.target.value })) } const handleDibayarDariChange = (value: { label: string; value: string } | null) => { setFormData(prev => ({ ...prev, dibayarDari: value?.value || '' })) } const addPemotongan = () => { const newItem: PemotonganItem = { id: Date.now().toString(), dipotong: '', persentase: '0', nominal: '', tipe: 'persen' } setPemotonganItems(prev => [...prev, newItem]) } const removePemotongan = (id: string) => { setPemotonganItems(prev => prev.filter(item => item.id !== id)) } const updatePemotongan = (id: string, field: keyof PemotonganItem, value: string) => { setPemotonganItems(prev => prev.map(item => (item.id === id ? { ...item, [field]: value } : item))) } const handleAccordionChange = () => { setExpanded(!expanded) } const calculatePemotongan = (item: PemotonganItem): number => { const totalDibayar = parseInt(formData.totalDibayar.replace(/\D/g, '')) || 0 const nilai = parseFloat(item.persentase) || 0 if (item.tipe === 'persen') { return (totalDibayar * nilai) / 100 } else { return nilai } } const formatCurrency = (amount: string | number): string => { const numAmount = typeof amount === 'string' ? parseInt(amount.replace(/\D/g, '')) : amount return new Intl.NumberFormat('id-ID').format(numAmount) } const handleUpload = async (file: File): Promise => { // Simulate upload return new Promise(resolve => { setTimeout(() => { resolve(URL.createObjectURL(file)) }, 1000) }) } return ( Kirim Pembayaran } /> {/* Left Column */} {/* Total Dibayar */} * Total Dibayar } value={formData.totalDibayar} onChange={handleChange('totalDibayar')} sx={{ '& .MuiInputBase-root': { textAlign: 'right' } }} /> {/* Tgl. Transaksi */} * Tgl. Transaksi } type='date' value={formData.tglTransaksi.split('/').reverse().join('-')} onChange={handleChange('tglTransaksi')} slotProps={{ input: { endAdornment: } }} /> {/* Referensi */} Referensi {/* Attachment Accordion */} } sx={{ backgroundColor: '#f8f9fa', borderRadius: '8px', minHeight: '48px', '& .MuiAccordionSummary-content': { margin: '12px 0' } }} > Attachment {/* Right Column */} {/* Nomor */} Nomor {/* Dibayar Dari */} * Dibayar Dari option.label || ''} value={dibayarDariOptions.find(option => option.value === formData.dibayarDari) || null} onChange={(_, value: { label: string; value: string } | null) => handleDibayarDariChange(value)} renderInput={(params: any) => } noOptionsText='Tidak ada pilihan' /> {/* Empty space to match Referensi height */} {/* Empty space */} {/* Pemotongan Button - aligned with Attachment */} {/* Pemotongan Items */} {pemotonganItems.length > 0 && ( {pemotonganItems.map((item, index) => ( removePemotongan(item.id)} sx={{ backgroundColor: '#fff', border: '1px solid #f44336', '&:hover': { backgroundColor: '#ffebee' } }} > option.label || ''} value={pemotonganOptions.find(option => option.value === item.dipotong) || null} onChange={(_, value: { label: string; value: string } | null) => updatePemotongan(item.id, 'dipotong', value?.value || '') } renderInput={(params: any) => } noOptionsText='Tidak ada pilihan' /> updatePemotongan(item.id, 'persentase', e.target.value)} placeholder='0' sx={{ '& .MuiInputBase-root': { textAlign: 'center' } }} /> {formatCurrency(calculatePemotongan(item))} ))} )} {/* Bottom Section */} {/* Empty space */} Total {formatCurrency(formData.totalDibayar)} ) } export default ExpenseDetailSendPayment