fix: Интеграция n8n webhook для создания контакта после SMS
- Step1Phone теперь вызывает n8n webhook после SMS верификации - Webhook создаёт/находит контакт в CRM через CreateWebContact - Возвращает: contact_id, claim_id, is_new_contact - Данные сохраняются в formData для дальнейшей работы - Исправлена нормализация телефона в sms_service (убираем +) - Отключен rate limiting SMS для тестирования - Backend подключён к внешнему Redis (crm.clientright.ru:6379) - Добавлены поля contact_id, is_new_contact в FormData - Frontend пересобран с новым кодом
This commit is contained in:
@@ -86,7 +86,40 @@ export default function Step1Phone({
|
||||
addDebugEvent?.('sms', 'success', `✅ Телефон подтвержден успешно`, { phone, verified: true });
|
||||
message.success('Телефон подтвержден!');
|
||||
setIsPhoneVerified(true);
|
||||
onNext();
|
||||
|
||||
// После верификации создаём контакт в CRM через n8n
|
||||
try {
|
||||
addDebugEvent?.('crm', 'info', '📞 Создание контакта в CRM...', { phone });
|
||||
|
||||
const crmResponse = await fetch('https://n8n.clientright.pro/webhook/511fde97-88bb-4fb4-bea5-cafdc364be27', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ phone })
|
||||
});
|
||||
|
||||
const crmResult = await crmResponse.json();
|
||||
|
||||
if (crmResponse.ok) {
|
||||
addDebugEvent?.('crm', 'success', `✅ Контакт создан/найден в CRM`, crmResult);
|
||||
|
||||
// Сохраняем данные из CRM в форму
|
||||
updateFormData({
|
||||
phone,
|
||||
contact_id: crmResult.contact_id,
|
||||
claim_id: crmResult.claim_id,
|
||||
is_new_contact: crmResult.is_new_contact
|
||||
});
|
||||
|
||||
message.success(crmResult.is_new_contact ? 'Контакт создан!' : 'Контакт найден!');
|
||||
onNext();
|
||||
} else {
|
||||
addDebugEvent?.('crm', 'error', '❌ Ошибка создания контакта в CRM', crmResult);
|
||||
message.error('Ошибка создания контакта в CRM');
|
||||
}
|
||||
} catch (crmError) {
|
||||
addDebugEvent?.('crm', 'error', '❌ Ошибка соединения с CRM', { error: String(crmError) });
|
||||
message.error('Ошибка соединения с CRM');
|
||||
}
|
||||
} else {
|
||||
addDebugEvent?.('sms', 'error', `❌ Неверный код SMS`, { phone, code, error: result.detail });
|
||||
message.error(result.detail || 'Неверный код');
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { useState, useMemo, useCallback } from 'react';
|
||||
import { Steps, Card, message, Row, Col } from 'antd';
|
||||
import Step1Phone from '../components/form/Step1Phone';
|
||||
import Step1Policy from '../components/form/Step1Policy';
|
||||
import Step2EventType from '../components/form/Step2EventType';
|
||||
import StepDocumentUpload from '../components/form/StepDocumentUpload';
|
||||
@@ -11,15 +12,20 @@ import './ClaimForm.css';
|
||||
const { Step } = Steps;
|
||||
|
||||
interface FormData {
|
||||
// Шаг 1: Policy
|
||||
// Шаг 1: Phone
|
||||
phone?: string;
|
||||
contact_id?: string;
|
||||
is_new_contact?: boolean;
|
||||
|
||||
// Шаг 2: Policy
|
||||
voucher: string;
|
||||
claim_id?: string;
|
||||
session_id?: string;
|
||||
|
||||
// Шаг 2: Event Type
|
||||
// Шаг 3: Event Type
|
||||
eventType?: string;
|
||||
|
||||
// Шаги 3+: Documents
|
||||
// Шаги 4+: Documents
|
||||
documents?: Record<string, {
|
||||
uploaded: boolean;
|
||||
data: any;
|
||||
@@ -30,7 +36,6 @@ interface FormData {
|
||||
// Последний шаг: Payment
|
||||
fullName?: string;
|
||||
email?: string;
|
||||
phone?: string;
|
||||
paymentMethod?: string;
|
||||
bankName?: string;
|
||||
cardNumber?: string;
|
||||
@@ -165,7 +170,24 @@ export default function ClaimForm() {
|
||||
const steps = useMemo(() => {
|
||||
const stepsArray: any[] = [];
|
||||
|
||||
// Шаг 1: Policy (всегда)
|
||||
// Шаг 1: Phone (телефон + SMS верификация)
|
||||
stepsArray.push({
|
||||
title: 'Телефон',
|
||||
description: 'Подтверждение по SMS',
|
||||
content: (
|
||||
<Step1Phone
|
||||
formData={{ ...formData, claim_id: claimId, session_id: sessionId }}
|
||||
updateFormData={updateFormData}
|
||||
onNext={nextStep}
|
||||
onPrev={prevStep}
|
||||
isPhoneVerified={isPhoneVerified}
|
||||
setIsPhoneVerified={setIsPhoneVerified}
|
||||
addDebugEvent={addDebugEvent}
|
||||
/>
|
||||
),
|
||||
});
|
||||
|
||||
// Шаг 2: Policy (всегда)
|
||||
stepsArray.push({
|
||||
title: 'Проверка полиса',
|
||||
description: 'Полис ERV',
|
||||
|
||||
Reference in New Issue
Block a user