Joywork/engine/classes/ModerationAdvert.php

405 lines
18 KiB
PHP
Raw Permalink Normal View History

2026-05-22 20:21:54 +02:00
<?php
class ModerationAdvert
{
public $debug = false;
public $pdo = null;
public $pdo_sphinx = null;
public function __construct($db = null, $debug = false) {
if ($debug == true) {
$this->debug = true;
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
}
if (!is_null($db)) {
$this->pdo = $db;
} else {
$pdo = new MysqlPdo(hst, ndb, user, pass);
$pdo->query("SET NAMES 'utf8'");
$this->pdo = $pdo;
}
}
/**
* Подключение сфинкса
*/
private function setSphinx(){
$this->pdo_sphinx = new MysqlPdo(hstsph2, null, null, null, true, '9306');
}
/*
* Запись в таблицу модерации
*/
public function addUpdate($agent_id, $object_id, $field){
/* error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);*/
$sql_moderation = "SELECT id FROM objects_moderation_advert WHERE agent_id = {$agent_id} AND object_id = {$object_id}";
$q_moderation = $this->pdo->query($sql_moderation);
if($this->pdo->num_rows($q_moderation) == 0){
$in_moderation = "INSERT INTO objects_moderation_advert (object_id, agent_id, {$field['field']}) VALUES ({$object_id}, {$agent_id}, {$field['value']})";
$this->pdo->query($in_moderation);
} else {
$r_moderation = $this->pdo->fetch_assoc($q_moderation);
$up_moderation = "UPDATE objects_moderation_advert SET {$field['field']} = {$field['value']} WHERE id={$r_moderation['id']}";
$this->pdo->query($up_moderation);
}
}
/*
* Проверка и очистка таблицы модерации по объекту
*
*/
public function checkAndClear($object_id, $type, $unset_advert = false) {
$types = ['add_to_bn_feed','add_to_yandex_feed','add_to_domclick_feed','add_to_emls_feed','add_to_cian_feed','add_to_zipal','add_to_avito_feed'];
$sql = "SELECT * FROM objects_moderation_advert WHERE object_id = {$object_id}";
$q = $this->pdo->query($sql);
if($this->pdo->num_rows($q) > 0){
$r = $this->pdo->fetch_assoc($q);
if($type =='use_in_advert') {
$this->clearModeration($r['id']);
if ($unset_advert)
$this->unsetGlobalAdvert($object_id);
} else {
$this->pdo->query("UPDATE objects_moderation_advert SET {$type}=0 WHERE id = {$r['id']}");
$clear = true;
foreach($types as $t){
if($t != $type && $r[$t] == 1){
$clear = false;
}
}
if($clear){
$this->clearModeration($r['id']);
if ($unset_advert)
$this->unsetGlobalAdvert($object_id);
}
}
}
/* $sql_check = "SELECT id FROM object_publish_statistic WHERE object_id={$object_id} AND publish_user_id={$agent_id} AND on_moderation = 0";
$q_check = $this->pdo->query($sql_check);
// $r_check = $this->pdo->fetch_assoc($q_check);
if($this->pdo->num_rows($q_check) == 0){
$this->pdo->query("DELETE FROM objects_moderation_advert WHERE object_id={$object_id} AND agent_id={$agent_id}");
}*/
}
/**
* Удаление модерациий
*/
private function clearModeration($moderationId){
$this->pdo->query("DELETE FROM objects_moderation_advert WHERE id={$moderationId}");
$this->pdo->query("DELETE FROM objects_moderation_advert_user_work WHERE moderation_id={$moderationId}");
}
/**
* Снятие с рекламы, глобальный флаг
*/
private function unsetGlobalAdvert($object_id) {
$this->setSphinx();
$this->pdo->query("UPDATE `objects` SET `use_in_advert` = 0 WHERE `id` = {$object_id}");
$sql_object_sph = "UPDATE objects SET use_in_advert = 0 WHERE id={$object_id}";
$this->pdo_sphinx->query($sql_object_sph);
}
/***
* Отправка модерации
*
*/
public function sendModeration($agent_id, $object_id, $who_work, $comment){
$this->setSphinx();
$types = ['add_to_bn_feed','add_to_yandex_feed','add_to_domclick_feed','add_to_emls_feed','add_to_cian_feed','add_to_zipal','add_to_avito_feed'];
$types_days = array('add_to_bn_feed'=>'YANDEX_JW_FEED',
'add_to_yandex_feed'=>'FREE_JW_FEED',
'add_to_domclick_feed'=>'DOMCLICK_JW_FEED',
'add_to_emls_feed'=>'EMLS_JW_FEED',
'add_to_cian_feed'=>'CIAN_JW_FEED',
'add_to_zipal'=>'ZIPAL',
'add_to_avito_feed'=>'AVITO_JW_FEED');
$result = array();
$comment = mysql_escape_string($comment);
if($agent_id > 0 && $object_id > 0 && !empty($who_work)){
$sql_moderation = "SELECT * FROM objects_moderation_advert WHERE agent_id = {$agent_id} AND object_id = {$object_id}";
$q_moderation = $this->pdo->query($sql_moderation);
if($this->pdo->num_rows($q_moderation) > 0){
$r_moderation = $this->pdo->fetch_assoc($q_moderation);
$sql_up_modr = "UPDATE objects_moderation_advert SET comment = '{$comment}' WHERE id = {$r_moderation['id']}";
$this->pdo->query($sql_up_modr);
$this->pdo->query("DELETE FROM objects_moderation_advert_user_work WHERE moderation_id={$r_moderation['id']}");
$sql_object = "UPDATE objects SET use_in_advert = 1, is_main = 0 WHERE id={$object_id}";
$this->pdo->query($sql_object);
$sql_object_sph = "UPDATE objects SET use_in_advert = 1 WHERE id={$object_id}";
$this->pdo_sphinx->query($sql_object_sph);
$user = new User();
$user->get($agent_id);
$users = array();
$agency_id = $user->agencyId;
//Все юзеры агенства
$sql_users = "SELECT * FROM users WHERE id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$q_users = $this->pdo->query($sql_users);
while($r_users = $this->pdo->fetch_assoc($q_users)){
$users[$r_users['id']] = $r_users;
}
//Отправляем на модерацию всем начальникам
foreach ($users as $emp){
if($emp['blocked'] == 0){
if(($emp['manager'] == 1 || $emp['agency'] == 1 || $emp['users_admin'] == 1) && $emp['show_all_objects_page'] == 1){
$sql_moderation_user_work_in = "INSERT INTO objects_moderation_advert_user_work (moderation_id, user_id) VALUES ({$r_moderation['id']}, {$emp['id']})";
$this->pdo->query($sql_moderation_user_work_in);
}
}
}
//Выборка количества дней рекламы
$days = array();
$sql_days = "SELECT * FROM object_publish_statistic WHERE object_id = {$object_id} AND on_moderation = 1 ORDER BY id DESC";
$q_days = $this->pdo->query($sql_days);
while($r_days = $this->pdo->fetch_assoc($q_days)){
$days[] = $r_days;
}
foreach($who_work as $user_id){
//Записываем уведомления и задачи для модераторов
$platforms_advert = array();
foreach($types as $type){
if($r_moderation[$type] > 0){
$days_platfotm = '';
foreach($days as $day){
if($day['destination'] == $types_days[$type]){
$days_platfotm = $day['days_count'].' дн.';
if($day['days_count'] == 5000) $days_platfotm = 'без ограничения дн.';
$platforms_advert[] = array('platform'=>$type, 'stage' => 1, 'days'=>$days_platfotm);
break;
}
}
}
}
$sql_platforms_advert = json_encode($platforms_advert, JSON_UNESCAPED_UNICODE);
$sql_event_obj = "INSERT INTO user_object_events SET user_id ={$user_id}, from_id={$agent_id}, object_id={$object_id}, comment = '{$comment}', platforms_advert = '{$sql_platforms_advert}', type='moderation', schedule_date=NOW()";
$this->pdo->query($sql_event_obj);
$result['result'] = 'done';
}
}
}
return $result;
}
/**
*
*/
public function get_object_moderation($objectsIds = array(), $user_ids = array(), $all = false){
$result = array();
if(isset($_SESSION['id']) && $_SESSION['id'] > 0 && (!empty($objectsIds) || !empty($user_ids))) {
if(empty($user_ids)){
$user_ids[] = (int)$_SESSION['id'];
}
$sql_modr_users = "SELECT * FROM objects_moderation_advert_user_work as w LEFT JOIN objects_moderation_advert as m on w.moderation_id=m.id WHERE w.user_id in (".implode(',',$user_ids).")";
if(!empty($objectsIds)){
$sql_modr_users .= " AND m.object_id in (".implode(',',$objectsIds).")";
}
if(!$all){
$sql_modr_users .= " AND w.is_moderation = 0";
}
$q_modr_users = $this->pdo->query($sql_modr_users);
if($this->pdo->num_rows($q_modr_users) > 0){
while($r_modr = $this->pdo->fetch_assoc($q_modr_users)){
$result[$r_modr['object_id']] = $r_modr;
}
}
}
return $result;
}
/**
*
*/
public function get_object_moderation_agency($user_ids){
if(!empty($user_ids) && is_array($user_ids)){
$sql_moderation = "SELECT id FROM objects_moderation_advert WHERE agent_id in (".implode(',', $user_ids).")";
}
}
/**
*
*/
public function confirmModeration($object_id){
/*error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);*/
$result = array();
$this->setSphinx();
if ($object_id > 0) {
$sql_moderation = "SELECT *, m.id as id_moderation
FROM objects_moderation_advert_user_work as w
LEFT JOIN objects_moderation_advert as m on w.moderation_id=m.id
WHERE m.object_id = $object_id AND w.is_moderation = 0";
$q_moderation = $this->pdo->query($sql_moderation);
if ($this->pdo->num_rows($q_moderation) > 0) {
$sql_obj = "SELECT * FROM objects WHERE id = {$object_id}";
$q_obj = $this->pdo->query($sql_obj);
$obj = $this->pdo->fetch_assoc($q_obj);
$r_moderation = $this->pdo->fetch_assoc($q_moderation);
$agent_id = $r_moderation['agent_id'];
$use_in_advert = 0;
$created_at = date('Y-m-d H:i:s', strtotime($r_moderation['created_at']));
$updated_at = date('Y-m-d H:i:s', strtotime($r_moderation['updated_at']));
$add_to_bn_feed = ($r_moderation['add_to_bn_feed'] == 1 || $obj['add_to_bn_feed'] == 1) ? 1 : 0;
$add_to_yandex_feed = ($r_moderation['add_to_yandex_feed'] == 1 || $obj['add_to_yandex_feed'] == 1) ? 1 : 0;
$add_to_domclick_feed = ($r_moderation['add_to_domclick_feed'] == 1 || $obj['add_to_domclick_feed'] == 1) ? 1 : 0;
$add_to_emls_feed = ($r_moderation['add_to_emls_feed'] == 1 || $obj['add_to_emls_feed'] == 1) ? 1 : 0;
$add_to_zipal = ($r_moderation['add_to_zipal'] == 1 || $obj['add_to_zipal'] == 1) ? 1 : 0;
$add_to_avito_feed = ($r_moderation['add_to_avito_feed'] == 1 || $obj['add_to_avito_feed'] == 1) ? 1 : 0;
$add_to_cian_feed = ($r_moderation['add_to_cian_feed'] == 1 || $obj['add_to_cian_feed'] == 1) ? 1 : 0;
if($add_to_bn_feed == 1
|| $add_to_yandex_feed == 1
|| $add_to_domclick_feed == 1
|| $add_to_emls_feed == 1
|| $add_to_zipal == 1
|| $add_to_avito_feed == 1
|| $add_to_cian_feed == 1
) $use_in_advert = 1;
$sql_up_obj = "UPDATE objects SET
add_to_bn_feed = {$add_to_bn_feed},
add_to_yandex_feed = {$add_to_yandex_feed},
add_to_domclick_feed = {$add_to_domclick_feed},
add_to_emls_feed = {$add_to_emls_feed},
add_to_cian_feed = {$add_to_cian_feed},
add_to_zipal = {$add_to_zipal},
add_to_avito_feed = {$add_to_avito_feed},
use_in_advert = {$use_in_advert}
WHERE id = {$object_id}";
$this->pdo->query($sql_up_obj);
$this->pdo_sphinx->query($sql_up_obj);
$sql_up_moderation = "UPDATE objects_moderation_advert_user_work SET is_moderation = 1 WHERE moderation_id = {$r_moderation['id_moderation']}";
//echo $sql_up_moderation;
$this->pdo->query($sql_up_moderation);
$user = new User();
$user->get($_SESSION['id']);
//Коммент и выполненость задачи
$comment = date('d.m.Y H:i:s')." ".$user->last_name." ".$user->first_name." ".$user->middle_name;
$sql_event = "INSERT INTO user_object_events (user_id, from_id, object_id, type, comment) VALUES ($agent_id, {$_SESSION['id']}, $object_id, 'comment_moderation', '$comment')";
$this->pdo->query($sql_event);
$sql_up_event = "UPDATE user_object_events SET calendar_view = 1 WHERE object_id = {$object_id} AND type = 'moderation'";
$this->pdo->query($sql_up_event);
$destinations = [];
if ($add_to_bn_feed)
$destinations[] = "'YANDEX_JW_FEED'";
if ($add_to_yandex_feed)
$destinations[] = "'FREE_JW_FEED'";
if ($add_to_domclick_feed)
$destinations[] = "'DOMCLICK_JW_FEED'";
if ($add_to_emls_feed)
$destinations[] = "'EMLS_JW_FEED'";
if ($add_to_cian_feed)
$destinations[] = "'CIAN_JW_FEED'";
if ($add_to_zipal)
$destinations[] = "'ZIPAL'"; // Модерация не используется для пакетов, но оставим на всякий:)
if ($add_to_avito_feed)
$destinations[] = "'AVITO_JW_FEED'";
// Смена статуса модерации и даты публикации в статистике размещения
if (!empty($destinations)) {
/*$sql_up_stats = "UPDATE object_publish_statistic
SET publish_start_date = NOW(),
publish_end_date = DATE_ADD(NOW(), INTERVAL days_count DAY),
on_moderation = 0
WHERE object_id = {$object_id} AND
publish_user_id = {$agent_id} AND
unpublish_user_id IS NULL AND
(created_at >= '$created_at' AND created_at <= '$updated_at') AND
on_moderation = 1 AND
destination IN (" . implode(',', $destinations) . ")";
$this->pdo->query($sql_up_stats);*/
foreach ($destinations as $destination) {
$sql = "UPDATE object_publish_statistic
SET publish_start_date = NOW(),
publish_end_date = DATE_ADD(NOW(), INTERVAL days_count DAY),
on_moderation = 0
WHERE id IN (
SELECT id FROM (
SELECT id FROM object_publish_statistic
WHERE object_id = {$object_id} AND
publish_user_id = {$agent_id} AND
unpublish_user_id IS NULL AND
destination = $destination AND
on_moderation = 1
ORDER BY created_at DESC LIMIT 1
) stats
)";
$this->pdo->query($sql);
}
$sql_cleanup = "DELETE FROM object_publish_statistic
WHERE object_id = {$object_id} AND
publish_user_id = {$agent_id} AND
destination IN ('YANDEX_JW_FEED','FREE_JW_FEED','DOMCLICK_JW_FEED','EMLS_JW_FEED','CIAN_JW_FEED','ZIPAL','AVITO_JW_FEED') AND
on_moderation = 1";
$this->pdo->query($sql_cleanup);
}
$result['result'] = 'done';
} else {
$result['errors'][] = 'Объект модерации не найден.';
$result['result'] = false;
}
} else {
$result['errors'][] = 'Не указан ИД объекта.';
$result['result'] = false;
}
return $result;
}
}