response->header('Content-Type', 'application/json'); $app->response->setStatus(403); $app->response->setBody(json_encode([ 'success' => false, 'errors' => ['Действие недоступно для найденного листинга. Скопируйте объект в свои, чтобы управлять им.'], ], JSON_UNESCAPED_UNICODE)); return true; } return false; } public function getPublishedPackages($app, $get, $post) { $error = false; $errors = []; $packages = []; $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $sql = "SELECT published.days AS days, published.publish_date AS publish_date, packs.name, published.advertising_package_id AS package FROM advertising_package_object_publish published JOIN advertising_package packs ON packs.id=published.advertising_package_id WHERE published.active=1 AND published.object_id=$object_id"; if ($query = mysql_query($sql)) { if (mysql_num_rows($query) > 0) { while ($row = mysql_fetch_assoc($query)) { $left_days = ceil(((strtotime($row['publish_date']) + $row['days'] * 86400) - time()) / 86400); $status_text = declOfNum($left_days, array('остался %d день', 'осталось %d дня', 'осталось %d дней')); $packages[] = [ 'name' => $row['package'], 'package_id' => $row['advertising_package_id'], 'left_days' => (!empty($left_days)) ? (int)$left_days : false, 'status_text' => (!empty($status_text)) ? $status_text : false, 'is_error' => (!empty($row['error_text'])) ? true : false, 'error_text' => (!empty($row['error_text'])) ? $row['error_text'] : null, 'is_active' => (!empty($row['zipal_active'])) ? true : false, ]; } } } else { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => !$error, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'packages' => count($packages) ? $packages : false ], JSON_UNESCAPED_UNICODE)); $app->stop(); } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function setObjectState($app, $get, $post) { $sqls = []; $errors = []; $sql = null; $sql_sph = null; $sql2 = null; $body = $app->request->getBody(); $data = json_decode(stripcslashes($body), true); if (($user_id = $_SESSION['id']) && isset($data['object_id']) && isset($data['service']) && isset($data['current'])) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $service = null; if (isset($data['service'])) $service = $data['service']; $price = null; if (isset($data['price'])) $price = (int)$data['price']; $days = null; if (isset($data['days'])) $days = (int)$data['days']; $publish = null; if (isset($data['publish'])) $publish = $data['publish']; $is_moderation = false; if (isset($data['is_moderation'])) $is_moderation = (bool)$data['is_moderation']; $unpublish = null; if (isset($data['unpublish'])) $unpublish = $data['unpublish']; $user = new \User; $user->get($user_id); $user->checkPermissions($user_id, false); $agency_id = $user->agencyId; $agency_users_ids = \User::getAllAgencyUsers($agency_id); // Предмодерация рекламы по объектам $sql = "SELECT * FROM `advert_moderation_agency` WHERE `agency_id` = {$agency_id}"; $adverts_moderator = false; // Рекламый модератор (руковод.) if ($query = mysql_query($sql)) { if (mysql_num_rows($query) > 0) { $adverts_moderator = true; } } else { $errors[] = mysql_error(); } $new_state = !boolval($data['current']); // Ивертируем текущее состояние (статус) публикации if (is_null($publish) && is_null($unpublish)) { // Стандартные способы размещения // Открываем соединение с БД и Сфинксом $pdo = $app->container->get('pdo'); $mypdo = $app->container->get('mypdo'); $db_sphinx = $app->container->get('sphinx2'); $set = []; $destination = null; $moderation_inst = new \ModerationAdvert($mypdo); switch ($service) { case 'global': if ($new_state) { $set['use_in_advert'] = "use_in_advert = 1"; } else { $set['use_in_advert'] = "use_in_advert = 0"; } break; case 'yandex': if ($new_state) $set['add_to_bn_feed'] = "add_to_bn_feed = 1"; else $set['add_to_bn_feed'] = "add_to_bn_feed = 0"; $destination = "YANDEX_JW_FEED"; break; case 'domclick': if ($new_state) $set['add_to_domclick_feed'] = "add_to_domclick_feed = 1"; else $set['add_to_domclick_feed'] = "add_to_domclick_feed = 0"; $destination = "DOMCLICK_JW_FEED"; break; case 'avito': if ($new_state) $set['add_to_avito_feed'] = "add_to_avito_feed = 1"; else $set['add_to_avito_feed'] = "add_to_avito_feed = 0"; $destination = "AVITO_JW_FEED"; break; case 'emls': case 'jcat': if ($new_state) $set['add_to_emls_feed'] = "add_to_emls_feed = 1"; else $set['add_to_emls_feed'] = "add_to_emls_feed = 0"; $destination = "EMLS_JW_FEED"; break; case 'cian': if ($new_state) $set['add_to_cian_feed'] = "add_to_cian_feed = 1"; else $set['add_to_cian_feed'] = "add_to_cian_feed = 0"; $destination = "CIAN_JW_FEED"; break; case 'free': if ($new_state) { $set['add_to_yandex_feed'] = "add_to_yandex_feed = 1"; } else { $set['add_to_yandex_feed'] = "add_to_yandex_feed = 0"; } $destination = "FREE_JW_FEED"; break; case 'zipal': if ($new_state) { $set['add_to_zipal'] = "add_to_zipal = 1"; } else { $set['add_to_zipal'] = "add_to_zipal = 0"; } break; } $advertBudgets = new \AdvertBudgets(); if ($service === 'global' && !$is_moderation) { if (!$new_state) { $set['add_to_bn_feed'] = "add_to_bn_feed = 0"; $set['add_to_domclick_feed'] = "add_to_domclick_feed = 0"; $set['add_to_avito_feed'] = "add_to_avito_feed = 0"; $set['add_to_emls_feed'] = "add_to_emls_feed = 0"; $set['add_to_cian_feed'] = "add_to_cian_feed = 0"; $set['add_to_zipal'] = "add_to_zipal = 0"; $set['add_to_yandex_feed'] = "add_to_yandex_feed = 0"; $results = $advertBudgets->updateObjectCost($object_id, 1); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } $results = $advertBudgets->updateObjectCost($object_id, 2); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } $results = $advertBudgets->updateObjectCost($object_id, 3); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } $results = $advertBudgets->updateObjectCost($object_id, 4); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } $results = $advertBudgets->updateObjectCost($object_id, 5); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } if (count($set) > 0) { foreach ($set as $adv_field => $adv_data) { if (in_array($adv_field, ['add_to_bn_feed', 'add_to_domclick_feed', 'add_to_avito_feed', 'add_to_emls_feed', 'add_to_cian_feed', 'add_to_zipal', 'add_to_yandex_feed'])) { $moderation_inst->checkAndClear($object_id, $adv_field); } } } } // Установка уведомлений в ТГ $telegram = new \Telegram(true); if ($new_state) $telegram->object_ad($object_id); else $telegram->object_ad($object_id, 0); } else { $error = false; $no_insert = false; $service_id = 0; if (!is_null($destination)) { $advertBudgets = new \AdvertBudgets(); $service_id = $advertBudgets->getServiceIdByCommonId($destination); $results = $advertBudgets->getObjectAdvertPrices($object_id, $service_id, $days); } if ($new_state) { // Стоимость размещения за весь период $price = 0; if (!is_null($results['price'])) $price = $results['price']; // Стоимость размещения за 1 период (30 дней) $price_period = 0; if (!is_null($results['price_period'])) $price_period = $results['price_period']; // Если агентство использует рекламный бюджет if (!is_null($results['budget'])) { // Если пользователь руковод или у него безлимит $unlimited = false; if (isset($results['is_unlimited'])) $unlimited = boolval($results['is_unlimited']); $budget = $results['budget']; if ($price > $budget && !$unlimited) { // Если нехватка бюджета - выходим $error = true; $errors[] = "Размещение не возможно по причине не достаточного баланса рекламного бюджета."; } } $set['use_in_advert'] = "use_in_advert = 1"; $days = 5000; if (isset($data['days']) && $data['days']) $days = $data['days']; if ($days > 5000) $days = 5000; $id_add_user = null; $sql_obj = "SELECT id, nazv, id_add_user from objects WHERE id = $object_id"; $sth = $pdo->prepare($sql_obj); if ($sth->execute()) { if ($object = $sth->fetch(\PDO::FETCH_ASSOC)) { $id_add_user = $object['id_add_user']; } } else { $error = true; $errors[] = $sth->pdo->errorInfo(); } if (!$is_moderation) { // Обновляем в статистике старую запись объекта из модерации /*$sqlCheck = "SELECT object_publish_statistic.id AS stat_id FROM object_publish_statistic WHERE object_id = '$object_id' AND destination = '$destination' AND publish_user_id = ( SELECT moderation.agent_id FROM objects_moderation_advert AS moderation LEFT JOIN objects_moderation_advert_user_work AS user_work ON user_work.moderation_id = moderation.id WHERE moderation.object_id = '$object_id' AND DATE(moderation.created_at) >= DATE(object_publish_statistic.created_at) AND moderation.send_moderation = 0 LIMIT 1 )"; if ($sqlCheckRez = mysql_query($sqlCheck)) { if (mysql_num_rows($sqlCheckRez)) { $stat_id = mysql_fetch_assoc($sqlCheckRez)['stat_id']; $sqlUpRc = "UPDATE object_publish_statistic SET publish_start_date = NOW(), publish_end_date = DATE_ADD(NOW(), INTERVAL $days DAY), days_count = '$days', price = '$price', publish_user_id = '$user_id', on_moderation = 0 WHERE id = $stat_id"; mysql_query($sqlUpRc); $no_insert = true; } }*/ } if (!$no_insert && ($days && !is_null($id_add_user) && !is_null($destination))) { $sql2 = "INSERT INTO object_publish_statistic ( object_id, user_owner_id, publish_user_id, created_at, publish_start_date, publish_end_date, days_count, destination, price, price_period, on_moderation ) VALUES ( '$object_id', '$id_add_user', '$user_id', NOW(), NOW(), DATE_ADD(NOW(), INTERVAL $days DAY), '$days', '$destination', '$price', '$price_period', '".($is_moderation ? 1 : 0)."' )"; } } else if (!is_null($destination) && $service_id) { $results = $advertBudgets->updateObjectCost($object_id, $service_id); if (!$results['success']) { $error = true; $errors = array_merge($errors, $results['errors']); } } if (!empty($sql2)) { $sth = $pdo->prepare($sql2); if (!$sth->execute()) { $error = true; $errors[] = $sth->pdo->errorInfo(); } } } if (count($set) > 0) { if (!$is_moderation) { $sql = "UPDATE objects SET " . implode(', ', $set) . ", is_main = 0 WHERE id = $object_id"; $sql_sph = "UPDATE objects SET " . implode(', ', $set) . " WHERE id = $object_id"; } if (!$error) { if ($is_moderation) { foreach ($set as $adv_field => $adv_data) { if (in_array($adv_field, ['add_to_bn_feed', 'add_to_domclick_feed', 'add_to_avito_feed', 'add_to_emls_feed', 'add_to_cian_feed', 'add_to_zipal', 'add_to_yandex_feed'])) { $moderation_inst->addUpdate($user_id, $object_id, [ 'field' => $adv_field, 'value' => 1 ]); } } } else if (!$is_moderation && $adverts_moderator && !$new_state) { foreach ($set as $adv_field => $adv_data) { if (in_array($adv_field, ['add_to_bn_feed', 'add_to_domclick_feed', 'add_to_avito_feed', 'add_to_emls_feed', 'add_to_cian_feed', 'add_to_zipal', 'add_to_yandex_feed'])) { $sql3 = "UPDATE `objects_moderation_advert` SET `$adv_field` = 0 WHERE `object_id` = {$object_id} AND `agent_id` IN (" . implode(',', $agency_users_ids) . ")"; $sth = $pdo->prepare($sql3); if (!$sth->execute()) { $error = true; $errors[] = $sth->pdo->errorInfo(); } } } } } } if (!$error && !empty($sql)) { $sth = $pdo->prepare($sql); if (!$sth->execute()) { $error = true; $errors[] = $sth->pdo->errorInfo(); } } if (!$error && !empty($sql_sph)) { if (!$db_sphinx->query($sql_sph)) { $error = true; $errors[] = $db_sphinx->pdo->errorInfo(); } } } if ($service === 'packages') { // Пакетное размещение if (is_array($publish)) $publish = array_unique($publish); else $publish = []; if (is_array($unpublish)) $unpublish = array_unique($unpublish); else $unpublish = []; if (count($publish)) { // постановка в публикацию foreach ($publish as $data) { if (is_null($data)) continue; $package_id = $data['package_id']; $days = $data['days_count']; $price = $data['zipal_price']; $sqlPackData = "SELECT * FROM advertising_package WHERE id = $package_id"; if ($query = mysql_query($sqlPackData)) { $package = mysql_fetch_assoc($query); $sql = "SELECT count(id) FROM advertising_package_object_publish WHERE object_id = $object_id AND advertising_package_id = $package_id"; $count = 0; if ($rez = mysql_query($sql)) { $count = mysql_result($rez, 0); } else { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } //если объект уже был, то обновляем, иначе создаем if ($count > 0) { $sql = "UPDATE advertising_package_object_publish SET unpublish_user_id = NULL, user_id = '$user_id', sended = 0, published = 0, unpublish = 0, active = 1, publish_date = NOW(), error_text = NULL, price = '$price', days = '$days' WHERE object_id = $object_id AND advertising_package_id = $package_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } else { $sql = "INSERT INTO advertising_package_object_publish (object_id, advertising_package_id, user_id, days, price, active, publish_date) VALUES ('$object_id', '$package_id', '$user_id', '$days', '$price', 1, NOW())"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } $logText = "Отправлен на публикацию через пакет $package[name] (ID = $package_id) на $days дней"; $sqlLog = "INSERT INTO object_publish_log(object_id, created_at, user_id, log_text) VALUES ('$object_id', NOW(), '$user_id', '$logText')"; if (!mysql_query($sqlLog)) { $error = true; $sqls[] = $sqlLog; $errors[] = mysql_error(); } $user = new \User; $user->get($user_id); if (empty($user->zipal_balance)) { $newBalance = $user->agencyZipalBalance - $price; $sql = "UPDATE users SET zipal_balance='$newBalance' WHERE id=" . $user->agencyId; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } else { $newBalance = $user->zipal_balance - $price; $sql = "UPDATE users SET zipal_balance='$newBalance' WHERE id=$user_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } $checked = false; $published = zipalPackageCountText($object_id, $package_id); if ($published['zipal_active'] == 1 && (int)$published['zipal_days'] > 0) $checked = true; $is_error = (!empty($published['error_text'])) ? true : false; $error_text = null; if ($is_error) $error_text = "Ошибка: " . $published['error_text'][0]['defaultMessage']; $packages[$package_id] = [ 'left_days' => (!empty($published['zipal_day'])) ? (int)$published['zipal_day'] : false, 'status_text' => (!empty($published['zipal_day_text'])) ? $published['zipal_day_text'] : false, 'is_error' => $is_error, 'error_text' => $error_text, 'is_active' => (!empty($published['zipal_active'])) ? true : false, 'is_active' => (!$is_error) ? $checked : false, ]; } else { $error = true; $sqls[] = $sqlPackData; $errors[] = mysql_error(); } } } else if (count($unpublish)) { // снятие с публикации foreach ($unpublish as $data) { if (is_null($data)) continue; $package_id = $data['package_id']; $sqlPackData = "SELECT * FROM advertising_package WHERE id = $package_id"; if ($query = mysql_query($sqlPackData)) { $package = mysql_fetch_assoc($query); $count = 0; $sql = "SELECT count(id) FROM advertising_package_object_publish WHERE zipal_id IS NOT NULL AND object_id = $object_id AND advertising_package_id = $package_id"; if ($query = mysql_query($sql)) { $count = mysql_result($query,0); } else { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } //если объект уже был отправлен, то распубликовываем, иначе удаляем if ($count > 0) { $sql = "UPDATE advertising_package_object_publish SET sended = 1, published = 1, unpublish = 1, active = 0, unpublish_user_id = $user_id WHERE object_id = $object_id AND advertising_package_id = $package_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } else { $sql = "DELETE FROM advertising_package_object_publish WHERE object_id = $object_id AND advertising_package_id = $package_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } $logText = "Отправлен на отмену публикации через пакет $package[name] (ID = $package_id)"; $sqlLog = "INSERT INTO object_publish_log(object_id, created_at, user_id, log_text) VALUES ('$object_id', NOW(), '$user_id', '$logText')"; if (!mysql_query($sqlLog)) { $error = true; $sqls[] = $sqlLog; $errors[] = mysql_error(); } $packages[$package_id] = [ 'status_text' => 'Снятие с публикации…', 'is_active' => false ]; } else { $error = true; $sqls[] = $sqlPackData; $errors[] = mysql_error(); } } } else { $error = true; $errors[] = 'Не выбран ни один пакет размещения.'; } } else if ($service === 'zipal') { // Размещение с отчётами if (!is_array($publish)) $publish = []; if ($new_state) { if (count($publish)) { // Постановка в публикацию $user = new \User; $user->get($user_id); $zipalBalance = $user->zipal_balance; if (empty($zipalBalance)) { $zipalBalance = $user->agencyZipalBalance; } $prices = self::getZipalPrices($app, $get, $post, true); $destinations = []; foreach($publish as $data) { if (is_null($data)) continue; $destination = trim($data[0]); $placements = (array)$data[1]; if ($destination && !empty($placements)) { foreach($placements as $placement) { $destinations[] = [ 'destination' => strtoupper(trim($destination)), 'feed' => (isset($prices[$destination][trim($placement)]['is_feed'])) ? "true" : "false", 'placementType' => strtoupper(trim($placement)), ]; } } } if (count($destinations) && $zipalBalance > $price) { $sql = "SELECT count(id) FROM zipal_objects WHERE object_id = $object_id"; if ($query = mysql_query($sql)) { // Постановка в публикацию $count = mysql_result($query,0); if ($count > 0) { $sql = "UPDATE zipal_objects SET unpublish_user_id = NULL, user_id = '$user_id', sended = 0, published = 0, unpublish = 0, error_text = NULL, price = '$price', destinations = '". json_encode($destinations) ."', days = '$days', add_to_zipal_at = NOW() WHERE object_id = $object_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } //var_export($sql) && die(); } else { $sql = "INSERT into zipal_objects (object_id, user_id, destinations, days, price, add_to_zipal_at) VALUES ('$object_id', '$user_id', '". json_encode($destinations) ."', '$days', '$price', NOW())"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } //var_export($sql) && die(); } // Обновление статуса объекта В рекламе $sql = "UPDATE objects SET use_in_advert=1, add_to_zipal=1, is_main = 0 WHERE id=$object_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } // Запись лога $logText = "Отправлен на публикацию через кнопку С отчетами на $days дней"; $sqlLog = "INSERT INTO object_publish_log(object_id, created_at, user_id, log_text) VALUES ('$object_id', NOW(), '$user_id', '$logText')"; if (!mysql_query($sqlLog)) { $error = true; $sqls[] = $sqlLog; $errors[] = mysql_error(); } } else { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } // Списание с баланса if (empty($user->zipal_balance)) { $newBalance = $user->agencyZipalBalance - $price; $sql = "UPDATE users SET zipal_balance='$newBalance' WHERE id=" . $user->agencyId; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } else { $newBalance = $user->zipal_balance - $price; $sql = "UPDATE users SET zipal_balance='$newBalance' WHERE id=$user_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } } else { $error = true; $errors[] = 'Не достаточно средств на балансе пользователя (агентства).'; } } else { $error = true; $errors[] = 'Не выбрана ни одна плащадка размещения.'; } } else { $sql = "SELECT count(id) FROM zipal_objects WHERE zipal_id is not null and object_id = $object_id"; if ($query = mysql_query($sql)) { $count = mysql_result($query,0); if ($count > 0) { $sql = "UPDATE zipal_objects SET sended = 1, published = 1, unpublish = 1, unpublish_user_id = $user_id WHERE object_id = $object_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } else { $sql = "DELETE from zipal_objects WHERE object_id = $object_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } $sql = "UPDATE objects SET use_in_advert = IF( add_to_bn_feed = 0 AND add_to_yandex_feed = 0 AND add_to_domclick_feed = 0 AND add_to_avito_feed = 0 AND add_to_emls_feed = 0 AND add_to_cian_feed = 0, 0, 1), add_to_zipal=0, is_main = 0 WHERE id=$object_id"; if (!mysql_query($sql)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } $logText = "Отправлен на отмену публикации через кнопку С отчетами"; $sqlLog = "INSERT INTO object_publish_log(object_id, created_at, user_id, log_text) VALUES ('$object_id', NOW(), '$user_id', '$logText')"; if (!mysql_query($sqlLog)) { $error = true; $sqls[] = $sql; $errors[] = mysql_error(); } } } } if (!$error) { // Вебхук: смена статуса рекламы $service_to_button = [ 'yandex' => 'add_to_bn_feed', 'domclick' => 'add_to_domclick_feed', 'avito' => 'add_to_avito_feed', 'emls' => 'add_to_emls_feed', 'jcat' => 'add_to_emls_feed', 'cian' => 'add_to_cian_feed', 'free' => 'add_to_yandex_feed', ]; if (isset($service_to_button[$service])) { $advert_action = $new_state ? 'object_advertise' : 'object_unadvertise'; $w_in = new \WebHookIn(null, $agency_id); $w_in->check_send([ 'action' => $advert_action, 'object_id' => $object_id, 'section' => 'object', 'user_id' => $user_id, 'agency_id' => $agency_id, 'button' => $service_to_button[$service], ]); } else if ($service === 'global' && !$new_state) { // Глобальное снятие с рекламы — со всех площадок $w_in = new \WebHookIn(null, $agency_id); $w_in->check_send([ 'action' => 'object_unadvertise', 'object_id' => $object_id, 'section' => 'object', 'user_id' => $user_id, 'agency_id' => $agency_id, 'button' => 'all', ]); } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'service' => $service, 'state' => $new_state, 'packages' => $packages, /*'queries' => [ 'sql' => $sql, 'sql_sph' => $sql_sph, 'sql2' => $sql2 ]*/ ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'sqls' => $sqls, 'errors' => $errors, /*'queries' => [ 'sql' => $sql, 'sql_sph' => $sql_sph, 'sql2' => $sql2 ]*/ ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function getZipalPackages($app, $get, $post, $need_return = false) { /*error_reporting(E_ERROR | E_WARNING | E_PARSE); ini_set('display_errors', 1);*/ global $ZIPAL_TARGETS; global $ZIPAL_MULTIPLY; $error = false; $errors = []; $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); $days_num = 0; if (isset($get['days_num'])) $days_num = intval($get['days_num']); $package_id = null; if (isset($get['package_id'])) $package_id = $get['package_id']; if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $package = []; $packages = []; $destinations = []; $obj = null; $sql = "SELECT objects.* FROM objects WHERE objects.id = $object_id"; if ($query = mysql_query($sql)) { $obj = mysql_fetch_assoc($query); } else { $error = true; $errors[] = mysql_error(); } if (!is_null($package_id)) { $curUser = new \User(); $curUser->get($user_id); $request = []; $login = $curUser->zipal_login; $password = $curUser->zipal_password; if (empty($login) || empty($password)) { $login = $curUser->agencyZipalLogin; $password = $curUser->agencyZipalPassword; } $request['login'] = $login; $request['password'] = $password; $request['method'] = 'GetPrices'; $request['request'] = []; $request['request']['requestType'] = 'GetPricesByParamsRequestType'; if ($obj['id_rf_region']) { $sql = "SELECT code FROM rf_regions WHERE rf_regions.id = ".$obj['id_rf_region']; if ($query = mysql_query($sql)) { $request['request']['region'] = mysql_fetch_assoc($query)['code']; } else { $error = true; $errors[] = mysql_error(); } } else { $request['request']['region'] = 78; } $sql = "SELECT * FROM advertising_package WHERE id=$package_id"; if ($query = mysql_query($sql)) { $package = mysql_fetch_assoc($query); if (!is_null($package)) { $sql = "SELECT * FROM advertising_package_destinations WHERE deleted=0 AND advertising_package_id=$package_id"; if ($query = mysql_query($sql)) { while ($row = mysql_fetch_assoc($query)) { array_push($destinations, $row); } $request['request']['days'] = $days_num; $request['request']['hasPhotos'] = $package['has_photo'] == 1 ? true : false; $deal_type_id = $package['advertising_package_deal_type_id']; $object_type_id = $package['advertising_package_object_type_id']; $price_type_id = $package['advertising_package_price_type_id']; $sql = "SELECT * FROM advertising_package_deal_type WHERE id=$deal_type_id"; if ($query = mysql_query($sql)) { $deal_type = mysql_fetch_assoc($query); } else { $error = true; $errors[] = mysql_error(); } $sql = "SELECT * FROM advertising_package_object_type WHERE id=$object_type_id"; if ($query = mysql_query($sql)) { $object_type = mysql_fetch_assoc($query); } else { $error = true; $errors[] = mysql_error(); } $priceType = null; if ($deal_type['code'] == 'RENT') { if (!$price_type_id || $price_type_id == -1) { $error = true; $errors[] = "Необходимо указать Тип цены для типа сделки Аренда"; } else { $sql = "SELECT * FROM advertising_package_price_type WHERE id=$price_type_id"; if ($query = mysql_query($sql)) { $priceType = mysql_fetch_assoc($query); } else { $error = true; $errors[] = mysql_error(); } } } $request['request']['room'] = $object_type['is_room'] == 1 ? true : false; $request['request']['dealType'] = $deal_type['code']; if ($priceType != null) $request['request']['priceType'] = $priceType['code']; $request['request']['objectType'] = $object_type['code']; $jsonResult = []; try { $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch_Diamond2_T5353; Windows Phone 6.5)'; $result = curl_request_zipal_json("https://zipal.ru/ws/json", $user_id, $user_agent, json_encode($request)); $jsonResult = json_decode($result, true); } catch (\Exception $exception) { $error = true; $errors[] = $exception->getMessage(); } if ($jsonResult['resultCode'] == "FAIL") { $error = true; if ($res = strpos($jsonResult['result'], "at [Source:")) $errors[] = substr($jsonResult['result'], $res); else $errors[] = $jsonResult['result']; } else if ($jsonResult['resultCode'] == "OK") { $zipal_price = $jsonResult['result']['basePrice'] / 100; $non_zipal_price = 0; $base_price = ($jsonResult['result']['basePrice'] / 100) * $ZIPAL_MULTIPLY; foreach ($destinations as $dbDest) { /*$targetName = $ZIPAL_TARGETS[$dbDest['destination']]; if (!$targetName) $targetName = $dbDest['destination'];*/ $zipalDest = null; $zipalDestPrice = null; foreach ($jsonResult['result']['destination'] as $dest) { if ($dbDest['destination'] === $dest['destination']) { $zipalDest = $dest; foreach ($dest['price'] as $price) { if ($price['type'] === $dbDest['placement_type']) { $zipalDestPrice = $price; } } } } if ($zipalDest != null && $zipalDestPrice != null) { /*$priceTypeVal = $ZIPAL_PRICE_TYPES[$zipalDestPrice['type']]; if (!$priceTypeVal) $priceTypeVal = $zipalDestPrice['type'];*/ $manPrice = 0; if ($dbDest['manual_price'] > 0) { if ($zipalDest['destination'] === 'AVITO') { $manPrice = $dbDest['manual_price']; } else { $manPrice = $dbDest['manual_price'] * $days_num; } } if ($zipalDestPrice['price'] > 0) $zipal_price = $zipal_price + ($zipalDestPrice['price'] / 100); if ($dbDest['manual_price'] > 0) $non_zipal_price = $non_zipal_price + $manPrice; } $price = $dbDest['manual_price'] > 0 ? $manPrice : $zipalDestPrice['price'] / 100; /*if ($zipalDest['destination'] === 'AVITO' || $zipalDest['destination'] === 'YANDEX' || $zipalDest['destination'] === 'CIAN' || $zipalDest['destination'] === 'EMLS') { $non_zipal_price = $non_zipal_price + $price; } else { $zipal_price = $zipal_price + $price; }*/ } $total_price = ($package) ? (float)$package['price'] : ($jsonResult['result']['basePrice'] / 100) * $ZIPAL_MULTIPLY; $package = [ 'days_count' => $days_num, 'base_price' => $base_price, 'zipal_price' => $zipal_price, 'addition_price' => $non_zipal_price, 'total_price' => $total_price + $base_price, '_meta' => ($package) ? $package : null ]; } } else { $error = true; $errors[] = mysql_error(); } } else { $error = true; $errors[] = "Пакет не найден"; } } else { $error = true; $errors[] = mysql_error(); } } else { $sql = "SELECT objects.* FROM objects WHERE objects.id = $object_id"; $query = mysql_query($sql); if ($obj = mysql_fetch_assoc($query)) { $curUser = new \User(); $curUser->get($user_id); $agency_id = $curUser->agencyId; if ($obj['operation_type'] == 1) { $deal_type = 'SELL'; $sql_price = "true"; } else { $deal_type = 'RENT'; $priceType = 'MONTH'; if ($obj['srok'] == 1) $priceType = 'DAY'; $sql_price = " advertising_package_price_type_id IN (SELECT id FROM advertising_package_price_type WHERE code = '$priceType') "; } $has_photos = 0; $sql = "SELECT id FROM objects_object_photo oop WHERE oop.object_id = $obj[id] LIMIT 1"; if ($query = mysql_query($sql)) { if (mysql_num_rows($query) > 0) { $has_photos = 1; } } else { $error = true; $errors[] = mysql_error(); } $is_room = 0; $object_type = 'FLAT'; switch ($obj['type']) { case 1: $object_type = 'FLAT'; break; case 2: $object_type = 'FLAT'; $is_room = 1; break; case 5: case 3: $object_type = 'HOUSE'; break; case 4: case 6: if ($obj['type_category']) { if ($obj['type_category'] == 1) { $object_type = 'BUSINESS'; } if ($obj['type_category'] == 2) { $object_type = 'WAREHOUSE'; } if ($obj['type_category'] >= 3) { $object_type = 'BUSINESS'; } } else { $object_type = 'BUSINESS'; } break; case 7: $object_type = 'LAND'; break; } if ($obj['id_rf_region']) $region_id = $obj['id_rf_region']; else $region_id = 78; $sql_a = "SELECT * FROM advertising_package WHERE is_room=$is_room AND has_photo = $has_photos AND advertising_package_deal_type_id IN (SELECT id FROM advertising_package_deal_type WHERE code = '$deal_type') AND advertising_package_object_type_id IN (SELECT id FROM advertising_package_object_type WHERE code = '$object_type') AND $sql_price AND deleted = 0 AND agency_id = $agency_id AND (region_rf_id = $region_id OR region_rf_id IN (SELECT parent FROM rf_regions WHERE id = $region_id))"; if ($query = mysql_query($sql_a)) { if (mysql_num_rows($query)) { while ($package = mysql_fetch_assoc($query)) { $checked = false; $published = \zipalPackageCountText($obj['id'], $package['id']); if ($published['zipal_active'] == 1 && (int)$published['zipal_days'] > 0) $checked = true; $targets = []; $sql = "SELECT * FROM advertising_package_destinations WHERE advertising_package_id = '$package[id]' AND deleted = 0"; if ($query_d = mysql_query($sql)) { while ($destination = mysql_fetch_assoc($query_d)) { $target = $ZIPAL_TARGETS[$destination['destination']]; if (!$target) $target = $destination['destination']; $targets[] = $target; } } else { $error = true; $errors[] = mysql_error(); } $is_error = (!empty($published['error_text'])) ? true : false; $error_text = null; if ($is_error) $error_text = "Ошибка: " . $published['error_text'][0]['defaultMessage']; $packages[] = [ 'id' => intval($package['id']), 'name' => trim($package['name']), 'days_count' => (int)$package['days_count'], 'days_count_string' => \declOfNum((int)$package['days_count'], ['%d день', '%d дня', '%d дней']), 'targets' => $targets, 'is_active' => (!$is_error) ? $checked : false, 'left_days' => (!empty($published['zipal_days'])) ? (int)$published['zipal_days'] : false, 'status_text' => (!empty($published['zipal_days_text'])) ? $published['zipal_days_text'] : false, 'is_error' => $is_error, 'error_text' => $error_text, /*'_meta' => $published, '_meta2' => $package,*/ ]; } } } } else { $error = true; $errors[] = mysql_error(); } } if (!$error && $need_return) { if (!is_null($package_id)) return $package; else return $packages; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); if (!is_null($package_id)) { $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'package' => $package ], JSON_UNESCAPED_UNICODE)); } else { $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'packages' => $packages ], JSON_UNESCAPED_UNICODE)); } $app->stop(); } } if ($need_return) { return false; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } public function getBudget($app, $get, $post, $need_return = false) { /*error_reporting(E_ERROR | E_WARNING | E_PARSE); ini_set('display_errors', 1);*/ $error = false; $errors = []; $is_agency_summary = false; $is_department_user = false; if (isset($get['is_agency'])) $is_agency_summary = boolval($get['is_agency']); if (($user_id = $_SESSION['id']) && $_SESSION['use_advert_budget']) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); // Текущий пользователь $user = new \User; $user->get($user_id); $user->checkPermissions($user_id, false); $departments_inst = new \Department(); $departments = $departments_inst->getDepartments((int)$user_id); foreach ($departments as $department) { if ($department['department_id'] == intval($user->department_id)) { $is_department_user = true; } } $is_budget_of = null; $advert_budgets = new \AdvertBudgets(); $budget = []; if ($is_agency_summary || ($user->agency || $user->users_admin)) { $is_budget_of = 'agency'; $budgets = $advert_budgets->getAdvertBudgets(null, true); $budget = $budgets; } else { $budgets = $advert_budgets->getAdvertBudgets($user_id); $budget = $budgets[(int)$user_id]; if ($is_department_user) { if ($user->agency) $is_budget_of = "agency"; else if ($departments[$user->role_id]['role'] == 'admin_department') $is_budget_of = "department_admin"; else if ($departments[$user->role_id]['role'] == 'manager_office_menager') $is_budget_of = "department_manager_office_manager"; else if ($departments[$user->role_id]['role'] == 'manager_office') $is_budget_of = "department_manager_office"; else if ($departments[$user->role_id]['role'] == 'agent') $is_budget_of = "department_agent"; else $is_department_user = !($is_office_user = true); } else { if ($user->agency) $is_budget_of = "agency"; else if ($user->manager > 0) $is_budget_of = "manager"; else $is_budget_of = "agent"; } } $label = "Рекламный бюджет"; switch($is_budget_of) { case 'agency': $label = "Рекламный бюджет Агентства"; break; case 'manager': $label = "Рекламный бюджет менеджера и подчиненных агентов"; break; case 'agent': $label = "Рекламный бюджет агента"; break; case 'department_admin': $label = "Рекламный бюджет Отдела и подчиненных"; break; case 'department_manager_office_manager': $label = "Рекламный бюджет менеджера Офиса и подчиненных агентов"; break; case 'department_manager_office': $label = "Рекламный бюджет менеджера Отдела и подчиненных агентов"; break; case 'department_agent': $label = "Рекламный бюджет агента Отдела"; break; } $data = array_merge([ 'avito' => [ 'total' => ($budget['avito']) ? $budget['avito'] : 0, 'amount' => ($budget['avito_amount']) ? $budget['avito_amount'] : 0, 'available' => ($budget['avito_available']) ? $budget['avito_available'] : 0, 'is_unlimited' => (int)$budget['avito_unlimited'], ], 'cian' => [ 'total' => ($budget['cian']) ? $budget['cian'] : 0, 'amount' => ($budget['cian_amount']) ? $budget['cian_amount'] : 0, 'available' => ($budget['cian_available']) ? $budget['cian_available'] : 0, 'is_unlimited' => (int)$budget['cian_unlimited'], ], 'domclick' => [ 'total' => ($budget['domclick']) ? $budget['domclick'] : 0, 'amount' => ($budget['domclick_amount']) ? $budget['domclick_amount'] : 0, 'available' => ($budget['domclick_available']) ? $budget['domclick_available'] : 0, 'is_unlimited' => (int)$budget['domclick_unlimited'], ], 'yandex' => [ 'total' => ($budget['yandex']) ? $budget['yandex'] : 0, 'amount' => ($budget['yandex_amount']) ? $budget['yandex_amount'] : 0, 'available' => ($budget['yandex_available']) ? $budget['yandex_available'] : 0, 'is_unlimited' => (int)$budget['yandex_unlimited'], ], 'jcat' => [ 'total' => ($budget['jcat']) ? $budget['jcat'] : 0, 'amount' => ($budget['jcat_amount']) ? $budget['jcat_amount'] : 0, 'available' => ($budget['jcat_available']) ? $budget['jcat_available'] : 0, 'is_unlimited' => (int)$budget['jcat_unlimited'], ], ], [ 'total' => ($budget['total']) ? $budget['total'] : 0, 'amount' => ($budget['amount']) ? $budget['amount'] : 0, 'balance' => ($budget['balance']) ? $budget['balance'] : 0, 'label' => $label, 'is_budget_of' => $is_budget_of, 'is_department_user' => $is_department_user, ]); if (!$error && $need_return) { return $data; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'budget' => $data ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } if ($need_return) { return false; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } public function getPrice($app, $get, $post, $need_return = false) { /*error_reporting(E_ERROR | E_WARNING | E_PARSE); ini_set('display_errors', 1);*/ $error = false; $errors = []; $id = null; if (isset($get['id'])) $id = intval($get['id']); $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); $service = null; if (isset($get['service'])) $service = trim($get['service']); $days_num = 0; if (isset($get['days_num'])) $days_num = intval($get['days_num']); $price = 0; $budget = 0; if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $advert_budget = new \AdvertBudgets(); $service_id = $advert_budget->getServiceByName($service); $results = $advert_budget->getObjectAdvertPrices($object_id, $service_id, $days_num); if (!is_null($results['price'])) $price = $results['price']; if (!is_null($results['budget'])) $budget = $results['budget']; if ($need_return) { return [ 'object_id' => $object_id, 'service_id' => $service_id, 'price' => $price, 'owner_user_id' => $price['owner_user_id'], 'budget' => $budget, ]; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'service_id' => $service_id, 'price' => $price, 'owner_user_id' => $price['owner_user_id'], 'budget' => $budget, //'_raw' => $results, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } if ($need_return) { return false; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } public function getZipalPrices($app, $get, $post, $need_return = false) { global $ZIPAL_TARGETS; global $ZIPAL_PRICE_TYPES; global $ZIPAL_MULTIPLY; /*error_reporting(E_ERROR | E_WARNING | E_PARSE); ini_set('display_errors', 1);*/ $error = false; $errors = []; $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); $days_num = 0; if (isset($get['days_num'])) $days_num = intval($get['days_num']); if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $packages = []; $request = []; $sql = "SELECT objects.* FROM objects WHERE objects.id = $object_id"; $query = mysql_query($sql); if ($obj = mysql_fetch_assoc($query)) { $curUser = new \User(); $curUser->get($user_id); $agency_id = $curUser->agencyId; $login = $curUser->zipal_login; $password = $curUser->zipal_password; if (empty($login) || empty($password)) { $login = $curUser->agencyZipalLogin; $password = $curUser->agencyZipalPassword; } $request['login'] = $login; $request['password'] = $password; $request['method'] = 'GetPrices'; $request['request'] = []; $request['request']['requestType'] = 'GetPricesByParamsRequestType'; $request['request']['days'] = $days_num; $request['request']['hasPhotos'] = false; $request['request']['room'] = false; if ($obj['id_rf_region']) { $sql = "SELECT code FROM rf_regions WHERE rf_regions.id = ".$obj['id_rf_region']; if ($query = mysql_query($sql)) { $request['request']['region'] = mysql_fetch_assoc($query)['code']; } else { $error = true; $errors[] = mysql_error(); } } else { $request['request']['region'] = 78; } if ($obj['operation_type'] == 1) { $request['request']['dealType'] = 'SELL'; } else { $request['request']['dealType'] = 'RENT'; $request['request']['priceType'] = 'MONTH'; if ($obj['srok'] == 1) { $request['request']['priceType'] = 'DAY'; } } $sql = "SELECT oop.sort_order FROM objects_object_photo oop WHERE oop.object_id = $obj[id]"; if ($query = mysql_query($sql)) { if (mysql_num_rows($query) > 0) { $request['request']['hasPhotos'] = true; } } else { $error = true; $errors[] = mysql_error(); } switch ($obj['type']) { case 1: $request['request']['objectType'] = 'FLAT'; break; case 2: $request['request']['objectType'] = 'FLAT'; $request['request']['room'] = true; break; case 3: case 5: $request['request']['objectType'] = 'HOUSE'; break; case 4: case 6: if ($obj['type_category']) { if ($obj['type_category'] == 1) { $request['request']['objectType'] = 'BUSINESS'; } if ($obj['type_category'] == 2) { $request['request']['objectType'] = 'WAREHOUSE'; } if ($obj['type_category'] >= 3) { $request['request']['objectType'] = 'BUSINESS'; } } else { $request['request']['objectType'] = 'BUSINESS'; } break; case 7: $request['request']['objectType'] = 'LAND'; break; } $jsonResult = []; try { $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; HTC_Touch_Diamond2_T5353; Windows Phone 6.5)'; $result = curl_request_zipal_json("https://zipal.ru/ws/json", $user_id, $user_agent, json_encode($request)); $jsonResult = json_decode($result, true); } catch (\Exception $exception) { $error = true; $errors[] = $exception->getMessage(); } if ($jsonResult['resultCode'] == "FAIL") { // ошибка $res = strpos($jsonResult['result'], "at [Source:"); if ($res) { $errors[] = substr($jsonResult['result'], $res); } else { $errors[] = $jsonResult['result']; } } else { if ($jsonResult['resultCode'] == "OK") { $base_price = (($jsonResult['result']['basePrice'] / 100) * $ZIPAL_MULTIPLY); $groups = []; $destinations = []; foreach ($jsonResult['result']['destination'] as $dest) { $skipped = false; foreach ($dest['price'] as $price) { if (!$price['feedOnly']) $skipped = true; } if (!isset($dest['destination'])) continue; $target_name = $dest['destination']; if(isset($ZIPAL_TARGETS[$dest['destination']])){ $target_name = $ZIPAL_TARGETS[$dest['destination']]; } $destination = strtolower(trim($dest['destination'])); if (!isset($groups[$destination])) $groups[$destination] = $target_name; if ($dest['destination'] === 'YANDEX') $skipped = true; if ($dest['destination'] === 'CIAN') $skipped = true; if ($dest['destination'] === 'EMLS') $skipped = true; if ($dest['destination'] === 'AVITO') $skipped = true; if ($skipped) { foreach ($dest['price'] as $price) { $is_feed = false; if ($price['feedOnly']) { $is_feed = true; } $amount = $price['price'] > 0 ? floatval($price['price']) / 100 : null; $is_free = false; if ((floatval($amount) == 0 && !$price['feedOnly']) || $dest['destination'] === 'YANDEX' || $dest['destination'] === 'CIAN' || $dest['destination'] === 'EMLS' || $dest['destination'] === 'AVITO') { $is_free = true; } if ($is_free && floatval($amount) > 0) $is_free = false; $type = $price['type']; $destinations[$destination][$type] = [ 'type' => $type, 'price' => $amount, 'description' => (isset($ZIPAL_PRICE_TYPES[$price['type']])) ? $ZIPAL_PRICE_TYPES[$price['type']] : trim($price['type']), 'is_feed' => $is_feed, 'is_free' => $is_free ]; } } } $packages[] = [ 'days_count' => $days_num, 'base_price' => $base_price, 'groups' => $groups, 'destinations' => $destinations, ]; } } } else { $error = true; $errors[] = mysql_error(); } if (!$error && $need_return) { return $packages; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'packages' => count($packages) ? $packages : null, //'_raw' => $jsonResult ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } if ($need_return) { return false; } else { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } public function getPromotion($app, $get, $post) { $error = false; $errors = []; $object_id = null; if (isset($get['object_id'])) $object_id = $get['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($get['is_external']) ? $get['is_external'] : null)) return; if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $promo = []; $get = clearInputData($_GET); $agency_id = \User::getUserAgencyID($user_id); if ($get['object_id']) { $sql = "SELECT * FROM `ads_promo` WHERE `object_id` = '$object_id' AND `agency_id` = '$agency_id' LIMIT 1"; if ($query = mysql_query($sql)) { $promo = mysql_fetch_assoc($query); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'object_id' => $object_id, 'packages' => count($promo) ? $promo : false ], JSON_UNESCAPED_UNICODE)); $app->stop(); } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function setPromotion($app, $get, $post) { $error = false; $errors = []; $body = $app->request->getBody(); $data = json_decode($body, true); $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $packages = null; if (isset($data['packages'])) $packages = $data['packages']; if (($user_id = $_SESSION['id']) && !is_null($object_id) && !is_null($packages)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $agency_id = \User::getUserAgencyID($user_id); $owner_id = (int)mysql_fetch_assoc(mysql_query("SELECT * FROM `objects` WHERE id = '$post[object_id]'"))['id_add_user']; if (!$owner_id) $owner_id = (int)$user_id; $sql = "SELECT `id` FROM `ads_promo` WHERE `object_id` = '$object_id' AND `agency_id` = '$agency_id' LIMIT 1"; $packages = array_map('intval', $packages); if ($id = (int)mysql_fetch_assoc(mysql_query($sql))['id']) { $sql = "UPDATE `ads_promo` SET `avito_highlight` = '$packages[avito_highlight]', `avito_xl` = '$packages[avito_xl]', `avito_x2_1` = '$packages[avito_x2_1]', `avito_x2_7` = '$packages[avito_x2_7]', `avito_x5_1` = '$packages[avito_x5_1]', `avito_x5_7` = '$packages[avito_x5_7]', `avito_x10_1` = '$packages[avito_x10_1]', `avito_x10_7` = '$packages[avito_x10_7]', `avito_price` = '$packages[avito_price]', `cian_highlight` = '$packages[cian_highlight]', `cian_standard` = '$packages[cian_standard]', `cian_paid` = '$packages[cian_paid]', `cian_premium` = '$packages[cian_premium]', `cian_top3` = '$packages[cian_top3]', `cian_bet` = '$packages[cian_bet]', `cian_ignore_pkg` = '$packages[cian_ignore_pkg]', `cian_price` = '$packages[cian_price]', `yandex_premium` = '$packages[yandex_premium]', `yandex_raise` = '$packages[yandex_raise]', `yandex_promotion` = '$packages[yandex_promotion]', `yandex_price` = '$packages[yandex_price]', `domclick_express` = '$packages[domclick_express]', `domclick_premium` = '$packages[domclick_premium]', `domclick_top` = '$packages[domclick_top]', `domclick_price` = '$packages[domclick_price]', `object_owner_id` = '$owner_id', `avito_promo_type` = '$packages[avito_promo_type]', `updated_at` = NOW(), `updated_by` = '$user_id' WHERE `id` = '$id'"; } else { $sql = "INSERT INTO `ads_promo` ( `object_id`, `agency_id`, `avito_highlight`, `avito_xl`, `avito_x2_1`, `avito_x2_7`, `avito_x5_1`, `avito_x5_7`, `avito_x10_1`, `avito_x10_7`, `avito_price`, `cian_highlight`, `cian_standard`, `cian_paid`, `cian_premium`, `cian_top3`, `cian_bet`, `cian_ignore_pkg`, `cian_price`, `yandex_premium`, `yandex_raise`, `yandex_promotion`, `yandex_price`, `domclick_express`, `domclick_premium`, `domclick_top`, `domclick_price`, `object_owner_id`, `created_at`, `created_by`, `updated_at`, `updated_by`, `avito_promo_type` ) VALUES( '$object_id', '$agency_id', '$packages[avito_highlight]', '$packages[avito_xl]', '$packages[avito_x2_1]', '$packages[avito_x2_7]', '$packages[avito_x5_1]', '$packages[avito_x5_7]', '$packages[avito_x10_1]', '$packages[avito_x10_7]', '$packages[avito_price]', '$packages[cian_highlight]', '$packages[cian_standard]', '$packages[cian_paid]', '$packages[cian_premium]', '$packages[cian_top3]', '$packages[cian_bet]', '$packages[cian_ignore_pkg]', '$packages[cian_price]', '$packages[yandex_premium]', '$packages[yandex_raise]', '$packages[yandex_promotion]', '$packages[yandex_price]', '$packages[domclick_express]', '$packages[domclick_premium]', '$packages[domclick_top]', '$packages[domclick_price]', '$owner_id', NOW(), '$user_id', NULL, NULL, '$packages[avito_promo_type]' )"; } if (!mysql_query($sql)) { $error = true; $errors[] = mysql_error(); } if (!$error) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'sql' => $sql, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function editAdvertPrice($app, $get, $post) { $error = false; $errors = []; $body = $app->request->getBody(); $data = json_decode($body, true); $id = null; if (isset($data['id'])) $id = $data['id']; $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $price = null; if (isset($data['price'])) $price = $data['price']; $old_price_string = null; if (isset($data['old_price'])) $old_price_string = trim($data['old_price']); $destination = null; if (isset($data['destination'])) $destination = $data['destination']; if (($user_id = $_SESSION['id']) && !is_null($id) && !is_null($object_id) && !is_null($destination) && !is_null($price)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $service_name = ''; if ($destination == 'avito') { $service_name = ' для Фида Avito'; $destination = 'AVITO_JW_FEED'; } else if ($destination == 'cian') { $service_name = ' для Фида ЦИАН'; $destination = 'CIAN_JW_FEED'; } else if ($destination == 'yandex') { $service_name = ' для Фида Я.Недвижимость'; $destination = 'YANDEX_JW_FEED'; } else if ($destination == 'domclick') { $service_name = ' для Фида ДомКлик'; $destination = 'DOMCLICK_JW_FEED'; } else if ($destination == 'jcat') { $service_name = ' для Фида JCat'; $destination = 'EMLS_JW_FEED'; } $sql = "UPDATE `object_publish_statistic` SET `price`='$price' WHERE `id`='$id' AND `object_id`='$object_id' AND `destination`='$destination' LIMIT 1"; if (mysql_query($sql)) { $price_string = (((float)$price < 1) ? declOfNum((float)$price * 100, ['%d копейка', '%d копейки', '%d копеек']) : declOfNum((float)$price, ['%s рубль', '%s рубля', '%s рублей'])); $message = 'Изменена стоимость продвижения в Рекламе' . $service_name . ' с '. $old_price_string . ' на ' . $price_string; $sql = "INSERT INTO user_object_events(user_id, object_id, type, comment) VALUES($user_id, $object_id, 'comment', '$message')"; mysql_query($sql); } else { $error = true; $errors[] = mysql_error(); } if (!$error) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'destination' => $destination, 'price' => $price, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function editPromotionPrice($app, $get, $post) { $error = false; $errors = []; $body = $app->request->getBody(); $data = json_decode($body, true); $id = null; if (isset($data['id'])) $id = $data['id']; $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $price = null; if (isset($data['price'])) $price = $data['price']; $old_price_string = null; if (isset($data['old_price'])) $old_price_string = trim($data['old_price']); $destination = null; if (isset($data['destination'])) $destination = $data['destination']; if (($user_id = $_SESSION['id']) && !is_null($id) && !is_null($object_id) && !is_null($destination) && !is_null($price)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $agency_id = \User::getUserAgencyID($user_id); $service_name = ''; if ($destination == 'avito') { $service_name = ' для Avito'; $sql = "UPDATE `ads_promo` SET `avito_price`='$price', `updated_by`='$user_id' WHERE `id`='$id' AND `object_id`='$object_id' AND `agency_id`='$agency_id'"; } else if ($destination == 'cian') { $service_name = ' для ЦИАН'; $sql = "UPDATE `ads_promo` SET `cian_price`='$price', `updated_by`='$user_id' WHERE `id`='$id' AND `object_id`='$object_id' AND `agency_id`='$agency_id'"; } else if ($destination == 'yandex') { $service_name = ' для Я.Недвижимость'; $sql = "UPDATE `ads_promo` SET `yandex_price`='$price', `updated_by`='$user_id' WHERE `id`='$id' AND `object_id`='$object_id' AND `agency_id`='$agency_id'"; } else if ($destination == 'domclick') { $service_name = ' для ДомКлик'; $sql = "UPDATE `ads_promo` SET `domclick_price`='$price', `updated_by`='$user_id' WHERE `id`='$id' AND `object_id`='$object_id' AND `agency_id`='$agency_id'"; } if (mysql_query($sql)) { $price_string = (((float)$price < 1) ? declOfNum((float)$price * 100, ['%d копейка', '%d копейки', '%d копеек']) : declOfNum((float)$price, ['%s рубль', '%s рубля', '%s рублей'])); $message = 'Изменена стоимость продвижения в Рекламе' . $service_name . ' с '. $old_price_string . ' на ' . $price_string; $sql = "INSERT INTO user_object_events(user_id, object_id, type, comment) VALUES($user_id, $object_id, 'comment', '$message')"; mysql_query($sql); } else { $error = true; $errors[] = mysql_error(); } if (!$error) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'destination' => $destination, 'price' => $price, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function getObjectCosts($app, $get = null, $post = null) { global $PROMO_TARGETS; global $ZIPAL_TARGETS; $error = false; $errors = []; $object_id = intval($get['object_id']); if (($user_id = $_SESSION['id']) && $object_id) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $pdo = $app->container->get('pdo'); /*error_reporting(E_ALL | E_STRICT); ini_set('display_errors', 1);*/ $user = new \User; $user->get($user_id); $gmtmsk =$user->gmtmsk; $time_zone = ''; if($gmtmsk >= 0){ $time_zone = '+'.$gmtmsk.' hour'; } else { $time_zone = '-'.$gmtmsk.' hour'; } $user->checkPermissions($user_id, false); $results = []; $today = 0; $total = 0; $sql = "SELECT `stats`.*, `stats`.`id` AS `id`, `users`.`last_name` AS `last_name`, `users`.`first_name` AS `first_name`, `users`.`middle_name` AS `middle_name`, `users`.`agency` AS `agency`, `users`.`fio` AS `fio`, `users`.`manager` AS `manager` FROM `object_publish_statistic` AS `stats` LEFT JOIN `users` AS `users` ON `users`.`id` = `stats`.`publish_user_id` WHERE `stats`.`object_id` = '$object_id' AND `stats`.`on_moderation` = 0 ORDER BY `stats`.`publish_start_date` DESC, `stats`.`id` ASC"; if ($rez = mysql_query($sql)) { $date = ''; $new_date = ''; $stats = []; while ($stat = mysql_fetch_assoc($rez)) { if (in_array($stat['destination'], array_keys($PROMO_TARGETS))) $stat['type'] = 'promotion'; else $stat['type'] = 'regular'; $stats[] = $stat; } $num = 0; $targets = array_merge($PROMO_TARGETS, $ZIPAL_TARGETS); foreach ($stats as $stat) { $num++; $target = $targets[$stat['destination']]; $publisher_id = (int)$stat['publish_user_id']; $unpublisher_id = null; $unpublisher_at = null; if (isset($stat['unpublish_user_id'])) { $unpublisher_id = (int)$stat['unpublish_user_id']; $unpublisher_at = strtotime($time_zone, strtotime($stat['updated_at'])); } $row = mysql_fetch_assoc(mysql_query("SELECT agency, manager, fio FROM users WHERE id=$publisher_id")); if ($row['agency']) $publisher = "Агентство $row[fio]"; elseif ($row['manager']) $publisher = "Менеджер $row[fio]"; else $publisher = "Агент $row[fio]"; $unpublisher = null; if ($unpublisher_id) { $row = mysql_fetch_assoc(mysql_query("SELECT agency, manager, fio FROM users WHERE id=$unpublisher_id")); if ($row['agency']) $unpublisher = "Агентство $row[fio]"; elseif ($row['manager']) $unpublisher = "Менеджер $row[fio]"; else $unpublisher = "Агент $row[fio]"; } $publisher_at = strtotime($time_zone, strtotime($stat['publish_start_date'])); $date = date('d', $publisher_at) . ' ' . getRusMonth(date('m', $publisher_at)) . ' ' . date('Y', $publisher_at). ' г.'; $new_date = $date; if (!$target) $target = $stat['destination']; if ($stat['type'] == 'promotion') $target = 'Продвижение от ' . $target; else $target = 'Размещено ' . ((strpos($target, 'Фид') !== false) ? 'в ' : 'на ') . $target; $price = 0; if ($stat['price'] > 0) { $price = (float)$stat['price'] < 1 ? (float)$stat['price'] * 100 : (float)$stat['price']; $today = $today + $stat['price']; $total = $total + $stat['price']; } $datetime = date('H:i:s', $publisher_at); $destination = $stat['destination']; if ($stat['type'] == 'promotion') { if (strpos($destination, 'AVITO') !== false) $destination = 'avito'; else if (strpos($destination, 'CIAN') !== false) $destination = 'cian'; else if (strpos($destination, 'DOMCLICK') !== false) $destination = 'domclick'; else if (strpos($destination, 'JCAT') !== false) $destination = 'jcat'; else if (strpos($destination, 'YANDEX') !== false) $destination = 'yandex'; } $results['stats'][$date][$datetime][] = [ 'id' => (int)$stat['id'], 'target' => $target, 'type' => $stat['type'], 'destination' => $destination, 'publisher' => $publisher, 'publisher_at' => date('d.m.Y в H:i:s', $publisher_at), 'publisher_by' => $publisher_id, 'unpublisher' => $unpublisher, 'unpublished_at' => date('d.m.Y в H:i:s', $unpublisher_at), 'unpublished_by' => $unpublisher_id, 'days' => ($stat['days_count'] < 5000) ? (int)$stat['days_count'] : false, 'expired' => ($stat['days_count'] < 5000) ? date('d.m.Y', strtotime($stat['publish_end_date'])) : false, 'price' => $price, ]; $results['stats'][$date]['amount'] = $price+$results['stats'][$date]['amount']; if ($date != $new_date) { $today = 0; $date = ''; } } $results['total'] = (float)$total < 1 ? (float)$total * 100 : (float)$total; } $results['stats'] = array_reverse($results['stats']); $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id, 'results' => $results, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id, 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function getModerators($app, $get = null, $post = null) { $error = false; $errors = []; $section = null; if (isset($get['section'])) $section = trim($get['section']); if (($user_id = $_SESSION['id']) && !is_null($section)) { // Открываем соединение с БД $mdb = $app->container->get('mysql'); $pdo = $app->container->get('mypdo'); /*error_reporting(E_ERROR | E_WARNING | E_PARSE); ini_set('display_errors', 1);*/ $employees = []; $meta = []; // Текущий пользователь $user = new \User; $user->get($user_id); $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); $event_id = null; if (isset($get['event_id'])) $event_id = intval($get['event_id']); $sub_id = null; if (isset($get['sub_id'])) $sub_id = intval($get['sub_id']); if ($section == 'adverts') { $users = []; $this_users = []; $user = new \User(); $user->get($user_id); $agency_id = $user->agencyId; $users_moderation = []; //Все юзеры агенства $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 = $pdo->query($sql_users); while($r_users = $pdo->fetch_assoc($q_users)) { $users[$r_users['id']] = $r_users; if ($r_users['id'] == $user_id) { $this_users = $r_users; //$meta['this_users'] = $this_users; } } //Поиск модераций $sql_modr = "SELECT * FROM objects_moderation_advert WHERE object_id={$object_id} AND agent_id={$user_id}"; $q_modr = $pdo->query($sql_modr); if ($pdo->num_rows($q_modr) > 0) { $r_modr = $pdo->fetch_assoc($q_modr); $sql_modr_users = "SELECT * FROM `objects_moderation_advert_user_work` WHERE moderation_id = {$r_modr['id']}"; $q_modr_users = $pdo->query($sql_modr_users); if ($pdo->num_rows($q_modr_users) > 0) { $meta['moderator'] = $r_modr; while($r_moder_users = $pdo->fetch_assoc($q_modr_users)) { $users_moderation[] = (int)$r_moder_users['user_id']; } } } $db_sphinx = $app->container->get('sphinx2'); $obj = $db_sphinx->fetch_assoc($db_sphinx->query("SELECT * FROM objects WHERE id={$object_id}")); if ($obj) $meta['object'] = $obj; $meta['users'] = $users_moderation; 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) { $employees[] = [ 'id' => intval($emp['id']), 'name' => htmlspecialchars_decode(trim($emp['last_name'] . ' ' . $emp['first_name'] . ' ' . $emp['middle_name'])), 'is_selected' => (in_array($emp['id'], $users_moderation)), 'is_agent' => boolval($emp['agent']), 'is_manager' => boolval($emp['manager']), ]; } } } } else if ($section == 'events') { $users = []; $this_users = []; $user = new \User(); $user->get($user_id); $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 = $pdo->query($sql_users); while($r_users = $pdo->fetch_assoc($q_users)) { $users[$r_users['id']] = $r_users; if ($r_users['id'] == $user_id) { $this_users = $r_users; //$meta['this_users'] = $this_users; } } $sql_event = "SELECT * FROM user_object_events WHERE id = {$event_id}"; $q_event = $pdo->query($sql_event); $r_event = $pdo->fetch_assoc($q_event); if (isset($r_event['object_id']) && $r_event['object_id'] > 0) { $object_id = (int)$r_event['object_id']; $meta['object_id'] = $object_id; } if ($object_id > 0) { $db_sphinx = $app->container->get('sphinx2'); //ответственный по объекту $sql_obj = "SELECT * FROM objects WHERE id={$object_id}"; $q_obj = $db_sphinx->query($sql_obj); $r_obj = $db_sphinx->fetch_assoc($q_obj); if (isset($r_obj['id_add_user']) && $r_obj['id_add_user'] > 0) { $user_add = (int)$r_obj['id_add_user']; $meta['user_add'] = $user_add; } } $user_for = 0; if ($sub_id > 0) { $sql_sub = "SELECT * FROM user_sub_comments WHERE id = {$sub_id}"; $q_sub = $pdo->query($sql_sub); $r_sub = $pdo->fetch_assoc($q_sub); $meta['event_id'] = $event_id; $meta['sub_comment'] = $r_sub['sub_comment']; $meta['user_for'] = (int)$r_sub['user_for']; $user_for = (int)$r_sub['user_for']; } 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) || ($user_add > 0 && $emp['id'] == $user_add) ) { $employees[] = [ 'id' => intval($emp['id']), 'name' => htmlspecialchars_decode(trim($emp['last_name'] . ' ' . $emp['first_name'] . ' ' . $emp['middle_name'])), 'is_selected' => ($emp['id'] == $user_for), 'is_agent' => boolval($emp['agent']), 'is_manager' => boolval($emp['manager']), ]; } } } } if (!$error) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $sources = [ 'success' => true, 'user_id' => (int)$user_id, 'list' => $employees, 'meta' => $meta ]; $app->response->setBody(json_encode($sources, JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$user_id ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function setConfirmModeration($app, $get, $post) { $error = false; $errors = []; $body = $app->request->getBody(); $data = json_decode($body, true); $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $services = null; if (isset($data['services'])) $services = $data['services']; if (($user_id = $_SESSION['id']) && !is_null($object_id) && !is_null($services)) { // Открываем соединение с БД $mypdo = $app->container->get('mypdo'); $moderation_inst = new \ModerationAdvert($mypdo); $result = $moderation_inst->confirmModeration($object_id); if (!empty($result['errors'])) $errors = $result['errors']; //$moderation_inst->checkAndClear($object_id, 'use_in_advert', false); if (empty($errors)) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => ($result['result'] == 'done'), 'user_id' => (int)$user_id, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors, ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function setModeration($app, $get, $post) { $error = false; $errors = []; $body = $app->request->getBody(); $data = json_decode($body, true); $object_id = null; if (isset($data['object_id'])) $object_id = $data['object_id']; // Признак найденного листинга — явный флаг из запроса (offset-free: id листинга коллизит с objects.id) if ($this->_rejectIfExternalListing($app, isset($data['is_external']) ? $data['is_external'] : null)) return; $employee_ids = null; if (isset($data['employee_ids'])) $employee_ids = $data['employee_ids']; $comment = ''; if (isset($data['comment'])) $comment = trim($data['comment']); if (($user_id = $_SESSION['id']) && !is_null($object_id) && is_array($employee_ids)) { // Открываем соединение с БД $mypdo = $app->container->get('mypdo'); $mdb = $app->container->get('mysql'); $moderation_inst = new \ModerationAdvert($mypdo); $result = $moderation_inst->sendModeration($user_id, $object_id, $employee_ids, $comment); if (!empty($result['errors'])) $errors = $result['errors']; if (empty($errors)) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function unsetModeration($app, $get, $post) { $error = false; $errors = []; $object_id = null; if (isset($get['object_id'])) $object_id = intval($get['object_id']); if (($user_id = $_SESSION['id']) && !is_null($object_id)) { // Открываем соединение с БД $mypdo = $app->container->get('mypdo'); $mdb = $app->container->get('mysql'); $moderation_inst = new \ModerationAdvert($mypdo); $result = $moderation_inst->checkAndClear($object_id, 'use_in_advert', true); if (!empty($result['errors'])) $errors = $result['errors']; if (empty($errors)) { $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => true, 'user_id' => (int)$user_id ], JSON_UNESCAPED_UNICODE)); $app->stop(); } } $app->response->header('Content-Type', 'application/json'); $app->response->setStatus(200); $app->response->setBody(json_encode([ 'success' => false, 'user_id' => (int)$_SESSION['id'], 'errors' => $errors ], JSON_UNESCAPED_UNICODE)); $app->stop(); } public function checkAdUnique($app, $post) { $pdo = $app->container->get('mypdo'); $body = $app->request->getBody(); $object_id = $_GET['object_id']; $agency_id = $_SESSION['agency_id']; $agents = [$agency_id]; // Добавляем самого главу $queue = [$agency_id]; while (!empty($queue)) { $current_id = array_shift($queue); $sql = "SELECT id FROM users WHERE id_manager = $current_id"; $result = $pdo->query($sql); while ($row = $pdo->fetch_assoc($result)) { $agents[] = $row['id']; $queue[] = $row['id']; } } $all_agents = $agents; $this_object_sql = "SELECT id FROM objects WHERE id = $object_id AND use_in_advert = 1"; $this_object_query = $pdo->query($this_object_sql); $this_object = $pdo->fetch_assoc($this_object_query); $sql_object = "SELECT o.adres, o.cadastral_number, o.cadastral_number_land, o.id_add_user, oai.flat_number, o.id FROM objects o LEFT JOIN objects_additional_information oai ON o.id = oai.object_id WHERE o.id = $object_id"; $result = $pdo->query($sql_object); $obj_data = $pdo->fetch_assoc($result); if (!empty($obj_data['cadastral_number'])) { $cadastral_number_to_check = $obj_data['cadastral_number']; $cad_column = 'cadastral_number'; } elseif (!empty($obj_data['cadastral_number_land']) && empty($obj_data['cadastral_number'])) { $cadastral_number_to_check = $obj_data['cadastral_number_land']; $cad_column = 'cadastral_number_land'; } if ($cadastral_number_to_check) { // Проверяем по кадастровому номеру $cad_sql = "SELECT id FROM objects WHERE $cad_column = '" . addslashes($cadastral_number_to_check) . "' AND id != " . intval($obj_data['id']) . " AND id_add_user IN (" . implode(",", $all_agents) . ") AND use_in_advert = 1"; // Исключаем текущий ID сразу в SQL $cad_res = $pdo->query($cad_sql); $object_ids = []; while ($cad_obj = $pdo->fetch_assoc($cad_res)) { $object_ids[] = $cad_obj['id']; } if (!empty($object_ids)) { echo json_encode(["object_in_ads" => true, "object_ids" => $object_ids]); exit(); } } // Если нет кадастрового номера, идем по обычной логике $sim_sql = "SELECT o.id, o.id_add_user FROM objects o LEFT JOIN objects_additional_information oai ON o.id = oai.object_id WHERE o.id_add_user IN (" . implode(",", $all_agents) . ")"; $conditions = []; if (!empty($obj_data['adres']) && !empty($obj_data['flat_number'])) { $conditions[] = "(o.adres = '" . addslashes($obj_data['adres']) . "' AND oai.flat_number = '" . addslashes($obj_data['flat_number']) . "')"; } if (empty($conditions)) { echo json_encode(["object_in_ads" => false]); exit(); } else { $sim_sql .= " AND (" . implode(" OR ", $conditions) . ")"; } $sim_res = $pdo->query($sim_sql); $matching_objects = []; while ($row = $pdo->fetch_assoc($sim_res)) { $matching_objects[$row['id']] = $row['id_add_user']; } $filtered_objects = []; foreach ($matching_objects as $id => $id_add_user) { if (in_array($id_add_user, $all_agents)) { $filtered_objects[] = $id; } } $object_in_ads = false; $objects_in_ads = []; $this_object_id = intval($this_object['id']); foreach ($filtered_objects as $obj_id) { $sql_ad = "SELECT COUNT(*) as count FROM objects WHERE id = $obj_id AND use_in_advert = 1"; $ad_res = $pdo->query($sql_ad); $ad_row = $pdo->fetch_assoc($ad_res); if ($ad_row['count'] > 0 && $obj_id !== $this_object_id) { $objects_in_ads[] = $obj_id; $object_in_ads = true; } } echo json_encode(["object_in_ads" => $object_in_ads, "object_ids" => $objects_in_ads]); } }