214 lines
9.2 KiB
PHP
214 lines
9.2 KiB
PHP
<?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);
|
||
}
|
||
|
||
?>
|