Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
229 lines
10 KiB
PHP
229 lines
10 KiB
PHP
<?php
|
||
// Включаем обработку ошибок и логирование в САМОМ НАЧАЛЕ
|
||
error_reporting(E_ALL);
|
||
ini_set('display_errors', 0);
|
||
ini_set('log_errors', 1);
|
||
|
||
// Функция для безопасного логирования
|
||
function logIncome($message) {
|
||
$logFile = __DIR__ . '/logs/income.log';
|
||
$logstring = date('Y-m-d H:i:s') . ' ' . $message . PHP_EOL;
|
||
@file_put_contents($logFile, $logstring, FILE_APPEND);
|
||
}
|
||
|
||
// Логируем начало обработки ДО загрузки CRM
|
||
logIncome('=== НАЧАЛО ОБРАБОТКИ ЗАПРОСА ===');
|
||
|
||
// Получаем данные ДО загрузки CRM
|
||
$str = @file_get_contents('php://input');
|
||
if (empty($str)) {
|
||
logIncome('ОШИБКА: Пустой запрос от банка');
|
||
echo "OK"; // Все равно отвечаем OK, чтобы банк не повторял
|
||
exit;
|
||
}
|
||
|
||
logIncome('Получены данные: ' . substr($str, 0, 500) . (strlen($str) > 500 ? '...' : ''));
|
||
|
||
// Пытаемся загрузить CRM, но не падаем если не получилось
|
||
try {
|
||
include_once 'modules/Users/Users.php';
|
||
require_once('include/Webservices/Utils.php');
|
||
require_once 'include/Webservices/Create.php';
|
||
require_once 'include/Webservices/Revise.php';
|
||
require_once 'include/Webservices/AddRelated.php';
|
||
require_once 'includes/Loader.php';
|
||
require_once 'include/utils/WhatsApp.php';
|
||
vimport ('includes.runtime.Globals');
|
||
vimport ('includes.runtime.BaseModel');
|
||
vimport ('includes.runtime.LanguageHandler');
|
||
logIncome('CRM модули загружены успешно');
|
||
} catch (Exception $e) {
|
||
logIncome('ОШИБКА загрузки CRM: ' . $e->getMessage());
|
||
// Продолжаем работу даже если CRM не загрузился
|
||
}
|
||
|
||
// Пересылаем данные на n8n webhook
|
||
logIncome('Начинаем отправку на n8n webhook');
|
||
$n8nWebhookUrl = 'https://n8n.clientright.pro/webhook/tpay';
|
||
$ch = @curl_init();
|
||
if (!$ch) {
|
||
logIncome('ОШИБКА: Не удалось инициализировать cURL');
|
||
echo "OK"; // Все равно отвечаем OK
|
||
exit;
|
||
}
|
||
|
||
curl_setopt($ch, CURLOPT_URL, $n8nWebhookUrl);
|
||
curl_setopt($ch, CURLOPT_POST, true);
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, $str);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
|
||
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
|
||
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
|
||
|
||
$n8nResponse = @curl_exec($ch);
|
||
$n8nHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
$curlError = curl_error($ch);
|
||
@curl_close($ch);
|
||
|
||
if ($curlError) {
|
||
logIncome('ОШИБКА отправки на n8n: HTTP ' . $n8nHttpCode . ', ошибка: ' . $curlError);
|
||
} else {
|
||
logIncome('Отправка на n8n webhook: HTTP ' . $n8nHttpCode . ', ответ: ' . substr($n8nResponse, 0, 200));
|
||
}
|
||
|
||
// ВСЕГДА возвращаем OK банку, даже если что-то пошло не так
|
||
logIncome('=== ЗАВЕРШЕНИЕ ОБРАБОТКИ ===');
|
||
echo "OK"; // Вернем наружу банку сообщение, что у нас все хорошо и повторно отправлять данные не надо
|
||
|
||
// ЗАКОММЕНТИРОВАНО: Обработка платежей перенесена в n8n
|
||
/*
|
||
$data = json_decode($str, true); // Формируем массив
|
||
$amount = $data['accountAmount'];
|
||
$description = $data['description'];
|
||
$inn = $data['payer']['inn'];
|
||
|
||
global $adb;
|
||
|
||
// Сначала поищем плательщика-контрагента по ИНН
|
||
$query = "select a.accountid
|
||
from vtiger_account a
|
||
left join vtiger_crmentity e on e.crmid = a.accountid
|
||
where e.deleted = '0' and a.inn = '".$inn."'";
|
||
$qresult = $adb->pquery($query);
|
||
|
||
if($adb->num_rows($qresult) == 0) {
|
||
// Не нашелся Контрагент - поищем Контакт. Причем с извращением - в базе ИННы почему-то хранятся с пробелами
|
||
$query = "select c.contactid
|
||
from vtiger_contactscf c
|
||
left join vtiger_crmentity e on e.crmid = c.contactid
|
||
where e.deleted = '0' and replace(c.cf_1257, ' ', '') = '".$inn."'";
|
||
$qresult = $adb->pquery($query);
|
||
|
||
if($adb->num_rows($qresult) == 0) {
|
||
// И Контакт по ИНН не найден - Платеж будет без привязки
|
||
$logstring = date('Y-m-d H:i:s').' с ИНН '.$inn.' не найден ни Контакт, ни Контрагент - Платеж будет без привязки'.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
} else {
|
||
$contactid = $adb->query_result($qresult, 0, 'contactid');
|
||
$payer = '12x'.$contactid;
|
||
$payerid = $contactid;
|
||
$logstring = date('Y-m-d H:i:s').' Найден Контакт с id = '.$contactid.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
}
|
||
} else {
|
||
$accountid = $adb->query_result($qresult, 0, 'accountid');
|
||
$payer = '11x'.$accountid;
|
||
$payerid = $accountid;
|
||
$logstring = date('Y-m-d H:i:s').' Найден Контрагент с id = '.$accountid.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
}
|
||
|
||
$user = Users::getActiveAdminUser(); // Получаем пользователя, под которым будем создавать платеж
|
||
$params = array (
|
||
'pay_date' => date('Y-m-d'),
|
||
'pay_type' => 'Receipt',
|
||
'pay_details' => $description,
|
||
'type_payment' => 'Cashless Transfer',
|
||
'amount' => $amount,
|
||
'spstatus' => 'Executed',
|
||
'spcompany' => 'МОО "Клиентправ"',
|
||
'assigned_user_id' => '19x1'
|
||
);
|
||
if (isset($payer)) {
|
||
$params['payer'] = $payer;
|
||
}
|
||
|
||
$logstring = date("Y-m-d H:i:s").' Подготовлен массив для создания Платежа: '.json_encode($params).PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
try {
|
||
$payment = vtws_create('SPPayments', $params, $user);
|
||
$output = 'Платеж создан: '.$payment['id'];
|
||
} catch (WebServiceException $ex) {
|
||
$output = $ex->getMessage();
|
||
}
|
||
$logstring = date("Y-m-d H:i:s").' '.$output.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
// Шаг второй - связка Платежа с Проектом
|
||
if (isset($payer)) {
|
||
// А теперь поищем Проекты, где фигурирует плательщик в качестве злодея и выберем из них тот, по которому пришли деньги
|
||
$query = "select cf.projectid, cf.cf_1752, cf.cf_1507
|
||
from vtiger_projectcf cf
|
||
left join vtiger_crmentity e on e.crmid = cf.projectid
|
||
where e.deleted = '0' and cf.cf_2274 = ".$payerid." and (cf.cf_1752 <> '' or cf.cf_1507 <> '')";
|
||
$logstring = date("Y-m-d H:i:s").' Запрос поиска Проектов: '.PHP_EOL.$query.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
$qresult = $adb->pquery($query);
|
||
|
||
$pcount = $adb->num_rows($qresult);
|
||
if($pcount > 0) {
|
||
// Проекты найдены - побежим по ним в цикле
|
||
$logstring = date("Y-m-d H:i:s").' Нашли Проекты у злодея. Всего: '.$pcount.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
$logstring = date("Y-m-d H:i:s").' Поищем среди них что-то из назначения платежа: '.$description.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
for ($i=0; $i<$pcount; $i++) {
|
||
$logstring = date("Y-m-d H:i:s").' Берем '.($i+1).'-й Проект'.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
$list = $adb->query_result($qresult, $i, 'cf_1752');
|
||
$num = $adb->query_result($qresult, $i, 'cf_1507');
|
||
$logstring = date("Y-m-d H:i:s").' Выкурили оттуда №ИЛ : '.$list.' и номер дела : '.$num.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
preg_match('/\d+$/', $list, $matches); // Вынимаем последние цифры из поля с исполнительным листом
|
||
if (!empty($matches)) {
|
||
$list = $matches[0];
|
||
} else {
|
||
$list = null;
|
||
}
|
||
$logstring = date("Y-m-d H:i:s").' Вытащили чисто цифры из ИЛ : '.$list.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
if ((mb_strpos($description, $list) !== false and !empty($list)) or
|
||
(mb_strpos($description, $num) !== false and !empty($num))) {
|
||
// В назначении нашлось значение одного из двух полей
|
||
$projectid = $adb->query_result($qresult, 0, 'projectid');
|
||
|
||
$logstring = date("Y-m-d H:i:s").' Найден Проект, по котому пришла оплата : '.$projectid.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
// Отметим галку о том, что Проект оплачен
|
||
try {
|
||
$params = array (
|
||
'id' => '33x'.$projectid,
|
||
'cf_2470' => '1'
|
||
);
|
||
vtws_revise($params, $user);
|
||
$logstring = date("Y-m-d H:i:s").' Поставлена метка об оплате в Проекте : '.$projectid.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
} catch (WebserviceException $ex) {
|
||
$logstring = date("Y-m-d H:i:s").' Ошибка установки метки об оплате в Проекте : '.$ex->getMessage().PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
}
|
||
|
||
// Привяжем Платеж к Проекту
|
||
vtws_add_related('33x'.$projectid, $payment['id']);
|
||
$logstring = date("Y-m-d H:i:s").' Платеж привязан к Проекту '.$projectid.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
|
||
// И уходим
|
||
break;
|
||
} else {
|
||
$logstring = date("Y-m-d H:i:s").' В назначении Платежа нет ни '.$list.', ни '.$num.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
}
|
||
}
|
||
} else {
|
||
$logstring = date("Y-m-d H:i:s").' У злодея не нашлось Проектов? - странно...'.PHP_EOL;
|
||
file_put_contents('logs/income.log', $logstring, FILE_APPEND);
|
||
}
|
||
}
|
||
*/
|
||
|
||
?>
|