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