diff --git a/PROJECT_TIMELINE.md b/PROJECT_TIMELINE.md index a685c3b..01d9d3f 100644 --- a/PROJECT_TIMELINE.md +++ b/PROJECT_TIMELINE.md @@ -547,3 +547,4 @@ Last commit: c049ed6 - "fix: Добавлены n8n webhook URLs в docker-compo **Последнее обновление:** 1 ноября 2025, 13:39 MSK **Автор:** Фёдор + AI Assistant (Claude Sonnet 4.5) + diff --git a/frontend/src/components/form/Step2EventType.tsx b/frontend/src/components/form/Step2EventType.tsx index 06adc7d..58b7f6b 100644 --- a/frontend/src/components/form/Step2EventType.tsx +++ b/frontend/src/components/form/Step2EventType.tsx @@ -1,4 +1,4 @@ -import { Form, Select, Button, Card, Alert } from 'antd'; +import { Form, Select, Button, Card, Alert, message } from 'antd'; import { ThunderboltOutlined } from '@ant-design/icons'; import { useState } from 'react'; @@ -9,6 +9,7 @@ interface Props { updateFormData: (data: any) => void; onNext: () => void; onPrev: () => void; + addDebugEvent?: (type: string, status: string, message: string, data?: any) => void; } // Типы страховых случаев @@ -22,15 +23,61 @@ const EVENT_TYPES = [ { value: 'delay_ferry', label: 'Задержка/отмена парома/круиза', icon: '⛴️' }, ]; -const Step2EventType: React.FC = ({ formData, updateFormData, onNext, onPrev }) => { +const Step2EventType: React.FC = ({ formData, updateFormData, onNext, onPrev, addDebugEvent }) => { const [form] = Form.useForm(); const [selectedEventType, setSelectedEventType] = useState(formData.eventType); + const [loading, setLoading] = useState(false); - const handleSubmit = () => { - form.validateFields().then(values => { - updateFormData({ eventType: values.eventType }); - onNext(); - }); + const handleSubmit = async () => { + try { + const values = await form.validateFields(); + setLoading(true); + + addDebugEvent?.('claim', 'pending', `📝 Создаю черновик заявки для типа: ${values.eventType}`); + + // Формируем title из типа события и номера полиса + const eventLabel = EVENT_TYPES.find(e => e.value === values.eventType)?.label || values.eventType; + const title = `${eventLabel} - ${formData.voucher || 'полис не указан'}`; + + // Вызываем n8n webhook для создания черновика заявки + const response = await fetch('https://n8n.clientright.pro/webhook/d5bf4ca6-9e44-44b9-9714-3186ea703e7d', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + claim_id: formData.claim_id, + contact_id: formData.contact_id, + project_id: formData.project_id, + event_type: values.eventType, + title: title, + voucher: formData.voucher, + session_id: formData.session_id + }) + }); + + const result = await response.json(); + + if (response.ok && result.success) { + addDebugEvent?.('claim', 'success', `✅ Черновик заявки создан`, result); + + // Сохраняем данные заявки + updateFormData({ + eventType: values.eventType, + ticket_id: result.result?.ticket_id, + ticket_number: result.result?.ticket_number + }); + + message.success(`Черновик заявки создан: ${result.result?.ticket_number || 'N/A'}`); + onNext(); + } else { + addDebugEvent?.('claim', 'error', `❌ Ошибка создания черновика`, result); + message.error('Ошибка создания черновика заявки'); + } + } catch (error: any) { + addDebugEvent?.('claim', 'error', `❌ Ошибка соединения`, { error: error.message }); + message.error('Ошибка соединения с сервером'); + } finally { + setLoading(false); + } }; const selectedEvent = EVENT_TYPES.find(e => e.value === selectedEventType); @@ -86,11 +133,11 @@ const Step2EventType: React.FC = ({ formData, updateFormData, onNext, onP )}
- -
diff --git a/frontend/src/pages/ClaimForm.tsx b/frontend/src/pages/ClaimForm.tsx index 39ee92e..457e4bf 100644 --- a/frontend/src/pages/ClaimForm.tsx +++ b/frontend/src/pages/ClaimForm.tsx @@ -193,7 +193,7 @@ export default function ClaimForm() { ), }); - // Шаг 2: Event Type Selection (всегда) + // Шаг 3: Event Type Selection (всегда) stepsArray.push({ title: 'Тип события', description: 'Выбор случая', @@ -203,6 +203,7 @@ export default function ClaimForm() { updateFormData={updateFormData} onNext={nextStep} onPrev={prevStep} + addDebugEvent={addDebugEvent} /> ), });