Files
crm.clientright.ru/erv_ticket/SYSTEM_DOCUMENTATION.md
Fedor 9245768987 🚀 CRM Files Migration & Real-time Features
 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!
2025-10-24 19:59:28 +03:00

367 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Документация системы 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**