✨ 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!
14 KiB
Документация системы ERV Ticket
📋 Общее описание
Это веб-приложение для приёма обращений за страховыми выплатами от клиентов ERV (Европейская страховая компания). Система собирает данные клиентов, проверяет полисы в базе данных, загружает документы и отправляет всё в CRM Vtiger.
🏗️ Архитектура системы
Основные компоненты:
-
Frontend (index.php)
- Многошаговая форма (3 шага)
- SMS-верификация
- Валидация данных
- Загрузка файлов
-
Backend
server.php- обработка и отправка данных в CRMdatabase.php- проверка полисов в БДfileupload.php- загрузка и обработка файловsms-test.php- отправка SMS кодов
-
JavaScript (common.js)
- Логика работы формы
- Валидация полей
- Загрузка файлов
- AJAX-запросы
📊 Процесс работы (Flow)
Шаг 0: SMS-верификация
- Пользователь вводит номер телефона
- Система генерирует 6-значный код
- Отправляет SMS через SigmaSMS API
- Пользователь вводит код подтверждения
- При совпадении открывается доступ к форме
Шаг 1: Проверка полиса и персональные данные
-
Проверка полиса в БД:
- Пользователь вводит номер полиса (формат:
A123-456789илиE123-456789) - AJAX запрос в
database.php - Поиск в таблице
ci20465_erv.lexrpiorityпо полюvoucher - Если найден → автоподстановка дат страхования, скрытие поля загрузки полиса
- Если не найден → требуется загрузить скан полиса
- Пользователь вводит номер полиса (формат:
-
Персональные данные:
- ФИО (фамилия, имя, отчество)
- Дата рождения (с проверкой возраста для несовершеннолетних)
- Банковские реквизиты (БИК, корр.счет, расчетный счет)
- ФИО получателя
- Документы законного представителя (если < 18 лет)
Шаг 2: Описание события
-
Тип события (select):
- Задержка авиарейса (> 3 часов)
- Отмена авиарейса
- Пропуск стыковочного рейса
- Посадка на запасной аэродром
- Задержка поезда
- Отмена поезда
- Задержка/отмена парома
-
Динамические поля (зависят от типа):
- Для стыковочного рейса: дополнительно номер рейса отправления + дата
- Для отмены рейса: подтверждение от авиакомпании
-
Общие поля:
- Дата наступления страхового случая
- Номер рейса/поезда/парома
- Описание ситуации (textarea)
- Подтверждающие документы (посадочный талон, билеты)
Шаг 3: Документы и согласия
- Адрес регистрации
- ИНН (скрыт, заполняется автоматически значением
000000000000) - Код документа (паспорт РФ, военный билет и т.д.)
- Серия и номер документа
- Страна события (выбор из списка)
- Скан документа, удостоверяющего личность
- Согласие с политикой обработки персональных данных
Финальная отправка
- Все файлы загружаются на
https://form.clientright.ru/fileupload_v2.php - Формируется JSON с данными форм (клиент, контрагент, проект, другие поля)
- Отправка на
https://form.clientright.ru/server_webservice2.php - Email-уведомление на
help@clientright.ruиftpl@yandex.ru - Редирект на
https://lexpriority.ru/ok
🗄️ База данных
Подключение:
Host: localhost
Database: ci20465_erv
User: ci20465_erv
Password: c7vOXbmG
Table: lexrpiority
Структура таблицы (предполагаемая):
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 tokenpublicid: форма IDname: '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
📁 Загрузка файлов
Процесс:
-
Валидация на клиенте:
- Максимум 10 файлов
- Форматы:
.pdf,.jpg,.png,.gif,.jpeg - Размер: до 5 МБ каждый
-
Загрузка (
fileupload.phpили удаленныйfileupload_v2.php):- Конвертация изображений в PDF (через ImageMagick
convert) - Объединение всех PDF в один файл (через Ghostscript
gs) - Формат имени:
{translit(docname)}_{дата}_{translit(lastname)}_{страниц}_CTP.pdf
- Конвертация изображений в PDF (через ImageMagick
-
Сохранение:
- Временно в папке
uploads/ - После отправки формы - очистка папки
- Временно в папке
Защита:
- Запрещены исполняемые файлы (.php, .exe, .js и т.д.)
- Замена опасных символов в именах
- Проверка через
is_uploaded_file()
🎨 Frontend технологии
Библиотеки:
- jQuery 3.6.3 - DOM манипуляции
- InputMask - маски ввода (телефон, ИНН, БИК, даты)
- Datepicker - календарь выбора дат
- intlTelInput - международные телефонные номера
- Fancybox - модальные окна (SMS подтверждение, успех)
- heic2any - конвертация HEIC изображений
Маски ввода:
Телефон: 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)
🔐 Безопасность
Проблемы текущей реализации:
⚠️ КРИТИЧНЫЕ:
- Пароли и токены в открытом виде в коде
shell_exec()иexec()без экранирования- SQL-запросы без prepared statements
- Отсутствие CSRF защиты
- Email-адреса в открытом виде
⚠️ ВАЖНЫЕ:
- Нет rate limiting на SMS
- Отсутствует логирование действий
- Нет проверки подлинности сессии
- Файлы сохраняются в веб-доступной папке
📋 Маппинг полей в CRM
Клиент (client):
lastname- Фамилияfirstname- Имяsecondname- Отчествоbirthday- Дата рожденияmobile- Телефонemail- Emailmailingstreet- Адрес регистрацииinn- ИНН
Контрагент (contractor):
accountname- "Филиал ООО РСО ЕВРОИНС Туристическое"inn- 7714312079ogrn- 1037714037426address- Адрес офисаemail- info@erv.ruphone- 84956265800website- 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):
-
Обязательные поля:
- Все
input[type="text"],input[type="email"],textareaбез класса.notvalidate - Исключаются поля с классом
.disabled
- Все
-
Email:
- Регулярное выражение RFC-совместимое
-
Даты:
- Максимальная дата = сегодня (нельзя выбрать будущее)
- Для дат рождения - расчет возраста
-
Файлы:
- Форматы через расширение
- Размер через
file.size
-
Динамическая логика:
- Возраст < 18 → показать поля законного представителя
- Тип события = стыковочный рейс → показать доп. поля
- Тип события = отмена рейса → показать поле подтверждения от АК
🚀 Точки входа и выхода
Точки входа:
index.php- главная страница формыdatabase.php?action=user_verify- AJAX проверка полисаsms-test.php- AJAX отправка SMSfileupload.phpили внешнийfileupload_v2.php- загрузка файлов
Точки выхода:
https://form.clientright.ru/server_webservice2.php- отправка данныхhttps://lexpriority.ru/ok- редирект после успеха- Email-уведомления на
help@clientright.ruиftpl@yandex.ru
🐛 Известные баги и особенности
-
Двойная загрузка jQuery (строки 17 и 18 в index.php)
-
Жестко закодированные значения:
- ИНН = "000000000000" (скрытое поле)
- Направление = "ЕРВ Средства размещения"
- Данные контрагента
-
Закомментированный код:
- Гражданство (огромный select с кодами стран)
- Серия документа (отдельное поле)
- Описание проблемы на шаге 3
-
Таймауты в редиректе:
- 30ms - слишком быстро, пользователь не увидит модалку успеха
-
Отладочный режим:
?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
📝 Заметки для разработчика
Что можно улучшить:
- ✅ Вынести все credentials в
.env - ✅ Использовать prepared statements для SQL
- ✅ Добавить CSRF токены
- ✅ Логирование всех операций
- ✅ Rate limiting на SMS
- ✅ Хранить файлы вне webroot
- ✅ Версионирование API запросов
- ✅ Улучшить обработку ошибок
- ✅ Добавить unit-тесты
- ✅ Документировать API endpoints
Зависимости (composer):
{
"phpmailer/phpmailer": "для отправки email",
"setasign/*": "работа с PDF",
"clegginabox/*": "неизвестная библиотека"
}
Документация обновлена: 23.10.2025