import React, { useState, useEffect } from 'react' import { FaTimes, FaDollarSign, FaFileAlt } from 'react-icons/fa' import { CrmOpportunity, OpportunityStageEnum, LeadSourceEnum, OpportunityStatusEnum, } from '../../../types/crm' import { mockBusinessParties } from '../../../mocks/mockBusinessParties' import { mockEmployees } from '../../../mocks/mockEmployees' import { BusinessParty } from '../../../types/common' import { getOpportunityLeadSourceText, getOpportunityStageText } from '@/utils/erp' import { mockCurrencies } from '@/mocks/mockCurrencies' interface OpportunityFormProps { isOpen: boolean onClose: () => void onSave: (opportunity: CrmOpportunity) => void opportunity?: CrmOpportunity | null mode: 'create' | 'edit' } const OpportunityForm: React.FC = ({ isOpen, onClose, onSave, opportunity, mode, }) => { const [formData, setFormData] = useState({ id: '', opportunityNumber: '', title: '', description: '', customerId: '', contactId: '', stage: OpportunityStageEnum.Qualification, probability: 10, estimatedValue: 0, currency: 'TRY', expectedCloseDate: '', assignedTo: '', teamId: '', leadSource: LeadSourceEnum.Website, campaignId: '', }) const [customers] = useState(mockBusinessParties) const [errors, setErrors] = useState>({}) useEffect(() => { if (opportunity && mode === 'edit') { setFormData({ id: opportunity.id, opportunityNumber: opportunity.opportunityNumber, title: opportunity.title, description: opportunity.description || '', customerId: opportunity.customerId, contactId: opportunity.contactId || '', stage: opportunity.stage, probability: opportunity.probability, estimatedValue: opportunity.estimatedValue, currency: opportunity.currency, expectedCloseDate: opportunity.expectedCloseDate.toISOString().split('T')[0], assignedTo: opportunity.assignedTo, teamId: opportunity.teamId || '', leadSource: opportunity.leadSource, campaignId: opportunity.campaignId || '', }) } else if (mode === 'create') { // Generate new opportunity number const newNumber = `OPP-${Date.now().toString().slice(-6)}` setFormData({ id: `opp_${Date.now()}`, opportunityNumber: newNumber, title: '', description: '', customerId: '', contactId: '', stage: OpportunityStageEnum.Qualification, probability: 10, estimatedValue: 0, currency: 'TRY', expectedCloseDate: '', assignedTo: 'Mevcut Kullanıcı', teamId: '', leadSource: LeadSourceEnum.Website, campaignId: '', }) } }, [opportunity, mode, isOpen]) const handleInputChange = ( e: React.ChangeEvent, ) => { const { name, value } = e.target setFormData((prev) => ({ ...prev, [name]: value, })) // Clear error when user starts typing if (errors[name]) { setErrors((prev) => ({ ...prev, [name]: '', })) } } const validateForm = () => { const newErrors: Record = {} if (!formData.title.trim()) { newErrors.title = 'Fırsat başlığı zorunludur' } if (!formData.customerId) { newErrors.customerId = 'Müşteri seçimi zorunludur' } if (formData.estimatedValue <= 0) { newErrors.estimatedValue = "Tahmini değer 0'dan büyük olmalıdır" } if (!formData.expectedCloseDate) { newErrors.expectedCloseDate = 'Beklenen kapanış tarihi zorunludur' } if (formData.probability < 0 || formData.probability > 100) { newErrors.probability = 'Olasılık 0-100 arasında olmalıdır' } setErrors(newErrors) return Object.keys(newErrors).length === 0 } const handleSubmit = (e: React.FormEvent) => { e.preventDefault() if (!validateForm()) { return } const opportunityData: CrmOpportunity = { id: formData.id, opportunityNumber: formData.opportunityNumber, title: formData.title, description: formData.description, customerId: formData.customerId, contactId: formData.contactId || undefined, stage: formData.stage, probability: formData.probability, estimatedValue: formData.estimatedValue, currency: formData.currency, expectedCloseDate: new Date(formData.expectedCloseDate), assignedTo: formData.assignedTo, teamId: formData.teamId || undefined, leadSource: formData.leadSource, campaignId: formData.campaignId || undefined, status: formData.stage === OpportunityStageEnum.ClosedWon ? OpportunityStatusEnum.Won : formData.stage === OpportunityStageEnum.ClosedLost ? OpportunityStatusEnum.Lost : OpportunityStatusEnum.Open, activities: [], competitors: [], creationTime: opportunity?.creationTime || new Date(), lastModificationTime: new Date(), } onSave(opportunityData) onClose() } if (!isOpen) return null return (
{/* Header */}

{mode === 'create' ? 'Yeni Fırsat Oluştur' : 'Fırsat Düzenle'}

{/* Form */}
{/* Basic Information */}

Temel Bilgiler

{errors.title &&

{errors.title}

}