feat: Добавлена операция CreateWebContact для vTiger webservice

- Упрощённая операция создания контакта: обязательно только mobile
- Логика: если контакт существует - возвращает ID БЕЗ обновления
- Если не существует - создаёт с дефолтами (Клиент ERV_XXXX)
- Формат телефона: 79001234567 (без +)
- Зарегистрировано в БД:
  * vtiger_ws_operation (id: 50)
  * vtiger_ws_operation_parameters (mobile, firstname, lastname, email)
- Логи: logs/CreateWebContact.log
- Протестировано: контакт 396625 найден и возвращён без изменений
This commit is contained in:
Fedor
2025-10-30 19:21:34 +03:00
parent 5ef8daf3e4
commit 09c1fbd1db

View File

@@ -0,0 +1,113 @@
<?php
/*********************************************************************************
* API-интерфейс для создания Контакта из Web-формы (упрощённый)
* Обязательное поле: только mobile
* Логика: если контакт существует - возвращаем ID БЕЗ обновления
* Автор: Фёдор, 2025-10-30
********************************************************************************/
include_once 'include/Webservices/Query.php';
include_once 'modules/Users/Users.php';
require_once('include/Webservices/Utils.php');
require_once 'include/Webservices/Create.php';
require_once 'includes/Loader.php';
vimport ('includes.runtime.Globals');
vimport ('includes.runtime.BaseModel');
vimport ('includes.runtime.LanguageHandler');
/**
* Создание контакта из web-формы
* Если контакт с таким mobile уже существует - просто возвращаем его ID
* @param string $mobile - номер телефона (обязательное поле)
* @param string $firstname - имя (опционально)
* @param string $lastname - фамилия (опционально)
* @param string $email - email (опционально)
* @return int - ID контакта
*/
function vtws_createwebcontact($mobile, $firstname = '', $lastname = '', $email = '', $user = false) {
$logstring = date("Y-m-d H:i:s").' '.json_encode($_REQUEST);
file_put_contents('logs/CreateWebContact.log', $logstring.PHP_EOL, FILE_APPEND);
// Проверка обязательного поля
if(empty($mobile)){
$logstring = date("Y-m-d H:i:s").' Не указано обязательное поле: mobile';
file_put_contents('logs/CreateWebContact.log', $logstring.PHP_EOL, FILE_APPEND);
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Не указан номер телефона (mobile)");
}
// Форматирование телефона: убираем всё кроме цифр
$mobile = preg_replace('/[^0-9]/', '', $mobile);
if (strlen($mobile) == 11 && $mobile[0] == '8') {
$mobile = "7".substr($mobile, 1);
} else if (strlen($mobile) == 10) {
$mobile = "7".$mobile;
} else if (strlen($mobile) != 11 || $mobile[0] != '7') {
$logstring = date("Y-m-d H:i:s").' Некорректный номер телефона: '.$mobile;
file_put_contents('logs/CreateWebContact.log', $logstring.PHP_EOL, FILE_APPEND);
throw new WebServiceException(WebServiceErrorCode::$INVALIDID, "Некорректный номер телефона");
}
$logstring = date('Y-m-d H:i:s').' Ищем контакт по mobile='.$mobile.PHP_EOL;
file_put_contents('logs/CreateWebContact.log', $logstring, FILE_APPEND);
global $adb, $current_user;
// Проверяем существование контакта по номеру телефона
$query = "select c.contactid
from vtiger_contactdetails c
left join vtiger_crmentity e on e.crmid = c.contactid
where e.deleted = 0 and c.mobile = ?
limit 1";
$result = $adb->pquery($query, array($mobile));
if ($adb->num_rows($result) > 0) {
// Контакт существует - ПРОСТО ВОЗВРАЩАЕМ ID (НЕ обновляем!)
$output = $adb->query_result($result, 0, 'contactid');
$logstring = date('Y-m-d H:i:s').' ✅ Контакт найден с id '.$output.' (БЕЗ обновления)'.PHP_EOL;
file_put_contents('logs/CreateWebContact.log', $logstring, FILE_APPEND);
} else {
// Контакт НЕ существует - создаём новый
// Дефолтные значения если не указаны
if (empty($firstname)) {
$firstname = 'Клиент';
}
if (empty($lastname)) {
$lastname = 'ERV_' . substr($mobile, -4); // ERV_4567
}
$params = array (
'firstname' => $firstname,
'lastname' => $lastname,
'mobile' => $mobile,
'email' => $email,
'birthday' => '01-01-1990', // Дефолтная дата
'cf_1257' => '', // ИНН пустой
'cf_1157' => '', // Отчество пустое
'cf_1263' => '', // Место рождения пустое
'mailingstreet' => '', // Адрес пустой
'cf_1849' => '', // Реквизиты пустые
'cf_1580' => '', // Код пустой
'assigned_user_id' => vtws_getWebserviceEntityId('Users', $current_user->id)
);
$logstring = date('Y-m-d H:i:s').' Массив для создания Web Контакта: '.json_encode($params).PHP_EOL;
file_put_contents('logs/CreateWebContact.log', $logstring, FILE_APPEND);
try {
$contact = vtws_create('Contacts', $params, $current_user);
$output = substr($contact['id'], 3);
$logstring = date('Y-m-d H:i:s').' ✅ Создан новый Web Контакт с id '.$output.PHP_EOL;
file_put_contents('logs/CreateWebContact.log', $logstring, FILE_APPEND);
} catch (WebServiceException $ex) {
$logstring = date('Y-m-d H:i:s').' ❌ Ошибка создания: '.$ex->getMessage().PHP_EOL;
file_put_contents('logs/CreateWebContact.log', $logstring, FILE_APPEND);
throw $ex;
}
}
return $output;
}
?>