fix: claim_id теперь генерируется только на бэкенде (n8n)
- ❌ Удалена локальная генерация claim_id в ClaimForm.tsx - ✅ claim_id создаётся n8n при SMS верификации - ✅ Step1Phone: передаёт session_id в n8n, сохраняет claim_id - ✅ Step1Policy: сохраняет claim_id из ответа n8n при проверке полиса - ✅ Добавлено детальное логирование для отладки - 📝 PROJECT_TIMELINE.md - полная хронология проекта (24 окт - 1 ноя)
This commit is contained in:
@@ -94,20 +94,37 @@ export default function Step1Phone({
|
||||
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 })
|
||||
body: JSON.stringify({
|
||||
phone,
|
||||
session_id: formData.session_id // ✅ Передаём session_id
|
||||
})
|
||||
});
|
||||
|
||||
const crmResult = await crmResponse.json();
|
||||
|
||||
console.log('🔥 N8N CRM Response:', crmResult);
|
||||
console.log('🔥 claim_id from n8n:', crmResult.claim_id);
|
||||
console.log('🔥 Array check:', Array.isArray(crmResult), crmResult[0]);
|
||||
|
||||
if (crmResponse.ok) {
|
||||
addDebugEvent?.('crm', 'success', `✅ Контакт создан/найден в CRM`, crmResult);
|
||||
|
||||
// Если n8n вернул массив - берём первый элемент
|
||||
const data = Array.isArray(crmResult) ? crmResult[0] : crmResult;
|
||||
|
||||
console.log('🔥 Saving to formData:', {
|
||||
phone,
|
||||
contact_id: data.contact_id,
|
||||
claim_id: data.claim_id,
|
||||
is_new_contact: data.is_new_contact
|
||||
});
|
||||
|
||||
// Сохраняем данные из CRM в форму
|
||||
updateFormData({
|
||||
phone,
|
||||
contact_id: crmResult.contact_id,
|
||||
claim_id: crmResult.claim_id,
|
||||
is_new_contact: crmResult.is_new_contact
|
||||
contact_id: data.contact_id,
|
||||
claim_id: data.claim_id,
|
||||
is_new_contact: data.is_new_contact
|
||||
});
|
||||
|
||||
message.success(crmResult.is_new_contact ? 'Контакт создан!' : 'Контакт найден!');
|
||||
|
||||
@@ -228,7 +228,12 @@ export default function Step1Policy({ formData, updateFormData, onNext, addDebug
|
||||
voucher: values.voucher
|
||||
});
|
||||
message.success(`Полис найден: ${result.policy.voucher}. Застрахованных: ${result.policy.count} чел.`);
|
||||
updateFormData(values);
|
||||
|
||||
// ✅ Сохраняем claim_id из ответа n8n (если есть) или используем существующий
|
||||
updateFormData({
|
||||
...values,
|
||||
claim_id: result.claim?.claim_id || formData.claim_id
|
||||
});
|
||||
onNext();
|
||||
} else {
|
||||
// Полис НЕ найден - показываем загрузку скана
|
||||
@@ -239,6 +244,13 @@ export default function Step1Policy({ formData, updateFormData, onNext, addDebug
|
||||
voucher: values.voucher
|
||||
});
|
||||
message.warning('Полис не найден в базе. Загрузите скан полиса');
|
||||
|
||||
// ✅ Сохраняем claim_id из ответа n8n (если есть) или используем существующий
|
||||
updateFormData({
|
||||
...values,
|
||||
claim_id: result.claim?.claim_id || formData.claim_id
|
||||
});
|
||||
|
||||
setPolicyNotFound(true);
|
||||
}
|
||||
} else {
|
||||
@@ -283,7 +295,11 @@ export default function Step1Policy({ formData, updateFormData, onNext, addDebug
|
||||
count: fileList.length
|
||||
});
|
||||
|
||||
// Генерируем claim_id если его нет
|
||||
// ✅ Используем claim_id из formData (создан в Step1Phone или получен от n8n)
|
||||
if (!formData.claim_id) {
|
||||
console.warn('⚠️ claim_id отсутствует! Генерирую новый. Возможна ошибка в флоу Step1Phone → Step2Policy');
|
||||
addDebugEvent?.('claim_id', 'warning', 'claim_id отсутствует, генерирую fallback');
|
||||
}
|
||||
const claimId = formData.claim_id || `CLM-${new Date().toISOString().split('T')[0]}-${Math.random().toString(36).substr(2, 6).toUpperCase()}`;
|
||||
|
||||
// Загружаем каждый файл через n8n вебхук
|
||||
|
||||
@@ -43,12 +43,8 @@ interface FormData {
|
||||
}
|
||||
|
||||
export default function ClaimForm() {
|
||||
// Генерируем claim_id один раз при загрузке формы
|
||||
const [claimId] = useState(() => {
|
||||
const date = new Date().toISOString().split('T')[0];
|
||||
const randomId = Math.random().toString(36).substr(2, 6).toUpperCase();
|
||||
return `CLM-${date}-${randomId}`;
|
||||
});
|
||||
// ✅ claim_id будет создан n8n в Step1Phone после SMS верификации
|
||||
// Не генерируем его локально!
|
||||
|
||||
// Генерируем session_id и сохраняем в sessionStorage
|
||||
const [sessionId] = useState(() => {
|
||||
@@ -63,13 +59,16 @@ export default function ClaimForm() {
|
||||
const [currentStep, setCurrentStep] = useState(0);
|
||||
const [formData, setFormData] = useState<FormData>({
|
||||
voucher: '',
|
||||
claim_id: claimId,
|
||||
claim_id: undefined, // ✅ Будет заполнен n8n в Step1Phone
|
||||
session_id: sessionId,
|
||||
paymentMethod: 'sbp',
|
||||
});
|
||||
const [isPhoneVerified, setIsPhoneVerified] = useState(false);
|
||||
const [debugEvents, setDebugEvents] = useState<any[]>([]);
|
||||
|
||||
// 🔥 VERSION CHECK: Если видишь это в консоли - фронт обновился!
|
||||
console.log('🔥 ClaimForm v2.0 - claim_id НЕ генерируется на фронте!');
|
||||
|
||||
// Динамически определяем список шагов на основе выбранного eventType
|
||||
const documentConfigs = formData.eventType ? getDocumentsForEventType(formData.eventType) : [];
|
||||
const totalDocumentSteps = documentConfigs.length;
|
||||
@@ -82,20 +81,13 @@ export default function ClaimForm() {
|
||||
message,
|
||||
data: {
|
||||
...data,
|
||||
claim_id: claimId // Добавляем claim_id во все события
|
||||
claim_id: formData.claim_id // ✅ Используем claim_id из formData (от n8n)
|
||||
}
|
||||
};
|
||||
setDebugEvents(prev => [event, ...prev]);
|
||||
};
|
||||
|
||||
// Логируем генерацию claim_id и session_id при первой загрузке
|
||||
useState(() => {
|
||||
addDebugEvent('system', 'info', `🆔 Сгенерирован Claim ID: ${claimId}`, {
|
||||
claim_id: claimId,
|
||||
session_id: sessionId,
|
||||
timestamp: new Date().toISOString()
|
||||
});
|
||||
});
|
||||
// ✅ claim_id будет залогирован в Step1Phone после получения от n8n
|
||||
|
||||
const updateFormData = useCallback((data: Partial<FormData>) => {
|
||||
setFormData((prev) => ({ ...prev, ...data }));
|
||||
@@ -127,7 +119,7 @@ export default function ClaimForm() {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
body: JSON.stringify({
|
||||
claim_id: claimId,
|
||||
claim_id: formData.claim_id, // ✅ Используем claim_id от n8n
|
||||
voucher: formData.voucher,
|
||||
email: formData.email,
|
||||
phone: formData.phone,
|
||||
@@ -146,10 +138,10 @@ export default function ClaimForm() {
|
||||
message.success(`Заявка ${result.claim_number} успешно создана!`);
|
||||
addDebugEvent('form', 'success', `✅ Заявка ${result.claim_number} создана`);
|
||||
|
||||
// Сброс формы
|
||||
// Сброс формы (создаём новую заявку, claim_id будет сгенерирован при следующем SMS)
|
||||
setFormData({
|
||||
voucher: '',
|
||||
claim_id: claimId,
|
||||
claim_id: undefined, // ✅ Очищаем для новой заявки
|
||||
session_id: sessionId,
|
||||
paymentMethod: 'sbp',
|
||||
});
|
||||
@@ -164,7 +156,7 @@ export default function ClaimForm() {
|
||||
addDebugEvent('form', 'error', '❌ Ошибка соединения');
|
||||
console.error(error);
|
||||
}
|
||||
}, [formData, claimId, sessionId, addDebugEvent]);
|
||||
}, [formData, sessionId, addDebugEvent]);
|
||||
|
||||
// Динамически генерируем шаги на основе выбранного eventType
|
||||
const steps = useMemo(() => {
|
||||
@@ -176,7 +168,7 @@ export default function ClaimForm() {
|
||||
description: 'Подтверждение по SMS',
|
||||
content: (
|
||||
<Step1Phone
|
||||
formData={{ ...formData, claim_id: claimId, session_id: sessionId }}
|
||||
formData={{ ...formData, session_id: sessionId }} // ✅ claim_id будет создан n8n
|
||||
updateFormData={updateFormData}
|
||||
onNext={nextStep}
|
||||
onPrev={prevStep}
|
||||
@@ -193,7 +185,7 @@ export default function ClaimForm() {
|
||||
description: 'Полис ERV',
|
||||
content: (
|
||||
<Step1Policy
|
||||
formData={{ ...formData, claim_id: claimId, session_id: sessionId }}
|
||||
formData={{ ...formData, session_id: sessionId }} // ✅ claim_id уже в formData от n8n
|
||||
updateFormData={updateFormData}
|
||||
onNext={nextStep}
|
||||
addDebugEvent={addDebugEvent}
|
||||
@@ -244,7 +236,7 @@ export default function ClaimForm() {
|
||||
description: 'Контакты и выплата',
|
||||
content: (
|
||||
<Step3Payment
|
||||
formData={{ ...formData, claim_id: claimId }}
|
||||
formData={formData} // ✅ claim_id уже в formData
|
||||
updateFormData={updateFormData}
|
||||
onPrev={prevStep}
|
||||
onSubmit={handleSubmit}
|
||||
@@ -256,12 +248,12 @@ export default function ClaimForm() {
|
||||
});
|
||||
|
||||
return stepsArray;
|
||||
}, [formData, documentConfigs, isPhoneVerified, claimId, sessionId, nextStep, prevStep, updateFormData, handleSubmit, setIsPhoneVerified, addDebugEvent]);
|
||||
}, [formData, documentConfigs, isPhoneVerified, sessionId, nextStep, prevStep, updateFormData, handleSubmit, setIsPhoneVerified, addDebugEvent]);
|
||||
|
||||
const handleReset = () => {
|
||||
setFormData({
|
||||
voucher: '',
|
||||
claim_id: claimId,
|
||||
claim_id: undefined, // ✅ Очищаем для новой заявки
|
||||
session_id: sessionId,
|
||||
paymentMethod: 'sbp',
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user