false, 'contact_id' => null, 'action' => null, // 'created', 'updated', 'found' 'message' => '' ); // ======================================== // 1. ФОРМАТИРОВАНИЕ ТЕЛЕФОНА // ======================================== if (!empty($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) { // Некорректный номер - логируем, но не падаем $logstring = date("Y-m-d H:i:s") . ' ⚠️ Некорректный номер телефона: ' . $mobile . ' (игнорируем)'; file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); $mobile = ''; // Обнуляем некорректный номер } } // ======================================== // 2. ПОИСК СУЩЕСТВУЮЩЕГО КОНТАКТА // ======================================== $existingContactId = null; $searchMethod = ''; // 2.1 По contact_id (приоритет 1) if (!empty($contact_id)) { $contact_id = preg_replace('/[^0-9]/', '', $contact_id); // Очищаем от 12x префикса $query = "SELECT c.contactid FROM vtiger_contactdetails c LEFT JOIN vtiger_crmentity e ON e.crmid = c.contactid WHERE e.deleted = 0 AND c.contactid = ? LIMIT 1"; $res = $adb->pquery($query, array($contact_id)); if ($adb->num_rows($res) > 0) { $existingContactId = $adb->query_result($res, 0, 'contactid'); $searchMethod = 'by_contact_id'; } } // 2.2 По mobile (приоритет 2) if (empty($existingContactId) && !empty($mobile)) { $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"; $res = $adb->pquery($query, array($mobile)); if ($adb->num_rows($res) > 0) { $existingContactId = $adb->query_result($res, 0, 'contactid'); $searchMethod = 'by_mobile'; } } // 2.3 По tgid (приоритет 3) - tgid хранится в поле phone if (empty($existingContactId) && !empty($tgid)) { $query = "SELECT c.contactid FROM vtiger_contactdetails c LEFT JOIN vtiger_crmentity e ON e.crmid = c.contactid WHERE e.deleted = 0 AND c.phone = ? LIMIT 1"; $res = $adb->pquery($query, array($tgid)); if ($adb->num_rows($res) > 0) { $existingContactId = $adb->query_result($res, 0, 'contactid'); $searchMethod = 'by_tgid'; } } $logstring = date('Y-m-d H:i:s') . ' Поиск: contact_id=' . $contact_id . ', mobile=' . $mobile . ', tgid=' . $tgid; $logstring .= ' → Найден: ' . ($existingContactId ? $existingContactId . ' (' . $searchMethod . ')' : 'НЕТ'); file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); // ======================================== // 3. ФОРМИРУЕМ ПАРАМЕТРЫ // ======================================== $params = array(); // Только непустые поля добавляем в params if (!empty($firstname)) $params['firstname'] = $firstname; if (!empty($secondname)) $params['cf_1157'] = $secondname; // Отчество if (!empty($lastname)) $params['lastname'] = $lastname; if (!empty($mobile)) $params['mobile'] = $mobile; if (!empty($email)) $params['email'] = $email; if (!empty($tgid)) $params['phone'] = $tgid; // TG ID в поле phone if (!empty($birthday)) $params['birthday'] = $birthday; if (!empty($birthplace)) $params['cf_1263'] = $birthplace; // Место рождения if (!empty($mailingstreet)) $params['mailingstreet'] = $mailingstreet; if (!empty($inn)) $params['cf_1257'] = $inn; // ИНН if (!empty($requisites)) $params['cf_1849'] = $requisites; // Реквизиты if (!empty($code)) $params['cf_1580'] = $code; // SMS код // ======================================== // 4. СОЗДАНИЕ ИЛИ ОБНОВЛЕНИЕ // ======================================== try { if (!empty($existingContactId)) { // === ОБНОВЛЕНИЕ === $params['id'] = '12x' . $existingContactId; $logstring = date('Y-m-d H:i:s') . ' 📝 Обновляем контакт ' . $existingContactId . ': ' . json_encode($params); file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); $contact = vtws_revise($params, $current_user); $result['success'] = true; $result['contact_id'] = $existingContactId; $result['action'] = 'updated'; $result['search_method'] = $searchMethod; $result['message'] = 'Контакт обновлён'; $logstring = date('Y-m-d H:i:s') . ' ✅ Контакт ' . $existingContactId . ' обновлён'; file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); } else { // === СОЗДАНИЕ === // Проверяем минимальные данные для создания if (empty($mobile) && empty($tgid)) { throw new WebServiceException( WebServiceErrorCode::$INVALIDID, "Для создания контакта нужен хотя бы mobile или tgid" ); } // Дефолтные значения для обязательных полей CRM if (empty($params['firstname'])) { $params['firstname'] = 'Клиент'; } if (empty($params['lastname'])) { $suffix = !empty($mobile) ? substr($mobile, -4) : substr($tgid, -4); $params['lastname'] = 'Web_' . $suffix; } if (empty($params['birthday'])) { $params['birthday'] = '01-01-1990'; } // Назначаем ответственного $params['assigned_user_id'] = vtws_getWebserviceEntityId('Users', $current_user->id); $logstring = date('Y-m-d H:i:s') . ' 🆕 Создаём контакт: ' . json_encode($params); file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); $contact = vtws_create('Contacts', $params, $current_user); $newContactId = substr($contact['id'], 3); // Убираем 12x $result['success'] = true; $result['contact_id'] = $newContactId; $result['action'] = 'created'; $result['message'] = 'Контакт создан'; $logstring = date('Y-m-d H:i:s') . ' ✅ Создан контакт ' . $newContactId; file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); } } catch (WebServiceException $ex) { $result['success'] = false; $result['message'] = $ex->getMessage(); $logstring = date('Y-m-d H:i:s') . ' ❌ Ошибка: ' . $ex->getMessage(); file_put_contents($logFile, $logstring . PHP_EOL, FILE_APPEND); throw $ex; } $logstring = date('Y-m-d H:i:s') . ' RESULT: ' . json_encode($result, JSON_UNESCAPED_UNICODE) . PHP_EOL; file_put_contents($logFile, $logstring, FILE_APPEND); return json_encode($result, JSON_UNESCAPED_UNICODE); }