Files
crm.clientright.ru/modules/SPTips/models/GoogleProvider.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

144 lines
4.7 KiB
PHP

<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: SalesPlatform Ltd
* The Initial Developer of the Original Code is SalesPlatform Ltd.
* All Rights Reserved.
* If you have any questions or comments, please email: devel@salesplatform.ru
************************************************************************************/
class SPTips_GoogleProvider_Model extends SPTips_AbstractProvider_Model {
private $APIKey;
public function __construct($settings) {
$this->APIKey = $settings['api_key'];
$this->curLanguage = Vtiger_Language_Handler::getShortLanguageName();
}
public function getProviderFields($type) {
switch($type) {
case SPTips_SearchType_Model::ADDRESS:
return [
'street_number' => 'Street number',
'route' => 'Street',
'locality' => 'City',
'country' => 'Country',
'postal_code' => 'Postal code'
];
default:
return [];
}
}
public function searchAddress($search, $dependentFields) {
$response = [];
$url = $this->getAPIAutocompleteUrl($search);
if ($curl = curl_init($url)) {
$this->prepareRequest($curl);
$json = curl_exec($curl);
$result = json_decode($json, true);
curl_close($curl);
}
foreach ($result['predictions'] as $prediction) {
$placeId = $prediction['place_id'];
$detailInfo = $this->searchDetailAddress($placeId);
$tipData = [
'tip' => $prediction['description']
];
if(!empty($dependentFields)) {
$tipData['fill'] = $this->getFillData($detailInfo, $dependentFields);
}
$response[] = $tipData;
}
return $response;
}
public function getSupportedSearchTypes() {
return [
SPTips_SearchType_Model::ADDRESS
];
}
public function searchOrganization($search, $dependentFields) {
/* Not supported */
return [];
}
private function getHeaders() {
return array(
'Content-Type: application/json',
'Accept: application/json',
);
}
private function prepareRequest($curl) {
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HTTPHEADER, $this->getHeaders());
curl_setopt($curl, CURLOPT_GET, 1);
}
private function searchDetailAddress($placeId) {
$url = $this->getAPIDetailsUrl($placeId);
$result = [];
if ($curl = curl_init($url)) {
$this->prepareRequest($curl);
$json = curl_exec($curl);
$result = json_decode($json, true);
curl_close($curl);
}
return $result;
}
/**
*
* @param type $detailInfo
* @param Settings_SPTips_RuleDependentField_Model[] $dependentFields
* @return type
*/
private function getFillData($detailInfo, $dependentFields) {
$fillMap = [];
foreach($dependentFields as $dependentField) {
$fillMap[$dependentField->getProviderFieldName()] = $dependentField->getVtigerFieldName();
}
$result = [];
foreach ($detailInfo["result"]["address_components"] as $value) {
$answerLocationTypes = $value['types'];
foreach($answerLocationTypes as $locationType) {
if(array_key_exists($locationType, $fillMap)) {
$result[] = [
'vtigerField' => $fillMap[$locationType],
'value' => $value['long_name']
];
}
}
}
return $result;
}
private function getAPIAutocompleteUrl($searchParam, $types = "address", $format = "json") {
$url = "https://maps.googleapis.com/maps/api/place/autocomplete/";
$url .= $format . "?input=" . urlencode($searchParam) . "&types=" . $types . "&language=" . $this->curLanguage . "&key=" . $this->APIKey;
return $url;
}
private function getAPIDetailsUrl($placeId, $format = "json") {
$url = "https://maps.googleapis.com/maps/api/place/details/";
$url .= $format . "?placeid=" . $placeId . "&language=" . $this->curLanguage . "&key=" . $this->APIKey;
return $url;
}
}