Your IP : 18.117.158.174


Current Path : /var/www/axolotl/data/www/krym.axolotls.ru/bitrix/components/bitrix/faceid.tracker/
Upload File :
Current File : /var/www/axolotl/data/www/krym.axolotls.ru/bitrix/components/bitrix/faceid.tracker/ajax.php

<?php

define("PUBLIC_AJAX_MODE", true);
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");

$VISIT_DURATION = 3600*2;

\Bitrix\Main\Loader::includeModule('faceid');

use Bitrix\Main\Localization\Loc;

if (!\Bitrix\Faceid\AgreementTable::checkUser($USER->getId()))
{
	die;
}

$imageContent = str_replace('data:image/jpeg', 'data://image/jpeg', $_POST['image']);

$fileContent = base64_decode(str_replace('data://image/jpeg;base64,', '', $imageContent));

if (!empty($_POST['action']))
{
	// current balance cache
	$currentBalance = \Bitrix\Main\Config\Option::get('faceid', 'balance', '1000');

	if ($_POST['action'] == 'identify')
	{
		$visitor = null;
		$confidence = 0;

		$response = \Bitrix\FaceId\FaceId::identify($fileContent, 'ftracker');
		$result = $response['result'];

		$errorResponse = array();

		// get actual balance
		if (isset($response['status']['balance']))
		{
			$currentBalance = (int) $response['status']['balance'];
		}

		if (!empty($response['success']) && !empty($response['result']['found']))
		{
			$faceId = $result['items'][0]['face_id'];
			$confidence = round($result['items'][0]['confidence']);

			$visitor = \Bitrix\Faceid\TrackingVisitorsTable::getRow(array(
				'filter' => array('=FACE_ID' => $faceId)
			));

			if (!empty($visitor))
			{
				$visitorId = $visitor['ID'];

				// check if it is new visit
				$currentTime = new \Bitrix\Main\Type\DateTime;
				$diff = $currentTime->getTimestamp() - $visitor['LAST_VISIT']->getTimestamp();

				if ($diff > $VISIT_DURATION)
				{
					// register new hit
					\Bitrix\Faceid\TrackingVisitsTable::registerVisit($visitorId);
					$visitor = \Bitrix\Faceid\TrackingVisitorsTable::getById($visitorId)->fetch();

					// register activity
					\Bitrix\Faceid\TrackingVisitorsTable::registerCrmActivity($visitor, $fileContent);
				}
				else
				{
					// update last visit
					\Bitrix\Faceid\TrackingVisitorsTable::update($visitorId, array(
						'LAST_VISIT' => $currentTime
					));

					$visitor['LAST_VISIT'] = $currentTime;
				}
			}
			else
			{
				// photo has been added by another module
				// create visitor
				$face = \Bitrix\Faceid\FaceTable::getRowById($faceId);
				if ($face)
				{
					$visitorId = \Bitrix\Faceid\TrackingVisitorsTable::add(array(
						'FILE_ID' => $face['FILE_ID'],
						'FACE_ID' => $face['ID'],
						'FIRST_VISIT' => new \Bitrix\Main\Type\DateTime
					))->getId();

					if ($visitorId)
					{
						\Bitrix\Faceid\TrackingVisitsTable::registerVisit($visitorId);
						$visitor = \Bitrix\Faceid\TrackingVisitorsTable::getById($visitorId)->fetch();

						// add to crm if there is no yet
						$crmRecord = \Bitrix\Faceid\TrackingVisitorsTable::getCrmInfoByFace($visitor['FACE_ID']);
						if (empty($crmRecord))
						{
							// lead auto creation
							if (\Bitrix\Main\Config\Option::get('faceid', 'ftracker_auto_create_lead') == 'Y')
							{
								\Bitrix\Faceid\TrackingVisitorsTable::createCrmLead(
									$visitor,
									Loc::getMessage('FACEID_VISITOR')." ".$visitor['ID']
								);
							}
						}
					}
					else
					{
						$errorResponse = array('msg' => 'error while creating visitor');
					}
				}
				else
				{
					$errorResponse = array('msg' => Loc::getMessage("FACEID_TRACKER_CMP_AJAX_NOT_FOUND_LOCAL_DB"));
				}
			}
		}
		elseif (!$result['found'] && $result['code'] == \Bitrix\FaceId\FaceId::CODE_OK_UNKNOWN_PERSON)
		{
			$currentTime = new \Bitrix\Main\Type\DateTime;

			$response = \Bitrix\FaceId\FaceId::add($fileContent, 'ftracker');

			// get actual balance
			if (isset($response['status']['balance']))
			{
				$currentBalance = (int) $response['status']['balance'];
			}

			if (!empty($response['success']) && !empty($response['result']['added']))
			{
				$faceId = $response['result']['item']['face_id'];
				$fileId = $response['result']['item']['file_id'];

				// add visitor
				$visitorId = \Bitrix\Faceid\TrackingVisitorsTable::add(array(
					'FILE_ID' => $fileId,
					'FACE_ID' => $faceId,
					'FIRST_VISIT' => $currentTime
				))->getId();

				if ($visitorId)
				{
					\Bitrix\Faceid\TrackingVisitsTable::registerVisit($visitorId);
					$visitor = \Bitrix\Faceid\TrackingVisitorsTable::getById($visitorId)->fetch();

					// lead auto creation
					if (\Bitrix\Main\Config\Option::get('faceid', 'ftracker_auto_create_lead') == 'Y')
					{
						$lead = \Bitrix\Faceid\TrackingVisitorsTable::createCrmLead(
							$visitor,
							Loc::getMessage('FACEID_VISITOR')." ".$visitor['ID']
						);

						if (!empty($lead['ID']))
						{
							// register activity
							\Bitrix\Faceid\TrackingVisitorsTable::registerCrmActivity(
								$visitor, $fileContent, \CCrmOwnerType::Lead, $lead['ID']
							);
						}
					}
				}
				else
				{
					// visitor has not been added
					$errorResponse = array('msg' => 'error while creating visitor');
				}
			}
			else
			{
				$errorResponse = array(
					'code' => $response['result']['code'],
					'msg' => \Bitrix\FaceId\FaceId::getErrorMessage($response['result']['code'])
				);
			}
		}

		// visitor info
		$outputVisitor = array();

		if (!empty($visitor))
		{
			$outputVisitor = \Bitrix\Faceid\TrackingVisitorsTable::toJson($visitor, $confidence, true);
		}

		// error info
		if (empty($errorResponse) && !empty($result['code']) && $result['code'] !== \Bitrix\FaceId\FaceId::CODE_OK)
		{
			$errorResponse = array(
				'code' => $result['code'],
				'msg' => \Bitrix\FaceId\FaceId::getErrorMessage($result['code'])
			);
		}

		// output
		echo \Bitrix\Main\Web\Json::encode(array(
			'visitor' => $outputVisitor,
			'status' => array(
				'balance' => $currentBalance
			),
			'error' => $errorResponse
		));
	}
}

CMain::FinalActions();