diff --git a/docker-compose.yml b/docker-compose.yml index e052559..ed83372 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,30 +20,45 @@ services: ports: - "8100:8100" environment: - - REDIS_HOST=crm.clientright.ru - - REDIS_PORT=6379 - - REDIS_PASSWORD=CRM_Redis_Pass_2025_Secure! + - REDIS_URL=redis://redis:6379 + - POSTGRES_URL=postgresql://erv_user:erv_password@postgres:5432/erv_db - RABBITMQ_URL=amqp://admin:tyejvtej@185.197.75.249:5672 - - N8N_POLICY_CHECK_WEBHOOK=https://n8n.clientright.pro/webhook/9eb7bc5b-645f-477d-a5d8-5a346260a265 - - N8N_FILE_UPLOAD_WEBHOOK=https://n8n.clientright.pro/webhook/7e2abc64-eaca-4671-86e4-12786700fe95 + depends_on: + - redis + - postgres networks: - erv-network restart: unless-stopped # Redis для кеширования - # redis: - # image: redis:7-alpine - # ports: - # - "6379:6379" - # volumes: - # - redis_data:/data - # networks: - # - erv-network - # restart: unless-stopped + redis: + image: redis:7-alpine + ports: + - "6379:6379" + volumes: + - redis_data:/data + networks: + - erv-network + restart: unless-stopped # PostgreSQL для логов и аналитики - # postgres: - # Используется внешний PostgreSQL на 147.45.189.234:5432 + postgres: + image: postgres:15-alpine + environment: + - POSTGRES_DB=erv_db + - POSTGRES_USER=erv_user + - POSTGRES_PASSWORD=erv_password + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - erv-network + restart: unless-stopped + +volumes: + redis_data: + postgres_data: networks: erv-network: diff --git a/frontend/src/components/form/Step3Payment.tsx b/frontend/src/components/form/Step3Payment.tsx index 64fb2c7..766147f 100644 --- a/frontend/src/components/form/Step3Payment.tsx +++ b/frontend/src/components/form/Step3Payment.tsx @@ -1,6 +1,6 @@ import { useState } from 'react'; -import { Form, Input, Button, Select, message, Divider } from 'antd'; -import { QrcodeOutlined, MailOutlined } from '@ant-design/icons'; +import { Form, Input, Button, Select, message, Space, Divider } from 'antd'; +import { PhoneOutlined, SafetyOutlined, QrcodeOutlined, MailOutlined } from '@ant-design/icons'; const { Option } = Select; @@ -24,12 +24,96 @@ export default function Step3Payment({ addDebugEvent }: Props) { const [form] = Form.useForm(); - const [codeSent] = useState(false); - const [loading] = useState(false); - const [verifyLoading] = useState(false); + const [codeSent, setCodeSent] = useState(false); + const [loading, setLoading] = useState(false); + const [verifyLoading, setVerifyLoading] = useState(false); const [submitting, setSubmitting] = useState(false); - // Верификация телефона перенесена на шаг 1 + const sendCode = async () => { + try { + const phone = form.getFieldValue('phone'); + if (!phone) { + message.error('Введите номер телефона'); + return; + } + + setLoading(true); + + addDebugEvent?.('sms', 'pending', `📱 Отправляю SMS на ${phone}...`, { phone }); + + const response = await fetch('http://147.45.146.17:8100/api/v1/sms/send', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ phone }), + }); + + const result = await response.json(); + + if (response.ok) { + addDebugEvent?.('sms', 'success', `✅ SMS отправлен (DEBUG mode)`, { + phone, + debug_code: result.debug_code, + message: result.message + }); + message.success('Код отправлен на ваш телефон'); + setCodeSent(true); + if (result.debug_code) { + message.info(`DEBUG: Код ${result.debug_code}`); + } + } else { + addDebugEvent?.('sms', 'error', `❌ Ошибка SMS: ${result.detail}`, { error: result.detail }); + message.error(result.detail || 'Ошибка отправки кода'); + } + } catch (error) { + message.error('Ошибка соединения с сервером'); + } finally { + setLoading(false); + } + }; + + const verifyCode = async () => { + try { + const phone = form.getFieldValue('phone'); + const code = form.getFieldValue('smsCode'); + + if (!code) { + message.error('Введите код из SMS'); + return; + } + + setVerifyLoading(true); + + addDebugEvent?.('sms', 'pending', `🔐 Проверяю SMS код...`, { phone, code }); + + const response = await fetch('http://147.45.146.17:8100/api/v1/sms/verify', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ phone, code }), + }); + + const result = await response.json(); + + if (response.ok) { + addDebugEvent?.('sms', 'success', `✅ Телефон подтвержден успешно`, { + phone, + verified: true + }); + message.success('Телефон подтвержден!'); + setIsPhoneVerified(true); + } else { + addDebugEvent?.('sms', 'error', `❌ Неверный код SMS`, { + phone, + code, + error: result.detail + }); + message.error(result.detail || 'Неверный код'); + } + } catch (error) { + message.error('Ошибка соединения с сервером'); + } finally { + setVerifyLoading(false); + } + }; const handleSubmit = async () => { try { @@ -59,35 +143,106 @@ export default function Step3Payment({ - {/* Блок верификации телефона перенесен на шаг 1 */} - {isPhoneVerified && ( -