Joywork/engine/classes/Antiznak.php
2026-05-22 21:21:54 +03:00

508 lines
23 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
class Antiznak {
private $db;
private $base_url = 'https://antiznak.ru/api/v2.php';
private $api_key = 'Y2Q4G8GW3R';
public function __construct($db = null) {
if($db){
$this->db = $db;
} else {
$pdo = new MysqlPdo(hst, ndb, user, pass);
$sql = "SET NAMES 'utf8'";
$pdo->query($sql);
$this->db = $pdo;
}
}
public function get_tariffs() {
$result = array();
$sql = "SELECT * FROM antiznak_tariff";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$average = ceil($r['price'] / $r['count']);
$r['average'] = $average;
$result[] = $r;
}
return $result;
}
public function save_tariff($id, $price, $count){
$result = array();
$sql = "UPDATE antiznak_tariff SET count='{$count}', price='{$price}' WHERE id={$id}";
$this->db->query($sql);
$result = $this->get_tariffs();
return $result;
}
public function request_tariff($user_id, $tariff){
$sqlCheck = "SELECT * from antiznak_user_request where paid = 0 and user_id = $user_id";
$rezCheck = $this->db->query($sqlCheck);
if ($this->db->num_rows($rezCheck) > 0) {
echo '<p><i style="color:#EE6161;font-size: 23px;margin-right: 7px;" class="ti-face-sad"></i><span>Имеются неоплаченные заказы. Ожидайте, пока с вами свяжется наш менеджер.</span></p>';
} else {
$user = new User;
$user->get($user_id);
$sql = "INSERT INTO antiznak_user_request(user_id, count, price, created_at, paid) VALUES ($user_id, $tariff->count, $tariff->price, NOW(), 0)";
$this->db->query($sql);
$noticeText = "Заявка на услугу АнтиЗнак. На " . $tariff->count . " объектов по цене " . $tariff->price . " рублей от пользователя." . " ФИО: " . $user->last_name ." ".$user->first_name . " " .$user->middle_name . ". Email: " . $user->email . ". Телефон: " . $user->phone;
//уведомления на мыло
mailClientFromJoywork("JoyWork2016@mail.ru", "Новая заявка на оплату пакета АнтиЗнак", $noticeText);
mailClientFromJoywork("sndmitrievsn@mail.ru", "Новая заявка на оплату пакета АнтиЗнак", $noticeText);
mailClientFromJoywork("Ellada-an@mail.ru", "Новая заявка на оплату пакета АнтиЗнак", $noticeText);
//уведомление Станиславу в телеграм
$sql = "INSERT INTO discharge_user_notice(user_id, text, sended, created_at) VALUES(4, '$noticeText', 0, NOW())";
$this->db->query($sql);
echo '<p><i style="color:#4CAF50;font-size: 23px;margin-right: 7px;" class="ti-face-smile"></i><span>Заявка на пакет успешно отправлена. Ожидайте, пока с вами свяжется наш менеджер.</span></p>';
}
}
public function confirm_request_pay($request_id){
$sqlRequest = "SELECT * from antiznak_user_request where id = {$request_id}";
$rezRequest = $this->db->query($sqlRequest);
$request = $this->db->fetch_assoc($rezRequest);
if ($request) {
$sqlUser = new User();
$sqlUser->get($request['user_id']);
$sql = "UPDATE antiznak_user_request SET paid = 1 where id = $request[id]";
$this->db->query($sql);
$newRequestsCount = 0;
if ($sqlUser->antiznak_request_count) {
$newRequestsCount = $sqlUser->antiznak_request_count;
}
$newRequestsCount = $newRequestsCount + $request['count'];
$sql = "UPDATE users SET antiznak_request_count = $newRequestsCount where id = $request[user_id]";
$this->db->query($sql);
} else {
echo "Не найден запрос на оплату в БД.";
}
}
/**
*
*/
public function get_place_object($object_id, $user_id){
$result = array();
$obj_ads_id = 0;
$url_place = '';
$photos_count = 0;
$sql_o_r = "SELECT * FROM `antiznak_object_result` WHERE object_id={$object_id} AND user_id={$user_id} AND status='save'";
$q_o_r = $this->db->query($sql_o_r);
if($this->db->num_rows($q_o_r) > 0){
$result['status'] = 'pre_save';
} else {
//Поиск объекта и фото
$sql = "SELECT * FROM objects WHERE id = {$object_id}";
$q = $this->db->query($sql);
$obj = $this->db->fetch_assoc($q);
if($obj['initial_object_id'] > 0){
$obj_ads_id = (int)$obj['initial_object_id'];
} else {
$obj_ads_id = $object_id;
}
//Оригинальные фото
$sql_photos = "SELECT count(*) as total FROM objects_object_photo WHERE object_id={$object_id}";
$q_photos = $this->db->query($sql_photos);
$r_photos = $this->db->fetch_assoc($q_photos);
if(isset($r_photos['total']) && $r_photos['total'] > 0){
$photos_count = (int)$r_photos['total'];
}
$is_photo_this = false;
//Есть ли уже фото
$sql_antiznak = "SELECT * FROM antiznak_object WHERE object_id = {$obj_ads_id}";
$q_antiznak = $this->db->query($sql_antiznak);
if($this->db->num_rows($q_antiznak) > 0){
$r_antiznak = $this->db->fetch_assoc($q_antiznak);
$antiznak_id = $r_antiznak['id'];
if($this->db->num_rows($this->db->query("SELECT * FROM antiznak_object_photos WHERE antiznak_id = {$antiznak_id}"))>0){
$is_photo_this = true;
$url_place = 'is_photo_this';
}
}
//Если фото ещё не определялись
if(!$is_photo_this){
$sql_ads = "SELECT * FROM ads_objects WHERE obj_id = {$obj_ads_id}";
$q_ads = $this->db->query($sql_ads);
$r_ads = $this->db->fetch_assoc($q_ads);
if(isset($r_ads['ads_url']) && !empty($r_ads['ads_url'])){
$url_place = $r_ads['ads_url'];
}
}
$result['object_ads_id'] = $obj_ads_id;
if($photos_count == 0){
$result['error']['no_photos'] = "Фотографии не найдены";
} else {
$result['photos'] = $photos_count;
}
if(empty($url_place)){
$result['error']['no_place'] = "Площадка оригинального объявления не найдена";
} else {
$result['place'] = $url_place;
}
}
return $result;
}
/**
* Сохранение фото
* @param array $photos
* @return array $photo_links
*/
private function save_photo($photos, $agency_id, $folder = ""){
$Selectel = SelectelApi::getTokenAndUrl();
$token = $Selectel[0];
$storageUrl = $Selectel[1];
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos");
}
if(!empty($folder)){
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos".$folder)) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos".$folder);
}
}
foreach ($photos as $index => $filePos) {
$originalName = $filePos;
/* $strArray = explode(".", $originalName);
$ext = end($strArray);
if ($ext == "pjpeg") {
$ext = "jpeg";
}*/
if(empty($ext)){
$ext = "jpeg";
}
$ext = mb_strtolower($ext);
$name = md5($originalName . time()) . "." . $ext;
$one = mb_substr($name, 0, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one");
}
$two = mb_substr($name, 1, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one/$two")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one/$two");
}
$three = mb_substr($name, 3, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one/$two/$three")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos$folder/$one/$two/$three");
}
$new_path = "$one/$two/$three/$name";
$photo = "/photos".$folder."/" . $new_path;
$oldPath = $originalName;
try {
copy($oldPath, $_SERVER['DOCUMENT_ROOT'] . $photo);
$oldPathList[] = $oldPath;
resize($_SERVER['DOCUMENT_ROOT'] . $photo, null, null, null, null, 100, (isset($editor['rotation']) ? $editor['rotation'] : null));
$image = new Imagick();
$image->readImage($_SERVER['DOCUMENT_ROOT'] . $photo);
/* $resolution = 1024;
if ( $agency_id == 10919 || $agency_id == 8826 || $agency_id == 12482 || $agency_id == 11916) {
$resolution = 1920;
}
if ($image->getImageWidth() > $resolution) {
$image->scaleImage($resolution, $resolution, true);
}*/
$image->writeImage();
//загрузка в Selectel
$fp = $_SERVER['DOCUMENT_ROOT'] . "/photos".$folder."/" . $new_path;
$SelectelApi=new SelectelApi();
$r = $SelectelApi->uploadFile($storageUrl, $token, $fp, $folder.'/'.$new_path, 'image/'.$ext);
//если выложили в Selectel
if ($r) {
//заменяем путь на новый
$new_path = "https://data.joywork.ru".$folder . "/" . $new_path;
//удаляем файл с локального сервера
unlink($fp);
}
if ($index >= 0) {
$newPhotos[$index] = $new_path;
} else {
$newPhotos[] = $new_path;
}
} catch (Exception $e) {
$err = "Проблема загрузки фотографии " . $originalName . ", возможно, фото повреждено или его формат не соответствует расширению";
}
//}
}
if(isset($err)){
$result['error'] = $err;
}
if(isset($newPhotos)){
$result = $newPhotos;
}
return $result;
}
/**
*
* *
*/
public function save_object_photo($agency_id, $object_id, $photos) {
//вставляем фото
$photos_obj = $this->save_photo($photos,$agency_id);
if(!empty($photos_obj)){
foreach($photos_obj as $num => $photo_obj) {
$sqlSelectPhoto = "select oop.id, oop.object_photo_id from objects_object_photo oop where oop.object_id = {$object_id} and sort_order = {$num}";
$rezSelectPhoto = $this->db->query($sqlSelectPhoto);
if ($this->db->num_rows($rezSelectPhoto) > 0) {
$ph = $this->db->fetch_assoc($rezSelectPhoto);
$sqlUpdPhoto = "UPDATE object_photo SET photo = '{$photo_obj}' WHERE id = {$ph['object_photo_id']}";
$this->db->query($sqlUpdPhoto);
} else {
$sqlInsPhoto = "INSERT INTO object_photo(photo) VALUES('{$photo_obj}')";
$this->db->query($sqlInsPhoto);
$photoId = $this->db->insert_id();
$sqlInsPhotoLink = "INSERT INTO objects_object_photo(object_id, object_photo_id, sort_order) VALUES('{$photo_obj}', {$photoId}, {$num})";
$this->db->query($sqlInsPhotoLink);
}
}
}
}
/**
*
*/
public function get_photo_antiznak($obj_ads_id, $photos_count, $num_query){
$result = new stdClass();
if($num_query <= $photos_count){
$pr = ceil(($num_query/$photos_count) * 100);
$result->status = 'processed '.$pr.'%';
} else {
$antiznak_id = 0;
$sql = "SELECT * FROM antiznak_object WHERE object_id = {$obj_ads_id}";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
if(isset($r['id'])){
$antiznak_id = $r['id'];
}
if($antiznak_id == 0){
$result->status = 'error';
} else {
$sql_photo = "SELECT * FROM antiznak_object_photos WHERE antiznak_id = {$antiznak_id}";
$q_photo = $this->db->query($sql_photo);
if($this->db->num_rows($q_photo)==0) {
$result->status = 'error';
} else {
$photos = array();
$num = 1;
while($r_photos = $this->db->fetch_assoc($q_photo)){
$photos[$num] = $r_photos['photo'];
$num++;
}
if(!empty($photos)){
$result->status = 'done';
$result->photos = $photos;
} else {
$result->status = 'error';
}
}
}
}
return $result;
}
/**
*
*/
public function send_api($url, $user_id, $agency_id, $object_id, $obj_ads_id, $photos_count, $num_query) {
$antiznak_obj_id = 0;
$sql = "SELECT id FROM antiznak_object_result WHERE object_id={$object_id} AND user_id={$user_id}";
$q=$this->db->query($sql);
if($this->db->num_rows($q) > 0){
$antiznak_obj_id = $this->db->fetch_assoc($q)['id'];
} else {
$sql_in = "INSERT INTO antiznak_object_result (object_id, user_id, agency_id, status) " .
"VALUES ({$object_id}, {$user_id}, {$agency_id}, 'create')";
$this->db->query($sql_in);
$antiznak_obj_id = $this->db->insert_id();
}
if($url == 'is_photo_this'){
$result = $this->get_photo_antiznak($obj_ads_id, $photos_count, $num_query);
} else {
$url_place = '';
if(!empty($url)){
$url_place = urlencode($url);
$url_api = $this->base_url.'?k='.$this->api_key.'&u='.$url_place;
$str = file_get_contents($url_api);
/* $str = '{
"status": "done",
"ID": "283197661",
"api_id": "344776",
"title": "2-комн. квартира, 45,2 м²",
"address": "Московская область, Балашиха, ул. Чистопольская, 24",
"parameters": {
"Общая площадь": "45.2 м²",
"Площадь кухни": "15 м²",
"Этаж": "2 из 22",
"Год постройки": "2018"
},
"description": "Продам 2х комнатную квартиру, с/у раздельный с мебелью техникой и евро ремонтом , в монолитном доме на втором этаже , жк находиться в окружении леса ,все огорожено забором ,рядом протекает речка детские и спортивные площадки, подземный паркинг.",
"price": "7300000",
"photos": {
"1": "https://photu.ru/img_cache_WGQN_5fb18d36c17a58ad90b12c78141ebb53/w/",
"2": "https://photu.ru/img_cache_WGQN_14e17e544200f13eb955b6151d106ea4/f/",
"3": "https://photu.ru/img_cache_WGQN_b358c4b7f7881620586179f049d15f82/m/",
"4": "https://photu.ru/img_cache_WGQN_576ab3d1f191d115b4cca7268c89650a/S/",
"5": "https://photu.ru/img_cache_WGQN_215c98fe0dafa9fdf4ad931e12e51adb/V/",
"6": "https://photu.ru/img_cache_WGQN_0b60b98f02262995b1dfc8066830c9b2/NN/",
"7": "https://photu.ru/img_cache_WGQN_5b618850c1d17afd78cd29b09d917368/QQ/",
"8": "https://photu.ru/img_cache_WGQN_ec52176c00284d8f3707c1186cfc91e8/bb/",
"9": "https://photu.ru/img_cache_WGQN_5db30de2c24218d59613c29419230981/yy/",
"10": "https://photu.ru/img_cache_WGQN_4d4860be16520d133e9b58b9d047f079/1q/",
"11": "https://photu.ru/img_cache_WGQN_2c295160f025396a9bc4a8c0361862e5/e1/",
"12": "https://photu.ru/img_cache_WGQN_ee433f0a9108a7658c06cb90685e03a1/r2/",
"13": "https://photu.ru/img_cache_WGQN_7aa604d398b928fdfb137541ee539e02/t3/",
"14": "https://photu.ru/img_cache_WGQN_cdde672e7909a675810f36ed4d474926/u4/",
"15": "https://photu.ru/img_cache_WGQN_a93f571689b317fb4bb975a7d96190b8/i5/",
"16": "https://photu.ru/img_cache_WGQN_426772ac63590eea345b9f2ce7cc60b0/oN/",
"17": "https://photu.ru/img_cache_WGQN_3f8834720a30ddc87b6d43251ab46001/pQ/",
"18": "https://photu.ru/img_cache_WGQN_f46d4096b691cbd61ecebe4002b939c7/ab/",
"19": "https://photu.ru/img_cache_WGQN_808f384391f6c53729a65cb52614ec94/sy/"
},
"balance": "6"
}';*/
$result = json_decode($str);
}
}
if($result->status == 'done'){
if(isset($result->balance) && ($result->balance == 10 || $result->balance == 0)){
//уведомление Станиславу в телеграм
$noticeText = "В системе АнтиЗнак осталось {$result->balance} объявлений";
$sql = "INSERT INTO discharge_user_notice(user_id, text, sended, created_at) VALUES(4, '$noticeText', 0, NOW())";
$this->db->query($sql);
}
//Списание баланса попыток
$sql_user = "SELECT * FROM users WHERE id in ($user_id, $agency_id)";
$q_user = $this->db->query($sql_user);
while($r_user = $this->db->fetch_assoc($q_user)){
if($r_user['antiznak_request_count'] > 0){
$new_antiznak_count = $r_user['antiznak_request_count'] - 1;
$sql_new_count = "UPDATE users SET antiznak_request_count = {$new_antiznak_count} WHERE id={$r_user['id']}";
$this->db->query($sql_new_count);
break;
}
}
$result->status ='save';
if($url != 'is_photo_this'){
$antiznak_id = 0;
if($obj_ads_id > 0){
$sql_antiznak = "SELECT * FROM antiznak_object WHERE object_id = {$obj_ads_id}";
$q_antiznak = $this->db->query($sql_antiznak);
if($this->db->num_rows($q_antiznak) == 0){
$sql_antiznak_in = "INSERT INTO antiznak_object (object_id) VALUES ({$obj_ads_id})";
$this->db->query($sql_antiznak_in);
$antiznak_id = $this->db->insert_id();
} else {
$r_antiznak = $this->db->fetch_assoc($q_antiznak);
$antiznak_id = (int)$r_antiznak['id'];
}
}
if($antiznak_id > 0){
$photos_antyznak = $this->save_photo($result->photos, $agency_id, '/antyznak');
if(!empty($photos_antyznak)){
$this->db->query("DELETE from antiznak_object_photos WHERE antiznak_id = {$antiznak_id}");
$sql_photos_antiznak = "INSERT INTO antiznak_object_photos (antiznak_id, photo) VALUES ";
$num = 0;
foreach($photos_antyznak as $photo_antiznak){
if($num > 0) $sql_photos_antiznak .= ", ";
$sql_photos_antiznak .= "({$antiznak_id}, '{$photo_antiznak}')";
$num++;
}
$this->db->query($sql_photos_antiznak);
}
}
}
//Вставка фото для объекта
$this->save_object_photo($agency_id, $object_id, $result->photos);
}
if($antiznak_obj_id > 0){
if(isset($result->status)){
$status = $result->status;
} else if( isset($result['status'] )){
$status = $result['status'];
}
$this->db->query("UPDATE antiznak_object_result SET status='{$status}' WHERE id={$antiznak_obj_id}");
}
return $result;
}
}