Files
crm.clientright.ru/income.php
Fedor 01c4fe80b5 chore: snapshot current working tree changes
Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
2026-03-26 14:19:01 +03:00

229 lines
10 KiB
PHP
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.

<?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);
}
}
*/
?>