'use client' import React, { useState } from 'react' import { Card, CardHeader, CardContent, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Box, Button, IconButton, Menu, MenuItem, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, CircularProgress } from '@mui/material' import Grid from '@mui/material/Grid2' import { PurchaseOrder, SendPaymentPurchaseOrderRequest } from '@/types/services/purchaseOrder' import { usePurchaseOrdersMutation } from '@/services/mutations/purchaseOrder' interface Props { data?: PurchaseOrder } const PurchaseDetailInformation = ({ data }: Props) => { const purchaseOrder = data // State for menu and dialog const [anchorEl, setAnchorEl] = useState(null) const [isSubmitting, setIsSubmitting] = useState(false) const [confirmDialog, setConfirmDialog] = useState<{ open: boolean type: 'approve' | 'reject' | null title: string message: string }>({ open: false, type: null, title: '', message: '' }) const { updateStatus } = usePurchaseOrdersMutation() const handleMenuClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget) } const handleMenuClose = () => { setAnchorEl(null) } const handleApproveClick = () => { setConfirmDialog({ open: true, type: 'approve', title: 'Konfirmasi Persetujuan', message: 'Apakah Anda yakin ingin menyetujui purchase order ini?' }) handleMenuClose() } const handleRejectClick = () => { setConfirmDialog({ open: true, type: 'reject', title: 'Konfirmasi Penolakan', message: 'Apakah Anda yakin ingin menolak purchase order ini?' }) handleMenuClose() } const handleConfirmAction = async () => { if (!purchaseOrder?.id) return setIsSubmitting(true) try { const status = confirmDialog.type === 'approve' ? 'approved' : 'rejected' updateStatus.mutate({ id: purchaseOrder.id, payload: status }) // Close dialog after successful submission setConfirmDialog({ open: false, type: null, title: '', message: '' }) } catch (error) { console.error('Error updating status:', error) // Handle error (you might want to show a toast or error message) } finally { setIsSubmitting(false) } } const handleCancelAction = () => { setConfirmDialog({ open: false, type: null, title: '', message: '' }) } // Helper functions const formatDate = (dateString: string): string => { const date = new Date(dateString) return date.toLocaleDateString('id-ID', { day: '2-digit', month: '2-digit', year: 'numeric' }) } const formatCurrency = (amount: number): string => { return new Intl.NumberFormat('id-ID').format(amount) } const getStatusLabel = (status: string): string => { const statusMap: Record = { draft: 'Draft', sent: 'Dikirim', approved: 'Disetujui', received: 'Diterima', cancelled: 'Dibatalkan', rejected: 'Ditolak' } return statusMap[status] || status } const getStatusColor = (status: string): 'error' | 'success' | 'warning' | 'info' | 'default' => { const colorMap: Record = { draft: 'default', sent: 'warning', approved: 'success', received: 'info', cancelled: 'error', rejected: 'error' } return colorMap[status] || 'info' } // Calculations const totalQuantity = (purchaseOrder?.items ?? []).reduce((sum, item) => sum + (item?.quantity ?? 0), 0) const total = (purchaseOrder?.items ?? []).reduce((sum, item) => sum + (item?.amount ?? 0) * item?.quantity, 0) // Check if actions should be available (only for certain statuses) const canApproveOrReject = purchaseOrder?.status === 'received' return ( <> {getStatusLabel(purchaseOrder?.status ?? '')} } /> {/* Purchase Information */} Vendor {purchaseOrder?.vendor?.name ?? ''} Tgl. Transaksi {formatDate(purchaseOrder?.transaction_date ?? '')} Nomor {purchaseOrder?.po_number} Tgl. Jatuh Tempo {formatDate(purchaseOrder?.due_date ?? '')} {/* Products Table */} Produk Deskripsi Kuantitas Satuan Harga Jumlah {(purchaseOrder?.items ?? []).map((item, index) => { return ( {item.ingredient.name} {item.description} {item.quantity} {item.unit.name} {formatCurrency(item.amount)} {formatCurrency(item.amount * item.quantity)} ) })} {/* Total Quantity Row */} Total Kuantitas {totalQuantity}
{/* Summary Section */} {/* Empty space for left side */} Total {formatCurrency(total)}
{/* Menu */} Disetujui Ditolak {/* Confirmation Dialog */} {confirmDialog.title} {confirmDialog.message} ) } export default PurchaseDetailInformation