query($sql);
// Offset-free: object_id приходит ЛИБО числовым (+src=ext для листинга от openEventsWindow), ЛИБО витринным EXT-{el.id}
// (reload панели задач после правки/коммента в crm.js гоняет именно EXT-id — единственный носитель листинг-ности в editEventObj→changeEventsObj).
// Принимаем оба: иначе is_numeric отбивал EXT-id → пустой ответ → белая модалка задач (повторное открытие через openEventsWindow слало числовой id и работало).
$objIdRaw = isset($_GET['object_id']) ? trim($_GET['object_id']) : '';
$isExtId = (preg_match('/^EXT-?(\d+)$/i', $objIdRaw, $mEl) === 1);
$objIdNum = $isExtId ? (int)$mEl[1] : (is_numeric($objIdRaw) ? (int)$objIdRaw : 0);
if ($_SESSION['id'] && $objIdNum) {
// Снимаем лок файла сессии (ниже сессия только читается) — чтобы парный AJAX getObjectInfoForEvents
// грузился параллельно, а не ждал освобождения сессии (PHP держит её эксклюзивно на время запроса).
session_write_close();
$gmtmsk = get_time_zone_user();
$time_zone = '';
if($gmtmsk >= 0){
$time_zone = '+'.$gmtmsk.' hour';
} else {
$time_zone = '-'.$gmtmsk.' hour';
}
$get = clearInputData($_GET);
// Offset-free: листинг определяем по явному маркеру src=ext (openEventsWindow добавляет его листингам), а не
// по диапазону id — после снятия смещения el.id коллизит с objects.id. $get['object_id'] == реальный el.id.
$is_listing = $isExtId || (isset($_GET['src']) && $_GET['src'] === 'ext');
// обновляем метку у меню календаря
// считаем события объектов
$sql = "SELECT count(id) FROM user_object_events WHERE user_id = $_SESSION[id] and calendar_view = 0
and schedule_date is not null and DATE(schedule_date) <= '".date("Y-m-d")."'";
$rez = mysql_query($sql);
$objectEventCount = mysql_result($rez,0);
// считаем события клиентов
$sql = "SELECT count(id) FROM user_client_events WHERE user_id = $_SESSION[id] and calendar_view = 0
and schedule_date is not null and DATE(schedule_date) <= '".date("Y-m-d")."'";
$rez = mysql_query($sql);
$clientEventCount = mysql_result($rez,0);
// суммарное количество событий по объектам и пользователям
$sumCount = intval($objectEventCount) + intval($clientEventCount) + get_user_listing_tasks_count($_SESSION['id']);
echo "";
// Сделка недоступна на найденном листинге (read-only; сервер addObjectDeal тоже отбивает) — прячем пункт
// меню «+»; для обычного объекта возвращаем. Грузится при каждом открытии модалки задач объекта.
echo "";
// «Файл» (вложение к задаче) на найденном листинге не поддержан (clients_files привязывается только к
// событиям обычных объектов) — прячем пункт меню «+» для листингов, как «Сделку».
echo "";
// Витринный id для onclick-редактирования: у листинга — EXT-{el.id}. Offset-free: crm.js (editEventObj) гоняет
// object_id через getEventForObjId→changeEventsObj без отдельного флага; единственный сквозной носитель —
// само значение object_id. EXT-{n} различает листинг без диапазона id (el.id коллизит с objects.id).
$objectIdForEdit = $is_listing ? ('EXT-' . $objIdNum) : $objIdNum;
// Сводку по objects тянем ТОЛЬКО для своих объектов — у листинга строки в objects нет, а el.id коллизит
// с objects.id, поэтому без гарда подтянулся бы чужой одноимённый объект.
$obj = array();
if (!$is_listing) {
$sqlObj = "SELECT objects.*, DATE_FORMAT(objects.date_add,'%d.%m.%Y %H:%i') as date_add
FROM objects
WHERE objects.id=$objIdNum";
$rezObj = mysql_query($sqlObj);
$obj = mysql_fetch_assoc($rezObj);
}
$user = new User;
$user->get($_SESSION['id']);
$agency_id = $user->agencyId;
$usersIds = array();
$usersIds[] = $agency_id;
$sql_users = "SELECT id 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 = mysql_query($sql_users);
while($r_users = mysql_fetch_assoc($q_users)){
$usersIds[] = (int)$r_users['id'];
}
$usersIds = array_unique($usersIds);
$sql_users2 = "SELECT id, user_logo, CONCAT(last_name, ' ', first_name, ' ', middle_name) as user_fio FROM users WHERE id in (".implode(',',$usersIds).")";
$q_users2 = mysql_query($sql_users2);
while($r_users2 = mysql_fetch_assoc($q_users2)){
$users[$r_users2['id']] = $r_users2;
}
//Доступ к задаче
$user_access = $_SESSION['id'];
if($user->users_admin == 1){
$user_access = $user->agencyId;
}
$req = new Requisitions(null, true);
$usersCanEdit = $req->getIdsUsers($user_access);
/*if($_SESSION['id'] == 5238){
var_dump($usersCanEdit);
}*/
if ($_SESSION['agency'] or $_SESSION['manager'] or $_SESSION['users_admin'] or $obj['id_add_user'] == $_SESSION['id']) {
$searchUserId = $_SESSION['id'];
$agentIds = array();
if ($_SESSION['users_admin'] or $obj['id_add_user'] == $_SESSION['id']) {
$searchUserId = $user->agencyId;
$agentIds[] = $user->agencyId;
}
$agentsOfAgency = User::getAllAgents($searchUserId);
$agentIds[] = $_SESSION['id'];
foreach ($agentsOfAgency as $agent) {
if (!in_array($agent['id'], $agentIds)) {
$agentIds[] = $agent['id'];
}
}
if ($_SESSION['agency'] or $_SESSION['users_admin']) {
$agentsOfManager = User::getAllManagers($searchUserId);
foreach ($agentsOfManager as $agent) {
if (!in_array($agent['id'], $agentIds)) {
$agentIds[] = $agent['id'];
}
}
}
$sql = "SELECT e.*,
IF(IFNULL(s.id, '') = '', 0, s.id) AS sub_id,
IF(IFNULL(s.sub_comment, '') = '', NULL, s.sub_comment) AS sub_comment,
IF(s.created_by <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.created_by
), NULL
) as sub_comment_author,
IF(s.user_for <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.user_for
), NULL
) as sub_comment_user_for
FROM user_object_events AS e
LEFT JOIN user_sub_comments AS s ON s.event_id = e.id AND s.section_id = 1
WHERE (e.user_id IN (" . implode(",", $agentIds) . ") or e.from_id IN (" . implode(",", $agentIds) . ")) AND e.object_id = '$objIdNum'
GROUP BY e.id
ORDER BY e.create_date ASC;";
//echo $sql;
} else {
$sql = "SELECT e.*,
IF(IFNULL(s.id, '') = '', 0, s.id) AS sub_id,
IF(IFNULL(s.sub_comment, '') = '', NULL, s.sub_comment) AS sub_comment,
IF(s.created_by <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.created_by
), NULL
) as sub_comment_author,
IF(s.user_for <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.user_for
), NULL
) as sub_comment_user_for
FROM user_object_events AS e
LEFT JOIN user_sub_comments AS s ON s.event_id = e.id AND s.section_id = 1
WHERE (e.user_id = '$_SESSION[id]' or e.from_id = '$_SESSION[id]') AND e.object_id = '$objIdNum'
GROUP BY e.id
ORDER BY e.create_date ASC;";
}
// Найденный листинг парсера: история событий из таблицы событий листинга.
// Offset-free: листинг определяем по явному маркеру src=ext (openEventsWindow добавляет его листингам), а не по
// диапазону id — после снятия смещения el.id коллизит с objects.id. object_id == реальный el.id.
// Шейп e.* близок к user_object_events; полей sum/req_id у листинга нет — рендер читает их через проверку > 0, отсутствие колонки безвредно.
// Суб-комменты листинг-событий — в общей user_sub_comments, но со СВОИМ section_id=4:
// id события листинга и id user_object_events — разные нумерации, общий section_id=1 дал бы коллизию строк.
// Доступ — свои события (e.user_id = me ИЛИ e.from_id = me): у листинга нет владельца id_add_user.
if ($is_listing) {
$external_listing_id = $objIdNum;
// Видимость как у своих объектов: руководитель/агентство/админ видят события агентства и подчинённых
// ($agentIds построен выше по роли — листинг id_add_user=0, поэтому в ветку agentIds входим именно по роли),
// обычный агент — только свои. Изоляция между агентствами: $agentIds = только пользователи СВОЕГО агентства,
// поэтому события чужих агентств на ОБЩЕМ листинге не видны.
if ($_SESSION['agency'] or $_SESSION['manager'] or $_SESSION['users_admin']) {
$listingEventScope = "(e.user_id IN (" . implode(",", $agentIds) . ") or e.from_id IN (" . implode(",", $agentIds) . "))";
} else {
$listingEventScope = "(e.user_id = '$_SESSION[id]' or e.from_id = '$_SESSION[id]')";
}
$sql = "SELECT e.*,
e.external_listing_id AS object_id,
IF(IFNULL(s.id, '') = '', 0, s.id) AS sub_id,
IF(IFNULL(s.sub_comment, '') = '', NULL, s.sub_comment) AS sub_comment,
IF(s.created_by <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.created_by
), NULL
) as sub_comment_author,
IF(s.user_for <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.user_for
), NULL
) as sub_comment_user_for
FROM external_listing_events AS e
LEFT JOIN user_sub_comments AS s ON s.event_id = e.id AND s.section_id = 4
WHERE $listingEventScope AND e.external_listing_id = '$external_listing_id'
GROUP BY e.id
ORDER BY e.create_date ASC;";
}
// Контекст событий для onclick-хендлеров (deleteEvent/addEventSubComment/…):
// у листинга СВОЯ таблица событий — передача 'objects' удаляла/писала бы по чужому id в user_object_events/user_sub_comments.
$events_from = $is_listing ? 'listing' : 'objects';
//echo $sql;
$rez = mysql_query($sql);
$date = null;
$is_who_work = false;
$createDate = null;
if ($obj['archive']) {
echo '
Объект в архиве
';
}
while ($event = mysql_fetch_assoc($rez)) {
if ($obj['id_add_user'] == $_SESSION['id'] || in_array($_SESSION['id'], $agentIds))
$is_who_work = true;
// $event['user_fio'] = trim($event['last_name'] . ' ' . $event['first_name'] . ' ' . $event['middle_name']);
if ($createDate == null || $createDate != date("d.m.Y", strtotime($event['create_date']))) {
$createDate = date("d.m.Y", strtotime($event['create_date']));
list($d, $m, $y) = explode(".", $createDate);
if ($y == date("Y")) {
$y = "";
}
echo '' . $d . " " . getRusMonth($m) . " " . $y . '
';
}
$class_ev = " is__right";
$from_id = $event['user_id'];
if(!empty($event['from_id'])) $from_id = $event['from_id'];
if($_SESSION['id'] == $from_id){
$class_ev = " is__left";
}
// Бейдж «Перенесено из Поиска»: событие перенесено в объект при копировании найденного (листинг/старый парсер), исходная дата сохранена
$movedBadge = !empty($event['moved_on_copy']) ? 'Перенесено из Поиска
' : '';
$sql_user = "SELECT user_logo, CONCAT(last_name, ' ', first_name, ' ', middle_name) as user_fio FROM users WHERE id = {$from_id}
UNION SELECT user_logo, CONCAT(last_name, ' ', first_name, ' ', middle_name, ' (удален)') as user_fio FROM users_delete WHERE user_id = {$from_id}";
$from_user = mysql_fetch_assoc(mysql_query($sql_user));
$event['user_logo'] = $from_user['user_logo'];
$event['user_fio'] = $from_user['user_fio'];
if ($event['type'] == 'file') {
$file_list = '';
$docs_q = mysql_query("SELECT * FROM clients_files WHERE event_id = '".$event['id']."'");
$name_files = '';
while ($file = mysql_fetch_assoc($docs_q)) {
if($file['name_id'] > 0 && $name_files == ''){
$sql_n = "SELECT * FROM names_client_files WHERE id={$file['name_id']}";
$q_n = mysql_query($sql_n);
if(mysql_num_rows($q_n) > 0){
$r_n = mysql_fetch_assoc($q_n);
$name_files = $r_n['name'];
}
}
$name_doc = $_SERVER['DOCUMENT_ROOT'].'/upload/objects/'.$file['object_id'].'/'.$file['guid'].'.'.$file['type'];
$file_path = '';
if ($file['object_id'] > 0)
$file_path = '/upload/objects/'.$file['object_id'].'/'.$file['guid'].'.'.$file['type'];
if (!empty($file_path) && !empty($file['name'])) {
$file_list .= '
' . $file['name'] . '
';
}
}
if (!empty($file_list)) { ?>
=$event['user_fio']?>
Примечание
= $name_files ?>= (!empty($file_list)) ? '
' : ''; ?>= $event['comment']; ?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
=$event['name']?>
Мероприятие состоится =$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
=$event['comment']?>
0 && isset($users[$event['user_id']])){?>
=$users[$event['user_id']]['user_fio']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Примечание
=$event['comment']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Модератор подтвердил рекламу
=$event['comment']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Звонок
Позвонить
=$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
Комментарий: =$event['comment']?>
Комментарий к задаче:
= $event['sub_comment'] ?>
(= $event['sub_comment_author'] ?>)
0 && isset($users[$event['user_id']])){?>
=$users[$event['user_id']]['user_fio']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Встреча
Встреча будет =$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
Адрес: =$event['address']?>
Комментарий: =$event['comment']?>
Комментарий к задаче:
= $event['sub_comment'] ?>
(= $event['sub_comment_author'] ?>)
0 && isset($users[$event['user_id']])){?>
=$users[$event['user_id']]['user_fio']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Отправлен на модерацию
Ответственный: =$who_user['who_fio']?>
Провести модерацию =$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
Выбранные площадки:
platform);
if($p_a->platform == 'add_to_yandex_feed'){ ?>
Бесплатные
days) echo ' '.$p_a->days;
}
if($p_a->platform == 'add_to_avito_feed'){ ?>
Авито
days) echo ' '.$p_a->days;
}
if($p_a->platform == 'add_to_cian_feed'){ ?>
Циан
days) echo ' '.$p_a->days;
}
if($p_a->platform == 'add_to_domclick_feed'){ ?>
ДомКлик
days) echo ' '.$p_a->days;
}
if($p_a->platform == 'add_to_emls_feed'){ ?>
Jcat
days) echo ' '.$p_a->days;
}
if($p_a->platform == 'add_to_bn_feed'){ ?>
Яндекс
days) echo ' '.$p_a->days;
}
}
?>
Выбранные площадки:
0){ ?>
Бесплатные.
0){ ?>
Авито.
0){ ?>
Циан.
0){ ?>
ДомКлик.
0){ ?>
Jcat.
0){ ?>
Яндекс.
Комментарий: =$event['comment']?>
Комментарий к задаче:
= $event['sub_comment'] ?>
(= $event['sub_comment_author'] ?>)
Ответственный:
(= $event['sub_comment_user_for'] ?>)
0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.created_by
), NULL
) as sub_comment_author,
IF(s.user_for <> 0, (
SELECT CONCAT(u.last_name, ' ', u.first_name, ' ', u.middle_name)
FROM users as u WHERE u.id = s.user_for
), NULL
) as sub_comment_user_for
FROM user_sub_comments as s WHERE
event_id = {$event['id']} AND section_id = 1 AND id != {$event['sub_id']}";
$q_sub = mysql_query($sql_sub);
while($sub_comment = mysql_fetch_assoc($q_sub)){
?>
Комментарий к задаче:
= $sub_comment['sub_comment'] ?>
(= $sub_comment['sub_comment_author'] ?>)
Ответственный:
(= $sub_comment['sub_comment_user_for'] ?>)
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
0){
$name_req = $pdo->result($pdo->query("SELECT name FROM requisitions WHERE id = {$event['req_id']}"));
}
?>
=$event['user_fio']?>
Показ
Показ будет =$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
Адрес: =$event['address']?>
0 && isset($name_req)){ ?>
Комментарий: =$event['comment']?>
Комментарий к задаче:
= $event['sub_comment'] ?>
(= $event['sub_comment_author'] ?>)
0 && isset($users[$event['user_id']])){?>
=$users[$event['user_id']]['user_fio']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>
=$event['user_fio']?>
Запланирована сделка на =$d?> =getRusMonth($m)?> =$y?> в =date("H:i", strtotime($event['schedule_date']))?>
Сумма в договоре: =number_format($deal_data['contract_price'], 0, '', ' ')?> руб.
Комиссия агента: =number_format($deal_data['agent_commission'], 0, '', ' ')?> руб.
Стороны сделки:
0) {
$row_req1 = mysql_fetch_assoc($rez_req1);
$side1_text .= ': Заявка «' . htmlspecialchars($row_req1['name']) . '»';
if (!empty($row_req1['client_id'])) {
$sql_cl1 = "SELECT id, fio FROM clients WHERE id = " . intval($row_req1['client_id']) . " LIMIT 1";
$rez_cl1 = mysql_query($sql_cl1);
if ($rez_cl1 && mysql_num_rows($rez_cl1) > 0) {
$row_cl1 = mysql_fetch_assoc($rez_cl1);
$side1_text .= ' —
' . htmlspecialchars($row_cl1['fio']) . '';
}
}
}
}
echo '
' . $side1_text . '';
$side2_text = htmlspecialchars($deal_data['side_two']);
if (!empty($deal_data['side_two_requisition_id'])) {
$sql_req2 = "SELECT name, client_id FROM requisitions WHERE id = " . intval($deal_data['side_two_requisition_id']) . " LIMIT 1";
$rez_req2 = mysql_query($sql_req2);
if ($rez_req2 && mysql_num_rows($rez_req2) > 0) {
$row_req2 = mysql_fetch_assoc($rez_req2);
$side2_text .= ': Заявка «' . htmlspecialchars($row_req2['name']) . '»';
if (!empty($row_req2['client_id'])) {
$sql_cl2 = "SELECT id, fio FROM clients WHERE id = " . intval($row_req2['client_id']) . " LIMIT 1";
$rez_cl2 = mysql_query($sql_cl2);
if ($rez_cl2 && mysql_num_rows($rez_cl2) > 0) {
$row_cl2 = mysql_fetch_assoc($rez_cl2);
$side2_text .= ' —
' . htmlspecialchars($row_cl2['fio']) . '';
}
}
}
}
echo '
' . $side2_text . '';
?>
0) {
echo '
';
}
}
$sql_inner_docs = "SELECT d.id, d.name FROM inner_docs d JOIN deal_inner_doc did ON did.inner_doc_id = d.id WHERE did.deal_id = " . intval($deal_id_for_edit);
$rez_inner_docs = mysql_query($sql_inner_docs);
if ($rez_inner_docs && mysql_num_rows($rez_inner_docs) > 0) {
echo '
Документы:
';
while ($doc_row = mysql_fetch_assoc($rez_inner_docs)) {
echo '' . htmlspecialchars($doc_row['name']) . '
';
}
echo '
';
}
?>
Сумма сделки: =$event['sum']?>p
Комментарий: =$event['comment']?>
Комментарий к задаче:
= $event['sub_comment'] ?>
(= $event['sub_comment_author'] ?>)
Клиент:
'.$doc_cls['fio'] . ((!empty($cls_contacts)) ? ' (' . implode(', ', $cls_contacts) . ')' : '') . '';
}
}
if (isset($params['client_id']) && (!isset($client_ids) || empty($client_ids))) {
$sql_cl = "SELECT id, fio, phone, email FROM `clients` WHERE `id` = '$params[client_id]' LIMIT 1";
$rez_cl = mysql_query($sql_cl);
if ($doc_cl = mysql_fetch_assoc($rez_cl)) {
mask_client_contacts_inplace($doc_cl);
$cl_contacts = [];
if ($doc_cl['email'])
$cl_contacts[] = $doc_cl['email'];
if ($doc_cl['phone'])
$cl_contacts[] = $doc_cl['phone'];
$doc_parties .= '
Клиент: '.$doc_cl['fio'] . ((!empty($cl_contacts)) ? ' (' . implode(', ', $cl_contacts) . ')' : '') . '';
}
}
if (isset($params['object_id'])) {
$sql_obj = "SELECT id, nazv, adres FROM `objects` WHERE `id` = '$params[object_id]' LIMIT 1";
$rez_obj = mysql_query($sql_obj);
if ($doc_obj = mysql_fetch_assoc($rez_obj)) {
$doc_parties .= '
Объект: '.$doc_obj['nazv'].' ('.$doc_obj['adres'].')';
}
}
if (!empty($doc_parties)) { ?>
0 && isset($users[$event['user_id']])){?>
=$users[$event['user_id']]['user_fio']?>
=date("H:i", strtotime($time_zone, strtotime($event['create_date'])))?>