/** * PartidaModal - Modal para crear/editar partidas de contrato */ import { useState } from 'react'; import { useCreateContractPartida, useUpdateContractPartida, } from '../../hooks/useContracts'; import type { ContractPartida, CreateContractPartidaDto, } from '../../types/contracts.types'; import { Modal, ModalFooter, TextInput, FormGroup, } from '../common'; interface PartidaModalProps { contractId: string; partida: ContractPartida | null; onClose: () => void; } export function PartidaModal({ contractId, partida, onClose }: PartidaModalProps) { const createMutation = useCreateContractPartida(); const updateMutation = useUpdateContractPartida(); const [formData, setFormData] = useState({ conceptoId: partida?.conceptoId || '', conceptoCode: partida?.conceptoCode || '', conceptoDescription: partida?.conceptoDescription || '', quantity: partida?.quantity || 0, unitPrice: partida?.unitPrice || 0, }); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const payload: CreateContractPartidaDto = { conceptoId: formData.conceptoId, quantity: formData.quantity, unitPrice: formData.unitPrice, }; if (partida) { await updateMutation.mutateAsync({ contractId, partidaId: partida.id, data: { quantity: formData.quantity, unitPrice: formData.unitPrice, }, }); } else { await createMutation.mutateAsync({ contractId, data: payload }); } onClose(); }; const update = (field: K, value: typeof formData[K]) => { setFormData({ ...formData, [field]: value }); }; const isLoading = createMutation.isPending || updateMutation.isPending; const total = formData.quantity * formData.unitPrice; const formatCurrency = (value: number) => { return new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN', }).format(value); }; return ( } >
{/* Concepto Selection - In a real app this would be a searchable select */} update('conceptoId', e.target.value)} placeholder="UUID del concepto" disabled={!!partida} /> {partida && (

Concepto

{partida.conceptoCode || 'N/A'}

{partida.conceptoDescription || '-'}

)} update('quantity', parseFloat(e.target.value) || 0)} placeholder="0.00" min="0" step="0.01" /> update('unitPrice', parseFloat(e.target.value) || 0)} placeholder="0.00" min="0" step="0.01" /> {/* Total Calculated */}
Total: {formatCurrency(total)}
); }