✨ Features: - Migrated ALL files to new S3 structure (Projects, Contacts, Accounts, HelpDesk, Invoice, etc.) - Added Nextcloud folder buttons to ALL modules - Fixed Nextcloud editor integration - WebSocket server for real-time updates - Redis Pub/Sub integration - File path manager for organized storage - Redis caching for performance (Functions.php) 📁 New Structure: Documents/Project/ProjectName_ID/file_docID.ext Documents/Contacts/FirstName_LastName_ID/file_docID.ext Documents/Accounts/AccountName_ID/file_docID.ext 🔧 Technical: - FilePathManager for standardized paths - S3StorageService integration - WebSocket server (Node.js + Docker) - Redis cache for getBasicModuleInfo() - Predis library for Redis connectivity 📝 Scripts: - Migration scripts for all modules - Test pages for WebSocket/SSE/Polling - Documentation (MIGRATION_*.md, REDIS_*.md) 🎯 Result: 15,000+ files migrated successfully!
367 lines
14 KiB
Markdown
367 lines
14 KiB
Markdown
# Документация системы ERV Ticket
|
||
|
||
## 📋 Общее описание
|
||
|
||
Это веб-приложение для приёма обращений за страховыми выплатами от клиентов ERV (Европейская страховая компания). Система собирает данные клиентов, проверяет полисы в базе данных, загружает документы и отправляет всё в CRM Vtiger.
|
||
|
||
---
|
||
|
||
## 🏗️ Архитектура системы
|
||
|
||
### Основные компоненты:
|
||
|
||
1. **Frontend (index.php)**
|
||
- Многошаговая форма (3 шага)
|
||
- SMS-верификация
|
||
- Валидация данных
|
||
- Загрузка файлов
|
||
|
||
2. **Backend**
|
||
- `server.php` - обработка и отправка данных в CRM
|
||
- `database.php` - проверка полисов в БД
|
||
- `fileupload.php` - загрузка и обработка файлов
|
||
- `sms-test.php` - отправка SMS кодов
|
||
|
||
3. **JavaScript (common.js)**
|
||
- Логика работы формы
|
||
- Валидация полей
|
||
- Загрузка файлов
|
||
- AJAX-запросы
|
||
|
||
---
|
||
|
||
## 📊 Процесс работы (Flow)
|
||
|
||
### Шаг 0: SMS-верификация
|
||
1. Пользователь вводит номер телефона
|
||
2. Система генерирует 6-значный код
|
||
3. Отправляет SMS через SigmaSMS API
|
||
4. Пользователь вводит код подтверждения
|
||
5. При совпадении открывается доступ к форме
|
||
|
||
### Шаг 1: Проверка полиса и персональные данные
|
||
1. **Проверка полиса в БД**:
|
||
- Пользователь вводит номер полиса (формат: `A123-456789` или `E123-456789`)
|
||
- AJAX запрос в `database.php`
|
||
- Поиск в таблице `ci20465_erv.lexrpiority` по полю `voucher`
|
||
- Если найден → автоподстановка дат страхования, скрытие поля загрузки полиса
|
||
- Если не найден → требуется загрузить скан полиса
|
||
|
||
2. **Персональные данные**:
|
||
- ФИО (фамилия, имя, отчество)
|
||
- Дата рождения (с проверкой возраста для несовершеннолетних)
|
||
- Банковские реквизиты (БИК, корр.счет, расчетный счет)
|
||
- ФИО получателя
|
||
- Документы законного представителя (если < 18 лет)
|
||
|
||
### Шаг 2: Описание события
|
||
1. **Тип события** (select):
|
||
- Задержка авиарейса (> 3 часов)
|
||
- Отмена авиарейса
|
||
- Пропуск стыковочного рейса
|
||
- Посадка на запасной аэродром
|
||
- Задержка поезда
|
||
- Отмена поезда
|
||
- Задержка/отмена парома
|
||
|
||
2. **Динамические поля** (зависят от типа):
|
||
- Для стыковочного рейса: дополнительно номер рейса отправления + дата
|
||
- Для отмены рейса: подтверждение от авиакомпании
|
||
|
||
3. **Общие поля**:
|
||
- Дата наступления страхового случая
|
||
- Номер рейса/поезда/парома
|
||
- Описание ситуации (textarea)
|
||
- Подтверждающие документы (посадочный талон, билеты)
|
||
|
||
### Шаг 3: Документы и согласия
|
||
1. Адрес регистрации
|
||
2. ИНН (скрыт, заполняется автоматически значением `000000000000`)
|
||
3. Код документа (паспорт РФ, военный билет и т.д.)
|
||
4. Серия и номер документа
|
||
5. Страна события (выбор из списка)
|
||
6. Email
|
||
7. Скан документа, удостоверяющего личность
|
||
8. Согласие с политикой обработки персональных данных
|
||
|
||
### Финальная отправка
|
||
1. Все файлы загружаются на `https://form.clientright.ru/fileupload_v2.php`
|
||
2. Формируется JSON с данными форм (клиент, контрагент, проект, другие поля)
|
||
3. Отправка на `https://form.clientright.ru/server_webservice2.php`
|
||
4. Email-уведомление на `help@clientright.ru` и `ftpl@yandex.ru`
|
||
5. Редирект на `https://lexpriority.ru/ok`
|
||
|
||
---
|
||
|
||
## 🗄️ База данных
|
||
|
||
### Подключение:
|
||
```php
|
||
Host: localhost
|
||
Database: ci20465_erv
|
||
User: ci20465_erv
|
||
Password: c7vOXbmG
|
||
Table: lexrpiority
|
||
```
|
||
|
||
### Структура таблицы (предполагаемая):
|
||
```sql
|
||
lexrpiority:
|
||
- voucher (номер полиса) - VARCHAR
|
||
- insured_from (дата начала страхования) - DATE
|
||
- insured_to (дата окончания страхования) - DATE
|
||
- ... другие поля
|
||
```
|
||
|
||
---
|
||
|
||
## 📤 API интеграции
|
||
|
||
### 1. SigmaSMS API
|
||
**Файл**: `sms-test.php`
|
||
```
|
||
Endpoint: https://online.sigmasms.ru/api/
|
||
Login: kfv.advokat@gmail.com
|
||
Password: s7NRIb
|
||
Token: 27f89492e00973263ff746a655663678fae7203bac8b62919700e489e33b3902
|
||
```
|
||
|
||
### 2. Vtiger CRM Webforms
|
||
**Endpoint**: `https://crm.clientright.ru/modules/Webforms/capture.php`
|
||
|
||
**Параметры**:
|
||
- `__vtrftk`: session token
|
||
- `publicid`: форма ID
|
||
- `name`: 'websiteticket'
|
||
- Поля клиента (lastname, firstname, email, phone и т.д.)
|
||
- Поля контрагента (inn, ogrn, accountname, address и т.д.)
|
||
- Кастомные поля (cf_XXXX)
|
||
- Файлы (вложения)
|
||
|
||
### 3. DaData API
|
||
**Используется для**: автозаполнения реквизитов организации
|
||
```
|
||
Endpoint: https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party
|
||
Token: f5d6928d7490cd44124ccae11a08c7fa5625d48c
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 Загрузка файлов
|
||
|
||
### Процесс:
|
||
1. **Валидация на клиенте**:
|
||
- Максимум 10 файлов
|
||
- Форматы: `.pdf`, `.jpg`, `.png`, `.gif`, `.jpeg`
|
||
- Размер: до 5 МБ каждый
|
||
|
||
2. **Загрузка** (`fileupload.php` или удаленный `fileupload_v2.php`):
|
||
- Конвертация изображений в PDF (через ImageMagick `convert`)
|
||
- Объединение всех PDF в один файл (через Ghostscript `gs`)
|
||
- Формат имени: `{translit(docname)}_{дата}_{translit(lastname)}_{страниц}_CTP.pdf`
|
||
|
||
3. **Сохранение**:
|
||
- Временно в папке `uploads/`
|
||
- После отправки формы - очистка папки
|
||
|
||
### Защита:
|
||
- Запрещены исполняемые файлы (.php, .exe, .js и т.д.)
|
||
- Замена опасных символов в именах
|
||
- Проверка через `is_uploaded_file()`
|
||
|
||
---
|
||
|
||
## 🎨 Frontend технологии
|
||
|
||
### Библиотеки:
|
||
- **jQuery 3.6.3** - DOM манипуляции
|
||
- **InputMask** - маски ввода (телефон, ИНН, БИК, даты)
|
||
- **Datepicker** - календарь выбора дат
|
||
- **intlTelInput** - международные телефонные номера
|
||
- **Fancybox** - модальные окна (SMS подтверждение, успех)
|
||
- **heic2any** - конвертация HEIC изображений
|
||
|
||
### Маски ввода:
|
||
```javascript
|
||
Телефон: 999 999-99-99
|
||
ИНН: 999999999999 (12 цифр)
|
||
БИК: 999999999 (9 цифр)
|
||
Расч. счет: 99999999999999999999 (20 цифр)
|
||
Корр. счет: 99999999999999999999 (20 цифр)
|
||
Дата: 99-99-9999
|
||
SMS код: 999999 (6 цифр)
|
||
Полис: A9{3,5}-*{6,10} (например: A123-456789)
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 Безопасность
|
||
|
||
### Проблемы текущей реализации:
|
||
⚠️ **КРИТИЧНЫЕ**:
|
||
1. Пароли и токены в открытом виде в коде
|
||
2. `shell_exec()` и `exec()` без экранирования
|
||
3. SQL-запросы без prepared statements
|
||
4. Отсутствие CSRF защиты
|
||
5. Email-адреса в открытом виде
|
||
|
||
⚠️ **ВАЖНЫЕ**:
|
||
1. Нет rate limiting на SMS
|
||
2. Отсутствует логирование действий
|
||
3. Нет проверки подлинности сессии
|
||
4. Файлы сохраняются в веб-доступной папке
|
||
|
||
---
|
||
|
||
## 📋 Маппинг полей в CRM
|
||
|
||
### Клиент (client):
|
||
- `lastname` - Фамилия
|
||
- `firstname` - Имя
|
||
- `secondname` - Отчество
|
||
- `birthday` - Дата рождения
|
||
- `mobile` - Телефон
|
||
- `email` - Email
|
||
- `mailingstreet` - Адрес регистрации
|
||
- `inn` - ИНН
|
||
|
||
### Контрагент (contractor):
|
||
- `accountname` - "Филиал ООО РСО ЕВРОИНС Туристическое"
|
||
- `inn` - 7714312079
|
||
- `ogrn` - 1037714037426
|
||
- `address` - Адрес офиса
|
||
- `email` - info@erv.ru
|
||
- `phone` - 84956265800
|
||
- `website` - https://www.erv.ru/
|
||
|
||
### Кастомные поля:
|
||
- `cf_1885` - Номер полиса
|
||
- `cf_1887` - Дата начала страхования
|
||
- `cf_1889` - Дата окончания страхования
|
||
- `cf_1899` - Код документа
|
||
- `cf_1802` - Серия документа
|
||
- `cf_1804` - Номер документа
|
||
- `cf_1909` - Страна события
|
||
- `cf_1945` - ФИО получателя
|
||
- `cf_1265` - Банк
|
||
- `cf_1267` - БИК
|
||
- `cf_1271` - Корр. счет
|
||
- `cf_1269` - Расчетный счет
|
||
- `cf_1273` - Иные реквизиты
|
||
- `cf_1726` - Тип события
|
||
- `cf_2566` - Дата наступления страхового случая
|
||
- `cf_2568` - Номер транспорта
|
||
- `cf_2206` - SMS код
|
||
- `cf_2446` - Флаг проверки полиса в БД (1/0)
|
||
- `cf_2502` - Согласие с политикой
|
||
|
||
---
|
||
|
||
## 🔄 Логика валидации
|
||
|
||
### JavaScript валидация (common.js):
|
||
|
||
1. **Обязательные поля**:
|
||
- Все `input[type="text"]`, `input[type="email"]`, `textarea` без класса `.notvalidate`
|
||
- Исключаются поля с классом `.disabled`
|
||
|
||
2. **Email**:
|
||
- Регулярное выражение RFC-совместимое
|
||
|
||
3. **Даты**:
|
||
- Максимальная дата = сегодня (нельзя выбрать будущее)
|
||
- Для дат рождения - расчет возраста
|
||
|
||
4. **Файлы**:
|
||
- Форматы через расширение
|
||
- Размер через `file.size`
|
||
|
||
5. **Динамическая логика**:
|
||
- Возраст < 18 → показать поля законного представителя
|
||
- Тип события = стыковочный рейс → показать доп. поля
|
||
- Тип события = отмена рейса → показать поле подтверждения от АК
|
||
|
||
---
|
||
|
||
## 🚀 Точки входа и выхода
|
||
|
||
### Точки входа:
|
||
1. `index.php` - главная страница формы
|
||
2. `database.php?action=user_verify` - AJAX проверка полиса
|
||
3. `sms-test.php` - AJAX отправка SMS
|
||
4. `fileupload.php` или внешний `fileupload_v2.php` - загрузка файлов
|
||
|
||
### Точки выхода:
|
||
1. `https://form.clientright.ru/server_webservice2.php` - отправка данных
|
||
2. `https://lexpriority.ru/ok` - редирект после успеха
|
||
3. Email-уведомления на `help@clientright.ru` и `ftpl@yandex.ru`
|
||
|
||
---
|
||
|
||
## 🐛 Известные баги и особенности
|
||
|
||
1. **Двойная загрузка jQuery** (строки 17 и 18 в index.php)
|
||
2. **Жестко закодированные значения**:
|
||
- ИНН = "000000000000" (скрытое поле)
|
||
- Направление = "ЕРВ Средства размещения"
|
||
- Данные контрагента
|
||
|
||
3. **Закомментированный код**:
|
||
- Гражданство (огромный select с кодами стран)
|
||
- Серия документа (отдельное поле)
|
||
- Описание проблемы на шаге 3
|
||
|
||
4. **Таймауты в редиректе**:
|
||
- 30ms - слишком быстро, пользователь не увидит модалку успеха
|
||
|
||
5. **Отладочный режим**:
|
||
- `?demodata=1` - автозаполнение формы тестовыми данными
|
||
|
||
---
|
||
|
||
## 📞 Контакты и доступы
|
||
|
||
### Email:
|
||
- Получатели уведомлений: `help@clientright.ru`, `ftpl@yandex.ru`
|
||
- SMTP отправитель: `ask@fvkorobkov.ru` (пароль: G59UQwYaSl)
|
||
|
||
### SMS:
|
||
- Провайдер: SigmaSMS
|
||
- Sender: "Clientright"
|
||
|
||
### База данных:
|
||
- Host: localhost (141.8.194.131 - закомментирован)
|
||
- База: ci20465_erv
|
||
- Пользователь: ci20465_erv
|
||
- Пароль: c7vOXbmG
|
||
|
||
---
|
||
|
||
## 📝 Заметки для разработчика
|
||
|
||
### Что можно улучшить:
|
||
1. ✅ Вынести все credentials в `.env`
|
||
2. ✅ Использовать prepared statements для SQL
|
||
3. ✅ Добавить CSRF токены
|
||
4. ✅ Логирование всех операций
|
||
5. ✅ Rate limiting на SMS
|
||
6. ✅ Хранить файлы вне webroot
|
||
7. ✅ Версионирование API запросов
|
||
8. ✅ Улучшить обработку ошибок
|
||
9. ✅ Добавить unit-тесты
|
||
10. ✅ Документировать API endpoints
|
||
|
||
### Зависимости (composer):
|
||
```json
|
||
{
|
||
"phpmailer/phpmailer": "для отправки email",
|
||
"setasign/*": "работа с PDF",
|
||
"clegginabox/*": "неизвестная библиотека"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
Документация обновлена: **23.10.2025**
|
||
|