import { Form, Head, router } from '@inertiajs/react'; import { ArrowLeft } from 'lucide-react'; import { useState } from 'react'; import { ConfirmDialog } from '@/components/confirm-dialog'; import { DataTable } from '@/components/data-table'; import InputError from '@/components/input-error'; import { RupiahInput } from '@/components/rupiah-input'; import { Button } from '@/components/ui/button'; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'; import { MONTH_NAMES } from '@/lib/constants'; import { formatCurrency } from '@/lib/utils'; import { destroy as adjustmentDestroy } from '@/routes/admin/finance/payroll-adjustments'; import { index as payrollPeriodsIndex } from '@/routes/admin/finance/payroll-periods'; import { cancel as payrollCancel, pay as payrollPay, } from '@/routes/admin/finance/payrolls'; import { store as adjustmentStore } from '@/routes/admin/finance/payrolls/adjustments'; import type { Payroll, PayrollAdjustment } from './show-columns'; import { createPayrollColumns } from './show-columns'; type Props = { payrollPeriod: { id: number; year: number; month: number; status: string; payrolls: Payroll[]; }; }; export default function PayrollPeriodShow({ payrollPeriod }: Props) { const [paying, setPaying] = useState(null); const [cancelling, setCancelling] = useState(null); const [addingAdjustment, setAddingAdjustment] = useState( null, ); const [deletingAdjustment, setDeletingAdjustment] = useState<{ adjustment: PayrollAdjustment; payrollId: number; } | null>(null); const [adjustmentType, setAdjustmentType] = useState('bonus'); function handlePay() { if (!paying) { return; } router.post( payrollPay(paying.id), {}, { onSuccess: () => setPaying(null), }, ); } function handleCancel() { if (!cancelling) { return; } router.post( payrollCancel(cancelling.id), {}, { onSuccess: () => setCancelling(null), }, ); } function handleDeleteAdjustment() { if (!deletingAdjustment) { return; } router.delete(adjustmentDestroy(deletingAdjustment.adjustment.id), { onSuccess: () => setDeletingAdjustment(null), }); } const columns = createPayrollColumns({ handlePay: (payroll) => setPaying(payroll), handleCancel: (payroll) => setCancelling(payroll), handleAddAdjustment: (payroll) => { setAddingAdjustment(payroll); setAdjustmentType('bonus'); }, handleDeleteAdjustment: (adjustment, payrollId) => { setDeletingAdjustment({ adjustment, payrollId }); }, }); const totalBaseSalary = payrollPeriod.payrolls.reduce( (sum, p) => sum + p.base_salary, 0, ); const totalBonus = payrollPeriod.payrolls.reduce( (sum, p) => sum + p.bonus_amount, 0, ); const totalDeduction = payrollPeriod.payrolls.reduce( (sum, p) => sum + p.deduction_amount, 0, ); const totalAmount = payrollPeriod.payrolls.reduce( (sum, p) => sum + p.total_amount, 0, ); return ( <>

Gaji {MONTH_NAMES[payrollPeriod.month]}{' '} {payrollPeriod.year}

{payrollPeriod.payrolls.length} karyawan · Status:{' '} {payrollPeriod.status === 'open' ? 'Terbuka' : 'Ditutup'}

Total Gaji Pokok

{formatCurrency(totalBaseSalary)}

Total Bonus

{formatCurrency(totalBonus)}

Total Potongan

{formatCurrency(totalDeduction)}

Total Gaji

{formatCurrency(totalAmount)}

{/* Dialog Tambah Penyesuaian */} { if (!open) { setAddingAdjustment(null); setAdjustmentType('bonus'); } }} > {addingAdjustment && (
{ setAddingAdjustment(null); setAdjustmentType('bonus'); }} > {({ errors, processing }) => ( <> Tambah Penyesuaian
)}
)}
{/* Dialog Konfirmasi Bayar */} { if (!open) { setPaying(null); } }} title="Tandai Dibayar" description={`Apakah Anda yakin ingin menandai gaji "${paying?.employee?.user?.user_profile?.full_name}" sebesar ${formatCurrency(paying?.total_amount ?? 0)} sebagai sudah dibayar? Penyesuaian tidak dapat ditambahkan setelah dibayar.`} confirmLabel="Bayar" onConfirm={handlePay} /> {/* Dialog Konfirmasi Batalkan */} { if (!open) { setCancelling(null); } }} title="Batalkan Gaji" description={`Apakah Anda yakin ingin membatalkan gaji "${cancelling?.employee?.user?.user_profile?.full_name}"?`} confirmLabel="Batalkan" onConfirm={handleCancel} /> {/* Dialog Konfirmasi Hapus Penyesuaian */} { if (!open) { setDeletingAdjustment(null); } }} title="Hapus Penyesuaian" description={`Apakah Anda yakin ingin menghapus penyesuaian "${deletingAdjustment?.adjustment.description}" sebesar ${formatCurrency(deletingAdjustment?.adjustment.amount ?? 0)}?`} confirmLabel="Hapus" onConfirm={handleDeleteAdjustment} />
); }