Files
erv-clientright/miniapp/database.php

214 lines
9.2 KiB
PHP
Raw Permalink Normal View History

2026-03-13 10:42:01 +03:00
<?php
/**
* Проверка полиса в базе данных
* База данных: ci20465_erv
* Таблица: lexrpiority
*/
// Устанавливаем заголовки сразу
header('Content-Type: application/json; charset=utf-8');
// Загружаем .env
require_once __DIR__ . '/env_loader.php';
// Логирование
$log_file = __DIR__ . '/logs/policy_check.log';
$log_dir = dirname($log_file);
if (!is_dir($log_dir)) {
if (!@mkdir($log_dir, 0755, true)) {
error_log("Не удалось создать директорию для логов: $log_dir");
}
}
function log_message($message) {
global $log_file;
$timestamp = date('Y-m-d H:i:s');
$log_entry = "[$timestamp] $message\n";
// Пытаемся записать в лог
$result = @file_put_contents($log_file, $log_entry, FILE_APPEND);
// Если не удалось записать, пробуем записать в error_log
if ($result === false) {
$error = error_get_last();
error_log("Не удалось записать в лог $log_file: " . ($error['message'] ?? 'неизвестная ошибка'));
error_log("Сообщение для лога: $message");
}
}
if(isset($_POST['action']) && !empty($_POST['action'])) {
$action = $_POST['action'];
switch($action) {
case 'user_verify' : user_verify(); break;
}
exit; // Важно! Завершаем выполнение после обработки действия
}
function user_verify() {
$inn = isset($_POST['inn']) ? trim($_POST['inn']) : '';
if (empty($inn)) {
log_message("Номер полиса не указан");
echo json_encode([
"success" => "false",
"message" => "Номер полиса не указан",
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
// Нормализация номера полиса (Е/А -> E/A)
$inn_original = $inn;
$inn = str_replace(['Е', 'е'], ['E', 'e'], $inn);
$inn = str_replace(['А', 'а'], ['A', 'a'], $inn);
if ($inn_original !== $inn) {
log_message("Номер полиса нормализован: $inn_original -> $inn");
}
log_message("Проверка полиса: " . $inn);
// Проверка через N8N webhook (только номер полиса)
$webhook_url = trim(env('N8N_POLIS_WEBHOOK', ''));
if ($webhook_url !== '') {
$payload = json_encode(['police_number' => $inn]);
log_message("N8N webhook: POST " . $webhook_url . " body=" . $payload);
$ch = curl_init($webhook_url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 20,
CURLOPT_CONNECTTIMEOUT => 10,
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_err = curl_error($ch);
curl_close($ch);
if ($curl_err) {
log_message("N8N webhook ошибка curl: " . $curl_err);
echo json_encode([
"success" => "false",
"message" => "Ошибка при проверке полиса: " . $curl_err,
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
if ($http_code < 200 || $http_code >= 300) {
log_message("N8N webhook HTTP $http_code, body=" . substr($response, 0, 500));
echo json_encode([
"success" => "false",
"message" => "Ошибка при проверке полиса (HTTP $http_code)",
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
$response = trim($response);
if ($response === '') {
log_message("N8N webhook: пустой ответ (HTTP $http_code). Настройте workflow на возврат JSON: {\"success\": true/false, \"message\": \"...\", \"result\": {}}");
echo json_encode([
"success" => "false",
"message" => "Полис не найден",
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
$data = json_decode($response, true);
if ($data === null) {
log_message("N8N webhook: ответ не JSON, body=" . substr($response, 0, 500));
echo json_encode([
"success" => "false",
"message" => "Ошибка при проверке полиса: неверный ответ сервера",
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
// Поддержка двух форматов ответа N8N:
// 1) Стандартный: { "success": true/false, "message": "...", "result": {} }
// 2) Текущий workflow: { "form_data": { "policy_check": { "found": true/false, "policy_info": {} } }, "mysql_results": [{}] }
$found = false;
$result = [];
if (isset($data['success'])) {
$found = (bool)$data['success'];
$result = isset($data['result']) && is_array($data['result']) ? $data['result'] : (isset($data['result']) ? $data['result'] : []);
} elseif (isset($data['form_data']['policy_check'])) {
$pc = $data['form_data']['policy_check'];
$found = !empty($pc['found']);
$result = isset($pc['policy_info']) && is_array($pc['policy_info']) ? $pc['policy_info'] : [];
if (empty($result) && !empty($data['mysql_results'][0]) && is_array($data['mysql_results'][0])) {
$result = $data['mysql_results'][0];
}
}
log_message("N8N webhook ответ: found=" . ($found ? '1' : '0'));
$out = [
"success" => $found ? "true" : "false",
"message" => $found ? (isset($data['message']) ? (string)$data['message'] : 'Полис найден') : (isset($data['message']) ? (string)$data['message'] : 'Полис не найден'),
"result" => $result
];
echo json_encode($out, JSON_UNESCAPED_UNICODE);
return;
}
// Fallback: проверка по БД (если N8N_POLIS_WEBHOOK не задан)
$valid_tariffs_basic = [
'STB0048', 'STB1099', 'STB1100', 'STB2099', 'AVS21500', 'AVS22500'
];
$valid_tariffs_other = [
'SPV0001', 'SPV0002', 'SPV0003', 'SPV0004', 'SPV0005',
'STV0090',
'SPV1001', 'SPV1002', 'SPV1003', 'SPV1004', 'SPV1005',
'SPV2001', 'SPV2002', 'SPV2004', 'SPV2005',
'OPV1001', 'OPV1002', 'OPV1003', 'OPV1004', 'OPV1005',
'OPV2001', 'OPV2002', 'OPV2004', 'OPV2005'
];
$db_host = env('MYSQL_ERV_HOST', env('MYSQL_CRM_HOST', 'localhost'));
$db_user = env('MYSQL_ERV_USER', 'ci20465_erv');
$db_pass = env('MYSQL_ERV_PASSWORD', 'c7vOXbmG');
$db_name = env('MYSQL_ERV_DB', 'ci20465_erv');
log_message("Попытка подключения к БД: host=$db_host, user=$db_user, db=$db_name");
$link = @mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (!$link) {
$error = mysqli_connect_error();
log_message("Ошибка подключения к БД: $error");
echo json_encode([
"success" => "false",
"message" => "Ошибка подключения к базе данных: " . $error,
"result" => ""
], JSON_UNESCAPED_UNICODE);
return;
}
mysqli_set_charset($link, "utf8");
$inn_escaped = mysqli_real_escape_string($link, $inn);
$sql = "SELECT * FROM lexrpiority WHERE voucher = '$inn_escaped' OR voucher LIKE '$inn_escaped/%' OR voucher LIKE '$inn_escaped%' LIMIT 1";
$result = mysqli_query($link, $sql);
if (!$result) {
$error = mysqli_error($link);
log_message("Ошибка SQL: $error");
echo json_encode(["success" => "false", "message" => "Ошибка запроса к базе данных: " . $error, "result" => ""], JSON_UNESCAPED_UNICODE);
mysqli_close($link);
return;
}
$row = mysqli_fetch_assoc($result);
if (!$row) {
log_message("Полис не найден в базе данных");
echo json_encode(["success" => "false", "message" => "Полис не найден", "result" => ""], JSON_UNESCAPED_UNICODE);
mysqli_close($link);
return;
}
$tariff_basic = isset($row['tariff_code_basic']) ? trim($row['tariff_code_basic']) : '';
$tariff_other = isset($row['tariff_code_other']) ? trim($row['tariff_code_other']) : '';
$has_valid_tariff = in_array($tariff_basic, $valid_tariffs_basic) || in_array($tariff_other, $valid_tariffs_other);
if ($has_valid_tariff) {
echo json_encode(["success" => "true", "message" => "Полис найден", "result" => $row], JSON_UNESCAPED_UNICODE);
} else {
echo json_encode(["success" => "false", "message" => "Ваш полис не включает покрытие задержки рейса", "result" => ""], JSON_UNESCAPED_UNICODE);
}
mysqli_close($link);
}
?>