import React from "react"; import { useFormik } from "formik"; import * as Yup from "yup"; import { FaSave, FaTimes } from "react-icons/fa"; import { QualityStatusEnum, MmLotNumber, MmUnit, MmMaterial, } from "../../../types/mm"; import { BusinessParty } from "../../../types/common"; const validationSchema = Yup.object({ materialId: Yup.string().required("Malzeme seçimi zorunlu"), lotNumber: Yup.string().required("Lot numarası zorunlu"), quantity: Yup.number().min(0, "Miktar 0'dan büyük olmalıdır"), }); interface LotFormProps { isOpen: boolean; onClose: () => void; onSave: (lot: MmLotNumber) => void; onUpdate?: (lot: MmLotNumber) => void; materials: MmMaterial[]; suppliers?: BusinessParty[]; units?: MmUnit[]; initial?: MmLotNumber | null; mode?: "create" | "edit" | "view"; } const LotForm: React.FC = ({ isOpen, onClose, onSave, onUpdate, materials, suppliers = [], units = [], initial = null, mode = "create", }) => { const formik = useFormik({ initialValues: { materialId: "", lotNumber: "", productionDate: "", expiryDate: "", quantity: 0, unitId: "KG", supplierId: suppliers.length ? suppliers[0].id : "", qualityStatus: QualityStatusEnum.Pending, isActive: true, }, validationSchema, onSubmit: async (values) => { const newLot: MmLotNumber = { id: (initial && initial.id) || Date.now().toString(), materialId: values.materialId, lotNumber: values.lotNumber, productionDate: values.productionDate ? new Date(values.productionDate) : new Date(), expiryDate: values.expiryDate ? new Date(values.expiryDate) : undefined, quantity: Number(values.quantity), unitId: values.unitId, supplierId: values.supplierId || undefined, qualityStatus: values.qualityStatus, isActive: !!values.isActive, }; // simulate API await new Promise((r) => setTimeout(r, 300)); if (mode === "edit" && onUpdate) { onUpdate(newLot); } else { onSave(newLot); } onClose(); }, }); // sync initial values when editing/viewing React.useEffect(() => { if (initial) { const src = initial; formik.setValues({ materialId: src.materialId || "", lotNumber: src.lotNumber || "", productionDate: src.productionDate ? new Date(src.productionDate).toISOString().slice(0, 10) : "", expiryDate: src.expiryDate ? new Date(src.expiryDate).toISOString().slice(0, 10) : "", quantity: src.quantity || 0, unitId: src.unitId || (units.length ? units[0].id : ""), supplierId: src.supplierId || (suppliers.length ? suppliers[0].id : ""), qualityStatus: src.qualityStatus || QualityStatusEnum.Pending, isActive: !!src.isActive, }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [initial]); if (!isOpen) return null; return (

{mode === "create" ? "Yeni Lot Kaydı" : mode === "edit" ? "Lot Düzenle" : "Lot Detayı"}

{mode === "create" ? "Lot bilgilerini girin" : mode === "edit" ? "Mevcut lot bilgilerini güncelleyin" : "Lot bilgileri (sadece gösterim)"}

{mode !== "view" && ( )}
); }; export default LotForm;