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)) { ?>
    Примечание
      ' . $file_list . '
    ' : ''; ?>
    Мероприятие состоится в
    0 && isset($users[$event['user_id']])){?>
    Примечание
    Модератор подтвердил рекламу
    Звонок
    Позвонить в
    Комментарий:
    Комментарий к задаче: ()
    0 && isset($users[$event['user_id']])){?>
    Встреча
    Встреча будет в
    Адрес:
    Комментарий:
    Комментарий к задаче: ()
    0 && isset($users[$event['user_id']])){?>
    Отправлен на модерацию
    Ответственный:
    Провести модерацию в
    Выбранные площадки: 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){ ?> Яндекс.
    Комментарий:
    Комментарий к задаче: () Ответственный: ()
    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)){ ?>
    Комментарий к задаче: () Ответственный: ()
    0){ $name_req = $pdo->result($pdo->query("SELECT name FROM requisitions WHERE id = {$event['req_id']}")); } ?>
    Показ
    Показ будет в
    Адрес:
    0 && isset($name_req)){ ?>
    Подключена заявка:
    Комментарий:
    Комментарий к задаче: ()
    0 && isset($users[$event['user_id']])){?>
    Сделка
    Запланирована сделка на в

    Сумма в договоре: руб.
    Комиссия агента: руб.
    Стороны сделки:
    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 '
    Объекты:
    '; while ($obj_row = mysql_fetch_assoc($rez_objs)) { echo '' . htmlspecialchars($obj_row['nazv']) . ' (' . htmlspecialchars($obj_row['adres']) . ')
    '; } 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 '
    '; } ?>
    Сумма сделки: p
    Комментарий:
    Комментарий к задаче: ()
    Клиент: '.$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']])){?>