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

405 lines
18 KiB
PHP
Raw Permalink 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 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;
}
}