Joywork/engine/classes/Antiznak.php

508 lines
23 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?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;
}
}