array('id'=>1, 'name'=>'Новый', 'title'=>'Новый клиент', 'classF' => 'stage-new'),
1 => array('id'=>2, 'name'=>'В работе', 'title'=>'В работе', 'classF' => 'stage-work'),
2 => array('id'=>3, 'name'=>'Презентация', 'title'=>'Презентация', 'classF' => 'stage-offer'),
3 => array('id'=>4, 'name'=>'Показ', 'title'=>'Показ', 'classF' => 'stage-showing'),
4 => array('id'=>5, 'name'=>'Бронь', 'title'=>'Бронь', 'classF' => 'stage-reservation'),
5 => array('id'=>6, 'name'=>'Подаем на ипотеку', 'title'=>'Подаем на ипотеку', 'classF' => 'stage-meet'),
6 => array('id'=>7, 'name'=>'Сделка', 'title'=>'Сделка', 'classF' => 'stage-deal'),
7 => array('id'=>8, 'name'=>'Закрыт', 'title'=>'Клиент закрыт', 'classF' => 'stage-end'),
);
private $funnels_adjacent = array();
private $userIdsWork = array();
public function __construct($db = null, $no_autosearch = false){
if($db){
$this->db = $db;
} else {
$pdo = new MysqlPdo(hst, ndb, user, pass);
$sql = "SET NAMES 'utf8'";
$pdo->query($sql);
$this->db = $pdo;
}
if(!$no_autosearch){
$this->autosearch_instce = new AutoSearch($this->db);
}
}
//установка вида вывода
public function set_view($view){
$this->view = $view;
}
//установка страницы
public function set_page($page){
$this->page = $page;
}
// Установка кол-ва на страницу
public function set_per_page($per_page) {
$this->limit = intval($per_page);
}
//Установка id агентства
public function set_agencyId($agencyId){
$this->agencyId = $agencyId;
}
//Установка пользователя
public function set_user($user){
$this->user = $user;
if($user->id > 0){
$this->set_userId($user->id);
}
if($user->agencyId > 0){
$this->set_agencyId($user->agencyId);
}
}
//Установка user_id
public function set_userId($user_id){
$this->user_id = $user_id;
}
//Получение типов заявки
public function get_type($settings = false, $active = false, $no_archive = false){
$denial_typereq = array();
$sql_d = "SELECT * FROM denial_typereq WHERE agency_id = {$this->agencyId}";
$q_d = $this->db->query($sql_d);
while($r_d = $this->db->fetch_assoc($q_d)){
$denial_typereq[$r_d['type_id']][$r_d['denial_id']] = $r_d['checked'];
}
$denial = $this->get_denial_work();
$common = array();
$temp_result = array();
$archive_type = array();
$result = array();
$sql = "SELECT * FROM requisitions_type WHERE agency_id = 0";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$common[$r['id']] = $r;
$result['heir'][] = array('code'=>$r['id'], 'name'=>$r['name']);
}
$sql = "SELECT * FROM requisitions_type WHERE agency_id = {$this->agencyId} and del = 0 order by order_number, id";
/* if($active){
$sql = "SELECT * FROM requisitions_type WHERE agency_id = {$this->agencyId} and del = 0 order by order_number, id";
}*/
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
if($r['parent_id'] > 0){
$common[$r['parent_id']] = $r;
} else {
$common[$r['id']] = $r;
}
}
if(!$settings){
$result['type'][] = array('code'=> 0, 'name'=> '', 'order'=>-1, 'heir'=>0, 'archive'=>0, 'type'=>'label', 'agency_id'=>$this->agencyId);
}
foreach($common as $key => $type){
$order[$key][] = $type['order_number'];
if($type['del'] == 0){
if($settings){
// var_dump($denial_typereq);
$denial_this_type = array();
foreach($denial as $id_d => $d){
if(isset($denial_typereq[$type['id']][$d['id']])){
$d['check'] = $denial_typereq[$type['id']][$d['id']];
}
$denial_this_type[$id_d] = $d;
}
if($type['archive'] == 0){
$result['type'][] = array('code'=>$type['id'], 'order'=>$type['order_number'], 'type'=>$type['type'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'denial'=>$denial_this_type);
} else {
$result['type_archive'][] = array('code'=>$type['id'], 'order'=>$type['order_number'], 'type'=>$type['type'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'denial'=>$denial_this_type);
}
} else {
if($active){
if($type['archive'] == 0){
if($type['parent_id'] > 0){
$result['type'][] = array('code'=>$type['parent_id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
} else {
$result['type'][] = array('code'=>$type['id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
}
} else {
if($type['parent_id'] > 0){
$archive_type[] = array('code'=>$type['parent_id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
} else {
$archive_type[] = array('code'=>$type['id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
}
}
} else {
if($type['parent_id'] > 0){
$result['type'][] = array('code'=>$type['parent_id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
} else {
$result['type'][] = array('code'=>$type['id'], 'type'=>$type['type'], 'order'=>$type['order_number'], 'heir'=>$type['heir'], 'name'=>$type['name'], 'agency_id'=>$type['agency_id'], 'archive'=>$type['archive']);
}
}
}
if($type['parent_id'] > 0){
$result['names_type'][$type['parent_id']] = array('heir'=>$type['heir'], 'name'=>$type['name']);
}
$result['names_type'][$type['id']] = array('heir'=>$type['heir'], 'name'=>$type['name']);
//$result['names_type'][$type['parent_id']] = array('heir'=>$type['heir'], 'name'=>$type['name']);
}
}
usort($result['type'], [Requisitions::class, "cmp"]);
if($active && !$no_archive){
if(!empty($archive_type)){
$result['type'][] = array('code'=>-1, 'type'=>'group', 'order'=>0, 'heir'=>0, 'name'=>'Архив', 'agency_id'=>$this->agencyId, 'archive'=>0);
foreach($archive_type as $at){
$result['type'][] = $at;
}
}
}
// usort($result['type_archive'], "cmp");
// $result['type'][] = array('code'=>'group'.$type['id'], 'type'=>'group', 'order'=>99, 'heir'=>0, 'name'=>'testG', 'agency_id'=>4135);
//$result['type'] = array_multisort($order, SORT_ASC, $result['type']);
return $result;
}
static function cmp($a, $b) {
return strnatcmp($a["order"], $b["order"]);
}
public function get_denial_work($default = 0){
$result = array();
$sql = "SELECT * FROM denial_work WHERE (agency_id = {$this->agencyId} or agency_id = 0) AND del = 0";
if($this->agencyId == 19895){
$sql = "SELECT * FROM denial_work WHERE agency_id = {$this->agencyId} AND del = 0";
}
if($default > 0){
$sql .= " AND default_val = 0";
}
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q)){
if($r['default_val'] == 1)
$r['check'] = 1;
else
$r['check'] = 0;
$result[$r['id']] = $r;
}
return $result;
}
//очередь
public function set_type_order($id, $sort_order, $direct){
$agency_id = $this->agencyId;
$update_pid = '';
$update_other = '';
if ($direct == 'up') {
$update_pid = '-';
$update_other = '+';
$sort_other = $sort_order - 1;
} elseif ($direct == 'down') {
$update_pid = '+';
$update_other = '-';
$sort_other = $sort_order + 1;
}
if (!empty($update_pid)) {
$sql = "UPDATE `requisitions_type`
SET `order_number` = `order_number` $update_other 1
WHERE `order_number` = '$sort_other' AND `agency_id` = '$agency_id'";
$sql2 = "UPDATE `requisitions_type`
SET `order_number` = `order_number` $update_pid 1
WHERE `id` = '$id' AND `agency_id` = '$agency_id'";
}
if (empty($sql) || empty($sql2))
exit();
if ($this->db->query($sql) && $this->db->query($sql2)) {
$sql3_1 = "SET @block_order:=0";
$sql3_2 = "UPDATE `requisitions_type` SET `order_number`=@block_order:=@block_order+1 WHERE `agency_id` = '$agency_id' and del=0 ORDER BY `order_number`, `id`";
//echo $sql3_2;
$this->db->query($sql3_1) && $this->db->query($sql3_2);
//echo json_encode(['success' => true]);
} else {
//echo json_encode(['success' => false, 'error' => $this->db->errorInfo()]);
}
$result=$this->get_type(true);
return $result;
}
//Редактирование/добавление типа договора
public function editAddType($type_id, $type, $heir, $order, $type_type){
if($type_id == 0){
$sql_in = "INSERT INTO requisitions_type SET
agency_id = {$this->agencyId},
name = '{$type}',
heir = {$heir},
order_number = {$order},
type = '{$type_type}',
created_at = NOW(),
created_by = {$this->user_id}";
if(!$this->db->query($sql_in)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
} else {
$sql = "SELECT * FROM requisitions_type WHERE id = {$type_id}";
$q = $this->db->query($sql);
if(!$q){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
$r = $this->db->fetch_assoc($q);
if($r['agency_id'] > 0 && $r['agency_id'] == $this->agencyId){
$sql_up = "UPDATE requisitions_type SET name='{$type}', heir={$heir}, type = '{$type_type}', updated_by={$this->user_id}, updated_at=NOW() WHERE id={$type_id}";
if(!$this->db->query($sql_up)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
} else if ($r['agency_id'] == 0) { //общий тип
$sql_in = "INSERT INTO requisitions_type SET
agency_id = {$this->agencyId},
parent_id = {$type_id},
name = '{$type}',
heir = {$heir},
order_number = {$order},
type = '{$type_type}',
created_at = NOW(),
created_by = {$this->user_id}";
if(!$this->db->query($sql_in)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
/*$sql3_1 = "SET @block_order:=0";
$sql3_2 = "UPDATE `requisitions_type` SET `order_number`=@block_order:=@block_order+1 WHERE `agency_id` = '{$this->agency_id}' and del=0 ORDER BY `order_number`, `id`";
//echo $sql3_2;
$this->db->query($sql3_1) && $this->db->query($sql3_2);*/
} else {
return array('source'=>'done');
}
}
}
}
}
//Удаление типа
public function deletedType($type_id)
{
$sql = "SELECT * FROM requisitions_type WHERE id = {$type_id}";
$q = $this->db->query($sql);
if(!$q){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
$r = $this->db->fetch_assoc($q);
if($r['agency_id'] > 0 && $r['agency_id'] == $this->agencyId){
$sql_up = "UPDATE requisitions_type SET del=1, updated_by={$this->user_id}, updated_at=NOW() WHERE id={$type_id}";
echo $sql_up;
if(!$this->db->query($sql_up)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
} /*else if ($r['agency_id'] == 0) { //общий тип
$sql_in = "INSERT INTO contract_types SET
agency_id = {$this->agency_id},
type = '{$r['type']}',
parent_id = {$type_id},
del = 1,
created_at = NOW(),
created_by = {$this->user_id}";
if(!$this->db->query($sql_in)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
}*/
}
}
//Архивирование типа
public function archiveType($type_id,$order)
{
$sql = "SELECT * FROM requisitions_type WHERE id = {$type_id}";
$q = $this->db->query($sql);
if(!$q){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
$r = $this->db->fetch_assoc($q);
if($r['agency_id'] > 0 && $r['agency_id'] == $this->agencyId){
$sql_up = "UPDATE requisitions_type SET archive=1, order_number={$order}, updated_by={$this->user_id}, updated_at=NOW() WHERE id={$type_id}";
// echo $sql_up;
if(!$this->db->query($sql_up)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
} /*else if ($r['agency_id'] == 0) { //общий тип
$sql_in = "INSERT INTO contract_types SET
agency_id = {$this->agency_id},
type = '{$r['type']}',
parent_id = {$type_id},
del = 1,
created_at = NOW(),
created_by = {$this->user_id}";
if(!$this->db->query($sql_in)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
}*/
}
}
//Восстановление из архива
public function recoverType($type_id, $order){
$sql = "SELECT * FROM requisitions_type WHERE id = {$type_id}";
$q = $this->db->query($sql);
if(!$q){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
$r = $this->db->fetch_assoc($q);
if($r['agency_id'] > 0 && $r['agency_id'] == $this->agencyId){
$sql_up = "UPDATE requisitions_type SET archive=0, order_number={$order}, updated_by={$this->user_id}, updated_at=NOW() WHERE id={$type_id}";
//echo $sql_up;
if(!$this->db->query($sql_up)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
} /*else if ($r['agency_id'] == 0) { //общий тип
$sql_in = "INSERT INTO contract_types SET
agency_id = {$this->agency_id},
type = '{$r['type']}',
parent_id = {$type_id},
del = 1,
created_at = NOW(),
created_by = {$this->user_id}";
if(!$this->db->query($sql_in)){
return array('source'=>'error', 'mes'=>$this->db->errorInfo());
} else {
return array('source'=>'done');
}
}*/
}
}
//Массив типов для фильтра
public function get_types_type($types){
$result = array();
if(!empty($types)){
$sql = "SELECT id, parent_id FROM requisitions_type WHERE id in (".implode(',', $types).")";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$result[] = (int)$r['id'];
if($r['parent_id'] > 0) {
$result[] = (int)$r['parent_id'];
}
}
}
$result = array_unique($result);
return $result;
}
//Установка причин закрытия
public function set_type_denial($type_id, $denial_id, $check){
if($this->agencyId > 0){
$sql = "SELECT id FROM `denial_typereq` where agency_id = {$this->agencyId} AND type_id = {$type_id} AND denial_id = {$denial_id}";
$q = $this->db->query($sql);
if($this->db->num_rows($q) > 0){
$r = $this->db->fetch_assoc($q);
$sql_up = "UPDATE denial_typereq SET checked={$check} WHERE id = {$r['id']}";
$this->db->query($sql_up);
} else {
$sql_in = "INSERT INTO denial_typereq SET agency_id = {$this->agencyId}, type_id = {$type_id}, denial_id = {$denial_id}, checked={$check}";
// echo $sql_in;
$this->db->query($sql_in);
}
//Проверка наследника
$sql_heir = "SELECT * FROM requisitions_type WHERE id = {$type_id}";
$q_heir = $this->db->query($sql_heir);
$r_heir = $this->db->fetch_assoc($q_heir);
if(isset($r_heir['parent_id']) && $r_heir['parent_id'] > 0){
$parent_id = (int)$r_heir['parent_id'];
$sql = "SELECT id FROM `denial_typereq` where agency_id = {$this->agencyId} AND type_id = {$parent_id} AND denial_id = {$denial_id}";
$q = $this->db->query($sql);
if($this->db->num_rows($q) > 0){
$r = $this->db->fetch_assoc($q);
$sql_up = "UPDATE denial_typereq SET checked={$check} WHERE id = {$r['id']}";
$this->db->query($sql_up);
} else {
$sql_in = "INSERT INTO denial_typereq SET agency_id = {$this->agencyId}, type_id = {$parent_id}, denial_id = {$denial_id}, checked={$check}";
// echo $sql_in;
$this->db->query($sql_in);
}
}
}
}
//Причины закрытия
public function editAddDenial($id, $name){
$result = array();
if($this->agencyId > 0){
if($id == 0){
$sql = "INSERT INTO denial_work (name, default_val, agency_id) VALUES ('{$name}', 0, {$this->agencyId})";
$this->db->query($sql);
} else {
$sql = "UPDATE denial_work SET name = '{$name}', default_val = 0 WHERE id = {$id}";
//echo $sql;
$this->db->query($sql);
}
$result = $this->get_denial_work(1);
}
return $result;
}
//Удаление причины
public function deleteDenial($id){
$result = array();
if($this->agencyId > 0){
if($id > 0){
$sql = "UPDATE denial_work SET del = 1 WHERE id = {$id}";
//echo $sql;
$this->db->query($sql);
}
}
$result = $this->get_denial_work(1);
return $result;
}
//У кого в работе
public function get_who($who_work, $req_id, $kanban, $departments, $usersToUse = []){
$master_work = '';
$master_phone = null;
$master_work_fio = '';
if ((int)$who_work > 0) {
if (isset($usersToUse) && isset($usersToUse[$who_work])) {
$mstr = $usersToUse[$who_work];
} else {
$mstr = $this->db->fetch_assoc($this->db->query("SELECT agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone, 0 as del FROM users WHERE id=$who_work UNION
SELECT agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone, 1 as del FROM users_delete WHERE user_id=$who_work"));
}
$master_phone = $mstr['phone'];
$master_work_fio = trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
if($kanban) {
$master_work = trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
if ($mstr['agency']) {
$master_work = trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']) ?: "агентство {$mstr['agency_name']}";
}
elseif ($mstr['manager']) {
if ($mstr['role_id'] > 0) {
$master_work = $departments[$mstr['role_id']]['role_name'] . ' ' . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
$master_work = "менеджер " . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
}
} else {
if ($mstr['role_id'] > 0) {
$master_work = $departments[$mstr['role_id']]['role_name'] . ' ' . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
$master_work = "агент " . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
}
}
if($mstr['del'] == 1) {
$master_work .= " (удален)";
}
$sql_work = "SELECT `date_update` FROM `events_clients` WHERE `req_id`=$req_id and event='accepted' and user_id=$who_work";
$q_work = $this->db->query($sql_work);
if ($this->db->num_rows($q_work) > 0) {
$r_work = $this->db->fetch_assoc($q_work);
if ($r_work['date_update'] != '0000-00-00 00:00:00') {
$master_work .= ' c ' . date('d.m.Y H:i', strtotime($r_work['date_update'])) . '';
}
}
}
} else {
$master_work .= 'Все агентство';
}
return ['id' => $who_work, 'name' => strip_tags($master_work), 'phone' => $master_phone, 'fio' => $master_work_fio];
}
public function get_who_delete($who_delete, $req_id, $kanban, $departments, $usersToUse = []){
$master_delete = '';
$master_phone = null;
if ((int)$who_delete > 0) {
if (isset($usersToUse) && isset($usersToUse[$who_delete])) {
$mstr = $usersToUse[$who_delete];
} else {
$mstr = $this->db->fetch_assoc($this->db->query("SELECT agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone, 0 as del FROM users WHERE id=$who_delete UNION
SELECT agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone, 1 as del FROM users_delete WHERE user_id=$who_delete"));
}
$master_phone = $mstr['phone'];
if($kanban) {
$master_delete = trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
if ($mstr['agency']) {
$master_delete = trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']) ?: "агентство {$mstr['agency_name']}";
}
elseif ($mstr['manager']) {
if ($mstr['role_id'] > 0) {
$master_delete = $departments[$mstr['role_id']]['role_name'] . ' ' . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
$master_delete = "менеджер " . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
}
} else {
if ($mstr['role_id'] > 0) {
$master_delete = $departments[$mstr['role_id']]['role_name'] . ' ' . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
} else {
$master_delete = "агент " . trim($mstr['last_name'] . ' ' . $mstr['first_name'] . ' ' . $mstr['middle_name']);
}
}
if($mstr['del'] == 1) {
$master_delete .= " (удален)";
}
$sql_delete = "SELECT `date_update` FROM `events_clients` WHERE `req_id`=$req_id and event='delete' and user_id=$who_delete order by id desc limit 1";
$q_delete = $this->db->query($sql_delete);
if ($this->db->num_rows($q_delete) > 0) {
$r_delete = $this->db->fetch_assoc($q_delete);
if ($r_delete['date_update'] != '0000-00-00 00:00:00') {
$master_delete .= ' ' . date('d.m.Y H:i', strtotime($r_delete['date_update'])) . '';
}
}
}
}
return ['id' => $who_delete, 'name' => strip_tags($master_delete), 'phone' => $master_phone];
}
//Общее по одной заявке для канбана
private function get_req_details_kanban($r, $kanban = false, $usersToUse = [], $departments = [], $typesReq = array(), $events_res = array()){
// Унифицировано с форматом даты задачи: DD.MM.YYYY.
$date_add = date("d.m.Y", strtotime($r['created_at']));
if(!isset($r['funnel_type'])){
$r['funnel_type'] = 'main';
}
$r['date_add'] = $date_add;
$r['isMainInfo'] = false;
$r['is_new'] = false;
if (isset($_SESSION['new_transfers']['requisitions']))
$r['is_new'] = in_array($r['id'], $_SESSION['new_transfers']['requisitions']);
$noConfirm = 0;
$noConfDoer = 0;
if ($r['confirm'] == '0' && ($r['who_work'] == $_SESSION['id'] or $r['user_id'] == $_SESSION['id'] or $r['who_work'] == 0)) {
$noConfirm = 1;
} else if ($r['doers_confirm'] == 0 && !empty($r['doers'])) {
$doers = json_decode(html_entity_decode($r['doers']), true);
if (isset($doers[$_SESSION['id']]) && $doers[$_SESSION['id']] == 0) {
$noConfDoer = 1;
}
}
$canSee = true;
//у Рослекс из общих могут забирать только менеджеры или агентство
if ($this->user->id != 6358 && $this->agencyId == 6358 && $this->user->manager == 0
&& $r['confirm'] == 0 && $r['who_work'] == 0) {
$canSee = false;
}
$r['can_edit'] = 0;
if($r['who_work'] == $this->user->id){
$r['can_edit'] = 1;
} else if($this->user->manager > 0 || $this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_edit'] = 1;
} else if($r['doers_confirm'] == 0 && !empty($r['doers'])){
$doers1 = json_decode(html_entity_decode($r['doers']), true);
if (isset($doers1[$_SESSION['id']]) && $doers1[$_SESSION['id']] == 1) {
$r['can_edit'] = 1;
}
}
$r['no_confirm'] = $noConfirm;
$r['no_conf_doer'] = $noConfDoer;
$r['can_see'] =$canSee;
$r['can_del'] = 1;
if($r['confirm'] == '0' && $r['who_work'] == 0){
$r['can_del'] = 0;
if($this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_del'] = 1;
}
} else if($r['funnel_type'] == 'adjacent'){
$r['can_del'] = 0;
}
$r['can_see_joint'] = 0;
if($this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_see_joint'] = 1;
}
$r['can_see_other'] = false;
if ($r['can_edit'] || $r['who_work'] == $this->user->id || $r['user_id'] == $this->user->id)
$r['can_see_other'] = true;
// Если заявка из общих
if ($r['deleted'] == 0 && $r['confirm'] == 0 && $r['who_work'] == 0)
$r['can_see_other'] = true;
$r['can_see_contact_closed'] = false;
$r['can_take_from_closed'] = false;
$r_check_permissions = $this->user->checkMenuPermissions();
$sql_check_manager = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$r['who_work'];
$result_check_manager = mysql_query($sql_check_manager);
$req_id_manager = mysql_fetch_assoc($result_check_manager);
$depClassPerm = new \Department();
$dep_user = $depClassPerm->getDepartment($_SESSION['id']);
$sql_user_missing_fields = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$_SESSION['id'];
$result_user_missing_fields = mysql_query($sql_user_missing_fields);
$user_missing_fields = mysql_fetch_assoc($result_user_missing_fields);
if ($_SESSION['agency'] || $_SESSION['users_admin'] || $r_check_permissions['menu_all_submissions_edit'] == 1 || $_SESSION['id'] == $r['who_work']) {
$r['can_see_contact_closed'] = true;
} elseif (($dep_user['role'] == 'admin_department' || $dep_user['role'] == 'manager_office') && $req_id_manager['department_id'] == $user_missing_fields['department_id']) {
$r['can_see_contact_closed'] = true;
} elseif ($dep_user['role'] == 'manager' && $this->user->id == $req_id_manager['id_manager']) {
$r['can_see_contact_closed'] = true;
} elseif ($dep_user['role'] == 'manager_office_menager' && ($this->user->id == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $r['who_work'])) {
$r['can_see_contact_closed'] = true;
} elseif (!($dep_user['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $req_id_manager['id_manager']))) {
$r['can_see_contact_closed'] = true;
}
$daily_closed_req_left = $r_check_permissions['daily_closed_req_limit'] - $r_check_permissions['actual_daily_closed_req'];
if (($_SESSION['agency'] || $_SESSION['users_admin'] || ($r_check_permissions['menu_can_take_from_closed'] == 1 && $daily_closed_req_left > 0)) && $r['confirm'] == 1) {
$r['can_take_from_closed'] = true;
}
$r['daily_closed_req_left'] = $daily_closed_req_left;
$r['r_check_permissions'] = $r_check_permissions;
$r['can_see_contact_common'] = false;
if ($_SESSION['agency'] || $_SESSION['users_admin']) {
$r['can_see_contact_common'] = true;
}
/*if ($this->user->manager > 0 || $this->user->agency > 0 || $_SESSION['users_admin'] > 0) {
$sql = "SELECT id FROM `users`
WHERE id = {$this->user->id} OR
id_manager = {$this->user->id} OR
id_manager IN (
SELECT id FROM users WHERE id_manager = {$this->user->id}
) OR
id_manager IN (
SELECT id FROM users WHERE id_manager IN (
SELECT id FROM users WHERE id_manager = {$this->user->id}
)
)";
}*/
if($r['funnel_type'] == 'adjacent'){
$funnelClass = new Funnel($this->db);
$r['steps'] = $funnelClass->get_class_etap(array(),$r['id'], $r['funnel_id']);
} else {
$r['steps'] = $this->get_class_etap($r['id'], $r['funnel_id'], $r['stage']);
}
// $r['steps'] = $this->get_class_etap($r['id'], $r['funnel_id'], $r['stage']);
$r['object'] = array();
$r['client'] = array();
$r['union_req'] = array();
$r['autosearch'] = array('filter' => []);
$r['autosearch_id'] = null;
$r['autosearch_info'] = null;
$r['add_tag'] = false;
$r['add_tag_contract'] = false;
$r['description'] = html_entity_decode($r['description']);
$who_work = $this->get_who($r['who_work'], $r['id'], $kanban, $departments, $usersToUse);
$r['master_work_id'] = $who_work['id'];
$r['master_work'] = $who_work['name'];
$r['master_work_name'] = $who_work['name'];
$r['master_work_fio'] = $who_work['fio'];
//Тип заявки
$typesReqNames = $typesReq['names_type'];
$r['name_type'] = $typesReqNames[$r['type_id']]['name'];
$r['heir_type'] = $typesReqNames[$r['type_id']]['heir'];
$r['activities'] = array() ;
$r['activities_visible'] = array() ;
$r['activities_temp'] = array();
$r['activities_name'] = '';
$r['activities_rest'] = 0;
$sql_a = "SELECT * FROM requisitions_activities WHERE req_id = {$r['id']}";
$q_a = $this->db->query($sql_a);
$tv = 0;
while($r_a = $this->db->fetch_assoc($q_a)){
$r['activities_temp'][] = $r_a['activity_id'];
$sql_a_name = "SELECT * FROM activities WHERE id = {$r_a['activity_id']}";
$q_a_name = $this->db->query($sql_a_name);
$r_a_name = $this->db->fetch_assoc($q_a_name);
$r['activities'][] = $r_a_name;
if(count($r['activities_visible']) < 2){
$r['activities_visible'][] = $r_a_name;
$tv++;
}
if($r['activities_name'] != '') $r['activities_name'] .= ", ";
$r['activities_name'] .= $r_a_name['name'];
}
if($tv < count($r['activities'])){
$r['activities_rest'] = count($r['activities']) - $tv;
}
$r['e'] = $events_res;
if(isset($events_res) && !empty($events_res)){
$r['events_res'] = $events_res[$r['id']]['events_res'];
$r['events_res1'] = $events_res[$r['id']]['events_res1'];
$r['events_res2'] = $events_res[$r['id']]['events_res2'];
}
$tasks_sql = "SELECT schedule_date, comment, user_id, name,type
FROM user_client_events
WHERE req_id = {$r['id']} AND type IN ('even', 'call', 'deal', 'show', 'meet') AND calendar_view = 0
ORDER BY schedule_date ASC";
$tasks_result = mysql_query($tasks_sql);
if ($tasks_result) {
while ($row = mysql_fetch_assoc($tasks_result)) {
$sql_user = "SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) as user_fio
FROM users
WHERE id = {$row['user_id']}";
$responsible = mysql_fetch_assoc(mysql_query($sql_user))['user_fio'];
$typeMap = [
'call' => ['label' => 'Звонок', 'bg' => '#dbedc7', 'text' => '#458c46'],
'deal' => ['label' => 'Сделка', 'bg' => '#fcd9dd', 'text' => '#e57373'],
'show' => ['label' => 'Показ', 'bg' => '#fff9c4', 'text' => '#f9a825'],
'meet' => ['label' => 'Встреча', 'bg' => '#f3e4f5', 'text' => '#7c1fa3']
];
$type = $row['type'];
// Унифицировано с датой заявки: DD.MM.YYYY HH:MM.
$scheduleDate = date('d.m.Y H:i', strtotime($row['schedule_date']));
$taskName = $row['name'];
$bgColor = '#e2e9f5';
$textColor = '#76a7fa';
if (isset($typeMap[$type])) {
$taskName = $type == 'even' ? $row['name'] : $typeMap[$type]['label'];
$bgColor = $typeMap[$type]['bg'];
$textColor = $typeMap[$type]['text'];
}
$r['tasks_data'][] = [
'schedule_date' => isset($scheduleDate) ? $scheduleDate : '',
'comment' => isset($row['comment']) ? $row['comment'] : '',
'name' => isset($taskName) ? $taskName : '',
'responsible' => isset($responsible) ? $responsible : '',
'bgColor' => isset($bgColor) ? $bgColor : '',
'textColor' => isset($textColor) ? $textColor : ''
];
}
}
$r['is_deal'] = !empty($r['deal_id']) && $r['deal_id'] > 0 ? 1 : 0;
$result = $r;
return $result;
}
//Общее по одной заявке
private function get_req_details($r, $kanban = false, $usersToUse = [], $sourcesToUse = [], $typesContracs = [], $typesReq = array(), $departments = array(), $needAutoSearch = true) {
//error_reporting(E_ALL | E_STRICT);
//ini_set('display_errors', 1);
$dateAdd = date("d.m.Y",strtotime($r['created_at']));
list($d, $m, $y) = explode(".", $dateAdd);
$date_add = $d." ".getRusMonth($m)." ".$y;
if(!isset($r['funnel_type'])){
$r['funnel_type'] = 'main';
}
$r['date_add'] = $date_add;
$r['isMainInfo'] = false;
$r['is_new'] = false;
if (isset($_SESSION['new_transfers']['requisitions']))
$r['is_new'] = in_array($r['id'], $_SESSION['new_transfers']['requisitions']);
$noConfirm = 0;
$noConfDoer = 0;
if ($r['confirm'] == '0' && ($r['who_work'] == $_SESSION['id'] or $r['user_id'] == $_SESSION['id'] or $r['who_work'] == 0)) {
$noConfirm = 1;
} else if ($r['doers_confirm'] == 0 && !empty($r['doers'])) {
$doers = json_decode(html_entity_decode($r['doers']), true);
if (isset($doers[$_SESSION['id']]) && $doers[$_SESSION['id']] == 0) {
$noConfDoer = 1;
}
}
$canSee = true;
//у Рослекс из общих могут забирать только менеджеры или агентство
if ($this->user->id != 6358 && $this->agencyId == 6358 && $this->user->manager == 0
&& $r['confirm'] == 0 && $r['who_work'] == 0) {
$canSee = false;
}
$r['can_edit'] = 0;
if($r['who_work'] == $this->user->id){
$r['can_edit'] = 1;
} else if($this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_edit'] = 1;
} else if($this->user->manager > 0){
if(!empty($this->userIdsWork)){
if(in_array($r['who_work'], $this->userIdsWork)){
$r['can_edit'] = 1;
}
}
} else if(!empty($r['doers'])){
$doers1 = json_decode(html_entity_decode($r['doers']), true);
$r['doers1'] = $doers1;
if (isset($doers1[$_SESSION['id']]) && $doers1[$_SESSION['id']] == 1) {
$r['can_edit'] = 1;
}
}
$r['no_confirm'] = $noConfirm;
$r['no_conf_doer'] = $noConfDoer;
$r['can_see'] =$canSee;
$r['is_deal'] = !empty($r['deal_id']) && $r['deal_id'] > 0 ? 1 : 0;
$r['can_see_other'] = false;
if ($r['can_edit'] && ((int)$r['who_work'] == (int)$this->user->id || (int)$r['user_id'] == (int)$this->user->id))
$r['can_see_other'] = true;
if (!$r['can_see_other'] && ($this->user->agency > 0 || $_SESSION['users_admin'] > 0))
$r['can_see_other'] = true;
// Если пользователь менеджер и заявка его подчиненного
if (!$r['can_see_other'] && ($this->user->manager > 0)) {
if (!empty($this->user->manager_users)) {
if (in_array((int)$r['who_work'], $this->user->manager_users) || in_array((int)$r['user_id'], $this->user->manager_users)) {
$r['can_see_other'] = true;
}
}
}
if (!isset($this->user) || $this->user === null) {
if (isset($_SESSION['id']) && is_numeric($_SESSION['id'])) {
$this->user = new User();
} else {
http_response_code(500);
echo json_encode(['error' => 'User authentication required']);
exit();
}
}
$r['can_see_contact_closed'] = false;
$r['can_take_from_closed'] = false;
$r_check_permissions = $this->user->checkMenuPermissions();
$sql_check_manager = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$r['who_work'];
$result_check_manager = mysql_query($sql_check_manager);
$req_id_manager = mysql_fetch_assoc($result_check_manager);
$depClassPerm = new \Department();
$dep_user = $depClassPerm->getDepartment($_SESSION['id']);
$sql_user_missing_fields = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$_SESSION['id'];
$result_user_missing_fields = mysql_query($sql_user_missing_fields);
$user_missing_fields = mysql_fetch_assoc($result_user_missing_fields);
if ($_SESSION['agency'] || $_SESSION['users_admin'] || $r_check_permissions['menu_all_submissions_edit'] == 1 || $_SESSION['id'] == $r['who_work']) {
$r['can_see_contact_closed'] = true;
$r['can_edit'] = 1;
} elseif (($dep_user['role'] == 'admin_department' || $dep_user['role'] == 'manager_office') && $req_id_manager['department_id'] == $user_missing_fields['department_id']) {
$r['can_see_contact_closed'] = true;
} elseif ($dep_user['role'] == 'manager' && $this->user->id == $req_id_manager['id_manager']) {
$r['can_see_contact_closed'] = true;
} elseif ($dep_user['role'] == 'manager_office_menager' && ($this->user->id == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $r['who_work'])) {
$r['can_see_contact_closed'] = true;
} elseif (!($dep_user['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $req_id_manager['id_manager']))) {
$r['can_see_contact_closed'] = true;
}
$daily_closed_req_left = $r_check_permissions['daily_closed_req_limit'] - $r_check_permissions['actual_daily_closed_req'];
if (($_SESSION['agency'] || $_SESSION['users_admin'] || ($r_check_permissions['menu_can_take_from_closed'] == 1 && $daily_closed_req_left > 0)) && $r['confirm'] == 1) {
$r['can_take_from_closed'] = true;
}
$r['daily_closed_req_left'] = $daily_closed_req_left;
$r['r_check_permissions'] = $r_check_permissions;
$see_client = true;
$see_info = true;
if($this->user->agencyId == 8826 || $this->user->agencyId == 19895){
if($r['who_work'] == 0 && $r['confirm'] == 0){
$see_client = false;
$see_info = false;
}
}
if ($r['deleted'] == 1 && !$r['can_see_contact_closed']) {
$see_info = false;
}
$r['can_see_contact_common'] = false;
if ($_SESSION['agency'] || $_SESSION['users_admin']) {
$r['can_see_contact_common'] = true;
}
$r['see_client'] = $see_client;
$r['see_info'] = $see_info;
$r['can_del'] = 1;
$r['can_see_joint'] = 0;
if($this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_see_joint'] = 1;
}
if($r['confirm'] == '0' && $r['who_work'] == 0){
$r['can_del'] = 0;
if($this->user->agency > 0 || $_SESSION['users_admin'] > 0){
$r['can_del'] = 1;
}
} else if($r['funnel_type'] == 'adjacent'){
$r['can_del'] = 0;
}
// Если заявка из общих
if ($r['deleted'] == 0 && $r['confirm'] == 0 && $r['who_work'] == 0) {
$r['can_see_other'] = true;
if($this->user->agencyId != 8826){
$r['can_edit'] = true;
}
}
if($r['funnel_type'] == 'adjacent'){
$funnelClass = new Funnel($this->db);
$r['steps'] = $funnelClass->get_class_etap(array(),$r['id'], $r['funnel_id']);
} else {
$r['steps'] = $this->get_class_etap($r['id'], $r['funnel_id'], $r['stage']);
}
$r['object'] = array();
$r['client'] = array();
$r['union_req'] = array();
$r['is_main_union_req'] = 0;
// Don`t remove (!)
$r['autosearch'] = array('error' => [], 'filter' => []);
$r['autosearch_id'] = null;
$r['autosearch_info'] = null;
//Теги
$r['activities'] = array() ;
$r['activities_visible'] = array() ;
$r['activities_temp'] = array();
$r['activities_name'] = '';
$r['activities_rest'] = 0;
$sql_a = "SELECT * FROM requisitions_activities WHERE req_id = {$r['id']}";
$q_a = $this->db->query($sql_a);
$tv = 0;
while($r_a = $this->db->fetch_assoc($q_a)){
$r['activities_temp'][] = $r_a['activity_id'];
$sql_a_name = "SELECT * FROM activities WHERE id = {$r_a['activity_id']}";
$q_a_name = $this->db->query($sql_a_name);
$r_a_name = $this->db->fetch_assoc($q_a_name);
$r['activities'][] = $r_a_name;
if(count($r['activities_visible']) < 3){
$r['activities_visible'][] = $r_a_name;
$tv++;
}
if($r['activities_name'] != '') $r['activities_name'] .= ", ";
$r['activities_name'] .= $r_a_name['name'];
}
if($tv < count($r['activities'])){
$r['activities_rest'] = count($r['activities']) - $tv;
}
$r['contracts'] = array();
$r['contracts_name'] = '';
$sql_a = "SELECT * FROM contracts_req WHERE req_id = {$r['id']}";
$q_a = $this->db->query($sql_a);
while($r_a = $this->db->fetch_assoc($q_a)){
$expired = false;
$diff_date = ($r_a['date_end'] - time())/86400;
if($diff_date < (int)$r_a['days']){
$expired = true;
}
$name = $typesContracs[$r_a['type']]['type']." №".$r_a['number']." от ".date('d.m.Y',$r_a['date_start']). " по ".date('d.m.Y', $r_a['date_end']);
$r['contracts'][] = array('id'=>$r_a['id'], 'name'=>$name, 'expired'=>$expired);
if($r['contracts_name'] != '') $r['contracts_name'] .= ", ";
$r['contracts_name'] .= $name;
}
$r['add_tag'] = false;
$r['popup_tag'] = false;
$r['add_tag_contract'] = false;
$r['description'] = html_entity_decode($r['description']);
if (isset($usersToUse) && isset($usersToUse[$r['user_id']])) {
$r_m = $usersToUse[$r['user_id']];
} else {
$sql_m = "SELECT agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone FROM users WHERE id=" . $r['user_id'];
$q_m = $this->db->query($sql_m);
$r_m = $this->db->fetch_assoc($q_m);
}
if (!isset($departments) || count($departments) == 0) {
$depClass = new Department;
$departments = $depClass->getDepartments();
}
$r['no_can_edit_hot'] = 0;
$r['see_modal_client'] = 1;
if ($r_m['agency']) {
$master = trim($r_m['last_name'] . ' ' . $r_m['first_name'] . ' ' . $r_m['middle_name']) ?: "Агентство {$r_m['agency_name']}";
} else if ($r_m['manager']) {
$master = "Менеджер " . trim($r_m['last_name'] . ' ' . $r_m['first_name'] . ' ' . $r_m['middle_name']);
if ($r_m['role_id'] > 0) {
$master = $departments[$r_m['role_id']]['role_name'] . ' ' . trim($r_m['last_name'] . ' ' . $r_m['first_name'] . ' ' . $r_m['middle_name']);
}
} else {
$master = "Агент " . trim($r_m['last_name'] . ' ' . $r_m['first_name'] . ' ' . $r_m['middle_name']);
if ($r_m['role_id'] > 0) {
$master = $departments[$r_m['role_id']]['role_name'] . ' ' . trim($r_m['last_name'] . ' ' . $r_m['first_name'] . ' ' . $r_m['middle_name']);
}
}
//check edit
$r['allow_edit'] = 0;
if(isset($this->user)){
$r_check_permissions = $this->user->checkMenuPermissions();
$sql_check_manager = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$r['who_work'];
$depClassPerm = new Department();
$dep_user_perm = $depClassPerm->getDepartment($this->user->id);
$result_check_manager = mysql_query($sql_check_manager);
$who_work_id_manager = mysql_fetch_assoc($result_check_manager);
$sql_check_user_department_id = "SELECT `department_id` FROM `users` WHERE `id` = ".$this->user->id;
$result_check_user_department_id = mysql_query($sql_check_user_department_id);
$user_department_id = mysql_fetch_assoc($result_check_user_department_id);
$sql_check_user_users_admin = "SELECT `users_admin` FROM `users` WHERE `id` = ".$this->user->id;
$result_check_user_users_admin = mysql_query($sql_check_user_users_admin);
$check_user_users_admin = mysql_fetch_assoc($result_check_user_users_admin);
$r['who_work_id_manager'] = $who_work_id_manager['id_manager'];
$r['who_work_department_id'] = $who_work_id_manager['department_id'];
//($dep_user_perm['role'] == 'admin_department' && $who_work_id_manager['department_id'] == $this->user->department_id)
$r['user_department_id'] = $user_department_id['department_id'];
$r['user_role'] = $dep_user_perm['role'];
if ($this->user->agency == 1 || $check_user_users_admin['users_admin'] == 1 || $r_check_permissions['menu_all_submissions_edit'] == 1 || $this->user->id == $r['who_work']) {
$r['allow_edit'] = 1;
} else if (($dep_user_perm['role'] == 'admin_department' || $dep_user_perm['role'] == 'manager_office') && $who_work_id_manager['department_id'] == $user_department_id['department_id']) {
$r['allow_edit'] = 1;
} elseif (($dep_user_perm['role'] == 'manager_office_menager' || $dep_user_perm['role'] == 'manager') && ($_SESSION['id'] == $who_work_id_manager['id_manager'] || $_SESSION['id_manager'] == $who_work_id_manager['id_manager'] || $_SESSION['id_manager'] == $r['who_work'])) {
$r['allow_edit'] = 1;
} elseif (!($dep_user_perm['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $who_work_id_manager['id_manager']))) {
$r['allow_edit'] = 1;
}
}
if($this->agencyId == 19895){
$r['no_can_edit_hot'] = 1;
$r['see_modal_client'] = 0;
if($this->user->agency == 1 || $check_user_users_admin['users_admin'] == 1 || $r_check_permissions['menu_all_submissions_edit'] == 1) {
$r['no_can_edit_hot'] = 0;
$r['see_modal_client'] = 1;
}
else if (($dep_user_perm['role'] == 'admin_department' || $dep_user_perm['role'] == 'manager_office') && $who_work_id_manager['department_id'] == $user_department_id['department_id']) {
$r['no_can_edit_hot'] = 0;
$r['see_modal_client'] = 1;
}
elseif ($dep_user_perm['role'] == 'manager_office_menager' && ($_SESSION['id'] == $who_work_id_manager['id_manager'] || $_SESSION['id_manager'] == $who_work_id_manager['id_manager'] || $_SESSION['id_manager'] == $r['who_work'])) {
$r['no_can_edit_hot'] = 0;
$r['see_modal_client'] = 1;
}
elseif (!($dep_user_perm['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $who_work_id_manager['id_manager']))){
$r['no_can_edit_hot'] = 0;
$r['see_modal_client'] = 1;
}
}
$r['user'] = $this->user;
$r['manager_id'] = $r['user_id'];
$r['manager'] = $master;
$r['manager_phone'] = $r_m['phone'];
$master_work = $this->get_who($r['who_work'], $r['id'], $kanban, $departments, $usersToUse);
$r['master_work_id'] = $master_work['id'];
$r['master_work'] = $master_work['name'];
$r['master_work_phone'] = $master_work['phone'];
$r['master_work_fio'] = $master_work['fio'];
$r['master_delete_id'] = null;
$r['master_delete'] = '';
$r['master_delete_phone'] = null;
if ($r['deleted'] > 0) {
$master_delete = $this->get_who_delete($r['who_delete'], $r['id'], $kanban, $departments, $usersToUse);
$r['master_delete_id'] = $master_delete['id'];
$r['master_delete'] = $master_delete['name'];
$r['master_delete_phone'] = $master_delete['phone'];
if ($r['confirm'] == 10 && empty($r['deal_id'])) {
$r['reason'] = "Совершена сделка на ".$r['summa']." руб.";
}
}
$doer_yes = array();
$doer_no = array();
if($r['doer_clients'] == 1){
$doers = array();
$doers_arr = json_decode(html_entity_decode($r['doers']));
foreach($doers_arr as $key => $doer){
if($key > 0){
$sql_user = "SELECT agency_name, first_name, last_name, middle_name from users WHERE id = ".$key;
$q_user = $this->db->query($sql_user);
$r_user = $this->db->fetch_assoc($q_user);
if($doer == 1) $doer_yes[] = trim($r_user['last_name'] . ' ' . $r_user['first_name'] . ' ' . $r_user['middle_name']);
if($doer == 0) $doer_no[] = trim($r_user['last_name'] . ' ' . $r_user['first_name'] . ' ' . $r_user['middle_name']);
}
}
}
$r['doer_yes'] = $doer_yes;
$r['doer_no'] = $doer_no;
$r['source_see'] = 1;
$r['source_name'] = $source = '';
if($r['source'] > 0){
if($r['source'] == 10000) {
$r['source_name'] = 'Объект нашей компании';
$source = 'Объект нашей компании';
}
else{
if (isset($sourcesToUse) && isset($sourcesToUse[$r['source']])) {
$r['source_name'] = $sourcesToUse[$r['source']]['source'];
$source = $sourcesToUse[$r['source']]['source'];
$r['source_see'] = $sourcesToUse[$r['source']]['source_see'];
if($r['source_see']==0) $r['source_name'] = '';
} else {
$sql_source = "SELECT * FROM advertising_sources WHERE id = $r[source]";
$q_source = $this->db->query($sql_source);
if ($this->db->num_rows($q_source) > 0) {
$r_source = $this->db->fetch_assoc($q_source);
if(is_see($r_source['is_no_see'], $r_source['users_no_see']) === false){
$r['source_name'] = '';
$source = '';
$r['source_see'] = 0;
} else {
$r['source_name'] = $r_source['source'];
$source = $r_source['source'];
}
}
}
}
}
$partner = "";
if (isset($r['employee_id']) && $r['employee_id'] > 0) {
$partners = new Partners;
$partner = $partners->getPartnerByEmployee(intval($r['employee_id']));
}
$r['source_name'] .= ($partner) ? ((isset($source)) ? " | " : '') . $partner['name'] . ((!empty($partner['resident'])) ? ' (' . $partner['resident']. ')' : '') : '';
$r['employe_name'] = null;
if (isset($partner['fullname']))
$r['employe_name'] = $partner['fullname'];
if(!empty($partner['position'])){
$r['employe_name'] .= ", ".$partner['position'];
}
//Название воронки
if($r['funnel_id'] == 0){
$r['name_funnel'] = "Обычные";
} else {
$sql_fun = "SELECT name FROM funnel WHERE id = ".$r['funnel_id'];
$r['name_funnel'] = $this->db->fetch_assoc($this->db->query($sql_fun))['name'];
}
//Тип заявки
$typesReqNames = $typesReq['names_type'];
$r['name_type'] = $typesReqNames[$r['type_id']]['name'];
$r['heir_type'] = $typesReqNames[$r['type_id']]['heir'];
//Смежные воронки
$r['funnels_adjacent'] = array();
$r['funnels_adjacent_text'] = '';
$r['is_active_funnels_adjacent'] = false;
$r['is_watched'] = false;
if($r['funnel_type'] == 'main' && isset($this->funnels_adjacent[$r['id']])){
$r['funnels_adjacent'] = $this->funnels_adjacent[$r['id']];
$new_total = count($r['funnels_adjacent']);
if(count($r['funnels_adjacent']) > 0){
$new_text = 'Ещё '.$new_total;
if($new_total == 1){
$new_text .= ' воронка';
} else if($new_total > 1 && $new_total < 5){
$new_text .= ' воронки';
} else if($new_total > 4){
$new_text .= ' воронок';
}
$r['funnels_adjacent_text'] = $new_text;
}
}
// Получаем данные о просмотренных заявках конкретного объекта
$r['watched_data'] = null;
$w_payload = file_get_contents("php://input");
$w_data = json_decode($w_payload, true);
$w_object_id = $w_data['object_id']; // ID объекта взятый из запроса
if ($w_object_id === null) {
$w_object_id = $_GET['object_id'];
}
$w_user_id = isset($_COOKIE['user_id']) ? $_COOKIE['user_id'] : (isset($_SESSION['id']) ? $_SESSION['id'] : null);
if($w_object_id !== null){
$watch_sql = "SELECT * FROM `watched_requisitions`
WHERE `req_id` = {$r['id']}
AND `user_id` = {$w_user_id}
AND `object_id` = {$w_object_id}";
$watch_query =$this->db->query($watch_sql);
$watch_result = $this->db->fetch_assoc($watch_query);
if ($watch_result) {
$r['watched_data'] = $watch_result;
}
}
if (($needAutoSearch === true) && ($r['type_id'] == 1 || $r['heir_type'] == 1 || $r['type_id'] == 4 || $r['heir_type'] == 4)) {
if ($filter = $this->autosearch_instce->getFilterByReq($r['id'], $_SESSION['id'], false, false, true)) {
if (isset($filter['id'])) {
$r['autosearch_id'] = intval($filter['id']);
$r['autosearch'] = [
'active' => intval($filter['is_active']),
'count' => $filter['count'],
'is_search' => intval($filter['is_search']),
'is_reverse' => intval($filter['is_reverse']),
'total' => $filter['total'],
'error' => $filter['error']
];
$info = '';
$comment = '';
$info_ar = $this->autosearch_instce->getFilterInfo($filter, true, true);
foreach ($info_ar as $key => $filter) {
if (isset($filter['label']) && isset($filter['value'])) {
if ($key === "comment")
$comment = '' . $filter['label'] . ': ' . $filter['value'];
else
$info .= ' ' . $filter['label'] . ': ' . $filter['value'] . ';';
}
$r['autosearch']['filter'][$key] = [
'id' => $filter['id'],
'label' => $filter['label'],
'value' => $filter['value']
];
}
if (!empty($filter['geo'])) {
$geo = (array)json_decode($filter['geo'], true);
$geo = array_filter(array_map(function($item) {
return !empty($item);
}, $geo));
$r['autosearch']['filter']['geo'] = [
'id' => 'geo',
'label' => 'Гео',
'value' => declOfNum(count($geo), ['%d уточнение', '%d уточнения', '%d уточнений'])
];
$info .= ' Гео: ' . declOfNum(count($geo), ['%d уточнение', '%d уточнения', '%d уточнений']). ';';
}
if (!empty($info)) {
$r['autosearch_info'] = rtrim(trim($info), ';');
$r['autosearch_comment'] = trim($comment) ."
". 'ID фильтра: ' . $r['autosearch_id'];
}
}
}
}
$result = $r;
return $result;
}
//Получение id заявок с просроченными этапами
public function getIdExpiredStages($where){
$expiredStagesRequisitions = array();
$stepIds = array();
$stepDays = array();
$funnelIds = array();
if($this->agencyId > 0){
$agency_id = $this->agencyId;
//Этапы
$sql_f = "SELECT id FROM `funnel` WHERE agency_id=$agency_id AND deleted = 0";
$q_f = $this->db->query($sql_f);
while($r_f = $this->db->fetch_assoc($q_f)){
$funnelIds[] = (int)$r_f['id'];
}
$sql_st = "SELECT id, days_step FROM funnel_steps WHERE funnel_id in (".implode(',', $funnelIds).")";
$q_st = $this->db->query($sql_st);
while($r_st = $this->db->fetch_assoc($q_st)){
$stepDays[(int)$r_st['id']] = $r_st['days_step'];
}
$sql = "SELECT id, step_id, created_at, (SELECT date_update FROM clients_funnel_step WHERE req_id=req.id) as date_update FROM requisitions as req WHERE 1 $where AND funnel_id > 0 AND step_id > 0";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
if($stepDays[(int)$r['step_id']] > 0){
$days_step = $stepDays[(int)$r['step_id']];
if(!empty($r['date_update'])){
$lostDate = $r['date_update'];
$interval = date_diff(new DateTime(), new DateTime($lostDate))->days;
if($interval > $days_step){
$expiredStagesRequisitions[] = $r['id'];
}
} else {
$lostDate = $r['created_at'];
$interval = date_diff(new DateTime(), new DateTime($lostDate))->days;
if($interval > $days_step){
$expiredStagesRequisitions[] = $r['id'];
}
}
}
}
}
return $expiredStagesRequisitions;
}
//Все заявки
public function get_all($user = null, $filtr=array(), $funnelId = false, $clientId = false, $objectId = false, $needAutoSearch = true, $complexRoomId = false, $reqs_id = false, $is_cancel = false){
/* if($_SESSION['id'] == 19895){
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
}*/
$starttime = microtime(true);
$type = 'list';
$order = null;
$result = array();
$join = '';
if ($filtr->stages->ahency == 1) {
$join .= "LEFT JOIN events_clients ON events_clients.id = (SELECT id FROM events_clients WHERE events_clients.req_id = req.id AND (events_clients.event='accepted' or events_clients.event='add' or events_clients.event='update') ORDER BY id DESC LIMIT 1)";
}
$priceSelect = '';
$priceJoin = '';
if (intval($filtr->priceFrom) || intval($filtr->priceTo)) {
$priceSelect = ', o.stoim, af.stoim_ot, af.stoim_do';
$priceJoin = '
LEFT JOIN objects AS o
ON req.object_id = o.id
LEFT JOIN autosearch_filters AS af
ON req.id = af.req_id';
}
$propertyTypeJoin = '';
if(!empty($filtr->property_type)){
if($priceJoin == ''){
$propertyTypeJoin = 'LEFT JOIN autosearch_filters AS af
ON req.id = af.req_id';
}
}
if($funnelId === 'all' || $funnelId === false){
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE 1";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE 1";
$sqlExpectedCommissionTotal = "SELECT sum(req.expected_commission) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE deleted=0";
} else if($funnelId == 0 || empty($funnelId)){
$funnelId = 0;
$sql = "SELECT req.* $priceSelect
FROM requisitions as req
$priceJoin
$propertyTypeJoin
$join WHERE funnel_id in ($funnelId)";
$sqlTotal = "SELECT count(*) as total
FROM requisitions as req
$priceJoin
$propertyTypeJoin
$join WHERE funnel_id in ($funnelId)";
$sqlExpectedCommissionTotal = "SELECT sum(req.expected_commission) as total FROM requisitions as req
$priceJoin
$propertyTypeJoin
$join WHERE funnel_id in ($funnelId) AND deleted=0";
} else {
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId)";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId)";
$sqlExpectedCommissionTotal = "SELECT sum(req.expected_commission) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId) AND deleted=0";
if($funnelId > 0){
$sqlPart1 = "SELECT req.id, req.name, req.user_id, req.created_at, req.client_id,
req.object_id, req.type_id, req.funnel_id, req.step_id, req.who_work, req.who_delete,
req.confirm, req.description,
req.stage, req.deleted, req.cancel, req.priority, req.doer_clients,
req.hot, req.reason, req.denial, req.summa, req.expected_commission, req.activities, req.asfilter_id,
req.source, req.doers, req.doers_confirm, req.employee_id, req.property_type_id,
req.integration, req.call_id, req.friend_client_id, req.confirm_recommendation, req.deal_id, req.id as reqid,
'main' as funnel_type,
req.complex_room_id $priceSelect
FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId)";
//$sql .= ' UNION ';
$sqlPart2 = "SELECT req.id, req.name, req.user_id, req.created_at, req.client_id,
req.object_id, req.type_id, a.funnel_id, a.step_id_active as step_id,
a.who_work as who_work, req.who_delete, a.confirm, req.description,
req.stage, req.deleted, req.cancel, req.priority, req.doer_clients,
req.hot, req.reason, req.denial, req.summa, req.expected_commission, req.activities, req.asfilter_id,
req.source, req.doers, req.doers_confirm, req.employee_id, req.property_type_id,
req.integration, req.call_id, 0 as friend_client_id, 0 as confirm_recommendation, req.deal_id, req.id as reqid,
'adjacent' as funnel_type,
req.complex_room_id $priceSelect
FROM adjacent_funnels as a
LEFT JOIN requisitions as req on a.req_id = req.id $priceJoin $propertyTypeJoin $join WHERE a.funnel_id in ($funnelId)";
$sqlTotalPart1 = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId)";
$sqlTotalPart2 = "SELECT count(*) as total FROM adjacent_funnels as a LEFT JOIN requisitions as req on a.req_id = req.id $priceJoin $propertyTypeJoin $join WHERE a.funnel_id in ($funnelId)";
$sqlExpectedCommissionTotalPart1 = "SELECT sum(req.expected_commission) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id in ($funnelId) AND deleted=0";
$sqlExpectedCommissionTotalPart2 = "SELECT sum(req.expected_commission) as total FROM adjacent_funnels as a LEFT JOIN requisitions as req on a.req_id = req.id $priceJoin $propertyTypeJoin $join WHERE a.funnel_id in ($funnelId) AND deleted=0";
}
}
if($clientId){
unset($sqlPart1);
unset($sqlPart2);
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE client_id=$clientId";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE client_id=$clientId";
}
if($objectId){
unset($sqlPart1);
unset($sqlPart2);
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE (type_id = 4 or type_id in (SELECT id FROM requisitions_type WHERE heir = 4 AND agency_id = {$this->agencyId})) and object_id=$objectId";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE (type_id = 4 or type_id in (SELECT id FROM requisitions_type WHERE heir = 4 AND agency_id = {$this->agencyId})) and object_id=$objectId";
}
if($complexRoomId){
unset($sqlPart1);
unset($sqlPart2);
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join where `complex_room_id` = $complexRoomId";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join where `complex_room_id` = $complexRoomId";
}
if($reqs_id){
unset($sqlPart1);
unset($sqlPart2);
if(!empty($reqs_id)){
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join where `id` in (".implode(',', $reqs_id).")";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join where `id` in (".implode(',', $reqs_id).")";
} else {
$sql = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join where `id` in (0)";
$sqlTotal = "SELECT count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join where `id` in (0)";
}
}
// $result['sql'] = $sql;
//Фильтры
$where = " AND cancel=0";
$wherePart1 = " AND cancel=0";
$wherePart2 = " AND cancel=0";
if($is_cancel){
$where = " AND cancel=1";
$wherePart1 = " AND cancel=1";
$wherePart2 = " AND cancel=1";
}
if(!empty($filtr)){
if(isset($filtr->order)){
if($filtr->order == 1){
$order = 'asc';
} else if ($filtr->order == 2) {
$order = 'desc';
} else {
$order = null;
}
}
if(!empty($filtr->search)){
$filtr->search = mb_strtolower(trim($filtr->search), "UTF-8");
$phone = preg_replace('/[+\-\(\)\/\?,.;:%№!\s]/', '', $filtr->search);
$sql_cl = "SELECT id FROM clients WHERE phone like '%".$phone."%'";
$q_cl = $this->db->query($sql_cl);
$clients = array();
while($r_cl = $this->db->fetch_assoc($q_cl)){
$clients[] = (int)$r_cl['id'];
}
$sql_cl_phone2 = "SELECT DISTINCT client_id FROM clients_phone2 WHERE phone like '%".$phone."%'";
$q_cl_phone2 = $this->db->query($sql_cl_phone2);
while($r_cl_phone2 = $this->db->fetch_assoc($q_cl_phone2)) {
$clients[] = (int)$r_cl_phone2['client_id'];
}
$clients = array_unique($clients);
$where .= " AND (name like '%".$filtr->search."%'";
$wherePart1 .= " AND (name like '%".$filtr->search."%'";
$wherePart2 .= " AND (name like '%".$filtr->search."%'";
if(!empty($clients)){
$where .= " or req.client_id in (".implode(',', $clients).")";
$wherePart1 .= " or req.client_id in (".implode(',', $clients).")";
$wherePart2 .= " or req.client_id in (".implode(',', $clients).")";
}
if (preg_match('/^\d+$/', $filtr->search)){
$where .= " or req.id = ".$filtr->search;
$wherePart1 .= " or req.id = ".$filtr->search;
$wherePart2 .= " or req.id = ".$filtr->search;
}
$where .= ")";
$wherePart1 .= ")";
$wherePart2 .= ")";
}
if(isset($filtr->stages)){
$uIds = array();
$query = mysql_query("select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user or id_manager in
(select id from users where id_manager=$user))");
while($us = mysql_fetch_assoc($query)) {
$uIds[] = $us['id'];
}
$all_null = true;
foreach ($filtr->stages as $value) {
if ((int)$value !== 0) {
$all_null = false;
break;
}
}
if(isset($filtr->filter_stage) && $filtr->filter_stage == 'filter_stage_work'){
$where .= " AND deleted = 0";
$wherePart1 .= " AND deleted = 0";
$wherePart2 .= " AND deleted = 0";
} else {
foreach($filtr->stages as $key => $stage){
if($stage == 1){
switch($key) {
case 'work':{
$where .= " AND deleted = 0 AND confirm = 1";
$wherePart1 .= " AND deleted = 0 AND req.confirm = 1";
$wherePart2 .= " AND deleted = 0 AND a.confirm = 1";
break;
}
case 'hot': {
$where .= " AND deleted = 0 AND hot > 0 AND confirm = 1";
$wherePart1 .= " AND deleted = 0 AND hot > 0 AND req.confirm = 1";
$wherePart2 .= " AND deleted = 0 AND hot > 0 AND a.confirm = 1";
break;
}
case 'close': {
$where .= " AND deleted = 1 AND confirm <> 10";
$wherePart1 .= " AND deleted = 1 AND req.confirm <> 10";
$wherePart2 .= " AND deleted = 1 AND a.confirm <> 10";
break;
}
case 'hit': {
$where .= " AND deleted = 1 AND confirm = 10";
$wherePart1 .= " AND deleted = 1 AND req.confirm = 10";
$wherePart2 .= " AND deleted = 1 AND a.confirm = 10";
break;
}
case 'ahency': {
$where .= " AND deleted = 0 AND confirm = 0 AND who_work = 0";
$wherePart1 .= " AND deleted = 0 AND req.confirm = 0 AND req.who_work = 0";
$wherePart2 .= " AND deleted = 0 AND a.confirm = 0 AND a.who_work = 0";
break;
}
case 'confirm': {
$where .= " AND deleted = 0 AND confirm = 0 AND who_work <> 0";
$wherePart1 .= " AND deleted = 0 AND req.confirm = 0 AND req.who_work <> 0";
$wherePart2 .= " AND deleted = 0 AND a.confirm = 0 AND a.who_work <> 0";
break;
}
case 'send': {
$where .= " AND deleted = 0 AND confirm = 0 AND who_work <> $user";
$wherePart1 .= " AND deleted = 0 AND req.confirm = 0 AND req.who_work <> $user";
$wherePart2 .= " AND deleted = 0 AND a.confirm = 0 AND a.who_work <> $user";
break;
}
}
}
}
}
} else {
$where .= " AND deleted = 0";
$wherePart1 .= " AND deleted = 0";
$wherePart2 .= " AND deleted = 0";
}
if(!empty($filtr->emp)){
//var_dump($filtr->emp);
if ($filtr->stages->ahency) {
$empwho = array();
foreach ($filtr->emp as $empId) {
if(strpos($empId, "all_") !== false){
$agencyId = str_replace('all_', '', $empId);
$sqId = "SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))";
$sqIdQuery = mysql_query($sqId);
while ($idRow = mysql_fetch_array($sqIdQuery)) {
$empwho[] = intval($idRow['id']);
}
} else if($empId == 'del_all'){
$user_agency = new User;
$user_agency->get($_SESSION['id']);
$agencyId = $user_agency->agencyId;
$sqId = "SELECT id FROM `users` WHERE (id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))) AND blocked=1";
$sqIdQuery = mysql_query($sqId);
while ($idRow = mysql_fetch_array($sqIdQuery)) {
$empwho[] = intval($idRow['id']);
}
$sqlDel = "SELECT user_id FROM users_delete WHERE agency_id = {$agencyId}";
$qDel = mysql_query($sqlDel);
while($rDel = mysql_fetch_assoc($qDel)){
$empwho[] = intval($rDel['user_id']);
}
} else {
$empwho[] = intval($empId);
}
}
if (!empty($empwho)) {
$empwho = array_unique($empwho);
$where .= " AND (events_clients.user_id IN (".implode(',', $empwho)."))";
$wherePart1 .= " AND (events_clients.user_id IN (".implode(',', $empwho)."))";
$wherePart2 .= " AND (events_clients.user_id IN (".implode(',', $empwho)."))";
}
} else {
$empwho = array();
$empwho1 = array();
$empwho2 = array();
foreach($filtr->emp as $empId){
$temp_where = '';
//$empwho[] = "id_agent = $empId";
if(strpos($empId, "all_") !== false){
$agencyId = str_replace('all_', '', $empId);
$stremp = " (who_work in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId)))";
$stremp1 = " (req.who_work in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId)))";
$stremp2 = " (a.who_work in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId)))";
/*if($post['emp']){
$stremp .= " or (doers like '%"".$post['emp'].""%')";
}*/
$empwho[] = $stremp .= ")";
$empwho1[] = $stremp1 .= ")";
$empwho2[] = $stremp2 .= ")";
} else if($empId == 'del_all'){
$user_agency = new User;
$user_agency->get($_SESSION['id']);
$agencyId = $user_agency->agencyId;
$sqId = "SELECT id FROM `users` WHERE (id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))) AND blocked=1";
$sqIdQuery = mysql_query($sqId);
while ($idRow = mysql_fetch_array($sqIdQuery)) {
$empwho[] = "who_work = ".(intval($idRow['id']));
$empwho1[] = "req.who_work = ".(intval($idRow['id']));
$empwho2[] = "a.who_work = ".(intval($idRow['id']));
}
$sqlDel = "SELECT user_id FROM users_delete WHERE agency_id = {$agencyId}";
$qDel = mysql_query($sqlDel);
while($rDel = mysql_fetch_assoc($qDel)){
// $empwho[] = intval($rDel['user_id']);
$empwho[] = "who_work = ".intval($rDel['user_id']);
$empwho1[] = "req.who_work = ".intval($rDel['user_id']);
$empwho2[] = "a.who_work = ".intval($rDel['user_id']);
}
}
else {
$empwho[] = "who_work = $empId";
$empwho1[] = "req.who_work = $empId";
$empwho2[] = "a.who_work = $empId";
}
}
if(!empty($empwho)){
$where .= " AND (".implode(" OR ",$empwho).")";
}
if(!empty($empwho1)){
$wherePart1 .= " AND (".implode(" OR ",$empwho1).")";
}
if(!empty($empwho2)){
$wherePart2 .= " AND (".implode(" OR ",$empwho2).")";
}
//$where .= " AND who_work in (".implode(',',$filtr->emp).")";
}
}
if(!empty($filtr->type)){
$types_req = $this->get_types_type($filtr->type);
$where .= " AND req.type_id in (".implode(',',$types_req).")";
$wherePart1 .= " AND req.type_id in (".implode(',',$types_req).")";
$wherePart2 .= " AND req.type_id in (".implode(',',$types_req).")";
}
if(!empty($filtr->property_type)){
$search_p_t = $filtr->property_type;
$search_au_t = [];
if(in_array(10, $search_p_t)){ //Если выбран тип "квартира"
array_push($search_p_t, 1, 2,3,4,5);
}
if(in_array(1, $search_p_t)){ //Если выбран тип "квартира"
array_push($search_p_t, 11);
}
$search_p_t = array_unique($search_p_t);
foreach($search_p_t as $pr){
if(in_array($pr, [1,2,3,4,5])){
$search_au_t[] = 'JSON_CONTAINS(af.rooms, \'"'.$pr.'"\')';
}
}
$where .= " AND (req.property_type_id in (".implode(',',$search_p_t).")";
$wherePart1 .= " AND (req.property_type_id in (".implode(',',$search_p_t).")";
$wherePart2 .= " AND (req.property_type_id in (".implode(',',$search_p_t).")";
if(!empty($search_au_t)){
$where .= " OR (".implode(' OR ', $search_au_t).")";
$wherePart1 .= " OR (".implode(' OR ', $search_au_t).")";
$wherePart2 .= " OR (".implode(' OR ', $search_au_t).")";
}
$where .= ")";
$wherePart1 .= ")";
$wherePart2 .= ")";
// AND (req.property_type_id in (1) or ( JSON_CONTAINS(af.rooms, '"1"') or JSON_CONTAINS(af.rooms, '"4"')))
}
if(!empty($filtr->step)){
// var_dump($filtr->step);
if(isset($filtr->is_date_step) && $filtr->is_date_step > 0){
$req_ids_step = array();
$sql_step = "SELECT * FROM steps_history WHERE req_id > 0 AND step_id in (".implode(',',$filtr->step).")";
if(isset($filtr->onDateStep) && $filtr->onDateStep > 0){
$date_on = strtotime($filtr->onDateStep."00:00:00");
$sql_step .= " AND date >= $date_on";
}
if(isset($filtr->offDateStep) && $filtr->offDateStep > 0){
$date_off = strtotime($filtr->offDateStep."23:59:59");
$sql_step .= " AND date <= $date_off";
}
$q_step = $this->db->query($sql_step);
while($r_step = $this->db->fetch_assoc($q_step)){
$req_ids_step[] = $r_step['req_id'];
}
// $part_where_step = " AND req.id in (".implode(',', $req_ids_step).")";
if(!empty($req_ids_step)){
$where .= " AND id in (".implode(',', $req_ids_step).")";
$wherePart1 .= " AND req.id in (".implode(',', $req_ids_step).")";
$wherePart2 .= " AND req.id in (".implode(',', $req_ids_step).")";
} else {
$where .= " AND id in (0)";
$wherePart1 .= " AND req.id in (0)";
$wherePart2 .= " AND req.id in (0)";
}
} else {
if($funnelId == 0){
$where .= " AND stage in (".implode(',',$filtr->step).")";
$wherePart1 .= " AND stage in (".implode(',',$filtr->step).")";
$wherePart2 .= " AND stage in (".implode(',',$filtr->step).")";
} else if($funnelId > 0){
$where .= " AND step_id in (".implode(',',$filtr->step).")";
$wherePart1 .= " AND req.step_id in (".implode(',',$filtr->step).")";
$wherePart2 .= " AND a.step_id in (".implode(',',$filtr->step).")";
}
}
} else if(isset($filtr->step_id) && $filtr->step_id !== 'all'){
if($funnelId == 0){
$where .= " AND stage in (".$filtr->step_id.")";
$wherePart1 .= " AND stage in (".$filtr->step_id.")";
$wherePart2 .= " AND stage in (".$filtr->step_id.")";
} else if($funnelId > 0){
$where .= " AND step_id in (".$filtr->step_id.")";
$wherePart1 .= " AND req.step_id in (".$filtr->step_id.")";
$wherePart2 .= " AND a.step_id in (".$filtr->step_id.")";
}
}
if(isset($filtr->total_union) && $filtr->total_union != '' && $filtr->total_union != 'null' && !is_null($filtr->total_union)){
$total_union = (int)$filtr->total_union;
$where .= " AND (SELECT count(id) as total_union FROM union_requisitions WHERE union_requisitions.main_id = req.id) = {$total_union}";
$wherePart1 .= " AND (SELECT count(id) as total_union FROM union_requisitions WHERE union_requisitions.main_id = req.id) = {$total_union}";
$wherePart2 .= " AND (SELECT count(id) as total_union FROM union_requisitions WHERE union_requisitions.main_id = a.id) = {$total_union}";
}
if(isset($filtr->denial) && !empty($filtr->denial)){
$where .= " AND denial in (".implode(',',$filtr->denial).")";
$wherePart1 .= " AND denial in (".implode(',',$filtr->denial).")";
$wherePart2 .= " AND denial in (".implode(',',$filtr->denial).")";
}
$priority_where = '';
if(isset($filtr->priority)){
foreach($filtr->priority as $key => $pr){
if($pr > 0){
if($priority_where == ''){
$priority_where .= " AND (priority = ".$key;
} else {
$priority_where .= " or priority = ".$key;
}
}
}
}
if($priority_where != ''){
$priority_where .= ")";
$where .= $priority_where;
$wherePart1 .= $priority_where;
$wherePart2 .= $priority_where;
}
if(!empty($filtr->object_id)){
$where .= " AND object_id = ".(int)$filtr->object_id;
$wherePart1 .= " AND object_id = ".(int)$filtr->object_id;
$wherePart2 .= " AND object_id = ".(int)$filtr->object_id;
}
$tasksConditions = [];
// "С задачами"
if(isset($filtr->is_tasks) && $filtr->is_tasks) {
$tasksConditions[] = "(SELECT count(id) FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id=req.id and schedule_date > '2001-03-10 17:16:18') > 0";
}
// "Без задач"
if(isset($filtr->noTasks) && $filtr->noTasks) {
$tasksConditions[] = "(SELECT count(id) FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id=req.id) = 0";
}
// "Задачи на сегодня"
if(isset($filtr->todayTasks) && $filtr->todayTasks) {
$tasksConditions[] = "(SELECT count(id) FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id=req.id
and DATE_FORMAT(schedule_date, '%Y-%m-%d') = '".date("Y-m-d")."') > 0";
}
// "Просроченные задачи"
if(isset($filtr->overTasks) && $filtr->overTasks) {
if(empty($this->userIdsWork)) {
$this->getIdsUsers($this->user->id);
}
$tasksConditions[] = "(SELECT count(id) FROM user_client_events
WHERE user_id in (".implode(',',$this->userIdsWork).")
and type != 'comment' and calendar_view = 0 and cancel = 0
and schedule_date is not null and req_id=req.id
and schedule_date <= '".date("Y-m-d H:i:s")."') > 0";
}
if(!empty($tasksConditions)) {
// Если только одно условие - добавляем его напрямую
if(count($tasksConditions) === 1) {
$condition = $tasksConditions[0];
$where .= " AND $condition";
$wherePart1 .= " AND $condition";
$wherePart2 .= " AND $condition";
}
// Если несколько условий - объединяем через OR
else {
$combinedCondition = "(" . implode(" OR ", $tasksConditions) . ")";
$where .= " AND $combinedCondition";
$wherePart1 .= " AND $combinedCondition";
$wherePart2 .= " AND $combinedCondition";
}
}
if(isset($filtr->is_contract) && $filtr->is_contract > 0){
$part_where = " AND (SELECT count(id) FROM contracts_req WHERE req_id=req.id";
if(isset($filtr->numder_contract) && !empty($filtr->numder_contract)){
$part_where .= " AND number like '%{$filtr->numder_contract}%'";
}
if(isset($filtr->type_contract) && !empty($filtr->type_contract)){
$part_where .= " AND type in (".implode(',',$filtr->type_contract).")";
}
if(isset($filtr->onDateContract) && $filtr->onDateContract > 0){
$date_on = strtotime($filtr->onDateContract."00:00:00");
$part_where .= " AND date_end >= $date_on";
}
if(isset($filtr->offDateContract) && $filtr->offDateContract > 0){
$date_off = strtotime($filtr->offDateContract."23:59:59");
$part_where .= " AND date_end <= $date_off";
}
$part_where .= ") > 0";
$where .= $part_where;
$wherePart1 .= $part_where;
$wherePart2 .= $part_where;
}
if(isset($filtr->period) && $filtr->period){
$onDate=null; $offDate = null;
if($filtr->period == 'period'){
if(!empty($filtr->onDate) || !empty($filtr->offDate)){
if($filtr->onDate != ''){
$onDate = $filtr->onDate;
}
if($filtr->offDate != ''){
$offDate = $filtr->offDate;
}
} else if ((isset($filtr->date_start) && !empty($filtr->date_start)) || (isset($filtr->date_end) && !empty($filtr->date_end))){
if(isset($filtr->date_start) && !empty($filtr->date_start)){
$onDate = date('d.m.Y H:i:s', $filtr->date_start);
}
if(isset($filtr->date_end) && !empty($filtr->date_end)){
$offDate = date('d.m.Y H:i:s', $filtr->date_end);
}
}
}
$dates = $this->getPeriod($filtr->period, $onDate, $offDate);
$date_between = $dates['between'];
$whereTasks = $dates['whereTasks'];
if(isset($filtr->filter_stage) && $filtr->filter_stage == 'filter_work_all_do'){
$where .= " AND req.created_at < '$dates[dateStart]'";
$wherePart1 .= " AND req.created_at < '$dates[dateStart]'";
$wherePart2 .= " AND req.created_at < '$dates[dateStart]'";
} else if(isset($filtr->stages) && $filtr->stages->hit > 0){
$where .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
$wherePart1 .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
$wherePart2 .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
} else if(isset($filtr->stages) && $filtr->stages->close > 0 ){
if(isset($filtr->date_closer) && (int)$filtr->date_closer == 11){
$where .= " AND req.created_at $date_between";
$wherePart1 .= " AND req.created_at $date_between";
$wherePart2 .= " AND req.created_at $date_between";
} else {
$where .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
$wherePart1 .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
$wherePart2 .= " AND ((SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) $date_between)";
}
} else {
$where .= " AND req.created_at ".$date_between;
$wherePart1 .= " AND req.created_at ".$date_between;
$wherePart2 .= " AND req.created_at ".$date_between;
}
}
if(isset($filtr->activities) && !empty($filtr->activities)){
$activity_req = array();
/* foreach($filtr->activities as $tag){
$activitieArr[] = "`activities` like '%"{$tag}"%'";
}
$where .= " AND (".implode(" OR ",$activitieArr).")";*/
$sql_a = "SELECT req_id FROM requisitions_activities as a LEFT JOIN requisitions as r on r.id=a.req_id WHERE a.activity_id in (".implode(',', $filtr->activities).") AND r.cancel = 0";
/* if($_SESSION['id'] == 19895){
echo $sql_a;
}*/
$q_a = $this->db->query($sql_a);
while($r_a = $this->db->fetch_assoc($q_a)){
$activity_req[] = $r_a['req_id'];
}
if(!empty($activity_req)){
$where .= " AND req.id in (".implode(",",$activity_req).")";
$wherePart1 .= " AND req.id in (".implode(",",$activity_req).")";
$wherePart2 .= " AND req.id in (".implode(",",$activity_req).")";
} else {
$where .= " AND id in (0)";
$wherePart1 .= " AND id in (0)";
$wherePart2 .= " AND id in (0)";
}
}
if(isset($filtr->source) && $filtr->source != -1){
$source_filter = array();
foreach($filtr->source as $source){
if(strpos($source, 'all_') === false){
$source_filter[] = $source;
} else {
$source_group = (int)str_replace('all_','',$source);
if($source_group > 0){
$sql_adv = "SELECT * FROM `advertising_sources` WHERE group_id = {$source_group}";
$q_adv = $this->db->query($sql_adv);
while($r_adv = $this->db->fetch_assoc($q_adv)){
$source_filter[] = (int)$r_adv['id'];
}
} else if($source_group == 0){
$users_ids_this = array();
$CallEvents = new CallEvents();
$user_this = new User;
$user_this->get($_SESSION['id']);
$users_ids_this = array_keys($CallEvents->getAllUserAgency($user_this->agencyId, $users_ids_this));
$sql_adv = "SELECT * FROM `advertising_sources` WHERE group_id = {$source_group} AND (user_id in (".implode(',', $users_ids_this).") or manager_id in (".implode(',', $users_ids_this)."))";
$q_adv = $this->db->query($sql_adv);
while($r_adv = $this->db->fetch_assoc($q_adv)){
$source_filter[] = (int)$r_adv['id'];
}
}
}
}
if(!empty($source_filter)){
$where .= " AND source in (".implode(',',$source_filter).")";
$wherePart1 .= " AND source in (".implode(',',$source_filter).")";
$wherePart2 .= " AND source in (".implode(',',$source_filter).")";
}
}
if(isset($filtr->employee_id) && $filtr->employee_id != -1){
$filter_partners =$filtr->employee_id;
$employees_ids = [];
$partners = new Partners();
foreach($filter_partners as $employee) {
if (preg_match('/all_(\d+)/', $employee, $matches)) {
if ($id = intval($matches[1])) {
$employees = $partners->getEmployeesId($id, false);
foreach($employees as $employee) {
$employees_ids[] = $employee;
}
}
} else {
$employees_ids[] = $employee;
}
}
$where .= " AND employee_id in (" . implode(", ", $employees_ids) . ")";
$wherePart1 .= " AND employee_id in (" . implode(", ", $employees_ids) . ")";
$wherePart2 .= " AND employee_id in (" . implode(", ", $employees_ids) . ")";
}
if(isset($filtr->fields) && !empty((array)$filtr->fields) && count((array)$filtr->fields) > 0){
$partWhere = $this->queryField($filtr->fields);
$where .= $partWhere;
$wherePart1 .= $partWhere;
$wherePart2 .= $partWhere;
}
if (!empty($filtr->id)) {
if (is_array($filtr->id)){
$where .= " AND id IN (".implode(',', $filtr->id) . ")";
$wherePart1 .= " AND req.id IN (".implode(',', $filtr->id) . ")";
$wherePart2 .= " AND req.id IN (".implode(',', $filtr->id) . ")";
}
else {
$where .= " AND id = ".$filtr->id;
$wherePart1 .= " AND req.id = ".$filtr->id;
$wherePart2 .= " AND req.id = ".$filtr->id;
}
}
if (!empty($filtr->not_id)) {
if (is_array($filtr->not_id)){
$where .= " AND id NOT IN (".implode(',', $filtr->not_id) . ")";
$wherePart1 .= " AND req.id NOT IN (".implode(',', $filtr->not_id) . ")";
$wherePart2 .= " AND req.id NOT IN (".implode(',', $filtr->not_id) . ")";
}
else {
$where .= " AND id != ".$filtr->not_id;
$wherePart1 .= " AND req.id != ".$filtr->not_id;
$wherePart2 .= " AND req.id != ".$filtr->not_id;
}
}
if(isset($filtr->isPartner) && $filtr->isPartner > 0){
$where .= " AND doer_clients = 1";
$wherePart1 .= " AND doer_clients = 1";
$wherePart2 .= " AND doer_clients = 1";
}
if(isset($filtr->is_deal) && $filtr->is_deal){
$where .= " AND req.deal_id IS NOT NULL AND req.deal_id > 0";
$wherePart1 .= " AND req.deal_id IS NOT NULL AND req.deal_id > 0";
$wherePart2 .= " AND req.deal_id IS NOT NULL AND req.deal_id > 0";
}
if(isset($filtr->expired_stages) && $filtr->expired_stages > 0){
$expired_stages = 1;
}
// echo $sql;
} else {
if($clientId){
$where .= "";
} else if($objectId){
$where .= "";
} else if($reqs_id){
$where .= "";
} else {
$where .= " AND deleted = 0 AND confirm = 1";
}
//$sql .= $where;
}
$is_stats = false;
if(isset($filtr->is_stats)){
$is_stats = true;
}
if(isset($filtr->userId)){
$user = $filtr->userId;
if(strpos($user, "I_") !== false){
$user = str_replace('I_', '', $user);
}
}
if(isset($filtr->transmitted)){
$where .= " AND (SELECT count(id) FROM events_clients WHERE event='transmitted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
$wherePart1 .= " AND (SELECT count(id) FROM events_clients WHERE event='transmitted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
$wherePart2 .= " AND (SELECT count(id) FROM events_clients WHERE event='transmitted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
}
if(isset($filtr->accepted)){
$where .= " AND (SELECT count(id) FROM events_clients WHERE event='accepted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
$wherePart1 .= " AND (SELECT count(id) FROM events_clients WHERE event='accepted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
$wherePart2 .= " AND (SELECT count(id) FROM events_clients WHERE event='accepted'
and events_clients.user_id=".$user." and events_clients.date $date_between and req_id=req.id) > 0";
}
if((isset($filtr->filter_stage) && $filtr->filter_stage == 'filter_work_add') || $filtr->transmitted || $filtr->accepted){
if($is_stats){
if($filtr->transmitted || $filtr->accepted){
if($this->agencyId > 0){
$agencyId = $this->agencyId;
} else {
$agencyId = User::getUserAgencyID();
}
$where .= " AND (req.user_id in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
$wherePart1 .= " AND (req.user_id in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
$wherePart2 .= " AND (req.user_id in (SELECT id FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
} else {
$where .= " AND req.user_id = $user";
$wherePart1 .= " AND req.user_id = $user";
$wherePart2 .= " AND req.user_id =$user";
}
} else {
$where .= " AND req.user_id in (select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user) or id_manager in
(select id from users where id_manager=$user))";
$wherePart1 .= " AND req.user_id in (select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user) or id_manager in
(select id from users where id_manager=$user))";
$wherePart2 .= " AND req.user_id in (select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user) or id_manager in
(select id from users where id_manager=$user))";
}
} else if($user) {
//если общие или закрытые - показываем от всего агентства
$r_check_permissions = $this->user->checkMenuPermissions();
if ($filtr->stages->ahency == 1 || ($filtr->stages->close == 1 && $r_check_permissions['menu_can_take_from_closed'] == 1)) {
if($this->agencyId > 0){
$agencyId = $this->agencyId;
} else {
$agencyId = User::getUserAgencyID();
}
$userIds = [];
$wh = new WebHookIn();
$allUsersIds = array();
if($agencyId > 0){
$allUsersIds = $wh->getAllUserAgency($agencyId);
}
$where .= " AND (req.user_id in (".implode(',', $allUsersIds)."))";
$wherePart1 .= " AND (req.user_id in (".implode(',', $allUsersIds)."))";
$wherePart2 .= " AND (req.user_id in (".implode(',', $allUsersIds)."))";
/*$where .= " AND (req.user_id in (SELECT `id` FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
$wherePart1 .= " AND (req.user_id in (SELECT `id` FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
$wherePart2 .= " AND (req.user_id in (SELECT `id` FROM `users` WHERE id=$agencyId or id_manager=$agencyId or id_manager in (select id from users where id_manager=$agencyId) or id_manager in (select id from users where id_manager in (select id from users where id_manager=$agencyId))))";
*/
} else {
$depClass = new Department();
$depUser = $depClass->getDepartment($user);
if (($depUser['role'] == 'manager_office' || $depUser['role'] == 'admin_department') && (int)$depUser['admin'] > 0 && !$is_stats ) {
$admin = (int)$depUser['admin'];
$userIds = array();
$doerIds = array();
$doerSql = '';
$query = mysql_query("select id from users where id=$admin or id_manager=$admin or id_manager in (select id from users where id_manager=$admin)");
while($us = mysql_fetch_assoc($query)) {
$userIds[] = $us['id'];
}
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id = " . $user . " and rd.confirm = 1");
if(!empty($userIds)){
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id in (" . implode(", ", $userIds) . ") and rd.confirm = 1");
}
while($us_d = mysql_fetch_assoc($query_d)) {
$doerIds[] = $us_d['requisition_id'];
}
if (count($doerIds) > 0 ) {
$doerSql = " or (req.id in (" . implode(", ", $doerIds) . "))";
}
if($is_stats){
$where .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND who_work = $user))";
$wherePart1 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND req.who_work = $user))";
$wherePart2 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND a.who_work = $user))";
} else {
$where .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart1 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or req.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart2 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or a.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
}
} else if (($depUser['role'] == 'manager_office_menager') && (int)$depUser['admin'] > 0 && !$is_stats) {
//$admin = (int)$depUser['admin'];
$admin = $_SESSION['id_manager'];
$userIds = array();
$doerIds = array();
$doerSql = '';
$query = mysql_query("select id from users where id=$admin or id_manager=$admin or id_manager in (select id from users where id_manager=$admin)");
while($us = mysql_fetch_assoc($query)) {
$userIds[] = $us['id'];
}
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id = " . $user . " and rd.confirm = 1");
if(!empty($userIds)){
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id in (" . implode(", ", $userIds) . ") and rd.confirm = 1");
}
while($us_d = mysql_fetch_assoc($query_d)) {
$doerIds[] = $us_d['requisition_id'];
}
if (count($doerIds) > 0) {
$doerSql = " or (req.id in (" . implode(", ", $doerIds) . "))";
}
if($is_stats){
$where .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND who_work = $user ))";
$wherePart1 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND req.who_work = $user ))";
$wherePart2 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") AND a.who_work = $user ))";
} else {
$where .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart1 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or req.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart2 .= " AND ((req.user_id in (" . implode(", ", $userIds) . ") or a.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
}
} else {
/*$where .= " AND ((user_id in (select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user or id_manager in
(select id from users where id_manager=$user))) or who_work in (select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user or id_manager in
(select id from users where id_manager=$user)))) or doers like '%"" . $user . "":1%')";*/
$userIds = array();
$doerIds = array();
$doerSql = '';
$query = mysql_query("select id from users where id=$user or id_manager=$user or id_manager in
(select id from users where id_manager=$user or id_manager in
(select id from users where id_manager=$user))
UNION SELECT user_id FROM users_delete where user_id=$user or id_manager=$user or id_manager in
(select user_id from users_delete where id_manager=$user or id_manager in
(select user_id from users_delete where id_manager=$user))
");
while($us = mysql_fetch_assoc($query)) {
$userIds[] = $us['id'];
}
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id = " . $user . " and rd.confirm = 1");
if(!empty($userIds)){
$query_d = mysql_query("select rd.requisition_id from requisition_doers rd where rd.user_id in (" . implode(", ", $userIds) . ") and rd.confirm = 1");
}
while($us_d = mysql_fetch_assoc($query_d)) {
$doerIds[] = $us_d['requisition_id'];
}
if (count($doerIds) > 0) {
$doerSql = " or (req.id in (" . implode(", ", $doerIds) . "))";
}
if($is_stats){
$where .= " AND ((who_work = $user))";
$wherePart1 .= " AND ((req.who_work = $user))";
$wherePart2 .= " AND ((a.who_work = $user))";
} else {
$n_user_id = $_SESSION['agency_id'];
$n_agents = "SELECT id FROM users
WHERE id IN (
SELECT id FROM users
WHERE id = $n_user_id
OR id_manager = $n_user_id
OR id_manager IN (
SELECT id FROM users
WHERE id_manager = $n_user_id
OR id_manager IN (
SELECT id FROM users
WHERE id_manager = $n_user_id
)
)
)
UNION
SELECT user_id FROM users_delete
WHERE agency_id = $n_user_id
";
$n_agents_res = mysql_query($n_agents);
$n_agent_ids = [];
while ($row = mysql_fetch_assoc($n_agents_res)) {
$n_agent_ids[] = $row['id'];
}
if ($all_null) {
$where .= " AND (who_work in (0, " . implode(", ", $userIds) . ") " . $doerSql . ")";
$where .= " AND user_id IN (" . implode(", ", $n_agent_ids) . ")";;
$wherePart1 .= " AND (req.who_work in (0, " . implode(", ", $userIds) . ") " . $doerSql . ")";
$wherePart1 .= " AND req.user_id IN (" . implode(", ", $n_agent_ids) . ")";;
$wherePart2 .= " AND (a.who_work in (0, " . implode(", ", $userIds) . ") " . $doerSql . ")";
$wherePart2 .= " AND req.user_id IN (" . implode(", ", $n_agent_ids) . ")";;
} else {
$where .= " AND ((who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart1 .= " AND ((req.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
$wherePart2 .= " AND ((a.who_work in (" . implode(", ", $userIds) . ")) " . $doerSql .")";
}
}
}
}
}
//С просроченными этапами
if(isset($expired_stages)){
$idExpiredStages = $this->getIdExpiredStages($where);
if(!empty($idExpiredStages)){
$where = " AND id in (".implode(',', $idExpiredStages).")";
$wherePart1 = " AND req.id in (".implode(',', $idExpiredStages).")";
$wherePart2 = " AND req.id in (".implode(',', $idExpiredStages).")";
}
}
$sql .= $where;
$_SESSION['where_req_campaigns'] = $sql;
$sqlTotal .= $where;
$sqlExpectedCommissionTotal .= $where;
if($this->view != 'kanban'){
if(isset($sqlPart1) && isset($sqlPart2)){
$sql = $sqlPart1;
$sql .= $wherePart1;
$sql .= " UNION ";
$sql .= $sqlPart2;
$sql .= $wherePart2;
$sqlTotal = $sqlTotalPart1;
$sqlTotal .= $wherePart1;
$sqlTotal .= " UNION ";
$sqlTotal .= $sqlTotalPart2;
$sqlTotal .= $wherePart2;
}
if(isset($sqlExpectedCommissionTotalPart1) && isset($sqlExpectedCommissionTotalPart2)){
$sqlExpectedCommissionTotal = $sqlExpectedCommissionTotalPart1;
$sqlExpectedCommissionTotal .= $wherePart1;
$sqlExpectedCommissionTotal .= " UNION ";
$sqlExpectedCommissionTotal .= $sqlExpectedCommissionTotalPart2;
$sqlExpectedCommissionTotal .= $wherePart2;
}
}
$limitSql = "";
if($this->page > 0){
$limitSql = ' limit '.($this->page-1)*$this->limit.', '.$this->limit;
}
$part_order = " ORDER BY if ((SELECT date_update from events_clients where req_id=req.id AND (event = 'accepted' OR event = 'restored' OR event = 'accepted_doer') order by id desc limit 1) > req.created_at, "
. "(SELECT date_update from events_clients where req_id=req.id AND (event = 'accepted' OR event = 'restored' OR event = 'accepted_doer') order by id desc limit 1) ,req.created_at) ";
$part_order1 = " ORDER BY if ((SELECT date_update from events_clients where req_id=reqid AND (event = 'accepted' OR event = 'restored' OR event = 'accepted_doer') order by id desc limit 1) > created_at, "
. "(SELECT date_update from events_clients where req_id=reqid AND (event = 'accepted' OR event = 'restored' OR event = 'accepted_doer') order by id desc limit 1) ,created_at) ";
if($order){
$part_order = ' ORDER BY req.created_at ';
$part_order1 = ' ORDER BY created_at ';
} else {
$order = 'desc';
}
if ($filtr->stages->close > 0) {
$part_order = " ORDER BY (SELECT date_update FROM `events_clients` WHERE req_id=req.id and event='delete' order by id desc limit 1) ";
$part_order1 = " ORDER BY (SELECT date_update FROM `events_clients` WHERE req_id=reqid and event='delete' order by id desc limit 1) ";
if((int)$filtr->date_closer == 11){
$part_order = " ORDER BY req.created_at ";
$part_order1 = ' ORDER BY created_at ';
}
}
$result['filtr'] = $filtr->date_closer;
$_SESSION['where_req_campaigns_order'] = $part_order.$order;
if($this->view != 'kanban'){
if(isset($sqlPart1) && isset($sqlPart2)){
// $_SESSION['where_req_campaigns_order'] = $part_order1.$order;
$sql .= $part_order1.$order;
} else {
$sql .= $part_order.$order;
}
} else {
$sql .= $part_order.$order;
}
$_SESSION['where_req'] = $sql;
$sql .= $limitSql;
$result['sql'] = $sql;
/* if ($_SESSION['id'] == 19895) {
echo $sql;
}*/
$typesReq = $this->get_type();
$this->funnels_adjacent = array();
if($this->view == 'kanban'){
$depClass = new Department;
$departments = $depClass->getDepartments();
$count_step = array();
$limitSql = "";
if($this->page > 0){
if($this->page == 1){
$limitSql = ' limit '.(($this->page-1)*4).', 4';
} else if ($this->page > 1) {
$limitSql = ' limit '.(($this->page-1)*1+3).', 1';
}
}
//echo $funnelId;
$start = microtime(true);
if($funnelId !== false){
if ($funnelId === 'all') {
$sql_count_step = "SELECT stage, count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE 1 $where group by stage";
} else {
if ($funnelId == 0 || empty($funnelId)) {
$sql_count_step = "SELECT stage, count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id=$funnelId $where group by stage";
//echo $sql_count_step;
} else if ($funnelId > 0) {
$arrayCountSteps = array();
$sql_stage = "SELECT * FROM `funnel_steps` WHERE funnel_id=$funnelId AND deleted = 0";
$q_stage = $this->db->query($sql_stage);
while($r_stage = $this->db->fetch_assoc($q_stage)){
$arrayCountSteps[$r_stage['id']] = 0;
}
$sql_count_step = "SELECT step_id as stage, count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id=$funnelId $where group by step_id";
if(isset($sqlPart1) && isset($sqlPart2)){
$sql_count_step1 = "SELECT req.step_id as stage, count(*) as total FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE req.funnel_id = $funnelId $wherePart1 group by req.step_id";
$q_count_step1 = $this->db->query($sql_count_step1);
while($r_count_step1 = $this->db->fetch_assoc($q_count_step1)){
if(!isset($arrayCountSteps[$r_count_step1['stage']])) $arrayCountSteps[$r_count_step1['stage']] = 0;
$arrayCountSteps[$r_count_step1['stage']] += (int)$r_count_step1['total'];
}
$sql_count_step2 = "SELECT a.step_id_active as stage, count(*) as total FROM adjacent_funnels as a LEFT JOIN requisitions as req on a.req_id = req.id $priceJoin $propertyTypeJoin $join WHERE a.funnel_id = $funnelId $wherePart2 group by a.step_id_active";
$q_count_step2 = $this->db->query($sql_count_step2);
while($r_count_step2 = $this->db->fetch_assoc($q_count_step2)){
if(!isset($arrayCountSteps[$r_count_step2['stage']])) $arrayCountSteps[$r_count_step2['stage']] = 0;
$arrayCountSteps[$r_count_step2['stage']] += (int)$r_count_step2['total'];
}
/* $sqlTotalPart1 = "SELECT step_id as stage, count(*) as total FROM requisitions as req $join WHERE funnel_id = $funnelId $";
$sqlTotalPart2 = "SELECT step_id as stage, count(*) as total FROM adjacent_funnels as a LEFT JOIN requisitions as req on a.req_id = req.id $join WHERE a.funnel_id in ($funnelId)";*/
}
}
}
/* if($_SESSION['id'] == 14050){
echo $sql_count_step;
}*/
//echo $sql_count_step;
$q_count_step = $this->db->query($sql_count_step);
$clientIds = array();
$objectIds = array();
$complex_room_ids = array();
$reqIds = array();
$requisitionData = array();
// $start = microtime(true);
/* if ($funnelId == 'all') {
$sql_2_part = "SELECT * FROM requisitions as req WHERE 1 $where ";
} else {
$sql_2_part = "SELECT * FROM requisitions as req WHERE funnel_id=$funnelId $where";
}
$sql2_new = '';*/
if(!isset($arrayCountSteps)){
$arrayCountSteps = array();
while($r_count_step = $this->db->fetch_assoc($q_count_step)){
if(!isset($arrayCountSteps[$r_count_step['stage']])) $arrayCountSteps[$r_count_step['stage']] = 0;
$arrayCountSteps[$r_count_step['stage']] += (int)$r_count_step['total'];
}
}
/* if($_SESSION['id'] == 14050){
var_dump($arrayCountSteps);
}*/
$num_step = 0;
foreach($arrayCountSteps as $step_id => $countSteps){
if($step_id > 0){
$count_step[$step_id] = $countSteps;
if($countSteps > 0){
// $start = microtime(true);
/* if($num_step > 0){
$sql2_new .= " UNION ";
}
$sql2_new .= "(".$sql_2_part ;
if ($funnelId == 0) {
$sql2_new .= " and stage = $r_count_step[stage]";
} else if($funnelId > 0) {
$sql2_new .= " and step_id = $r_count_step[stage]";
}
$sql2_new .= " $part_order $order $limitSql)";*/
if($funnelId === 'all' || $funnelId === false){
$sql_2 = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE 1 $where and stage = $step_id $part_order $order $limitSql";
} else {
$sql_2 = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id=$funnelId $where and stage = $step_id $part_order $order $limitSql";
if ($funnelId > 0) {
$sql_2 = "SELECT req.* $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE funnel_id=$funnelId $where and step_id = $step_id $part_order $order $limitSql";
if(isset($sqlPart1) && isset($sqlPart2)){
$sql_2 = "SELECT req.id, req.name, req.user_id, req.created_at, req.client_id,
req.object_id, req.type_id, req.funnel_id, req.step_id, req.who_work, req.who_delete,
req.confirm, req.description,
req.stage, req.deleted, req.cancel, req.priority, req.doer_clients,
req.hot, req.reason, req.denial, req.summa, req.expected_commission, req.activities, req.asfilter_id,
req.source, req.doers, req.doers_confirm, req.employee_id, req.property_type_id,
req.integration, req.call_id, req.friend_client_id, req.confirm_recommendation, req.deal_id, req.id as reqid, 'main' as funnel_type $priceSelect FROM requisitions as req $priceJoin $propertyTypeJoin $join WHERE req.funnel_id=$funnelId $wherePart1 and req.step_id = $step_id";
$sql_2 .= " UNION ";
$sql_2 .= "SELECT req.id, req.name, req.user_id, req.created_at, req.client_id,
req.object_id, req.type_id, a.funnel_id, a.step_id_active as step_id,
a.who_work as who_work, req.who_delete, a.confirm, req.description,
req.stage, req.deleted, req.cancel, req.priority, req.doer_clients,
req.hot, req.reason, req.denial, req.summa, req.expected_commission, req.activities, req.asfilter_id,
req.source, req.doers, req.doers_confirm, req.employee_id, req.property_type_id,
req.integration, req.call_id, 0 as friend_client_id, 0 as confirm_recommendation, req.deal_id, req.id as reqid, 'adjacent' as funnel_type $priceSelect
FROM adjacent_funnels as a
LEFT JOIN requisitions as req on a.req_id = req.id $priceJoin $propertyTypeJoin $join WHERE a.funnel_id=$funnelId $wherePart2 and a.step_id_active = $step_id";
$sql_2 .= " ORDER BY created_at $order $limitSql";
}
}
}
/* if($_SESSION['id'] == 14050){
echo $sql_2;
}*/
$q = $this->db->query($sql_2);
/*while ($r = $this->db->fetch_assoc($q)){
$sql_cl = "SELECT id, fio, phone FROM clients WHERE id = $r[client_id]";
$q_cl = $this->db->query($sql_cl);
while($r_cl = $this->db->fetch_assoc($q_cl)){
$r['phone'] = preg_replace("/[^,.0-9]/", '', $r_cl['phone']);
$r['fio'] = $r_cl['fio'];
}
if($r['object_id' ] > 0){
$sql_ob = "SELECT id, nazv FROM objects WHERE id = $r[object_id]";
$q_ob = $this->db->query($sql_ob);
while($r_ob = $this->db->fetch_assoc($q_ob)){
$r['nazv'] = $r_ob['nazv'];
}
}
$details = $this->get_req_details($r, true);
$result['req'][$r_count_step['stage']]['req'.$r['id']] = $details;
$result['req']['req'.$r['id']] = $details;
}*/
while ($r = $this->db->fetch_assoc($q)){
//$time = microtime(true) - $start;
$reqIds[] = $r['id'];
$events_res[$r['id']] = array('events_res'=>0, 'events_res1'=>0, 'events_res2'=>0);
$r['stage'] = $step_id;
$requisitionData[] = $r;
$clientIds[] = $r['client_id'];
if($r['complex_room_id'] > 0){
$complex_room_ids[] = $r['complex_room_id'];
}
if($r['object_id'] > 0){
$objectIds[] = $r['object_id'];
}
}
$num_step++;
}
}
$sqls2[] = $sql_2;
}
$clients = [];
if (count($clientIds) > 0) {
$sql_cl = "SELECT id, fio, phone FROM clients WHERE id in (" . implode(", ", $clientIds) . ")";
$q_cl = $this->db->query($sql_cl);
while ($r_cl = $this->db->fetch_assoc($q_cl)) {
$clients[$r_cl['id']] = $r_cl;
}
}
$objects = [];
if (count($objectIds) > 0) {
$sql_ob = "SELECT id, nazv FROM objects WHERE id in (" . implode(", ", $objectIds) . ")";
$q_ob = $this->db->query($sql_ob);
while($r_ob = $this->db->fetch_assoc($q_ob)){
$objects[$r_ob['id']] = $r_ob;
}
}
$complex_rooms = [];
if (count($complex_room_ids) > 0) {
$sql_room = "SELECT id, `number` FROM complex_rooms WHERE id in (" . implode(", ", $complex_room_ids) . ")";
$q_room = $this->db->query($sql_room);
while($r_room = $this->db->fetch_assoc($q_room)){
$complex_rooms[$r_room['id']] = $r_room;
}
}
if(!empty($reqIds)){
$events = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and schedule_date < '" . date("Y-m-d H:i:s") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$events1 = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and DATE_FORMAT(schedule_date, '%Y-%m-%d') = '" . date("Y-m-d") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$events2 = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and DATE_FORMAT(schedule_date, '%Y-%m-%d') > '" . date("Y-m-d") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$q_events = $this->db->query($events);
while($event_res = $this->db->fetch_assoc($q_events)){
$events_res[$event_res['req_id']]['events_res'] = (int)$event_res['res'];
}
$q_events1 = $this->db->query($events1);
while($event_res1 = $this->db->fetch_assoc($q_events1)){
$events_res[$event_res1['req_id']]['events_res1'] = (int)$event_res1['res'];
}
$q_events2 = $this->db->query($events2);
while($event_res2 = $this->db->fetch_assoc($q_events2)){
$events_res[$event_res2['req_id']]['events_res2'] = (int)$event_res2['res'];
}
}
//Количество присоединенных заявок
$totalUnion = array();
if(!empty($reqIds)){
$sql_total_union = "SELECT * FROM union_requisitions WHERE main_id in (".implode(',',$reqIds).")";
$q_total_union = $this->db->query($sql_total_union, true);
while($r_total_union = $this->db->fetch_assoc($q_total_union)){
if(!isset($totalUnion[$r_total_union['main_id']])) $totalUnion[$r_total_union['main_id']] = 0;
$totalUnion[$r_total_union['main_id']]++;
}
}
/*if($_SESSION['id'] == 5238){
var_dump($events2);
var_dump($events_res);
}*/
if($_SESSION['id'] == 12071){
$time = microtime(true) - $start;
file_put_contents($_SERVER['DOCUMENT_ROOT']."/callevents/log_req.txt", date('d.m.Y H:i:s')." - 1.".$time."\n", FILE_APPEND);
}
/**
* Финансы
* */
if(!empty($reqIds)){
$deposits = array();
$sql_deposit = "SELECT * FROM deposits_clients_req WHERE req_id in (".implode(',',$reqIds).")";
$q_deposit = $this->db->query($sql_deposit);
while($r_deposit = $this->db->fetch_assoc($q_deposit)){
$deposits[$r_deposit['req_id']] = $r_deposit['deposit'];
}
$expenses_req = array();
$expenses = array();
$expenses_total = array();
$sql_ex = "SELECT * FROM expenses_req WHERE req_id in (".implode(',',$reqIds).")";
$q_ex = $this->db->query($sql_ex);
if($this->db->num_rows($q_ex) > 0){
$steps_ids = array();
$steps = array();
while($r_ex = $this->db->fetch_assoc($q_ex)){
$expenses[] = $r_ex;
$steps_ids[] = (int)$r_ex['step_id'];
}
if(!empty($steps_ids)){
$sql_step = "SELECT * FROM `funnel_steps` WHERE id in (".implode(',', $steps_ids).")";
$q_step = $this->db->query($sql_step);
while($r_step = $this->db->fetch_assoc($q_step)){
$pole_end_list = json_decode(htmlspecialchars_decode($r_step['pole_end_list']), true);
foreach($pole_end_list as $pole){
if($pole['type'] == 'Расходы'){
$steps[$r_step['id']] = $pole['name'];
}
}
}
}
foreach($expenses as $key => $expense){
$nameExpense = 'Расходы';
if(isset($steps[$expense['step_id']])){
$nameExpense = $steps[$expense['step_id']];
}
$expense['name'] = $nameExpense;
$expense['amount'] = rtrim(rtrim($expense['amount'], '0'), '.');
$expenses_req[$expense['req_id']][] = $expense;
if(!isset($expenses_total[$expense['req_id']])) $expenses_total[$expense['req_id']] = 0;
$expenses_total[$expense['req_id']] += $expense['amount'];
}
}
}
foreach ($requisitionData as $r) {
if (should_hide_contacts_for_current_user()) {
// hide_client_contacts: маскируем телефон и (если в ФИО есть номер) — ФИО
$r['phone'] = mask_client_phone($clients[$r['client_id']]['phone']);
$r['fio'] = mask_fio_if_contains_phone($clients[$r['client_id']]['fio']);
} else {
$r['phone'] = preg_replace("/[^,.0-9]/", '', $clients[$r['client_id']]['phone']);
$r['fio'] = $clients[$r['client_id']]['fio'];
}
if($r['complex_room_id'] > 0){
$r['complex_room_number'] = $complex_rooms[$r['complex_room_id']]['number'];
}
if($r['object_id'] > 0){
$r['nazv'] = $objects[$r['object_id']]['nazv'];
}
$details = $this->get_req_details_kanban($r, true, [], $departments, $typesReq, $events_res);
if($filtr->stages->ahency == 1){
$details['can_del'] = 0;
}
$details['deposit'] = 0;
$details['expenses'] = array();
$details['expenses_total'] = 0;
if(isset($deposits[$details['id']])){
$details['deposit'] = $deposits[$details['id']];
}
if(isset($expenses_req[$details['id']])){
$details['expenses'] = $expenses_req[$details['id']];
}
if(isset($expenses_total[$details['id']])){
$details['expenses_total'] = $expenses_total[$details['id']];
}
$result['req'][$r['stage']]['req'.$r['id']] = $details;
$result['req']['req'.$r['id']] = $details;
if(isset($totalUnion[$r['id']])){
$result['req'][$r['stage']]['req'.$r['id']]['union_total'] = $totalUnion[$r['id']];
$result['req']['req'.$r['id']]['union_total'] = $totalUnion[$r['id']];
} else {
$result['req'][$r['stage']]['req'.$r['id']]['union_total'] = 0;
$result['req']['req'.$r['id']]['union_total'] = 0;
}
}
if($_SESSION['id'] == 12071){
$time = microtime(true) - $start;
file_put_contents($_SERVER['DOCUMENT_ROOT']."/callevents/log_req.txt", date('d.m.Y H:i:s')." - 2.".$time."\n", FILE_APPEND);
}
}
$result['req']['count'] = $count_step;
if($this->page == 1){
$result['total_req'] = 0;
$qTotal = $this->db->query($sqlTotal);
while($rTotal = $this->db->fetch_assoc($qTotal)){
$result['total_req'] += (int)$rTotal['total'];
}
$result['total_comission'] = 0;
$qExpectedCommissionTotal = $this->db->query($sqlExpectedCommissionTotal);
while($rExpectedCommissionTotal = $this->db->fetch_assoc($qExpectedCommissionTotal)){
$result['total_comission'] += (int)$rExpectedCommissionTotal['total'];
}
}
}
else {
$result['req'] = array();
// Фильтр по ценам и бюджету автопоиска в зависимости от типа
if ((isset($filtr->priceFrom) || isset($filtr->priceTo)) && !empty($filtr->type)) {
$priceWhere = '';
$hasSprosType = false;
$hasPodborType = false;
$typeQuery = 'SELECT `id`,`heir`
FROM requisitions_type
WHERE `id` IN ('.implode(',',$filtr->type).')';
$types = $this->db->query($typeQuery);
// Идентифицируем, есть ли типы, при которых нужно включать поиск по цене
while($type = $this->db->fetch_assoc($types)) {
if ($type['id'] == 1 || $type['heir'] == 1) { // Подбор объекта
$hasPodborType = true;
}
if ($type['id'] == 4 || $type['heir'] == 4) { // Спрос по нашему объекту
$hasSprosType = true;
}
if ($hasPodborType && $hasSprosType) {
break;
}
}
if($hasPodborType || $hasSprosType) {
if($from = intval($filtr->priceFrom)) {
$priceFromReq = '';
if ($hasSprosType) {
$priceFromReq .= "o.stoim >= $from";
}
if ($hasPodborType) {
$priceFromReq .= ($hasSprosType ? ' and ' : '')." af.stoim_do >= $from";
}
if(!empty($priceFromReq)) {
$priceWhere .= " ($priceFromReq) AND ";
}
}
if($to = intval($filtr->priceTo)) {
$priceToReq = '';
if ($hasSprosType) {
$priceToReq .= "o.stoim <= $to";
}
if ($hasPodborType) {
$priceToReq .= ($hasSprosType ? ' and ' : '')." af.stoim_do <= $to";
}
if(!empty($priceToReq)) {
$priceWhere .= " ($priceToReq) AND ";
}
}
}
if (!empty($priceWhere)) {
$sql = str_replace('WHERE', 'WHERE ' . $priceWhere, $sql);
$sqlTotal = str_replace('WHERE', 'WHERE ' . $priceWhere, $sqlTotal);
$sqlExpectedCommissionTotal = str_replace('WHERE', 'WHERE ' . $priceWhere, $sqlExpectedCommissionTotal);
}
}
$q = $this->db->query($sql);
$requestList = [];
$usersToUse = [];
$sourcesToUse = [];
$userIdsForRead = [];
$sourceIdsForRead = [];
$requestIds = [];
//первый цикл для запоминания и формирования списков ИД
while ($r = $this->db->fetch_assoc($q)){
$requestList[] = $r;
$requestIds[] = $r['id'];
if ($r["user_id"]) {
$userIdsForRead[] = $r["user_id"];
}
if ($r["who_delete"]) {
$userIdsForRead[] = $r["who_delete"];
}
if ($r["who_work"]) {
$userIdsForRead[] = $r["who_work"];
}
if ($r["source"]) {
$sourceIdsForRead[] = $r["source"];
}
}
//выделяем только уникальные
$userIdsForRead = array_unique($userIdsForRead);
$sourceIdsForRead = array_unique($sourceIdsForRead);
//формируем списки пользователей
if (count($userIdsForRead) > 0) {
$usersQuery = "SELECT id, agency, manager, agency_name, first_name, last_name, middle_name, role_id, phone FROM users WHERE id in (" . implode(", ", $userIdsForRead) . ")";
$resultUsers = $this->db->query($usersQuery);
if ($this->db->num_rows($resultUsers) > 0) {
while ($userRes = $this->db->fetch_assoc($resultUsers)) {
$usersToUse[$userRes['id']] = $userRes;
}
}
}
//формируем списки источников
if (count($sourceIdsForRead) > 0) {
$sourcesQuery = "SELECT * FROM `advertising_sources` WHERE `id` in (" . implode(", ", $sourceIdsForRead) . ")";
$resultSources = $this->db->query($sourcesQuery);
//ini_set('display_errors', 1);
//ini_set('display_startup_errors', 1);
if ($this->db->num_rows($resultSources) > 0) {
while ($sourceRes = $this->db->fetch_assoc($resultSources)) {
$sourceRes['source_see'] = 1;
if(is_see($sourceRes['is_no_see'], $sourceRes['users_no_see']) === false){
$sourceRes['source_see'] = 0;
}
$sourcesToUse[$sourceRes['id']] = $sourceRes;
}
}
}
if(!empty($requestIds)){
$sql_funnels_adjacent = "SELECT id, req_id FROM adjacent_funnels WHERE req_id in (".implode(',',$requestIds).")";
$q_funnel_adjacent = $this->db->query($sql_funnels_adjacent);
while($r_funnel_adjacent = $this->db->fetch_assoc($q_funnel_adjacent)){
$this->funnels_adjacent[$r_funnel_adjacent['req_id']][] = $r_funnel_adjacent;
}
}
/* if($_SESSION['id'] == 5238){
var_dump($this->funnels_adjacent);
}*/
//Типы договоров
$contract = new Contract($this->db);
$contract->setAgencyId($this->agencyId);
$typesContracs = $contract->getTypesName();
/* if($_SESSION['id'] == 5238){
var_dump($typesContracs);
}*/
//Количество присоединенных заявок
$totalUnion = array();
if(!empty($requestIds)){
$sql_total_union = "SELECT * FROM union_requisitions WHERE main_id in (".implode(',',$requestIds).")";
$q_total_union = $this->db->query($sql_total_union, true);
while($r_total_union = $this->db->fetch_assoc($q_total_union)){
if(!isset($totalUnion[$r_total_union['main_id']])) $totalUnion[$r_total_union['main_id']] = 0;
$totalUnion[$r_total_union['main_id']]++;
}
}
/**
* Финансы
* */
if(!empty($requestIds)){
$deposits = array();
$depositArr = array();
$sql_deposit = "SELECT * FROM deposits_clients_req WHERE req_id in (".implode(',',$requestIds).")";
$q_deposit = $this->db->query($sql_deposit);
while($r_deposit = $this->db->fetch_assoc($q_deposit)){
$deposits[$r_deposit['req_id']] = $r_deposit['deposit'];
$depositArr[$r_deposit['req_id']] = $r_deposit;
}
$expenses_req = array();
$expenses = array();
$expenses_total = array();
$sql_ex = "SELECT * FROM expenses_req WHERE req_id in (".implode(',',$requestIds).")";
$q_ex = $this->db->query($sql_ex);
if($this->db->num_rows($q_ex) > 0){
$steps_ids = array();
$steps = array();
while($r_ex = $this->db->fetch_assoc($q_ex)){
$expenses[] = $r_ex;
$steps_ids[] = (int)$r_ex['step_id'];
}
if(!empty($steps_ids)){
$sql_step = "SELECT * FROM `funnel_steps` WHERE id in (".implode(',', $steps_ids).")";
$q_step = $this->db->query($sql_step);
while($r_step = $this->db->fetch_assoc($q_step)){
$pole_end_list = json_decode(htmlspecialchars_decode($r_step['pole_end_list']), true);
foreach($pole_end_list as $pole){
if($pole['type'] == 'Расходы'){
$steps[$r_step['id']] = $pole['name'];
}
}
}
}
foreach($expenses as $key => $expense){
$nameExpense = 'Расходы';
if(isset($steps[$expense['step_id']])){
$nameExpense = $steps[$expense['step_id']];
}
$expense['name'] = $nameExpense;
$expense['amount'] = rtrim(rtrim($expense['amount'], '0'), '.');
$expenses_req[$expense['req_id']][] = $expense;
if(!isset($expenses_total[$expense['req_id']])) $expenses_total[$expense['req_id']] = 0;
$expenses_total[$expense['req_id']] += $expense['amount'];
}
}
}
$depClass = new Department;
$departments = $depClass->getDepartments();
//Для доступных юзеров
$this->getIdsUsers($_SESSION['id']);
//цикл формирования
foreach ($requestList as $requisition) {
$starttime2 = microtime(true);
$details = $this->get_req_details($requisition, false, $usersToUse, $sourcesToUse,$typesContracs,$typesReq,$departments, $needAutoSearch);
$details['deposit'] = 0;
$details['depositArr'] = array('id'=>0);
$details['expenses'] = array();
if(isset($deposits[$details['id']])){
$details['deposit'] = $deposits[$details['id']];
}
if(isset($depositArr[$details['id']])){
$details['depositArr'] = $depositArr[$details['id']];
}
if(isset($expenses_req[$details['id']])){
$details['expenses'] = $expenses_req[$details['id']];
}
if(isset($expenses_total[$details['id']])){
$details['expenses_total'] = $expenses_total[$details['id']];
}
$result['req']['req'.$requisition['id']] =$details;
$endtime3 = microtime(true);
if($filtr->stages->ahency == 1){
$result['req']['req'.$requisition['id']]['can_del'] = 0;
}
if($requisition['complex_room_id'] > 0){
$sql_room = "SELECT id, `number` FROM complex_rooms WHERE id = {$requisition['complex_room_id']} ";
$q_room = $this->db->query($sql_room);
$r_room = $this->db->fetch_assoc($q_room);
if ($r_room) {
$result['req']['req'.$requisition['id']]['complex_room_number'] = $r_room['number'];
}
}
if(isset($totalUnion[$requisition['id']])){
$result['req']['req'.$requisition['id']]['union_total'] = $totalUnion[$requisition['id']];
} else {
$result['req']['req'.$requisition['id']]['union_total'] = 0;
}
$t3 = $endtime3 - $starttime2;
$result['req']['req'.$requisition['id']]['time'] = $t3;
}
//Теги
$arrActivities = array();
$arrActivitiesName = array();
$sql_adv = "SELECT * FROM `activities` WHERE `user_id` = '".$this->user->id."' OR `manager_id` = '".$this->user->id."'";
if ($this->user->id_manager)
$sql_adv .= " OR `manager_id` = '".$this->user->id_manager."' OR `user_id` = '".$this->user->id_manager."'";
if ($this->agencyId)
$sql_adv .= " OR `manager_id` = '".$this->agencyId."' OR `user_id` = '".$this->agencyId."'";
$sql_adv .= ' ORDER BY `name`';
$q_adv = $this->db->query($sql_adv);
$rows_adv = $this->db->num_rows($q_adv);
if ($rows_adv > 0) {
while ($r_adv = $this->db->fetch_assoc($q_adv)) {
$arrActivities[] = array('id'=>$r_adv['id'], 'name'=>trim($r_adv['name']), 'color'=>$r_adv['color']);
$arrActivitiesName['act'.$r_adv['id']] = trim($r_adv['name']);
}
}
$result['total_req'] = 0;
$qTotal = $this->db->query($sqlTotal);
while($rTotal = $this->db->fetch_assoc($qTotal)){
$result['total_req'] += (int)$rTotal['total'];
}
$result['total_comission'] = 0;
$qExpectedCommissionTotal = $this->db->query($sqlExpectedCommissionTotal);
while($rExpectedCommissionTotal = $this->db->fetch_assoc($qExpectedCommissionTotal)){
$result['total_comission'] += (int)$rExpectedCommissionTotal['total'];
}
$result['allPages'] = ceil($result['total_req']/$this->limit);
$result['activities'] = $arrActivities;
$result['activities_name'] = $arrActivitiesName;
}
$endtime2 = microtime(true);
$t2 = $endtime2 - $starttime;
$result['after_cycle'] = $t2;
$result['sql2'] = $sqls2;
$result['sql_total'] = $sqlTotal;
$result['funnel_id'] = $funnelId;
$result['comission'] = $sqlExpectedCommissionTotal;
return $result;
}
public function queryField($fields){
$query = "";
$user = new User;
$user->get($_SESSION['id']);
$agencyId = $user->agencyId;
$agencyFielsds =array();
$sql = "SELECT * FROM client_req_fields WHERE `agency_id`=$agencyId order by id desc";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$agencyFielsds[$r['id']] = $r;
}
$agencyFielsdsP =array();
$sql = "SELECT * FROM client_req_fields_podgroup WHERE `agency_id`=$agencyId order by id desc";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$agencyFielsdsP[$r['id']] = $r;
}
$fieldsJson = array();
$fieldsInt = array();
$fieldsString = array();
$fieldsPod = array();
$search = false;
if(!empty($agencyFielsds)) {
foreach($fields as $key => $field){
$arrField = explode("_", $key);
$typeField = 1;
if($arrField[0] == 'modelp'){
$typeField = 2;
}
$field_id = (int)$arrField[1];
$value = trim(json_encode($field, JSON_UNESCAPED_UNICODE), '"');
$fids = array();
$sql = "SELECT id, field_id FROM requisition_data WHERE field_id = $field_id AND type = $typeField";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q)){
$type = -1;
if($typeField == 1){
if($agencyFielsds[$r['field_id']]['is_podgroup'] == 0){
$type = $agencyFielsds[$r['field_id']]['type'];
} else {
$type = 10;
}
} else if ($typeField == 2){
$type = $agencyFielsdsP[$r['field_id']]['type'];
}
if($type == 0 || $type == 5){
$fieldsString[] = array('data_id'=>$r['id'], 'value'=>$value);
} else if($type == 3){
$fieldsJson[] = array('data_id'=>$r['id'], 'value'=>$value);
}
else if($type == 1 || $type == 2 || $type == 4){
$fieldsInt[] = array('data_id'=>$r['id'], 'value'=>$value);
} else if($type == 10){
$fieldsPod[] = array('data_id'=>$r['id'], 'value'=>$value);
}
}
}
}
$req_ids = array();
$req_ids_temp = array();
if(!empty($fieldsPod)){
$ids = array();
$values = array();
foreach($fieldsPod as $fi){
$ids[] = $fi['data_id'];
$arrVal = json_decode($fi['value'], true);
if(is_array($arrVal)){
foreach ($arrVal as $val) {
if(!in_array($val, $values))
$values[] = $val;
}
} else {
if(!in_array($fi['value'], $values))
$values[] = $fi['value'];
}
}
$sql = "SELECT req_id FROM requisition_data WHERE id in (".implode(',', $ids).") AND value in (".implode(',', $values).")";
//echo $sql;
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$req_ids_temp[] = $r['req_id'];
}
}
if(!empty($fieldsInt)){
$ids = array();
$values = array();
foreach($fieldsInt as $fi){
$ids[] = $fi['data_id'];
$arrVal = json_decode($fi['value'], true);
if(is_array($arrVal)){
foreach ($arrVal as $val) {
if(!in_array($val, $values))
$values[] = $val;
}
} else {
if(!in_array($fi['value'], $values))
$values[] = $fi['value'];
}
}
$sql = "SELECT req_id FROM requisition_data WHERE id in (".implode(',', $ids).") AND value in (".implode(',', $values).")";
if(!empty($req_ids_temp)){
$sql .= " AND req_id in (".implode(',', $req_ids_temp).")";
}
//echo $sql;
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$req_ids[] = $r['req_id'];
}
}
if(!empty($fieldsString)){
$ids = array();
$values = '';
foreach($fieldsString as $fi){
$ids[] = $fi['data_id'];
if($values != ''){
$values .= ' OR ';
}
$values .= "value like '%".$fi['value']."%'";
}
$sql = "SELECT req_id FROM requisition_data WHERE id in (".implode(',', $ids).") AND ($values)";
if(!empty($req_ids_temp)){
$sql .= " AND req_id in (".implode(',', $req_ids_temp).")";
}
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$req_ids[] = $r['req_id'];
}
}
if(!empty($fieldsJson)){
$ids = array();
$values = '';
$arr_values = array();
foreach($fieldsJson as $fi){
$ids[] = $fi['data_id'];
if(!in_array($fi['value'], $arr_values)){
$arr_values[] = $fi['value'];
if($values != ''){
$values .= ' OR ';
}
$values .= "JSON_CONTAINS(`value`, '".$fi['value']."') > 0";
}
}
$sql1 = "SELECT req_id FROM requisition_data WHERE id in (".implode(',', $ids).") AND value != 'Array' AND value != '' AND value is not null AND ($values)";
if(!empty($req_ids_temp)){
$sql1 .= " AND req_id in (".implode(',', $req_ids_temp).")";
}
$q1 = $this->db->query($sql1);
while($r1 =$this->db->fetch_assoc($q1)){
$req_ids[] = $r1['req_id'];
}
}
if(!empty($req_ids)){
$query = " AND req.id in (".implode(',',$req_ids).")";
} else if((empty($fieldsJson) && empty($fieldsInt) && empty($fieldsString)) && !empty($req_ids_temp)){
$query = " AND req.id in (".implode(',',$req_ids_temp).")";
} else {
$query = " AND req.id in (0)";
}
return $query;
}
public function get_req_fields($agency_id, $req_id=0, $funnel_id = 0, $user_id = 0){
if($user_id == 0){
$user_id = (int)$_SESSION['id'];
}
$result = array();
$result['fields'] = array();
$steps_funnel = array();
$linking_fields = array();
$steps = array();
if($user_id == 0){
$user_id = (int)$_SESSION['id'];
}
if($funnel_id > 0){
//Все этапы воронки
$sql_funnel_step = "SELECT * FROM `funnel_steps` WHERE funnel_id = {$funnel_id} AND deleted=0";
$q_funnel_step = $this->db->query($sql_funnel_step);
while($r_funnel_step = $this->db->fetch_assoc($q_funnel_step)){
$steps_funnel[$r_funnel_step['id']] = $r_funnel_step;
$steps[] = (int)$r_funnel_step['id'];
}
//Выбор полей закрываемых на этапах
if(!empty($steps)){
$sql_linking = "SELECT * FROM `linking_steps_client_req` WHERE step_id in (".implode(',', $steps).")";
$q_linking = $this->db->query($sql_linking);
while($r_linking = $this->db->fetch_assoc($q_linking)){
$linking_fields[] = $r_linking['field_id'];
}
}
}
if($agency_id > 0){
$sql = "SELECT * FROM client_req_fields WHERE agency_id = $agency_id AND is_req > 0";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$is_see = true;
$tempArrNoSee = json_decode($r['users_no_see'], true);
if($r['is_no_see'] == 1 && !empty($r['users_no_see']) && !empty($tempArrNoSee)){
$is_see = false;
$arrNoSeeUsers = array();
foreach($tempArrNoSee as $u){
if(strpos($u, 'all_') !== false){
$manId = str_replace('all_', '', $u);
$sql_u = "SELECT id FROM `users`
WHERE id = $manId OR
id_manager = $manId OR
id_manager IN (SELECT id FROM users WHERE id_manager = $manId)";
$q_u = mysql_query($sql_u);
while($r_u = mysql_fetch_row($q_u)){
$arrNoSeeUsers[] = (int)$r_u[0];
}
} else {
$arrNoSeeUsers[] = (int)$u;
}
}
if(in_array($user_id, $arrNoSeeUsers)){
$is_see = true;
}
}
if(!$is_see) continue;
$r['is_close_step'] = 0;
if(in_array($r['id'], $linking_fields)){
$r['is_close_step'] = 1;
}
if(!empty($r['params'])){
$r['params'] = json_decode($r['params'], true);
}
if (!$r['params'] || $r['params'] == null) {
$r['params'] = [];
}
if($r['is_podgroup'] > 0){
$r['podgroups'] = array();
$r['podgroups_select'] = array();
$sql_p = "SELECT * FROM client_req_fields_podgroup WHERE group_id = $r[id] AND agency_id = $agency_id";
$q_p = $this->db->query($sql_p);
while($r_p = $this->db->fetch_assoc($q_p)){
if(!empty($r_p['params'])){
$r_p['params'] = json_decode($r_p['params'], true);
}
if (!$r_p['params'] || $r_p['params'] == null) {
$r_p['params'] = [];
}
$r['podgroups_select'][] = array('id'=>$r_p['id'], 'title'=>$r_p['title']);
$r['podgroups'][] = $r_p;
}
}
$result['fields'][] = $r;
}
//Значения
$values = array();
if($req_id > 0){
$sql_val = "SELECT * FROM requisition_data WHERE req_id=$req_id";
$q_val = $this->db->query($sql_val);
while($r_val = $this->db->fetch_assoc($q_val)){
if($r_val['type'] == 1){
$values['model_'.$r_val['field_id']] = $r_val['value'];
} else if ($r_val['type'] == 2){
$values['modelp_'.$r_val['field_id']] = $r_val['value'];
}
}
}
$result['values'] = $values;
$result['linking_fields'] = $linking_fields;
$result['sql'] = $sql_funnel_step;
}
return $result;
}
// Заявка(ки) по status
public function getReqAndWhoWorkByStatusId($status_id, $is_interrupted = 0, $where_is_interrupted = true, $er_is_interrupted = 0, $where_er_is_interrupted = false)
{
$result = [];
$sql = "SELECT
req.*,
req.id as req_id,
user.*,
user.id as user_id,
cr.number as complex_room_number,
cl.name as complex_name
FROM requisitions AS req
LEFT JOIN users AS user on user.id = req.who_work
JOIN complex_rooms cr on cr.id = req.complex_room_id
JOIN complex_floors cf on cf.id = cr.floor_id
JOIN complex_entrances ce on ce.id = cf.complex_entrance_id
JOIN complex_houses ch on ch.id = ce.complex_house_id
JOIN complex_list cl on cl.id = ch.complex_id
WHERE";
$sql .= is_array($status_id) ? " req.complex_status_id IN (" . implode(',', $status_id) . ")" : " req.complex_status_id = $status_id";
$sql .= $where_is_interrupted ? " AND req.is_interrupted = $is_interrupted" : "";
$sql .= $where_er_is_interrupted ? " AND req.er_is_interrupted = $er_is_interrupted" : "";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q))
{
$result[] = $r;
}
return $result;
}
// Заявка(ки) по id
public function get_req_id($req_id, $needAutoSearch = false, $is_kanban = false) {
$result = [];
$typesReq = [];//$this->get_type();
if($this->agencyId > 0){
$typesReq = $this->get_type();
}
if (is_array($req_id)) {
$sql = "SELECT
req.*,
cr.`number` as complex_room_number
FROM requisitions AS req
LEFT JOIN complex_rooms AS cr ON cr.`id` = req.`complex_room_id`
WHERE req.`id` IN (" . implode(',', $req_id) . ")";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q))
{
$result['req' . $r['id']] = $this->get_req_details($r, false, [], [], [], $typesReq, [], $needAutoSearch);
}
} else {
$sql = "SELECT
req.*,
cr.`number` as complex_room_number
FROM requisitions as req
LEFT JOIN complex_rooms AS cr ON cr.`id` = req.`complex_room_id`
WHERE req.`id` = $req_id";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
if($r['client_id'] > 0){
$sql_cl = "SELECT id, fio, phone FROM clients WHERE id = {$r['client_id']}";
$q_cl = $this->db->query($sql_cl);
$r_cl = $this->db->fetch_assoc($q_cl);
if (should_hide_contacts_for_current_user()) {
$r['phone'] = mask_client_phone($r_cl['phone']);
$r['fio'] = mask_fio_if_contains_phone($r_cl['fio']);
} else {
$r['phone'] = preg_replace("/[^,.0-9]/", '', $r_cl['phone']);
$r['fio'] = $r_cl['fio'];
}
}
/**
* Финансы
* */
$deposits = array();
$depositArr = array();
$sql_deposit = "SELECT * FROM deposits_clients_req WHERE req_id = $req_id";
$q_deposit = $this->db->query($sql_deposit);
while($r_deposit = $this->db->fetch_assoc($q_deposit)){
$deposits[$r_deposit['req_id']] = $r_deposit['deposit'];
$depositArr[$r_deposit['req_id']] = $r_deposit;
}
$expenses_req = array();
$expenses = array();
$expenses_total = array();
$sql_ex = "SELECT * FROM expenses_req WHERE req_id = $req_id";
$q_ex = $this->db->query($sql_ex);
if($this->db->num_rows($q_ex) > 0){
$steps_ids = array();
$steps = array();
while($r_ex = $this->db->fetch_assoc($q_ex)){
$expenses[] = $r_ex;
$steps_ids[] = (int)$r_ex['step_id'];
}
if(!empty($steps_ids)){
$sql_step = "SELECT * FROM `funnel_steps` WHERE id in (".implode(',', $steps_ids).")";
$q_step = $this->db->query($sql_step);
while($r_step = $this->db->fetch_assoc($q_step)){
$pole_end_list = json_decode(htmlspecialchars_decode($r_step['pole_end_list']), true);
foreach($pole_end_list as $pole){
if($pole['type'] == 'Расходы'){
$steps[$r_step['id']] = $pole['name'];
}
}
}
}
foreach($expenses as $key => $expense){
$nameExpense = 'Расходы';
if(isset($steps[$expense['step_id']])){
$nameExpense = $steps[$expense['step_id']];
}
$expense['name'] = $nameExpense;
$expense['is_edit'] = false;
$expense['amount'] = rtrim(rtrim($expense['amount'], '0'), '.');
$expenses_req[$expense['req_id']][] = $expense;
if(!isset($expenses_total[$expense['req_id']])) $expenses_total[$expense['req_id']] = 0;
$expenses_total[$expense['req_id']] += $expense['amount'];
}
}
$r['deposit'] = 0;
$r['expenses'] = array();
$r['expenses_total'] = 0;
$r['depositArr'] = array('id'=>0);
if(isset($deposits[$r['id']])){
$r['deposit'] = $deposits[$r['id']];
}
if(isset($depositArr[$r['id']])){
$r['depositArr'] = $depositArr[$r['id']];
}
if(isset($expenses_req[$r['id']])){
$r['expenses'] = $expenses_req[$r['id']];
}
if(isset($expenses_total[$r['id']])){
$r['expenses_total'] = $expenses_total[$r['id']];
}
if($is_kanban){
$reqIds[] = $req_id;
$events_res[$r['id']] = array('events_res'=>0, 'events_res1'=>0, 'events_res2'=>0);
if(!empty($reqIds)){
$events = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and schedule_date < '" . date("Y-m-d H:i:s") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$events1 = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and DATE_FORMAT(schedule_date, '%Y-%m-%d') = '" . date("Y-m-d") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$events2 = "SELECT count(id) as res, req_id FROM user_client_events WHERE calendar_view = 0
and schedule_date is not null and req_id in (".implode(',',$reqIds).") and DATE_FORMAT(schedule_date, '%Y-%m-%d') > '" . date("Y-m-d") . "' and type in ('call','meet','show','deal','even') and schedule_date <> '0000-00-00 00:00:00' and cancel=0 group by req_id";
$q_events = $this->db->query($events);
while($event_res = $this->db->fetch_assoc($q_events)){
$events_res[$event_res['req_id']]['events_res'] = (int)$event_res['res'];
}
$q_events1 = $this->db->query($events1);
while($event_res1 = $this->db->fetch_assoc($q_events1)){
$events_res[$event_res1['req_id']]['events_res1'] = (int)$event_res1['res'];
}
$q_events2 = $this->db->query($events2);
while($event_res2 = $this->db->fetch_assoc($q_events2)){
$events_res[$event_res2['req_id']]['events_res2'] = (int)$event_res2['res'];
}
}
$result['req' . $r['id']] = $this->get_req_details_kanban($r, true, [], [], $typesReq, $events_res);
} else {
$result['req' . $r['id']] = $this->get_req_details($r, false, [], [], [], $typesReq, [], $needAutoSearch);
}
}
$result['is_kanban'] =$is_kanban;
$result['e'] = $events_res;
return $result;
}
//Добавление/редактирование заявки
public function add_edit($params) {
/* if($_SESSION['id'] == 22111){
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
}*/
$errors = [];
$hasSave = true;
//var_dump($params);
if(!isset($params['add_obj'])){
$sql_type = "SELECT * FROM requisitions_type WHERE id = {$params['type_id']}";
$q_type = $this->db->query($sql_type);
$r_type = $this->db->fetch_assoc($q_type);
$parentType = $params['type_id'];
if($r_type['heir'] > 0){
$parentType = $r_type['heir'];
}
}
if ($params['object_id'] > 0 && ($params['type_id'] == 2 || $parentType == 2)) {
$filtr = (object) array('object_id'=>$params['object_id'], 'type' => [$params['type_id']]);
if (isset($params['req_id'])) {
$filtr = (object) array('object_id'=>$params['object_id'], 'not_id'=>$params['req_id'], 'type' => [$params['type_id']]);
}
//$search = $this->get_all($user = $params['user_id'], $filtr);
$sql_check_exist_object_in_req = "SELECT * FROM requisitions WHERE object_id = " . (int)$params['object_id'];
// Исключаем текущую заявку при редактировании
if (isset($params['req_id']) && (int)$params['req_id'] > 0) {
$sql_check_exist_object_in_req .= " AND id != " . (int)$params['req_id'];
}
//Фильтр по типу заявки
$sql_check_exist_object_in_req .= " AND type_id = " . (int)$params['type_id'] . " AND deleted=0 AND cancel=0 ";
$sql_check_exist_object_in_req .= " LIMIT 1";
$q_check_exist_object_in_req = $this->db->query($sql_check_exist_object_in_req);
$search = $this->db->fetch_assoc($q_check_exist_object_in_req);
if (!empty($search)) {
$hasSave = false;
$res['error'] = 1001;
$res['mes'] = "Этот объект уже добавлен в заявку";
$keys = array_keys($search['req']);
$firstKey = $keys[0];
if (isset($search[$firstKey]['name'])) {
$res['mes'] .= " «".$search[$firstKey]['name']."»";
}
return $res;
}
}
if ($hasSave) {
$activities = htmlspecialchars(json_encode($params['activities']));
if ($params['type_id'] == 4 || $parentType == 4) {
if (intval($params['autosearch_enabled']) == 1 && intval($params['object_id']) > 0) {
$objToFilter = $this->autosearch_instce->syncObjectToFilter(
intval($params['asfilter_id']),
intval($params['object_id']),
intval($params['req_id']),
(intval($params['asfilter_id']) > 0)
);
if ($objToFilter['success'])
$params['asfilter_id'] = $objToFilter['filter_id'];
else
$errors = array_merge($errors, $objToFilter['errors']);
$asfilter_sql = "UPDATE `autosearch_filters` SET `is_reverse` = 1 WHERE `id` = " . $params['asfilter_id'];
if (!$this->db->query($asfilter_sql)) {
$errors[] = $this->db->errorInfo();
}
} else if (intval($params['autosearch_enabled']) == 0) {
/*$this->autosearch_instce->deleteFilter(intval($params['asfilter_id']), $_SESSION['id']);
$params['asfilter_id'] = '0';*/
$asfilter_sql = "UPDATE `autosearch_filters` SET `is_reverse` = 0 WHERE `id` = " . $params['asfilter_id'];
if (!$this->db->query($asfilter_sql)) {
$errors[] = $this->db->errorInfo();
}
}
}
$property_type_id = 0;
if($params['object_id'] > 0){
$property_type_id = $this->check_property_type($params['object_id']);
}
$complex_room_id = $params['complex_room_id'] ? $params['complex_room_id'] : 'NULL';
$friend_client_id = $params['friend_client_id'] ? $params['friend_client_id'] : 0;
$confirm_recommendation = $params['confirm_recommendation'] && ($params['confirm_recommendation'] == 1 || $params['confirm_recommendation'] == 2) ? $params['confirm_recommendation'] : 'NULL';
$complex = new Complex();
$reservations = $complex->get_room_reservations($complex_room_id);
$last_requisition = $reservations[count($reservations) - 1];
$position = $last_requisition && $last_requisition['position'] ? ((int)$last_requisition['position'] + 1) : 1;
$is_manual = 0;
if(isset($params['is_manual'])){
$is_manual = $params['is_manual'];
}
$agency = new User;
if (isset($_SESSION['id'])) {
$agency->get($_SESSION['id']);
} else {
$agency->get($params['user_id']);
}
$agency_id = $agency->agencyId;
$is_general = false;
$in_sql = "INSERT INTO requisitions (user_id, funnel_id, name, description, asfilter_id, type_id, object_id, client_id, stage, priority, confirm, who_work, hot, activities, source, employee_id, property_type_id, `complex_status_id`, complex_room_id, friend_client_id, confirm_recommendation, position, is_manual)
values ($params[user_id], $params[funnel_id], '$params[name]', '$params[opis]', '$params[asfilter_id]', $params[type_id], $params[object_id], $params[client_id], 1, $params[priority], $params[confirm], $params[who_work], $params[hot], '$activities', '$params[source]', '$params[employee_id]', $property_type_id, '$params[status]', $complex_room_id, $friend_client_id, $confirm_recommendation, $position, $is_manual)";
if ($params['req_id'] > 0 && !isset($params['add_obj'])) {
$in_sql = "UPDATE requisitions SET
funnel_id=$params[funnel_id],
name='$params[name]',
description='".mysql_real_escape_string($params['opis'])."',
asfilter_id=$params[asfilter_id],
type_id=$params[type_id],
object_id=$params[object_id],
client_id=$params[client_id],
priority=$params[priority],
confirm=$params[confirm],
who_work=$params[who_work],
hot=$params[hot],
activities='$activities',
employee_id='$params[employee_id]',
property_type_id = $property_type_id,
`complex_status_id` = '$params[status]',
complex_room_id = $complex_room_id,
friend_client_id = $friend_client_id,
confirm_recommendation = $confirm_recommendation";
//Если передача в общие то восстанавливаем заявку
if($params['who_work'] == 0 && $params['confirm'] == 0){
$is_general = true;
$in_sql .= ", deleted=0";
$dop_text = "Переведена в общие";
$sql_ev = "INSERT INTO events_clients (req_id, event, dop_text, user_id) VALUES ({$params['req_id']}, 'update', '{$dop_text}', {$params['user_id']})";
$this->db->query($sql_ev);
}
//echo $in_sql;
if(isset($params['source'])){
$in_sql .= ", source='$params[source]'";
}
$in_sql .= " WHERE id = $params[req_id]";
$this->updateFunnel($params['funnel_id'], $params['req_id']);
} else if (isset($params['add_obj'])) {
$in_sql = "UPDATE requisitions SET
object_id=$params[object_id],
property_type_id = $property_type_id
WHERE id = $params[req_id]";
}
if ($params['complex_room_id'] && $params['status']) {
$this->db->query("UPDATE complex_rooms SET `complex_status_id` = '$params[status]' WHERE id = {$params['complex_room_id']}");
}
$new_req = false;
$req_id = 0;
if (!$this->db->query($in_sql))
$errors[] = $this->db->errorInfo();
if ($params['req_id'] > 0) {
$req_id = (int)$params['req_id'];
if($is_general){
$reqs = array($req_id);
$this->set_user($agency);
$this->autoUnitReq(0, $reqs);
}
} else {
$req_id = $this->db->insert_id();
$new_req = true;
$temp_req = $params;
$temp_req['id'] = $req_id;
$this->set_user($agency);
$this->check_mesages($temp_req, [], 2);
}
if(isset($params['newClientName']) && !empty($params['newClientName']) && $req_id > 0){
$client_id = (int)$params['client_id'];
if($client_id > 0){
$sql = "UPDATE `clients` SET
`fio` = '{$params['newClientName']}'
WHERE `id` = '$client_id'";
$this->db->query($sql);
if($params['type_id'] > 0){
$name_type = $this->db->fetch_assoc($this->db->query("SELECT name FROM requisitions_type WHERE id = {$params['type_id']}"))['name'];
}
$new_req_name = $name_type. ' для ' . $params['newClientName'];
$this->db->query("UPDATE requisitions SET name = '{$new_req_name}' WHERE id={$req_id}");
}
}
if (!isset($params['add_obj'])) {
//Теги
if ($req_id > 0) {
if (!$this->db->query("DELETE FROM requisitions_activities WHERE req_id = {$req_id}"))
$errors[] = $this->db->errorInfo();
foreach($params['activities'] as $a) {
$sql_in = "INSERT INTO requisitions_activities SET req_id = {$req_id}, activity_id={$a}";
if (!$this->db->query($sql_in))
$errors[] = $this->db->errorInfo();
}
}
if ($params['type_id'] == 1 || $params['type_id'] == 4 || $parentType == 1 || $parentType == 4) {
if (isset($params['asfilter_id']) && $req_id !== 0) {
$this->autosearch_instce->setReqToFilter($req_id, intval($params['asfilter_id']), $_SESSION['id']);
}
}
//Добавляем событие передачи
if ($params['confirm'] == 0 && $params['old_whowork'] != $params['who_work']) {
$new_owner_id_check_event = intval($params['who_work']);
if ($req_id > 0 && $new_owner_id_check_event > 0) {
$sql_clear = "UPDATE events_clients SET `read` = 1, date_update = NOW() WHERE req_id = $req_id AND event = 'transmitted'";
mysql_query($sql_clear);
}
//$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `event`) VALUES (".$params['old_whowork'].", ".$req_id.", ".$params['who_work'].", 'transmitted')";
$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `event`) VALUES (".$_SESSION['id'].", ".$req_id.", ".$params['who_work'].", 'transmitted')";
if (!$this->db->query($sql_conf))
$errors[] = $this->db->errorInfo();
}
if ($params['object_id'] > 0 && $params['client_id'] > 0 && $params['type_id'] != 4 && $parentType != 4) {
$objectArr = array();
$sql_cl = "SELECT objects FROM clients WHERE id=$params[client_id]";
$q_cl = $this->db->query($sql_cl);
$r_cl = $this->db->fetch_assoc($q_cl);
if (!empty($r_cl['objects'])) {
$arrObj = json_decode(html_entity_decode($r_cl['objects']), ENT_QUOTES);
foreach($arrObj as $oneObj) {
$objectArr[] = strval($oneObj);
}
if (!in_array($params['object_id'],$objectArr)) {
$objectArr[] = strval($params['object_id']);
}
} else {
$objectArr[] = strval($params['object_id']);
}
if (!empty($objectArr)) {
$cl = new Clients();
$cl->update_objects($params['client_id'], null, $objectArr);
$obj = htmlentities(json_encode($objectArr));
$up_client = "UPDATE clients SET objects='$obj' where id = $params[client_id]";
if (!$this->db->query($up_client))
$errors[] = $this->db->errorInfo();
}
}
// Сохранение данных предварительной оценки
if (
//!is_null($params['object_price']) ||
!is_null($params['object_prep_price']) ||
!is_null($params['object_start_price']) ||
!is_null($params['object_fact_price'])
) {
$price = (isset($params['object_price'])) ? $params['object_price'] : "NULL";
$prep_price = (isset($params['object_prep_price'])) ? $params['object_prep_price'] : "NULL";
$start_price = (isset($params['object_start_price'])) ? $params['object_start_price'] : "NULL";
$fact_price = (isset($params['object_fact_price'])) ? $params['object_fact_price'] : "NULL";
$object_id = $params['object_id'];
$sqlCheck = "SELECT * FROM `object_prices` WHERE `object_id` = $object_id AND `agency_id` = '$agency_id'";
$resCheck = $this->db->query($sqlCheck);
if ($this->db->num_rows($resCheck) == 0) {
$sql = "INSERT INTO `object_prices` (
`object_id`,
`price`,
`prep_price`,
`start_price`,
`fact_price`,
`agency_id`
) VALUES (
'$object_id',
'$price',
'$prep_price',
'$start_price',
'$fact_price',
'$agency_id'
)";
if (!$this->db->query($sql)) {
$errors[] = $this->db->errorInfo();
}
} else {
$sql = "UPDATE `object_prices` SET `prep_price` = '$prep_price', `start_price` = '$start_price', `fact_price` = '$fact_price' WHERE `object_id` = '$object_id' and `agency_id` = '$agency_id'";
if (!$this->db->query($sql)) {
$errors[] = $this->db->errorInfo();
}
}
}
//Поля которые может редактировать сотрудник
$fields_can_edid = array();
$sql_field = "SELECT * FROM `client_req_fields` WHERE agency_id = {$agency_id}";
$q_fields = $this->db->query($sql_field);
while($r_fields = $this->db->fetch_assoc($q_fields)){
$tempArrNoSee = json_decode($r_fields['users_no_see'], true);
if($r_fields['is_no_see'] == 1 && !empty($r_fields['users_no_see']) && !empty($tempArrNoSee)){
$arrNoSeeUsers = array();
foreach($tempArrNoSee as $u){
if(strpos($u, 'all_') !== false){
$manId = str_replace('all_', '', $u);
$sql_u = "SELECT id FROM `users`
WHERE id = $manId OR
id_manager = $manId OR
id_manager IN (SELECT id FROM users WHERE id_manager = $manId)";
$q_u = mysql_query($sql_u);
while($r_u = mysql_fetch_row($q_u)){
$arrNoSeeUsers[] = (int)$r_u[0];
}
} else {
$arrNoSeeUsers[] = (int)$u;
}
}
if(in_array($_SESSION['id'], $arrNoSeeUsers)){
$fields_can_edid[] = (int)$r_fields['id'];
}
} else {
$fields_can_edid[] = (int)$r_fields['id'];
}
}
//Кастомные поля
if(!empty($fields_can_edid)){
$sql_del = "DELETE FROM requisition_data WHERE req_id=$req_id and field_id in (".implode(',', $fields_can_edid).")";
if (!$this->db->query($sql_del))
$errors[] = $this->db->errorInfo();
if (!empty($params['field_models'])) {
foreach($params['field_models'] as $key => $field_models) {
$arrField = explode("_", $key);
$typeField = 1;
if ($arrField[0] == 'modelp') {
$typeField = 2;
}
$value = json_encode($field_models, JSON_UNESCAPED_UNICODE);
$field_id = (int)$arrField[1];
$sql_in = "INSERT INTO requisition_data SET ".
" req_id=$req_id, ".
" field_id=$field_id, ".
" type=$typeField, ".
" value='$value'";
if (!$this->db->query($sql_in))
$errors[] = $this->db->errorInfo();
}
}
}
if ($req_id > 0) {
if (!empty($params['contracts'])) {
foreach($params['contracts'] as $contract) {
if (!isset($contract->id)) {
$date_start = strtotime($contract->date_start);
$date_end = strtotime($contract->date_end);
$sql = "INSERT INTO contracts_req SET ".
"req_id = {$req_id}, ".
"type = {$contract->type}, ".
"date_start = {$date_start}, ".
"date_end = {$date_end}, ".
"number = '{$contract->number}', ".
"days = {$contract->days_mes_end}, ".
"send = {$contract->no_mes_end}";
if (!$this->db->query($sql))
$errors[] = $this->db->errorInfo();
}
}
}
if ($params['object_id'] > 0 && ($params['type_id'] == 2 || $parentType == 2)){
$this->contractInObject($req_id, $params['object_id']);
}
//сохраняем данные wazzap
if (isset($params['wazzap_chat_type']) && $params['wazzap_chat_type'] &&
isset($params['wazzap_chat_id']) && $params['wazzap_chat_id'] &&
isset($params['wazzap_channel_id']) && $params['wazzap_channel_id']) {
$wazzap_chat_type = $params['wazzap_chat_type'];
$wazzap_chat_id = $params['wazzap_chat_id'];
$wazzap_channel_id = $params['wazzap_channel_id'];
$wazzap_user_id = $params['wazzap_user_id'];
$wazzap_integration_id = $params['wazzap_integration_id'];
//связываем заявку с чатом wazzap
$sql = "INSERT INTO `requisition_data_wazzap` (`requisition_id`, `chat_type`, `chat_id`, `channel_id`, `user_id`, `integration_id`) VALUES ('$req_id', '$wazzap_chat_type', '$wazzap_chat_id', '$wazzap_channel_id', '$wazzap_user_id', '$wazzap_integration_id')";
$this->db->query($sql);
$client_id = (int)$params['client_id'];
$agency_id = User::getUserAgencyID();
$wazzap = new Wazzap($agency_id, $this->db);
//проверяем, передавался ли клиент в wazzap
$sqlCheck = "SELECT * FROM `client_data_wazzap` WHERE `client_id` = $client_id";
$resCheck = $this->db->query($sqlCheck);
if ($this->db->num_rows($resCheck) == 0) {
$sql_cl_fio = "SELECT fio FROM clients WHERE id = $client_id";
$q_cl_fio = $this->db->query($sql_cl_fio);
$r_cl_fio = $this->db->fetch_assoc($q_cl_fio);
//связываем клиента с чатом wazzap
$sql2 = "INSERT INTO `client_data_wazzap` (`client_id`, `chat_type`, `chat_id`, `channel_id`, `user_id`, `integration_id`) VALUES ('$client_id', '$wazzap_chat_type', '$wazzap_chat_id', '$wazzap_channel_id', '$wazzap_user_id', '$wazzap_integration_id')";
$this->db->query($sql2);
//создаем его в wazzap
$wazzap->createWazzapContact($client_id, $wazzap_user_id, $r_cl_fio["fio"], $wazzap_chat_type, $wazzap_chat_id);
}
$name = $params['name'];
if (mb_strlen($name) > 200) {
$name = mb_substr($name, 0, 195);
}
//создаем сделку в wazzap
$wazzap->createWazzapDeal($req_id, $wazzap_user_id, $name, $client_id);
}
if(!isset($agency_id)){
$agency = new User;
$agency->get($_SESSION['id']);
$agency_id = $agency->agencyId;
}
/* if($agency_id == 5238){
$w = new WebHookSend($agency_id, 2, $req_id, 'req');
}*/
if($agency_id == 13154){
$w = new WebHookSend($agency_id, 2, $req_id, 'req');
}
}
}
if (!empty($errors)){
$result['error'] = $errors;
return $result;
}
return $req_id;
}
}
// Копирование заявки в одной транзакции. Возвращает [success, id, error, code].
public function copy($srcId, $funnelId, $whoWorkId, $currentUserId) {
$srcId = (int)$srcId;
$funnelId = (int)$funnelId;
$whoWorkId = (int)$whoWorkId;
$currentUserId = (int)$currentUserId;
$qSrc = $this->db->query("SELECT * FROM requisitions WHERE id = {$srcId} LIMIT 1");
$src = $this->db->fetch_assoc($qSrc);
if (!$src) {
return array(
'success' => false,
'error' => 'Исходная заявка не найдена',
'code' => 'src_not_found',
'id' => null,
);
}
if ((int)$src['deleted'] === 1) {
return array(
'success' => false,
'error' => 'Нельзя копировать закрытую заявку',
'code' => 'src_deleted',
'id' => null,
);
}
$srcTypeId = (int)$src['type_id'];
$qType = $this->db->query("SELECT id, heir FROM requisitions_type WHERE id = {$srcTypeId} LIMIT 1");
$typeRow = $this->db->fetch_assoc($qType);
$baseTypeId = $typeRow ? requisition_base_type_id($typeRow) : 0;
// funnel_id=0 — дефолтная воронка без funnel_steps; step_id=1 («Новый»).
if ($funnelId === 0) {
$newStepId = 1;
} else {
$qStep = $this->db->query(
"SELECT id FROM funnel_steps WHERE funnel_id = {$funnelId} AND deleted = 0 ORDER BY order_number, branch LIMIT 1"
);
$firstStep = $this->db->fetch_assoc($qStep);
if (!$firstStep) {
return array(
'success' => false,
'error' => 'В выбранной воронке нет этапов',
'code' => 'no_steps',
'id' => null,
);
}
$newStepId = (int)$firstStep['id'];
}
$srcName = isset($src['name']) ? (string)$src['name'] : '';
$newName = (trim($srcName) === '') ? '' : 'Копия: ' . $srcName;
$copyObject = requisition_should_copy_object($baseTypeId);
$newObjectId = $copyObject ? (int)$src['object_id'] : 0;
$copyFilters = requisition_should_copy_search_filters($baseTypeId);
// ВАЖНО: нативный PDO begin/commit (query("BEGIN") глотает PDOException). Даты через NOW() — TZ-смещение.
try {
$this->db->beginTransaction();
$now = date('Y-m-d H:i:s');
$nameSql = mysql_real_escape_string($newName);
$sourceVal = (int)$src['source'];
$hot = (int)$src['hot'];
$priority = (int)$src['priority'];
$clientId = (int)$src['client_id'];
$descriptionSql = mysql_real_escape_string((string)$src['description']);
// Теги читаются из requisitions_activities (junction-таблица), а не из колонки activities.
$insSql = "INSERT INTO requisitions
(user_id, who_work, funnel_id, step_id, stage, name, type_id, source,
priority, hot, client_id, object_id, description, created_at, confirm, deleted, cancel)
VALUES
({$currentUserId}, {$whoWorkId}, {$funnelId}, {$newStepId}, 1,
'{$nameSql}', {$srcTypeId}, {$sourceVal},
{$priority}, {$hot}, {$clientId}, {$newObjectId}, '{$descriptionSql}', NOW(), 1, 0, 0)";
if (!$this->db->query($insSql)) {
throw new Exception('INSERT requisitions завершился ошибкой');
}
$newId = (int)$this->db->insert_id();
if ($newId <= 0) {
throw new Exception('INSERT requisitions не вернул id');
}
// autosearch_filters — копируем для всех типов кроме «Подбор объекта» (base=1).
$srcAsfilterId = isset($src['asfilter_id']) ? (int)$src['asfilter_id'] : 0;
if ($copyFilters && $srcAsfilterId > 0) {
$qFilter = $this->db->query("SELECT * FROM autosearch_filters WHERE id = {$srcAsfilterId} LIMIT 1");
$filterRow = $this->db->fetch_assoc($qFilter);
if ($filterRow) {
unset($filterRow['id']);
if (array_key_exists('deleted', $filterRow)) $filterRow['deleted'] = 0;
if (array_key_exists('archived', $filterRow)) $filterRow['archived'] = 0;
$filterRow['req_id'] = $newId;
$filterRow['created_at'] = $now;
$filterRow['created_by'] = $currentUserId;
$filterRow['updated_at'] = $now;
$filterRow['updated_by'] = $currentUserId;
$cols = array();
$vals = array();
foreach ($filterRow as $col => $val) {
$cols[] = "`{$col}`";
if ($col === 'created_at' || $col === 'updated_at') {
$vals[] = 'NOW()';
} elseif ($val === null) {
$vals[] = 'NULL';
} else {
$vals[] = "'" . mysql_real_escape_string((string)$val) . "'";
}
}
$filterInsSql = "INSERT INTO autosearch_filters (" . implode(',', $cols) . ")"
. " VALUES (" . implode(',', $vals) . ")";
if (!$this->db->query($filterInsSql)) {
throw new Exception('INSERT autosearch_filters завершился ошибкой');
}
$newAsfilterId = (int)$this->db->insert_id();
if ($newAsfilterId <= 0) {
throw new Exception('INSERT autosearch_filters не вернул id');
}
if (!$this->db->query("UPDATE requisitions SET asfilter_id = {$newAsfilterId} WHERE id = {$newId}")) {
throw new Exception('UPDATE requisitions.asfilter_id завершился ошибкой');
}
}
}
$qTags = $this->db->query("SELECT activity_id FROM requisitions_activities WHERE req_id = {$srcId}");
while ($tag = $this->db->fetch_assoc($qTags)) {
$aid = (int)$tag['activity_id'];
if (!$this->db->query("INSERT INTO requisitions_activities SET req_id = {$newId}, activity_id = {$aid}")) {
throw new Exception('INSERT requisitions_activities завершился ошибкой');
}
}
// contracts_req: date_start/date_end — unix-timestamp (int), не DATETIME.
$hasSaleContract = false;
$qContracts = $this->db->query("SELECT * FROM contracts_req WHERE req_id = {$srcId}");
while ($c = $this->db->fetch_assoc($qContracts)) {
$cType = (int)$c['type'];
$cNumber = mysql_real_escape_string((string)$c['number']);
$cStart = (int)$c['date_start'];
$cEnd = (int)$c['date_end'];
$cDays = (int)$c['days'];
$cSend = (int)$c['send'];
$cAgency = (int)$c['agency_id'];
$contractInsSql = "INSERT INTO contracts_req
(req_id, type, number, date_start, date_end, days, send, agency_id)
VALUES
({$newId}, {$cType}, '{$cNumber}', {$cStart}, {$cEnd}, {$cDays}, {$cSend}, {$cAgency})";
if (!$this->db->query($contractInsSql)) {
throw new Exception('INSERT contracts_req завершился ошибкой');
}
if ($cType === 2) {
$hasSaleContract = true;
}
}
// Cross-link contracts_object — только если есть договор type=2 (продажа).
if ($copyObject && $newObjectId > 0 && $hasSaleContract) {
$this->contractInObject($newId, $newObjectId);
}
// copy_created: историческое событие в исходнике (без уведомления). dop_text = id новой заявки.
$sqlEvSrc = "INSERT INTO events_clients
(req_id, event, dop_text, user_id, from_id, date, send_telegramm, send_max, `read`)
VALUES
({$srcId}, 'copy_created', '{$newId}', {$currentUserId}, 0, NOW(), 1, 1, 1)";
if (!$this->db->query($sqlEvSrc)) {
throw new Exception('INSERT events_clients (copy_created) завершился ошибкой');
}
// copy_from: событие в копии. read=1 всегда — копия не передача, поллер не должен показывать модалку «Передача заявки».
// send_telegramm/send_max=0 при копировании на другого сотрудника — cron отдельно шлёт уведомление в TG/MAX.
$skipTgMax = ($whoWorkId === $currentUserId) ? 1 : 0;
$sqlEvNew = "INSERT INTO events_clients
(req_id, event, dop_text, user_id, from_id, date, send_telegramm, send_max, `read`)
VALUES
({$newId}, 'copy_from', '{$srcId}', {$currentUserId}, {$whoWorkId}, NOW(), {$skipTgMax}, {$skipTgMax}, 1)";
if (!$this->db->query($sqlEvNew)) {
throw new Exception('INSERT events_clients (copy_from) завершился ошибкой');
}
$this->db->commit();
return array(
'success' => true,
'id' => $newId,
'error' => null,
'code' => null,
);
} catch (Exception $e) {
// inTransaction() — защита от двойного rollback (DDL-ошибки откатывают сами).
if ($this->db->inTransaction()) {
$this->db->rollBack();
}
return array(
'success' => false,
'error' => 'Ошибка при создании копии: ' . $e->getMessage(),
'code' => 'exception',
'id' => null,
);
}
}
// Право на редактирование/копирование заявки. Без $_SESSION (для cron). TODO: унифицировать с дубликатами в этом классе.
public function user_can_edit_req($srcRow, $userId) {
$userId = (int)$userId;
if ($userId <= 0) {
return false;
}
if (isset($srcRow['who_work']) && (int)$srcRow['who_work'] === $userId) {
return true;
}
$sql = "SELECT u.`agency`, u.`users_admin`, p.`menu_all_submissions_edit`
FROM `users` u
LEFT JOIN `user_permissions` p ON p.`user_id` = u.`id`
WHERE u.`id` = {$userId}
LIMIT 1";
$result = mysql_query($sql);
if (!$result) {
return false;
}
$u = mysql_fetch_assoc($result);
if (!$u) {
return false;
}
if ((int)$u['agency'] === 1
|| (int)$u['users_admin'] === 1
|| (int)$u['menu_all_submissions_edit'] === 1) {
return true;
}
// doers (соисполнители): doers_confirm=0 И userId — ключ в JSON со значением 1.
$doersConfirm = isset($srcRow['doers_confirm']) ? (int)$srcRow['doers_confirm'] : 0;
$doersRaw = isset($srcRow['doers']) ? $srcRow['doers'] : '';
if ($doersConfirm === 0 && $doersRaw !== '') {
$doers = json_decode(html_entity_decode((string)$doersRaw), true);
if (is_array($doers) && isset($doers[$userId]) && (int)$doers[$userId] === 1) {
return true;
}
}
// admin_department / manager_office своего отдела (по users.department_id ответственного).
$whoWorkId = isset($srcRow['who_work']) ? (int)$srcRow['who_work'] : 0;
if ($whoWorkId <= 0) {
return false;
}
$depHelper = new Department();
$callerDep = $depHelper->getDepartment($userId);
if (!is_array($callerDep) || !isset($callerDep['role'])) {
return false;
}
$callerRole = $callerDep['role'];
if ($callerRole === 'admin_department' || $callerRole === 'manager_office') {
$q = mysql_query(
"SELECT u_caller.`department_id` AS caller_dep,
u_responsible.`department_id` AS resp_dep
FROM `users` u_caller
LEFT JOIN `users` u_responsible ON u_responsible.`id` = {$whoWorkId}
WHERE u_caller.`id` = {$userId}
LIMIT 1"
);
$deps = $q ? mysql_fetch_assoc($q) : null;
if (!$deps) {
return false;
}
$callerDepId = (int)$deps['caller_dep'];
$respDepId = (int)$deps['resp_dep'];
if ($callerDepId > 0 && $callerDepId === $respDepId) {
return true;
}
return false;
}
// manager / manager_office_menager в цепочке id_manager ответственного.
if ($callerRole === 'manager' || $callerRole === 'manager_office_menager') {
$qm = mysql_query(
"SELECT u_caller.`id_manager` AS caller_mgr,
u_responsible.`id_manager` AS resp_mgr
FROM `users` u_caller
LEFT JOIN `users` u_responsible ON u_responsible.`id` = {$whoWorkId}
WHERE u_caller.`id` = {$userId}
LIMIT 1"
);
$mgrs = $qm ? mysql_fetch_assoc($qm) : null;
if (!$mgrs) {
return false;
}
$callerMgr = (int)$mgrs['caller_mgr'];
$respMgr = (int)$mgrs['resp_mgr'];
if ($respMgr > 0 && $respMgr === $userId) {
return true;
}
if ($callerMgr > 0 && $callerMgr === $respMgr) {
return true;
}
if ($callerMgr > 0 && $callerMgr === $whoWorkId) {
return true;
}
}
return false;
}
// Может ли $userId быть ответственным: agency-tree + blocked=0 + НЕ в funnel.users_no_see.
public function user_can_be_responsible($userId, $agencyId, $funnelId) {
$userId = (int)$userId;
$agencyId = (int)$agencyId;
$funnelId = (int)$funnelId;
if ($userId <= 0 || $agencyId <= 0 || $funnelId <= 0) {
return false;
}
if ((int)User::getUserAgencyID($userId) !== $agencyId) {
return false;
}
$blockedQ = mysql_query("SELECT `blocked` FROM `users` WHERE `id` = {$userId} LIMIT 1");
$blockedRow = mysql_fetch_assoc($blockedQ);
if (!$blockedRow || (int)$blockedRow['blocked'] === 1) {
return false;
}
$sql = "SELECT `users_no_see` FROM `funnel` WHERE `id` = {$funnelId} LIMIT 1";
$result = mysql_query($sql);
if (!$result) {
return false;
}
$funnelRow = mysql_fetch_assoc($result);
if (!$funnelRow) {
return false;
}
if (!empty($funnelRow['users_no_see'])) {
$hidden = json_decode($funnelRow['users_no_see'], true);
if (is_array($hidden)) {
$hiddenInt = array_map('intval', $hidden);
if (in_array($userId, $hiddenInt, true)) {
return false;
}
}
}
return true;
}
//Изменение воронки
public function updateFunnel($funnel_id, $req_id) {
$errors = [];
$sqlSelFun = "select funnel_id from requisitions WHERE id=$req_id";
$resSelFun = $this->db->query($sqlSelFun);
$rowSelFun = $this->db->fetch_assoc($resSelFun);
$funnel = $rowSelFun['funnel_id'];
$newFunnel = (int)$funnel_id;
if ($funnel != $newFunnel) {
$funnelName = "Обычные";
if ($newFunnel > 0) {
$sqlFunnel = "SELECT name FROM funnel WHERE id = $newFunnel";
$resFunnel = $this->db->query($sqlFunnel);
$phRow = $this->db->fetch_assoc($resFunnel);
$funnelName = $phRow['name'];
}
$sql = "UPDATE requisitions SET funnel_id = '$newFunnel', `stage`='1' WHERE id=$req_id";
if (!$this->db->query($sql)) {
if ($this->db->errorInfo())
$errors[] = $this->db->errorInfo();
}
$sqlDeleteOldFunnel = "delete from clients_funnel_step where req_id = $req_id";
if (!$this->db->query($sqlDeleteOldFunnel)) {
if ($this->db->errorInfo())
$errors[] = $this->db->errorInfo();
}
$this->get_class_etap($req_id, $newFunnel);
$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `event`, `dop_text`, `read`) VALUES (".$_SESSION['id'].", ".$req_id.", '0', 'update', 'Передан в воронку «".$funnelName."»', '1')";
if (!$this->db->query($sql_conf)) {
if ($this->db->errorInfo())
$errors[] = $this->db->errorInfo();
}
}
if (count($errors))
return $errors;
else
return true;
}
//
public function updateReq($req_id = [], $client_id = null, $object_id = null) {
$errors = [];
if (!empty($req_id)) {
if (!is_array($req_id))
$req_id = [$req_id];
if (is_null($client_id))
$client_id = 'NULL';
if (is_null($object_id))
$object_id = 'NULL';
/* $property_type_id = 0;
if($params['object_id'] > 0){
$property_type_id = $this->check_property_type($params['object_id']);
}*/
foreach ($req_id as $req) {
$sql = "UPDATE `requisitions` SET
`object_id` = '$object_id',
`client_id` = '$client_id'
WHERE `id` = '$req'";
if (!$this->db->query($sql)) {
$errors[] = $this->db->errorInfo();
}
}
}
if (count($errors))
return [
'success' => false,
'errors' => $errors,
];
else
return [
'success' => true
];
}
//Закрытие заявки
public function deleteReq($id, $user_id, $post){
$errors = [];
$dop_text = "";
$select_text = "";
$is_deal = false;
if($post['note'] == 1){
// При закрытии отказом (denial) JS передаёт текущую дату в $post['datazakl'],
// парсить её не нужно — используем текущее время напрямую.
$t = date_create();
$formatted_date = date_format($t,"Y-m-d H:i:s");
$formatted_dateZajavki = date_format($t,"d.m.Y");
}else{
$test = substr($post['datazakl'], 0, -3);
$dateZajavki = date('d.m.Y', intval($test));
if($dateZajavki == '01.01.1970'){
$dateZajavki = date('d.m.Y');
}
$phpdate = strtotime($dateZajavki);
$formatted_d = date( 'Y-m-d', $phpdate );
$today = date('Y-m-d');
if($today == $formatted_d){
$formatted_date = date('Y-m-d H:i:s');
}else{
$formatted_date = date( 'Y-m-d H:i:s', $phpdate );
}
$formatted_dateZajavki = date( 'd.m.Y', $phpdate );
}
if($post['denial']){
$sql_d = "SELECT * FROM denial_work WHERE id = ".$post['denial'];
$q_d =$this->db->query($sql_d);
$r_d = $this->db->fetch_assoc($q_d);
$select_text = $r_d['name'];
}
if($post['tempid']){
$sql_mes = "SELECT * FROM step_notify_closure WHERE temp_id = {$post['tempid']}";
$q_mes = $this->db->query($sql_mes);
if($this->db->num_rows($q_mes) > 0){
$mes = $this->db->fetch_assoc($q_mes);
}
}
if(!empty($post['reason']) || $select_text != ""){
$dop_text .= "Причина: «".$select_text.".» Комментарий: «".$post['reason']."»";
if(isset($mes)){
$text = $mes['text']."<br>Закрыта. ".$dop_text;
if (!$this->db->query("UPDATE step_notify_closure SET text='{$text}', send=0 WHERE temp_id = {$post['tempid']}"))
$errors[] = $this->db->errorInfo();
}
} else if(isset($post['summa']) && $post['luck']){
$is_deal = true;
$dop_text .= "$post[reason] Совершена сделка на ".$post['summa']." руб.".$formatted_dateZajavki;
if(isset($mes)){
$text = $mes['text']."<br>Закрыта. Совершена сделка на ".$post['summa']." руб.".$formatted_dateZajavki;
if (!$this->db->query("UPDATE step_notify_closure SET text='{$text}', send=0 WHERE temp_id = {$post['tempid']}"))
$errors[] = $this->db->errorInfo();
}
}
$sql = "SELECT * FROM `requisitions` WHERE id = $id";
$requisistion = $this->db->fetch_assoc($this->db->query($sql));
// ИСПРАВЛЕНО: Определяем $lastStepId в начале, до всех условий
$lastStepId = 8; // значение по умолчанию для обычной воронки
$funnelId = intval($requisistion['funnel_id']);
if ($funnelId > 0) {
// Для кастомной воронки
$q_step = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $funnelId AND deleted = 0");
if ($q_step && $this->db->num_rows($q_step) > 0) {
$r_step = $this->db->fetch_assoc($q_step);
if ($r_step['last_stage'] !== null) {
$lastStepId = intval($r_step['last_stage']);
}
}
} else {
// funnel_id = 0 — дефолтная воронка, берём по agency_id
$agencyId = $this->user->agencyId;
$q_default = $this->db->query("SELECT id FROM funnel_default WHERE agency_id = $agencyId LIMIT 1");
if ($q_default && $this->db->num_rows($q_default) > 0) {
$r_default = $this->db->fetch_assoc($q_default);
$defaultFunnelId = intval($r_default['id']);
if ($defaultFunnelId > 0) {
$q_step = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $defaultFunnelId AND deleted = 0");
if ($q_step && $this->db->num_rows($q_step) > 0) {
$r_step = $this->db->fetch_assoc($q_step);
if ($r_step['last_stage'] !== null) {
$lastStepId = intval($r_step['last_stage']);
}
}
}
}
}
if ($requisistion['complex_status_id'] && $requisistion['complex_room_id'])
{
$complexStatus = new ComplexStatus((int)$requisistion['complex_status_id']);
$complexStatus->updateRoomsStatus([
'new_status_id' => 4,
'complex_room_id' => $requisistion['complex_room_id']
], false, false);
}
if ($funnelId > 0) {
$sql = "UPDATE requisitions SET reason='".$select_text.". ".$post['reason']."', who_delete = '$user_id', deleted=1, step_id=$lastStepId, denial = $post[denial] WHERE id=$id";
} else {
$sql = "UPDATE requisitions SET reason='".$select_text.". ".$post['reason']."', who_delete = '$user_id', deleted=1, stage=$lastStepId, denial = $post[denial] WHERE id=$id";
}
if(isset($post['summa']) && $post['luck']){
if($dop_text != '') $dop_text .= " ";
$commission = isset($post['commission']) ? intval($post['commission']) : 0;
$dop_text1 = "Совершена сделка на ".$commission." руб. ".$formatted_dateZajavki;
if ($funnelId > 0) {
$sql = "UPDATE requisitions SET reason='".$dop_text1."', who_delete = '$user_id', deleted=1, step_id=$lastStepId, summa='$post[summa]', confirm='$post[luck]' WHERE id=$id";
} else {
$sql = "UPDATE requisitions SET reason='".$dop_text1."', who_delete = '$user_id', deleted=1, stage=$lastStepId, summa='$post[summa]', confirm='$post[luck]' WHERE id=$id";
}
}
if ($this->db->query($sql)) {
$sql = "INSERT INTO `events_clients` (user_id, req_id, from_id, event, `read`, `dop_text`, `date_update`) VALUES ('".$user_id."', '".$id."', '".$user_id."', 'delete', '1', '".$dop_text1."', '".$formatted_date."')";
if (!$this->db->query($sql))
$errors[] = $this->db->errorInfo();
if (!empty($requisistion['deal_id']) && $requisistion['deal_id'] > 0) {
$dealId = intval($requisistion['deal_id']);
// Проверяем, есть ли другие заявки в сделке, которые ещё не закрыты
$otherReqsSql = "SELECT COUNT(*) as cnt FROM requisitions WHERE deal_id = $dealId AND deleted = 0 AND id != $id";
$otherReqsRow = $this->db->fetch_assoc($this->db->query($otherReqsSql));
$otherReqsOpen = $otherReqsRow['cnt'] > 0;
if ($is_deal || !$otherReqsOpen) {
// Если сделка (is_deal=true) ИЛИ все заявки закрыты — ставим статус 1 (успешная)
$this->db->query("UPDATE deals SET status = 1 WHERE id = $dealId AND status != 2");
// Закрытие смежной заявки (стороны 2) со статусом успешно
$dealSql = "SELECT title, side_two_requisition_id FROM deals WHERE id = $dealId AND side_two_requisition_id IS NOT NULL AND side_two_requisition_id > 0 LIMIT 1";
$dealRow = $this->db->fetch_assoc($this->db->query($dealSql));
if ($dealRow) {
$linkedReqId = intval($dealRow['side_two_requisition_id']);
$linkedReqSql = "SELECT id, who_work, client_id, deleted FROM requisitions WHERE id = $linkedReqId AND deleted = 0 LIMIT 1";
$linkedReq = $this->db->fetch_assoc($this->db->query($linkedReqSql));
if ($linkedReq) {
$reason = 'Закрыта, т.к. была смежной заявкой по заявке ID ' . $id;
$linkedReqData = $this->db->fetch_assoc($this->db->query("SELECT funnel_id, agency_id FROM requisitions WHERE id=$linkedReqId LIMIT 1"));
$linkedFunnelId = intval(isset($linkedReqData['funnel_id']) ? $linkedReqData['funnel_id'] : 0);
$linkedLastStepId = 8;
if ($linkedFunnelId > 0) {
$lq = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $linkedFunnelId AND deleted = 0");
if ($lq && $this->db->num_rows($lq) > 0) {
$lr = $this->db->fetch_assoc($lq);
if ($lr['last_stage'] !== null) $linkedLastStepId = intval($lr['last_stage']);
}
} else {
$linkedAgencyId = intval(isset($linkedReqData['agency_id']) ? $linkedReqData['agency_id'] : 0);
if ($linkedAgencyId > 0) {
$ldq = $this->db->query("SELECT id FROM funnel_default WHERE agency_id = $linkedAgencyId LIMIT 1");
if ($ldq && $this->db->num_rows($ldq) > 0) {
$ldr = $this->db->fetch_assoc($ldq);
$defaultFunnelId = intval($ldr['id']);
if ($defaultFunnelId > 0) {
$lq = $this->db->query("SELECT MAX(order_number) as last_stage FROM funnel_steps WHERE funnel_id = $defaultFunnelId AND deleted = 0");
if ($lq && $this->db->num_rows($lq) > 0) {
$lr = $this->db->fetch_assoc($lq);
if ($lr['last_stage'] !== null) $linkedLastStepId = intval($lr['last_stage']);
}
}
}
}
}
if ($linkedFunnelId > 0) {
$this->db->query("UPDATE requisitions SET deleted=1, confirm=10, step_id=$linkedLastStepId, reason='" . addslashes($reason) . "', who_delete=$user_id WHERE id=$linkedReqId");
} else {
$this->db->query("UPDATE requisitions SET deleted=1, confirm=10, stage=$linkedLastStepId, reason='" . addslashes($reason) . "', who_delete=$user_id WHERE id=$linkedReqId");
}
$this->db->query("INSERT INTO events_clients (user_id, req_id, from_id, client_id, event, `read`, dop_text, date_update) VALUES (" .
$linkedReq['who_work'] . ", $linkedReqId, $user_id, " . $linkedReq['client_id'] . ", 'delete', '1', '" . addslashes($reason) . "', NOW())");
}
}
// Запись в историю сделки
$userObj = new User;
$userObj->get($user_id);
$comment = "Заявка #$id закрыта.";
if ($is_deal && isset($post['summa'])) {
$comment .= " Совершена сделка на ".$post['summa']." руб.";
}
if (!$otherReqsOpen) {
$comment .= " Все заявки сделки закрыты. Сделка завершена.";
}
$this->db->query("INSERT INTO user_client_events (user_id, req_id, deal_id, type, name, comment, create_date) VALUES ($user_id, $id, $dealId, 'deal', 'Закрытие сделки', '".addslashes($comment)."', NOW())");
}
if ($dealId) {
$this->db->query("UPDATE user_client_events SET calendar_view = 1 WHERE deal_id = $dealId AND calendar_view = 0");
$this->db->query("UPDATE user_object_events SET calendar_view = 1 WHERE deal_id = $dealId AND calendar_view = 0");
}
}
// Удаление фильтра автопоиска
$autosearch_instce = $this->autosearch_instce;
$autosearch_instce->deleteFilterByReq($id, $user_id);
$user = new User;
$user->get($user_id);
if($user->agencyId == 13154){
$w = new WebHookSend($user->agencyId, 3, $id, 'req', $this->db, 'close');
}
if($is_deal === false){
$reqs = array($id);
$this->set_user($user);
$this->autoUnitReq(-1, $reqs);
}
} else {
$errors[] = $this->db->errorInfo();
}
if ($requisistion['complex_room_id'])
{
$complex = new Complex();
$complex->generate_room_reservations_positions($requisistion['complex_room_id']);
}
if (!empty($errors))
return $errors;
return true;
}
//Удаление заявки
public function cancelReq($req_id){
$sql = "UPDATE requisitions SET cancel=1 WHERE id=$req_id";
if ($this->db->query($sql)) {
// Удаление фильтра автопоиска
$autosearch_instce = $this->autosearch_instce;
$autosearch_instce->deleteFilterByReq($req_id, $_SESSION['id']);
} else {
return $this->db->errorInfo();
}
return true;
}
//Удаление заявок по клиенту
public function cancelReqsClient($client_id){
$sql = "SELECT id FROM requisitions WHERE client_id = $client_id";
$q = $this->db->query($sql);
while($r = $this->db->fetch_assoc($q)){
$this->cancelReq($r['id']);
}
}
//Восстановление заявки
public function renewReq($req_id, $user_id){
$sql = "UPDATE requisitions SET deleted=0, reason='', confirm = 1, who_delete=NULL WHERE id=$req_id";
if (!$this->db->query($sql)) {
return $this->db->errorInfo();
}
$dop_text = "Восстановлен из закрытых. ";
$sql = "INSERT INTO `events_clients` (user_id, req_id, from_id, event, `read`, `dop_text`) VALUES ('".$user_id."', '".$req_id."', '".$user_id."', 'restored', '1', '".$dop_text."')";
if (!$this->db->query($sql)) {
return $this->db->errorInfo();
}
return true;
}
//Принятие заявки из закрытых
public function takeFromClosedReq($req_id, $user_id){
$sql_check_permissions = "SELECT `daily_closed_req_limit`, `actual_daily_closed_req` FROM user_permissions WHERE user_id = $user_id";
$q_check_permissions = mysql_query($sql_check_permissions);
$r_check_permissions = mysql_fetch_assoc($q_check_permissions);
$daily_closed_req_left = $r_check_permissions['daily_closed_req_limit'] - $r_check_permissions['actual_daily_closed_req'];
if ($daily_closed_req_left <= 0) {
exit;
}
$sql = "UPDATE requisitions SET deleted=0, reason='', confirm = 1, who_work=$user_id, who_delete=NULL WHERE id=$req_id";
if (!$this->db->query($sql)) {
return $this->db->errorInfo();
}
$sql_2 = "INSERT INTO `events_clients` (user_id, req_id, from_id, event, `read`) VALUES ('".$user_id."', '".$req_id."', '".$user_id."', 'taken_from_closed', '1')";
if (!$this->db->query($sql_2)) {
return $this->db->errorInfo();
}
$sql_3 = "UPDATE user_permissions SET actual_daily_closed_req=actual_daily_closed_req + 1 WHERE user_id = $user_id";
if (!$this->db->query($sql_3)) {
return $this->db->errorInfo();
}
return true;
}
//Установка воронки
public function set_funnel($funnel_id){
$this->funnel_id = $funnel_id;
}
//этапы воронки
public function get_etap_funnel($funnelId) {
$res = array();
if($funnelId == 0){
$steps = $this->steps;
$res = $steps;
} else {
$funnel_sql = "SELECT * FROM funnel_steps WHERE funnel_id = " . $funnelId . " and deleted=0 order by order_number, branch";
$funnel_step = $this->db->query($funnel_sql);
while ($step = $this->db->fetch_assoc($funnel_step)) {
$steps['step_'.$step['id']] = $step;
}
$res = $steps;
}
return $res;
}
//Определение воронки
public function get_class_etap($reqId, $funnelId, $stageId = 0) {
$res = array('bar'=>array());
$res['req_id'] = $reqId;
if($funnelId == 0){
$steps = $this->steps;
$stage = "Новый";
foreach($steps as $step){
if($step['id'] == $stageId){
$stage = $step['name'];
}
}
$res['bar'] = $steps;
$res['stage'] = $stage;
$res['stageId'] = $stageId;
return $res;
} else {
$change_step_query = $this->db->query("SELECT * FROM clients_funnel_step WHERE req_id = " . $reqId);
$next_id = 0;
$change_step = array('step_id' => 0);
//$lostDate = $client['date_create'];
if ($this->db->num_rows($change_step_query) > 0) {
$change_step = $this->db->fetch_assoc($change_step_query);
$next_id = $change_step['next_id'];
$lostDate = $change_step['date_update'];
} else {
$sql_req = "SELECT created_at FROM requisitions WHERE id = $reqId";
$q_req = $this->db->query($sql_req);
$r_req = $this->db->fetch_assoc($q_req);
$lostDate = $r_req['created_at'];
}
$next_steps = array();
$funnel_sql = "SELECT * FROM funnel_steps WHERE funnel_id = " . $funnelId . " and deleted=0 order by order_number, branch";
$funnel_step = $this->db->query($funnel_sql);
$isActive = true;
$classF = ' active';
$stage = '';
$stageId = 0;
if ((int)$change_step['step_id'] == 0) {
$isActive = false;
}
$arr_steps = array();
$countStep = $this->db->num_rows($funnel_step);
while ($step = $this->db->fetch_assoc($funnel_step)) {
$step['isActive'] = (int)$isActive;
$step['nextStep'] = false;
if ($step['main'] == 1 && !$isActive) {
$next_steps[] = $step['id'];
}
if ($step['id'] == (int)$change_step['step_id']) {
//$stage = $step['name'];
$next_steps = json_decode(htmlspecialchars_decode($step['next_step']));
if ($next_id == 0) {
//$stage = $step['name'];
//$next_steps = json_decode( htmlspecialchars_decode($step['next_step']));
//if($step['branch'] < $branch){
$isActive = false;
// }
}
} else if ($step['id'] == (int)$next_id) {
$isActive = false;
}
$arr_steps[$step['id']] = $step;
}
if ($next_id != 0 && !empty($next_steps)) {
foreach ($next_steps as $key => $st) {
if ($st != $next_id) {
unset($next_steps[$key]);
}
}
}
foreach ($arr_steps as $idstep => $step) {
$arr_steps[$idstep]['isNext'] = 0;
if (in_array($idstep, $next_steps)) {
$stage = $step['name'];
$stageId = $step['id'];
$arr_steps[$idstep]['isNext'] = 1;
}
}
$isActive = true;
foreach ($arr_steps as $idstep => $step) {
$classF = '';
if ($isActive) $classF = ' active';
if ($step['isNext'] == 1) {
$classF = ' nextStep';
$isActive = false;
}
// Покажет сколько мне дней
if(!isset($lostDate)) $lostDate = date('d.m.Y H:i:s');
$interval = date_diff(new DateTime(), new DateTime($lostDate))->days;
if ($interval >= $step['days_step']) {
$classF .= ' expired';
}
$step['classF'] = $classF;
$res['bar'][] = $step;
$res['stage'] = $stage;
$res['stageId'] = $stageId;
}
if($stageId == 0) $stageId = -1;
$sql = "UPDATE requisitions SET step_id = {$stageId} WHERE id = {$reqId}";
$this->db->query($sql);
$sqld = "SELECT deleted FROM requisitions WHERE id = {$reqId}";
$qd = $this->db->query($sqld);
$rd = $this->db->fetch_assoc($qd);
$res['req_deleted'] = $rd['deleted'];
$res['sql'] = $sqld;
return $res;
}
}
public function prev_step_event($reqId, $stepId, $is_open_step = false){
/* error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);*/
$db_sphinx = new MysqlPdo(hstsph2, null, null, null, true, '9306');
$sql = "SELECT * FROM funnel_steps WHERE id = $stepId";
// echo $sql."\n";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
$sql_req = "SELECT *, (SELECT heir FROM requisitions_type WHERE id = req.type_id) as heir FROM requisitions as req WHERE id=$reqId";
$q_req = $this->db->query($sql_req);
$req = $this->db->fetch_assoc($q_req);
if(!empty($r['pole_prev'])){
if(strpos($r['pole_prev'], '{"') !== false){
$pole_prev = json_decode(htmlspecialchars_decode($r['pole_prev']));
} else {
$pole_prev = json_decode($r['pole_prev']);
}
foreach($pole_prev as $pole => $value_pole){
switch ($pole){
case 'tasks':{
if(!$is_open_step){
$name = '';
if($req['who_work'] > 0){
foreach($value_pole as $vp){
if(!empty($vp->type)){
$set = " SET req_id = {$reqId}";
if(!empty($vp->name)){
$name = $vp->name;
} else if ($vp->type == 'even'){
$name = "Мероприятие";
}
$date_time = date('Y-m-d H:i:s');
if(!empty($vp->time)){
$date_time = date('Y-m-d H:i:s', strtotime($vp->time));
}
$set .= ", user_id = {$req['who_work']}, type = '{$vp->type}', comment='{$vp->comment}', schedule_date = '{$date_time}', from_id = {$req['who_work']}, open_step=1";
if(!empty($name)){
$set .= ", name='{$name}'";
}
$insert_ev = "INSERT INTO user_client_events {$set}";
// echo $insert_ev;
$this->db->query($insert_ev);
}
}
}
}
break;
}
case 'tasks_all':{
if(!$is_open_step){
$name = '';
if($req['who_work'] > 0){
foreach($value_pole as $vp){
if(!empty($vp->type)){
$set = " SET req_id = {$reqId}";
if(!empty($vp->name)){
$name = $vp->name;
} else if ($vp->type == 'even'){
$name = "Мероприятие";
}
$date_time = date('Y-m-d H:i:s');
if(!empty($vp->time)){
$date_time = date('Y-m-d H:i:s', strtotime($vp->time));
}
$set .= ", user_id = {$req['who_work']}, type = '{$vp->type}', comment='{$vp->comment}', schedule_date = '{$date_time}', from_id = {$req['who_work']}, open_step=1";
if(!empty($name)){
$set .= ", name='{$name}'";
}
$insert_ev = "INSERT INTO user_client_events {$set}";
// echo $insert_ev;
$this->db->query($insert_ev);
}
}
}
}
break;
}
case 'comment':{
if(!$is_open_step){
if(!empty($value_pole)){
// $set .= ", user_id = {$req['who_work']}, type = '{$vp->type}', comment='{$vp->comment}', schedule_date = '{$date_time}', from_id = {$req['who_work']}, open_step=1";
$insert_ev = "INSERT INTO user_client_events SET req_id = {$reqId}, user_id = {$req['who_work']}, type = 'comment', comment='{$value_pole}', from_id = {$req['who_work']}, open_step=1";
//echo $insert_ev;
$this->db->query($insert_ev);
}
}
break;
}
case 'new_who_work':{
//Добавляем событие передачи
if(!$is_open_step){
if($pole_prev->is_new_who_work != 0 && !empty($value_pole) && (int)$value_pole != 0){
$confirm = 0;
if($req['who_work'] == $value_pole) {
$confirm = 1;
}
if ($confirm == 0) {
$sql_req_up = "UPDATE requisitions SET who_work={$value_pole}, confirm=0 WHERE id = {$reqId}";
$this->db->query($sql_req_up);
$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `dop_text`, `event`) VALUES ({$req['who_work']}, {$reqId}, {$value_pole}, '(автоматическая передача при переходе на этап)', 'transmitted')";
// var_dump(($pole_prev));
$this->db->query($sql_conf);
if($pole_prev->is_new_who_work_object > 0 && $req['object_id'] > 0){
if($req['type_id'] == 2 || $req['heir'] == 2){
$sqlUser = "SELECT `first_name`, `last_name`, `middle_name`, `phone` FROM `users` where id=".$value_pole;
$qUser = $this->db->query($sqlUser);
$rUser = $this->db->fetch_assoc($qUser);
$sobstv = trim($rUser['last_name'] . ' ' . $rUser['first_name'] . ' ' . $rUser['middle_name']);
if ($_SESSION['agency']) {
$sobstv = $sobstv . ", агентство " . $rUser['agency_name'];
} else {
$agency = new User;
$agency->get($value_pole);
if (isset($agency->agencyName)) {
$sobstv = trim($rUser['last_name'] . ' ' . $rUser['first_name'] . ' ' . $rUser['middle_name']) . ", агентство " . $agency->agencyName;
} else {
$sobstv = trim($rUser['last_name'] . ' ' . $rUser['first_name'] . ' ' . $rUser['middle_name']);
}
}
//Передача объекта
$sql_up = "UPDATE objects SET id_add_user = '".$value_pole."', phone='".$rUser['phone']."', sobstv='".$sobstv."' WHERE id = ".$req['object_id'];
//echo $sql_up;
$this->db->query($sql_up);
$sql_sph = "UPDATE objects SET id_add_user = {$value_pole} WHERE id = ".$req['object_id'];
$db_sphinx->query($sql_sph);
}
}
}
}
}
break;
}
case 'new_doers':{
if(!$is_open_step)
{
if($pole_prev->is_new_doers > 0){
if(!empty($value_pole)){
$doers = array();
$doers_confirm = $req['doers_confirm'];
//$doer_clients = $req['doer_clients'];
if(!empty($req['doers'])){
$doers = json_decode(htmlspecialchars_decode($req['doers']), true);
}
foreach($value_pole as $doer_id){
if(!isset($doers[$doer_id]) && $doer_id != $req['who_work']){
$doers_confirm = 0;
$doers[$doer_id] = 0;
$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `dop_text`, `event`) VALUES ({$req['who_work']}, {$reqId}, {$doer_id}, '(автоматически при переходе на этап)','transmitted_parallel')";
$this->db->query($sql_conf);
}
}
if(!empty($doers)){
$sql_up_doer = "UPDATE requisitions SET doers_confirm = {$doers_confirm}, doers = '". clearInputElement(json_encode($doers))."' WHERE id = ".$reqId;
$this->db->query($sql_up_doer);
}
}
}
}
break;
}
case 'files_attach': {
if(!$is_open_step){
if(!empty($value_pole)){
// var_dump($value_pole);
foreach($value_pole as $vp){
$sql_file = "SELECT * FROM files_steps_funnel_prev WHERE id = {$vp->id}";
$q_file = $this->db->query($sql_file);
while($r_file = $this->db->fetch_assoc($q_file)){
$patch_new = $_SERVER['DOCUMENT_ROOT']."/upload/reqs/".$reqId;
//echo $patch_new;
if(!file_exists($patch_new)){
mkdir($patch_new, 0777);
}
$patch = $_SERVER['DOCUMENT_ROOT']."/upload/funnels/prev_steps/".$r_file['funnel_id'];
$name = $r_file['guid'].'.'.$r_file['type'];
// Источник может быть только в Селектеле — локальную копию удаляет
// cron clearFunnelPrevStepFilesExistsInSelectel.php после заливки в облако.
$source_local = $patch."/".$name;
$source_cdn = "https://uf.joywork.ru/upload/funnels/prev_steps/".$r_file['funnel_id']."/".$name;
$source_content = false;
if (file_exists($source_local)) {
$source_content = @file_get_contents($source_local);
} else {
// Один HTTP-запрос вместо HEAD+GET. При 404/timeout — false.
$ctx = stream_context_create(['http' => ['timeout' => 15]]);
$source_content = @file_get_contents($source_cdn, false, $ctx);
if ($source_content === '') {
$source_content = false;
}
}
if ($source_content !== false) {
$name_new = md5(time().$name);
@file_put_contents($patch_new."/".$name_new.".".$r_file['type'], $source_content);
$sql_event_file = "INSERT INTO user_client_events SET req_id = {$reqId}, user_id = {$req['who_work']}, type = 'file', comment = '{$vp->comment}', from_id = {$req['who_work']}, open_step=1";
$this->db->query($sql_event_file);
$event_id = $this->db->insert_id();
$sql_in_file = "INSERT INTO clients_files (guid, req_id, type, name, event_id)
VALUES ('{$name_new}', '{$reqId}', '{$r_file['type']}', '{$r_file['name']}', '{$event_id}')";
$this->db->query($sql_in_file);
$client_file_id = $this->db->insert_id();
if(!empty($vp->name)){
$sql = "INSERT INTO names_client_files SET name = '{$vp->name}'";
$this->db->query($sql);
$id_name = $this->db->insert_id();
$sql = "UPDATE `clients_files` SET `name_id` = {$id_name} WHERE `id` = {$client_file_id}";
$this->db->query($sql);
}
$type = $r_file['type'];
//отправляем файл в Селектел (токен получаем один раз на все файлы этапа)
if (empty($token)) {
$token = SelectelApi::getNewToken();
}
$contType = "application/octet-stream";
if ($type) {
$type = strtolower($type);
}
if ($type === "doc") {
$contType = "application/msword";
}
if ($type === "docx") {
$contType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
}
if ($type === "xls") {
$contType = "application/vnd.ms-excel";
}
if ($type === "xlsx") {
$contType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
}
if ($type === "pdf") {
$contType = "application/pdf";
}
if ($type === "jpeg" || $type === "jpg") {
$contType = "image/jpeg";
}
if ($type === "gif") {
$contType = "image/gif";
}
if ($type === "png") {
$contType = "image/png";
}
if ($type === "mp3") {
$contType = "audio/mpeg";
}
if ($type === "zip") {
$contType = "application/zip";
}
if ($type === "rar") {
$contType = "application/vnd.rar";
}
$new_path = "/upload/reqs/". $reqId . "/" . $name_new . '.' . $type;
$r = SelectelApi::uploadUserFile($token, $patch_new."/".$name_new.".".$type, $new_path, $contType);
} else {
error_log("prev_step_event(req={$reqId}): files_attach source missing local={$source_local} cdn={$source_cdn}");
}
}
}
}
}
// $sql = "INSERT INTO clients_files (guid, req_id, type, name, event_id) VALUES ('{$name}', '{$req_id}', '{$type}', '{$_FILES['file']['name']}', '{$_SESSION['event_id_temp']}')";
break;
}
case 'list_users_select':{
if($pole_prev->is_mes > 0){
if(!empty($value_pole)){
$tempid = 0;
$users_mes = $value_pole;
$userId = (int)$_SESSION['id'];
$who_work = 0;
$user1 = $this->db->fetch_assoc($this->db->query("SELECT * FROM users WHERE id = {$userId}"));
$post = "Сотрудник";
if ($user1['agency'] == 1) {
$post = "Агенство";
} else if ($user1['manager'] == 1) {
$post = "Менеджер";
}
$text = "".$post . " " . trim($user1['last_name'] . ' ' . $user1['first_name'] . ' ' . $user1['middle_name'])."
перевел(а) заявку на этап «".$r['name']."» ";
if($is_open_step){
$text .= "(этап открыт повторно) ";
}
$who_work = $req['who_work'];
$text .= "
Заявка: ".$req['name']." ID: ".$req['id']."
";
$client_req = $this->db->fetch_assoc($this->db->query("SELECT * FROM clients WHERE id = {$req['client_id']}"));
// hide_client_contacts: уведомление уходит who_work — маскируем по нему.
$cl_fio_notif = should_hide_contacts_for_user_id($who_work) ? mask_fio_if_contains_phone($client_req['fio']) : $client_req['fio'];
$cl_phone_notif = should_hide_contacts_for_user_id($who_work) ? mask_client_phone($client_req['phone']) : $client_req['phone'];
$text .="Клиент: ".$cl_fio_notif." тел. ".$cl_phone_notif;
if($req['object_id'] > 0){
$obj = $this->db->fetch_assoc($this->db->query("SELECT id, adres, stoim, type, komnat FROM objects WHERE id = {$req['object_id']}"));
if($obj){
switch ($obj['type']) {
case 1:
if ($obj['komnat'] == 1 && $obj['studio_flag']) {
$type = "Квартира-студия";
} else {
$type = "$obj[komnat]-комнатная квартира";
}
break;
case 2:
$type = "Комната в $obj[komnat]-комнатной квартире";
break;
case 3:
$type = "$obj[komnat]-комнатный дом";
break;
case 4:
switch ($obj['type_category']){
case 1:
$type = "Офис";
break;
case 2:
$type = "Склад";
break;
case 3:
$type = "Торговая площадь";
break;
case 4:
$type = "Производство";
break;
case 5:
$type = "Помещение свободного назначения";
break;
case 6:
$type = "Здание";
break;
case 7:
$type = "Гараж";
break;
case 8:
$type = "Готовый бизнес";
break;
case 9:
$type = "Коммерческая земля";
break;
default: $type = "Помещение";
}
break;
case 5:
$type = "Часть дома";
break;
case 6:
$type = "Комплекс";
break;
case 7:
$type = "Участок";
break;
default:
$type = "$obj[komnat]-комнатная квартира";
}
$text .= '
Объект: ID:'.$obj['id'].' '.$obj['adres'].', '.$type.' '.$obj['stoim'];
}
}
if($req['deleted'] > 0){
$close = true;
}
}
$text = htmlspecialchars($text);
$userMes = array();
$send = 0;
if($close){
$tempid = time();
$send = 1;
}
// $user_id_mes = false;
foreach ($users_mes as $key => $user_id_mes_) {
unset($user_id_mes);
if ($users_mes[$key] === 'manager') {
$managerWhoWork = $this->db->fetch_assoc($this->db->query("SELECT * FROM users WHERE id = {$who_work}"));
$user_id_mes = $managerWhoWork['id_manager'];
} else if($users_mes[$key] == 0){
$user_id_mes = $who_work;
} else {
$user_id_mes = $user_id_mes_;
}
if(!in_array($user_id_mes, $userMes) && $user_id_mes != $_SESSION['id']){
$sqlMesIn = "INSERT INTO step_notify_closure SET user_id = {$user_id_mes}, from_id={$userId}, step_id={$stepId}, text='{$text}', send={$send}, temp_id={$tempid}";
$this->db->query($sqlMesIn);
$userMes[] = $user_id_mes;
}
}
}
break;
}
case 'adjacent_funnels':{
if(!$is_open_step){
if($pole_prev->is_adjacent_funnels > 0){
if(!empty($value_pole)){
$adjacent_funnels=$value_pole;
foreach($adjacent_funnels as $funnel){
$sql_a_f = "SELECT id FROM adjacent_funnels WHERE funnel_id = {$funnel} AND req_id = {$reqId}";
$row_a_f = $this->db->num_rows($this->db->query($sql_a_f));
if($row_a_f == 0){
$this->db->query("INSERT INTO adjacent_funnels (funnel_id, req_id, parent_funnel_id, parent_step_id) VALUES ({$funnel}, {$reqId}, {$req['funnel_id']}, {$req['step_id']})");
$comment = "Заявка переведена в смежную воронку ";
$sql_funnel = "SELECT name FROM funnel WHERE id = {$funnel}";
$nameFunnel = "«".$this->db->fetch_assoc($this->db->query($sql_funnel))['name']."»";
$comment = $comment.' '.$nameFunnel;
$sql_event_adj = "INSERT INTO user_client_events SET req_id = {$reqId}, user_id = {$req['who_work']}, type = 'comment', comment = '{$comment}', from_id = {$req['who_work']}, open_step=1";
$this->db->query($sql_event_adj);
}
}
}
}
}
break;
}
}
}
}
}
//Синхронизация с объктом для Реализации объекта
public function contractInObject($req_id, $object_id, $id_contract_obj = 0){
/* error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);*/
$objectId = (int)$object_id;
if($objectId > 0){
$sql = "SELECT * FROM contracts_req WHERE req_id = {$req_id}";
if($id_contract_obj > 0){
$sql .= " AND contract_object_id = {$id_contract_obj}";
}
$q = $this->db->query($sql);
if($this->db->num_rows($q)>0){
$params = array();
while($r = $this->db->fetch_assoc($q)){
$id = 0;
$sql_o = "SELECT id FROM contracts_object WHERE contract_req_id = {$r['id']}";
$q_o = $this->db->query($sql_o);
if($this->db->num_rows($q_o) > 0){
$r_o = $this->db->fetch_assoc($q_o);
$id = (int)$r_o['id'];
}
$params['id'] = $id;
$params['parent_id'] = (int)$objectId;
$params['parent_type'] = 'object';
$params['type'] = $r['type'];
$params['date_start'] = date("d.m.Y H:i:s", $r['date_start']);
$params['date_end'] = date("d.m.Y H:i:s", $r['date_end']);
$params['number'] = $r['number'];
$params['days_mes_end'] = $r['days'];
$params['no_mes_end'] = $r['send'];
$params['contract_req_id'] = (int)$r['id'];
$contractClass = new Contract($this->db);
$contractClass->setAgencyId($this->agencyId);
$id_oc = $contractClass->editAdd($params, true);
if($r['contract_object_id'] == 0 && $id_oc['id'] > 0){
$this->db->query("UPDATE contracts_req SET contract_object_id = {$id_oc['id']} WHERE id = {$r['id']}");
}
}
} else {
$sql = "SELECT * FROM contracts_object WHERE object_id = {$objectId}";
$q = $this->db->query($sql);
if($this->db->num_rows($q)>0){
$params = array();
while($r = $this->db->fetch_assoc($q)){
$id = 0;
$sql_o = "SELECT id FROM contracts_req WHERE contract_object_id = {$r['id']}";
$q_o = $this->db->query($sql_o);
if($this->db->num_rows($q_o) > 0){
$r_o = $this->db->fetch_assoc($q_o);
$id = (int)$r_o['id'];
}
$params['id'] = $id;
$params['parent_id'] = (int)$req_id;
$params['parent_type'] = 'req';
$params['type'] = $r['type'];
$params['date_start'] = date("d.m.Y H:i:s", $r['date_start']);
$params['date_end'] = date("d.m.Y H:i:s", $r['date_end']);
$params['number'] = $r['number'];
$params['days_mes_end'] = $r['days'];
$params['no_mes_end'] = $r['send'];
$params['contract_object_id'] = (int)$r['id'];
$contractClass = new Contract($this->db);
$contractClass->setAgencyId($this->agencyId);
$id_oc = $contractClass->editAdd($params, true);
if($r['contract_req_id'] == 0 && $id_oc['id'] > 0){
$this->db->query("UPDATE contracts_object SET contract_req_id = {$id_oc['id']} WHERE id = {$r['id']}");
}
}
}
}
}
}
//Тип недвижимости
public function check_property_type($object_id){
$type_id = 0;
$object = $this->db->fetch_assoc($this->db->query("SELECT * FROM objects WHERE id = {$object_id}"));
if(isset($object['id'])){
switch ($object['type']) {
case 1:
{
$type_id = 10;
if($object['komnat'] == 1){
$type_id = 1;
} else if($object['komnat'] == 2){
$type_id = 2;
} else if($object['komnat'] == 3){
$type_id = 3;
} else if($object['komnat'] == 4){
$type_id = 4;
} else if($object['komnat'] > 4){
$type_id = 5;
}
if($object['studio_flag'] == 1){
$type_id = 11;
}
break;
}
case 2:
$type_id = 12;
break;
case 3: {
$type_id = 13;
$sqlAddInfo = "SELECT object_id, house_category FROM objects_additional_information WHERE object_id = {$object['id']}";
$qAddInfo = $this->db->query($sqlAddInfo);
$rAddInfo = $this->db->fetch_assoc($qAddInfo);
if(isset($rAddInfo['object_id'])){
if($rAddInfo['house_category'] == 1){
$type_id = 14;
} else if($rAddInfo['house_category'] == 2){
$type_id = 15;
} else if($rAddInfo['house_category'] == 3){
$type_id = 16;
}
}
break;
}
case 4:
$type_id = 23;
if($object['type_category'] == 1){
$type_id = 19;
} else if($object['type_category'] == 2){
$type_id = 20;
} else if($object['type_category'] == 3){
$type_id = 21;
} else if($object['type_category'] == 4){
$type_id = 22;
} else if($object['type_category'] == 6){
$type_id = 24;
} else if($object['type_category'] == 7){
$type_id = 25;
} else if($object['type_category'] == 8){
$type_id = 26;
} else if($object['type_category'] == 9){
$type_id = 27;
}
break;
case 5:
$type_id = 17;
break;
case 6:
$type_id = 23;
break;
case 7:
$type_id = 18;
break;
}
}
return $type_id;
}
//Фильтр
public function get_filtr($user_id, $funnel_id){
$result['search'] = '';
$result['stages'] = array('work'=>1, 'hot'=>0, 'close'=>0, 'hit'=>0, 'ahency'=>0, 'confirm'=>0, 'send'=>0);
if($funnel_id == 'all'){
$sqlt = "SELECT count(*) as total from requisitions WHERE 1 AND deleted=0 AND (who_work = ".$user_id.") AND `confirm` = 0 AND (user_id=$user_id or who_work=$user_id)";
} else {
$sqlt = "SELECT count(*) as total from requisitions WHERE 1 AND funnel_id in ($funnel_id) AND deleted=0 AND (who_work = ".$user_id.") AND `confirm` = 0 AND (user_id=$user_id or who_work=$user_id)";
}
$qt = $this->db->query($sqlt);
$totalt = (int)$this->db->fetch_assoc($qt)['total'];
$result['confirm'] = $totalt;
if($funnel_id == 'all'){
$sqlt = "SELECT count(*) as total from requisitions WHERE 1 AND deleted=0 AND (who_work <> ".$user_id.") AND `confirm` = 0 AND (user_id=$user_id or who_work=$user_id)";
} else {
$sqlt = "SELECT count(*) as total from requisitions WHERE 1 AND funnel_id in ($funnel_id) AND deleted=0 AND (who_work <> ".$user_id.") AND `confirm` = 0 AND (user_id=$user_id or who_work=$user_id)";
}
$qt = $this->db->query($sqlt);
$totalt = (int)$this->db->fetch_assoc($qt)['total'];
$result['send'] = $totalt;
$result['emp'] = array();
$result['type'] = array();
$result['step'] = array();
$result['priority'] = array(1=>0, 2=>0, 3=>0, 4=>0);
$result['object_id'] = '';
$result['is_tasks'] = false;
$result['noTasks'] = false;
$result['todayTasks'] = false;
$result['overTasks'] = false;
$result['period'] = 'all';
$result['onDate'] = '';
$result['offDate'] = '';
$result['denial'] = array();
$result['activities'] = array();
$result['order'] = 0;
$result['isPartner'] = false;
$result['is_deal'] = false;
$result['source'] = -1;
$result['employee_id'] = -1;
$result['fields'] = array();
return $result;
}
//Для периодов
function getPeriod($period, $onDate=null, $offDate = null){
$mounthArrray = [ "Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь" ];
$treplace = array (
"Январь" => "января",
"Февраль" => "февраля",
"Март" => "марта",
"Апрель" => "апреля",
"Май" => "мая",
"Июнь" => "июня",
"Июль" => "июля",
"Август" => "августа",
"Сентябрь" => "сентября",
"Октябрь" => "октября",
"Ноябрь" => "ноября",
"Декабрь" => "декабря");
$months = array(1,2,3,4,5,6,7,8,9,10,11,12);
$years = array();
$firstDay = '';
$lastDay = '';
$totalDays = 365;
$readPeriod = '';
$diffDays = 0;
$firstNameMonth = $lastNameMonth = $nameMonth = '';
$years[] = date('Y');
$date_between = "between '1970-01-01 00:00:00' AND '3000-12-31 23:59:59'";
$dateStart = "1970-01-01 00:00:00";
$dateEnd = "3000-12-31 23:59:59";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '1970-01-01 00:00:00' AND '3000-12-31 23:59:59'";
if($period == 'period') $period = 'dates';
switch ($period){
case 'today': {
$months = array();
$months[] = (int)date('m');
$firstDay = date('d');
$totalDays = cal_days_in_month(CAL_GREGORIAN, (int)date('m'), date('Y'));
$readPeriod = $mounthArrray[(int)date('m') - 1].' '.date('Y').' года';
$datetime1 = new DateTime(date('Y-m-d'));
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->d;
$lastDay = $totalDays;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$firstNameMonth = $lastNameMonth = $nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$date_between = "between '".date("Y-m-d")." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date("Y-m-d")." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$dateStart = date("Y-m-d")." 00:00:00";
$dateEnd = date("Y-m-d")." 23:59:59";
break;
}
case 'month': {
$months = array();
$months[] = (int)date('m');
$firstDay = '01';
$totalDays = cal_days_in_month(CAL_GREGORIAN, (int)date('m'), date('Y'));
$readPeriod = $mounthArrray[(int)date('m') - 1].' '.date('Y').' года';
$datetime1 = new DateTime(date('Y').'-'.date('m').'-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->d;
$lastDay = $totalDays;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$firstNameMonth = $lastNameMonth = $nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$date_between = "between '".date('Y')."-".date('m')."-01 00:00:00' AND '".date('Y')."-".date('m')."-".$lastDay." 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-".date('m')."-01 00:00:00' AND '".date('Y')."-".date('m')."-".$lastDay." 23:59:59'";
$dateStart = date('Y')."-".date('m')."-01 00:00:00";
$dateEnd = date('Y')."-".date('m')."-".$lastDay." 23:59:59";
break;
}
case 'quarter' : {
$nowMounth = (int)date('m');
if ($nowMounth < 4) {
$months = array();
$months[] = 1;
$months[] = 2;
$months[] = 3;
$years[] = date('Y');
$firstDay = '01';
$lastDay = '31';
$firstNameMonth = $treplace[$mounthArrray[0]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[2]];
$datetime1 = new DateTime(date('Y').'-01-01');
$datetime2 = new DateTime(date('Y').'-03-31');
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date('Y').'-01-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$date_between = "between '".date('Y')."-01-01 00:00:00' AND '".date('Y')."-03-31 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-01-01 00:00:00' AND '".date('Y')."-03-31 23:59:59'";
$dateStart = date('Y')."-01-01 00:00:00";
$dateEnd = date('Y')."-03-31 23:59:59";
} else if($nowMounth >= 4 && $nowMounth < 7){
$months = array();
$months[] = 4;
$months[] = 5;
$months[] = 6;
$years[] = date('Y');
$firstDay = '01';
$lastDay = '30';
$firstNameMonth = $treplace[$mounthArrray[3]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[5]];
$datetime1 = new DateTime(date('Y').'-04-01');
$datetime2 = new DateTime(date('Y').'-06-30');
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date('Y').'-04-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$date_between = "between '".date('Y')."-04-01 00:00:00' AND '".date('Y')."-06-30 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-04-01 00:00:00' AND '".date('Y')."-06-30 23:59:59'";
$dateStart = date('Y')."-04-01 00:00:00";
$dateEnd = date('Y')."-06-30 23:59:59";
} else if ($nowMounth >= 7 && $nowMounth < 10){
$months = array();
$months[] = 7;
$months[] = 8;
$months[] = 9;
$years[] = date('Y');
$firstDay = '01';
$lastDay = '30';
$firstNameMonth = $treplace[$mounthArrray[6]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[8]];
$datetime1 = new DateTime(date('Y').'-07-01');
$datetime2 = new DateTime(date('Y').'-09-30');
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date('Y').'-07-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$date_between = "between '".date('Y')."-07-01 00:00:00' AND '".date('Y')."-09-30 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-07-01 00:00:00' AND '".date('Y')."-09-30 23:59:59'";
$dateStart = date('Y')."-07-01 00:00:00";
$dateEnd = date('Y')."-09-30 23:59:59";
} else if ($nowMounth >= 10 && $nowMounth < 13){
$months = array();
$months[] = 10;
$months[] = 11;
$months[] = 12;
$years[] = date('Y');
$firstDay = '01';
$lastDay = '31';
$firstNameMonth = $treplace[$mounthArrray[9]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[11]];
$readPeriod = 'c '.$firstDay.' '.$firstNameMonth. ' по ' . $lastDay . ' ' .$lastNameMonth;
$datetime1 = new DateTime(date('Y').'-10-01');
$datetime2 = new DateTime(date('Y').'-12-31');
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date('Y').'-10-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$date_between = "between '".date('Y')."-10-01 00:00:00' AND '".date('Y')."-12-31 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-10-01 00:00:00' AND '".date('Y')."-12-31 23:59:59'";
$dateStart = date('Y')."-10-01 00:00:00";
$dateEnd = date('Y')."-12-31 23:59:59";
}
break;
}
case 'week': {
$months = array();
$months[] = (int)date('m');
$years = array();
$years[] = date('Y');
$firstDay = date("d", strtotime("monday this week"));
$lastDay = date("d", strtotime("sunday this week"));
$firstNameMonth = $treplace[$mounthArrray[(int)date("m", strtotime("monday this week")) - 1]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[(int)date("m", strtotime("sunday this week")) - 1]];
$readPeriod = 'c '.$firstDay.' '.$firstNameMonth. ' по ' . $lastDay . ' ' .$lastNameMonth;
$datetime1 = new DateTime(date("Y-m-d", strtotime("monday this week")));
$datetime2 = new DateTime(date("Y-m-d", strtotime("sunday this week")));
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date("Y-m-d", strtotime("monday this week")));
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$date_between = "between '".date("Y-m-d 00:00:00", strtotime("monday this week"))."' AND '".date("Y-m-d 23:59:59", strtotime("sunday this week"))."'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date("Y-m-d 00:00:00", strtotime("monday this week"))."' AND '".date("Y-m-d 23:59:59", strtotime("sunday this week"))."'";
$dateStart = date("Y-m-d 00:00:00", strtotime("monday this week"));
$dateEnd = date("Y-m-d 23:59:59", strtotime("sunday this week"));
break;
}
case 'dates' : {
if(empty($offDate)) $offDate = date('Y-m-d 23:59:59');
$months = array();
$years = array();
$months[] = date("m", strtotime($onDate));
$months[] = date("m", strtotime($offDate));
$years[] = date("Y", strtotime($onDate));
$years[] = date("Y", strtotime($offDate));
$firstDay = date("d", strtotime($onDate));
$lastDay = date("d", strtotime($offDate));
$firstNameMonth = $treplace[$mounthArrray[(int)date("m", strtotime($onDate)) - 1]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[(int)date("m", strtotime($offDate)) - 1]];
$readPeriod = 'c '.$firstDay.' '.$firstNameMonth. ' по ' . $lastDay . ' ' .$lastNameMonth;
$datetime1 = new DateTime(date("Y-m-d", strtotime($onDate)));
$datetime2 = new DateTime(date("Y-m-d", strtotime($offDate)));
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date("Y-m-d", strtotime($onDate)));
$datetime2 = new DateTime(date('Y-m-d'));
if($datetime1 < $datetime2){
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
}
$procentDays = 0;
$date_between = "between '".date("Y-m-d 00:00:00", strtotime($onDate))."' AND '".date("Y-m-d 23:59:59", strtotime($offDate))."'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date("Y-m-d 00:00:00", strtotime($onDate))."' AND '".date("Y-m-d 23:59:59", strtotime($offDate))."'";
$dateStart = date("Y-m-d 00:00:00", strtotime($onDate));
$dateEnd = date("Y-m-d 23:59:59", strtotime($offDate));
break;
} case '30days': {
$months = array();
$months[] = (int)date('m');
$firstDay = date('d');
$totalDays = 30;
$datetime1 = new DateTime(date('Y-m-d', strtotime('-30 day')));
$readPeriod = $mounthArrray[(int)date('m') - 1].' '.date('Y').' года';
//$datetime1 = new DateTime(date('Y-m-d'));
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->d;
$lastDay = $totalDays;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$firstNameMonth = $lastNameMonth = $nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$date_between = "between '".date('Y-m-d', strtotime('-30 day'))." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y-m-d', strtotime('-30 day'))." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$dateStart = date('Y-m-d', strtotime('-30 day'))." 00:00:00";
$dateEnd = date("Y-m-d")." 23:59:59";
break;
} case '90days': {
$months = array();
$months[] = (int)date('m');
$firstDay = date('d');
$totalDays = 90;
$datetime1 = new DateTime(date('Y-m-d', strtotime('-30 day')));
$readPeriod = $mounthArrray[(int)date('m') - 1].' '.date('Y').' года';
//$datetime1 = new DateTime(date('Y-m-d'));
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->d;
$lastDay = $totalDays;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$firstNameMonth = $lastNameMonth = $nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$date_between = "between '".date('Y-m-d', strtotime('-90 day'))." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y-m-d', strtotime('-90 day'))." 00:00:00' AND '".date("Y-m-d")." 23:59:59'";
$dateStart = date('Y-m-d', strtotime('-90 day'))." 00:00:00";
$dateEnd = date("Y-m-d")." 23:59:59";
break;
}
default: {
$firstDay = '01';
$lastDay = '31';
$firstNameMonth = $treplace[$mounthArrray[0]];
$nameMonth = $treplace[$mounthArrray[(int)date('m') - 1]];
$lastNameMonth = $treplace[$mounthArrray[11]];
$readPeriod = date('Y').' год';
$datetime1 = new DateTime(date('Y').'-01-01');
$datetime2 = new DateTime(date('Y').'-12-31');
$difference = $datetime1->diff($datetime2);
$totalDays = $difference->days + 1;
$datetime1 = new DateTime(date('Y').'-01-01');
$datetime2 = new DateTime(date('Y-m-d'));
$difference = $datetime1->diff($datetime2);
$diffDays = $difference->days;
$procentDays = (int)(($diffDays/$totalDays) * 100);
$whereTasks = " and DATE_FORMAT(schedule_date, '%Y-%m-%d %H:%i:%s') between '".date('Y')."-01-01 00:00:00' AND '".date('Y')."-12-31 23:59:59'";
$dateStart = date('Y')."-01-01 00:00:00";
$dateEnd = date('Y')."-12-31 23:59:59";
break;
}
}
$result = array('between'=>$date_between, 'whereTasks'=>$whereTasks, 'dateStart'=>$dateStart, 'dateEnd'=>$dateEnd);
return $result;
}
//Список доступных юзеров
public function getIdsUsers($user_id){
if((int)$user_id == 0) die();
$usersIds = array();
$search_user_id = (int)$user_id;
$usersIds[] = $search_user_id;
$sql = "SELECT * FROM users WHERE id = {$user_id}";
$q = $this->db->query($sql, true);
$user = $this->db->fetch_assoc($q);
if($user['role_id'] > 0){
$dep = new Department();
$res = $dep->getDepartment($user_id);
//var_dump($res);
if($res['role'] == 'manager_office' || $res['role'] == 'manager_office_menager' || $res['role'] == 'user_admin'){
$search_user_id = (int)$res['admin'];
}
//manager_office_menager
}
$sql_user = "SELECT id from users WHERE id in (select id from users where id={$search_user_id} or id_manager={$search_user_id} or id_manager in (select id from users where id_manager={$search_user_id} or id_manager in (select id from users where id_manager={$search_user_id})))";
if($_SESSION['id'] == 21444){
file_put_contents(__DIR__.'/log_req.txt', json_encode($res, JSON_UNESCAPED_UNICODE). "\n", FILE_APPEND);
file_put_contents(__DIR__.'/log_req.txt', $sql_user. "\n", FILE_APPEND);
}
$q_user = $this->db->query($sql_user, true);
while($r_user = $this->db->fetch_assoc($q_user)){
if(!in_array((int)$r_user['id'], $usersIds)){
$usersIds[] = (int)$r_user['id'];
}
}
$this->userIdsWork = $usersIds;
return $usersIds;
}
public function update_reservation_is_interrupted($req_id, $bool = true)
{
$sql = "UPDATE `requisitions` SET `is_interrupted` = $bool WHERE id = $req_id";
try {
$this->db->query($sql);
return ['status' => true];
} catch (\Throwable $th) {
return ['status' => false];
}
}
/**
* Поиск заявок для объединения
*/
public function get_union_reqs($reqs){
/* ini_set('display_errors', 1);
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);*/
$result = array();
if($this->user_id > 0 && $this->agencyId > 0 && !empty($reqs)){
$usersIds = array();
$webHookIn = new WebHookIn();
$usersIds = $webHookIn->getAllUserAgency($this->agencyId);
if(!empty($usersIds)){
$types = [0, 1, 3];
$sql_type = "SELECT id FROM requisitions_type WHERE heir in (1,3) AND agency_id = {$this->agencyId}";
$q_type = $this->db->query($sql_type, true);
while($r_type = $this->db->fetch_assoc($q_type)){
$types[] = (int)$r_type['id'];
}
$sql = "SELECT * FROM requisitions WHERE user_id in (".implode(',', $usersIds).") AND type_id in (".implode(',', $types).") AND deleted=0 AND cancel=0 AND confirm=1";
//echo $sql;
$q = $this->db->query($sql, true);
while($r = $this->db->fetch_assoc($q)){
foreach($reqs as $key => $req){
if((int)$req->id != (int)$r['id'] && $req->type_id != 2 && $req->type_id != 4 && $req->heir_type != 4 && $req->heir_type != 2){
if($req->who_work == $r['who_work'] && $req->client_id == $r['client_id']){
$result[$key][] = (int)$r['id'];
}
}
}
}
}
}
return $result;
}
/**
* Сохранение объединения заявок
*/
public function save_union_reqs($reqs, $main_id){
/* ini_set('display_errors', 1);
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE);*/
$result = array();
$done = false;
if($this->user_id > 0 && $main_id > 0 && !empty($reqs)){
$req_main = $this->get_req_main($main_id);
$reqs = array_unique($reqs);
$comments = $this->get_comment_reqs($reqs);
$dop_text = "Присоединены заявки c ID: ".implode(', ', $reqs);
if($req_main['who_work'] > 0){
$in_ev = "INSERT INTO `events_clients` (`user_id`, `from_id`, `req_id`, `event`, `dop_text`, `read`, send_telegramm) VALUES ('{$this->user_id}', '{$req_main['who_work']}', '$main_id', 'update', '{$dop_text}', 1, 1)";
$dop_text2 = "Основная заявка ID: ".$main_id;
if(!empty($req_main['name_activity2'])){
$dop_text2 .= ' по '.$req_main['name_activity2'];
}
$dop_text2 .= '
К ней добавлена заявка:
';
if(isset($comments['text2']) && !empty($comments['text2'])){
$dop_text2 .= $comments['text2'];
}
$in_ev2 = "INSERT INTO `events_clients` (`user_id`, `from_id`, `req_id`, `event`, `dop_text`, `read`, is_not_show) VALUES ('{$this->user_id}', '{$req_main['who_work']}', '$main_id', 'union', '{$dop_text2}', 1, 1)";
} else {
$in_ev = "INSERT INTO `events_clients` (`user_id`, `req_id`, `event`, `dop_text`, `read`) VALUES ('{$this->user_id}', '$main_id', 'update', '{$dop_text}', 1)";
}//$in_ev = "INSERT INTO `events_clients` (`user_id`, `req_id`, `event`, `dop_text`, `read`) VALUES ('{$this->user_id}', '$main_id', 'union', '{$dop_text}', 0)";
if(!empty($comments['comment'])){
$in_comment = "INSERT INTO `user_client_events` (`user_id`, `req_id`, `type`, `comment`) VALUES ('{$this->user_id}', {$main_id}, 'comment' ,'{$comments['comment']}')";
$q_comment = $this->db->query($in_comment);
}
//переносим события
foreach($reqs as $req_id){
$sql_ev = "SELECT * FROM user_client_events WHERE req_id = {$req_id} AND type != 'file'";
$q_ev = $this->db->query($sql_ev, true);
$sql = "INSERT INTO `user_client_events` (`user_id`, `client_id`, `req_id`, `old_req_id`, `create_date`, `type`, `checklist`, `address`, `sum`, `document_id`, `name`, `schedule_date_to`, `schedule_date`, `comment`, `calendar_view`, `from_id`, `partner_id`, `tracking`, `tel`, `mango`, `megafon`, `telphin`, `beeline`, `mts`, `tele2`, `allo`, `open_step`, `record`, `cancel`) VALUE ";
$key_req = 0;
while($r_ev = $this->db->fetch_assoc($q_ev)){
if($key_req == 5){
$this->db->query($sql, true);
$key_req = 0;
$sql = "INSERT INTO `user_client_events` (`user_id`, `client_id`, `req_id`, `old_req_id`, `create_date`, `type`, `checklist`, `address`, `sum`, `document_id`, `name`, `schedule_date_to`, `schedule_date`, `comment`, `calendar_view`, `from_id`, `partner_id`, `tracking`, `tel`, `mango`, `megafon`, `telphin`, `beeline`, `mts`, `tele2`, `allo`, `open_step`, `record`, `cancel`) VALUE ";
}
if($key_req > 0) $sql .= ", ";
if($r_ev['calendar_view'] == 1 || $r_ev['cancel'] == 1 || $r_ev['type'] == 'comment')
$sql .= "($r_ev[user_id], $r_ev[client_id], {$main_id}, $r_ev[req_id], '$r_ev[create_date]', '$r_ev[type]', '$r_ev[checklist]', '$r_ev[address]', '$r_ev[sum]', '$r_ev[document_id]', '$r_ev[name]', '$r_ev[schedule_date_to]', '$r_ev[schedule_date]', '$r_ev[comment]', '$r_ev[calendar_view]', '$r_ev[from_id]', '$r_ev[partner_id]', '$r_ev[tracking]', '$r_ev[tel]', '$r_ev[mango]', '$r_ev[megafon]', '$r_ev[telphin]', '$r_ev[beeline]', '$r_ev[mts]', '$r_ev[tele2]', '$r_ev[allo]', '$r_ev[open_step]', '$r_ev[record]', '$r_ev[cancel]')";
else
$sql .= "({$this->user_id}, $r_ev[client_id], {$main_id}, $r_ev[req_id], '$r_ev[create_date]', '$r_ev[type]', '$r_ev[checklist]', '$r_ev[address]', '$r_ev[sum]', '$r_ev[document_id]', '$r_ev[name]', '$r_ev[schedule_date_to]', '$r_ev[schedule_date]', '$r_ev[comment]', '$r_ev[calendar_view]', {$this->user_id}, '$r_ev[partner_id]', '$r_ev[tracking]', '$r_ev[tel]', '$r_ev[mango]', '$r_ev[megafon]', '$r_ev[telphin]', '$r_ev[beeline]', '$r_ev[mts]', '$r_ev[tele2]', '$r_ev[allo]', '$r_ev[open_step]', '$r_ev[record]', '$r_ev[cancel]')";
$key_req++;
}
if($key_req > 0){
$this->db->query($sql, true);
}
}
//Объединение тегов
$all_reqs_ids = $reqs;
$all_reqs_ids[] = $main_id;
$all_tags = array();
if(!empty($all_reqs_ids)){
$sql_ak = "SELECT * FROM requisitions_activities WHERE req_id in (".implode(',',$all_reqs_ids).")";
$q_ak = $this->db->query($sql_ak);
while($r_ak = $this->db->fetch_assoc($q_ak)){
if(!in_array((int)$r_ak['activity_id'], $all_tags))
$all_tags[] = (int)$r_ak['activity_id'];
}
$all_tags = array_unique($all_tags);
if(!empty($all_tags)){
$this->db->query("DELETE FROM requisitions_activities WHERE req_id = {$main_id}");
$sql_ak_in = "INSERT INTO requisitions_activities (`req_id`, `activity_id`) VALUES ";
$key_tag = 0;
foreach($all_tags as $tag){
if ($key_tag > 0) $sql_ak_in .= ", ";
$sql_ak_in .= "({$main_id}, {$tag})";
$key_tag++;
}
if($key_tag > 0){
$this->db->query($sql_ak_in);
}
}
}
// if($this->db->query($sql, true)){
// $done = true;
if(!$this->db->query($in_ev, true))
$done = false;
else {
if(isset($in_ev2)){
$this->db->query($in_ev2, true);
}
if(isset($in_ev3)){
$this->db->query($in_ev3, true);
}
$sql_req = "UPDATE requisitions SET cancel=1 WHERE id in (".implode(',', $reqs).")";
if(!$this->db->query($sql_req, true)){
$done = false;
} else {
$sql_in_union = "INSERT INTO union_requisitions (`main_id`, `req_id`, `user_id`, `agency_id`) VALUES ";
foreach($reqs as $key => $req_id){
if($key > 0) $sql_in_union .= ", ";
$sql_in_union .= "({$main_id}, {$req_id}, {$this->user_id}, {$this->agencyId})";
}
if(!$this->db->query($sql_in_union)){
$done = false;
}
//Отправка уведомления менеджеру
$this->check_mesages($req_main, $comments);
//Объединение файлов
$sql_file = "SELECT *, fc.type as type_file, fc.guid, fc.id as file_id, uc.id as event_id FROM `user_client_events` as uc LEFT JOIN clients_files as fc ON uc.id=fc.event_id WHERE uc.type = 'file' AND uc.req_id in (".implode(',', $reqs).")";
//echo $sql_file."\n";
$q_file = $this->db->query($sql_file, true);
while($r_file = $this->db->fetch_assoc($q_file)){
$sql_in_file = "INSERT INTO `user_client_events` (`user_id`, `client_id`, `req_id`, `old_req_id`, `create_date`, `type`, `checklist`, `address`, `sum`, `document_id`, `name`, `schedule_date_to`, `schedule_date`, `comment`, `calendar_view`, `from_id`, `partner_id`, `tracking`, `tel`, `mango`, `megafon`, `telphin`, `beeline`, `mts`, `tele2`, `allo`, `open_step`, `record`, `cancel`)
SELECT `user_id`, `client_id`, {$main_id}, {$r_file['req_id']}, `create_date`, `type`, `checklist`, `address`, `sum`, `document_id`, `name`, `schedule_date_to`, `schedule_date`, `comment`, `calendar_view`, `from_id`, `partner_id`, `tracking`, `tel`, `mango`, `megafon`, `telphin`, `beeline`, `mts`, `tele2`, `allo`, `open_step`, `record`, `cancel`
FROM `user_client_events` WHERE id = {$r_file['event_id']}";
$this->db->query($sql_in_file, true);
$event_id = $this->db->insert_id();
$sql_cl_file = "INSERT INTO `clients_files`(`guid`, `funnel_id`, `etap_id`, `type`, `name`, `event_id`, `req_id`, `name_id`)
SELECT `guid`, `funnel_id`, `etap_id`, `type`, `name`, {$event_id}, {$main_id}, `name_id` FROM `clients_files` WHERE id = {$r_file['file_id']}";
//echo $sql_cl_file."\n";
$this->db->query($sql_cl_file, true);
$path = $_SERVER['DOCUMENT_ROOT']."/upload/reqs/".$main_id;
if(!file_exists($path)){
mkdir($path, 0777);
}
$old_path = $_SERVER['DOCUMENT_ROOT']."/upload/reqs/".$r_file['req_id'];
$name = $r_file['guid'].'.'.$r_file['type_file'];
//echo $path."/".$name."\n";
if(!file_exists($path."/".$name) && file_exists($old_path."/".$name)){
if(!copy($old_path."/".$name, $path."/".$name)){
$done = false;
} else {
$type = $r_file['type_file'];
//отпарвляем файл в Селектел
$token = SelectelApi::getNewToken();
$contType = "application/octet-stream";
if ($type) {
$type = strtolower($type);
}
if ($type === "doc") {
$contType = "application/msword";
}
if ($type === "docx") {
$contType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
}
if ($type === "xls") {
$contType = "application/vnd.ms-excel";
}
if ($type === "xlsx") {
$contType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
}
if ($type === "pdf") {
$contType = "application/pdf";
}
if ($type === "jpeg" || $type === "jpg") {
$contType = "image/jpeg";
}
if ($type === "gif") {
$contType = "image/gif";
}
if ($type === "png") {
$contType = "image/png";
}
if ($type === "mp3") {
$contType = "audio/mpeg";
}
if ($type === "zip") {
$contType = "application/zip";
}
if ($type === "rar") {
$contType = "application/vnd.rar";
}
$new_path = "/upload/reqs/". $main_id . "/" . $name;
// echo $new_path."\n";
$r = SelectelApi::uploadUserFile($token, $path . "/" . $name, $new_path, $contType);
//var_dump($r);
}
}
}
}
}
}
$result['done'] = $done;
return $result;
}
/**
* Автоматическое объединение заявок
*/
public function autoUnitReq($rang, $reqs) {
//echo $this->agencyId." ".$this->user_id ." ". is_numeric($rang)." ".!empty($reqs);
//var_dump(($this->agencyId && $this->user_id && is_numeric($rang) && !empty($reqs)));
if($this->agencyId && $this->user_id && is_numeric($rang) && !empty($reqs)){
if($this->agencyId == 19895){
switch($rang){
case -1: { //Все закрытые. Главная, которая создана последней
$this->union_closes_req($reqs);
break;
}
case 0: { //общие с закрытыми
$this->union_general_req($reqs);
break;
}
case 1 : { //Активные
$this->union_active_req($reqs);
break;
}
}
}
}
}
/**
*
*/
private function get_req_main($req_id){
$sql = "SELECT * FROM requisitions as req WHERE id = {$req_id}";
$q = $this->db->query($sql, true);
$req_main = $this->db->fetch_assoc($q);
$req_main['name_activity'] = '';
$req_main['name_activity2'] = '';
$sql_a = "SELECT *, (SELECT name FROM activities WHERE activities.id = requisitions_activities.activity_id) as name FROM requisitions_activities WHERE req_id = {$req_id}";
$activites_name = [];
$q_a = $this->db->query($sql_a, true);
while($r_a = $this->db->fetch_assoc($q_a)){
if($req_main['name_activity'] == ''){
$req_main['name_activity'] = $r_a['name'];
}
if(count($activites_name) < 2){
$activites_name[] = $r_a['name'];
}
}
if(!empty($activites_name)){
$req_main['name_activity2'] = implode(', ',$activites_name);
}
return $req_main;
}
/**
* Формирование комментария с ответсвенным и тегами
*/
private function get_comment_reqs($reqs){
$comments['comment'] = '';
$comments['text'] = '';
$comments['text2'] = '';
if(!empty($reqs)){
$arr_name_activities = array();
$arr_name_first_activity = array();
$arr_name_two_activity = array();
$sql_a = "SELECT *, (SELECT name FROM activities WHERE activities.id = requisitions_activities.activity_id) as name FROM requisitions_activities WHERE req_id in (".implode(',', $reqs).")";
$q_a = $this->db->query($sql_a);
while($r_a = $this->db->fetch_assoc($q_a)){
if(!isset($arr_name_activities[$r_a['req_id']])) $arr_name_activities[$r_a['req_id']] = '';
if($arr_name_activities[$r_a['req_id']] != '') $arr_name_activities[$r_a['req_id']] .= ', ';
$arr_name_activities[$r_a['req_id']] .= $r_a['name'];
if(!isset($arr_name_first_activity[$r_a['req_id']])) $arr_name_first_activity[$r_a['req_id']] = $r_a['name'];
if(!isset($arr_name_two_activity[$r_a['req_id']])) $arr_name_two_activity[$r_a['req_id']] = [];
if(count($arr_name_two_activity[$r_a['req_id']]) < 2) $arr_name_two_activity[$r_a['req_id']][] = $r_a['name'];
}
$sql = "SELECT *, if (who_work > 0, (SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) FROM users WHERE requisitions.who_work = users.id), (SELECT (SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) as fio FROM users WHERE events_clients.user_id = users.id) FROM events_clients WHERE requisitions.id = events_clients.req_id AND event = 'transmitted' order by id desc limit 1)) as fio FROM requisitions WHERE id in (".implode(',', $reqs).")";
$q = $this->db->query($sql);
$comments['comment'] .= "Присоединены следующие заявки
";
$k = 0;
while($r = $this->db->fetch_assoc($q)){
if($k > 0) {
$comments['comment'] .= "
";
$comments['text'] .= "
";
$comments['text2'] .= "
";
}
$fio = "из общих";
if(!empty($r['fio'])){
$fio = $r['fio'];
}
$comments['comment'] .= "ID: ".$r['id'];
$comments['comment'] .= "; ответственный: ".$fio;
if(isset($arr_name_activities[$r['id']])){
$comments['comment'] .= "; теги: ".$arr_name_activities[$r['id']];
}
$comments['text'] .= "ID: ".$r['id'];
$comments['text2'] .= "ID: ".$r['id'];
if(isset($arr_name_first_activity[$r['id']])){
$comments['text'] .= " по ".$arr_name_first_activity[$r['id']];
}
if(isset($arr_name_two_activity[$r['id']]) && !empty($arr_name_two_activity[$r['id']])){
$comments['text2'] .= " по ".implode(', ', $arr_name_two_activity[$r['id']]);
}
$k++;
}
}
return $comments;
}
/**
* Активные по клиенту и поиск самой старшей
*/
private function get_active_req($client_id){
$req_id = 0;
$sql = "SELECT * FROM requisitions WHERE client_id = {$client_id} AND deleted = 0 AND who_work <> 0 AND is_manual = 0 AND cancel = 0 order by created_at asc LIMIT 1";
$q = $this->db->query($sql, true);
$req = $this->db->fetch_assoc($q);
if($req && $req['id']){
$req_id = (int)$req['id'];
}
return $req_id;
}
/**
* Горячая по клиенту и ответственному
*/
private function get_hot_req($client_id, $who_work){
$req_id = 0;
}
/**
* Поиск тега Горячий
*/
private function get_hot_tag($req_id){
$result = false;
$hot_tag = 0;
if($this->agencyId > 0){
if($this->agencyId == 19895){
$hot_tag = 3039;
$enter_tag = 3043;
}
else if ($this->agencyId == 117){
$hot_tag = 3232;
} else if ($this->agencyId == 5238){
$hot_tag = 338;
}
}
if($hot_tag > 0 && $req_id > 0){
$sql = "SELECT * FROM requisitions_activities WHERE req_id = {$req_id} AND activity_id = {$hot_tag}";
$q = $this->db->query($sql);
if($this->db->num_rows($q) > 0){
$result = true;
}
}
return $result;
}
/**
* Объединение по рангу -1
*/
private function union_closes_req($reqs){
$main_id = 0;
$reqs_union = array();
//Определяем что с чем объединять
if(!empty($reqs)){
foreach($reqs as $req_id){
$req_main = $this->get_req_main($req_id);
$client_id = (int)$req_main['client_id'];
$who_work = (int)$req_main['who_work'];
//Поиск активной заявки и определение самой старой
$main_id = $this->get_active_req($client_id);
$sql = "SELECT * FROM requisitions WHERE client_id = {$client_id} AND ((deleted = 1 AND confirm = 1) OR (deleted = 0 AND who_work=0 AND confirm=0)) AND cancel = 0 order by created_at desc";
//echo $sql."\n";
$q = $this->db->query($sql, true);
$key = 0;
while($req = $this->db->fetch_assoc($q)){
// var_dump($req);
if($key == 0 && $main_id == 0){
$main_id = (int)$req['id'];
} else {
$reqs_union[] = (int)$req['id'];
}
$key++;
}
}
if(!empty($reqs_union) && $main_id > 0 && $who_work > 0){
$this->save_union_reqs($reqs_union, $main_id);
} else {
$req_main = $this->get_req_main($reqs[0]);
$this->check_mesages($req_main, [], 0);
}
}
}
/**
* Объединение по рангу 0
*/
private function union_general_req($reqs){
$main_id = 0;
$reqs_union = array();
//Определяем что с чем объединять
if(!empty($reqs)){
foreach($reqs as $req_id){
$req_main = $this->get_req_main($req_id);
$client_id = (int)$req_main['client_id'];
//Поиск активной заявки и определение самой старой
$main_id = $this->get_active_req($client_id);
$sql = "SELECT * FROM requisitions WHERE client_id = {$client_id} AND ((deleted = 1 AND confirm = 1) OR (deleted = 0 AND who_work=0 AND confirm=0)) AND cancel = 0 order by created_at desc";
$q = $this->db->query($sql, true);
$key = 0;
while($req = $this->db->fetch_assoc($q)){
if($req['who_work'] == 0 && $req['confirm'] == 0 && $main_id == 0){
$main_id = (int)$req['id'];
} else {
$reqs_union[] = (int)$req['id'];
}
$key++;
}
}
if(!empty($reqs_union) && $main_id > 0){
$this->save_union_reqs($reqs_union, $main_id);
} else {
$req_main = $this->get_req_main($reqs[0]);
$this->check_mesages($req_main, [], 0);
}
}
}
/**
* Объединение по активным
*/
private function union_active_req($req_id){
$main_id = 0;
$reqs_union = array();
$req_main = $this->get_req_main($req_id);
$is_rang_2 = false;
$is_rang_3 = false;
$client_id = (int)$req_main['client_id'];
if($req_main['who_work'] == 0 && $req_main['confirm'] == 0){ //Заявка общая объединяем по рангу 0
$this->union_general_req(array($req_id));
} else {
//ищем другие по ответственному
$hot_tag = 0;
$enter_tag = 0;
if($this->agencyId == 19895){
$hot_tag = 3039;
$enter_tag = 3043;
}
else if ($this->agencyId == 117){
$hot_tag = 3232;
$enter_tag = 3233;
} else if ($this->agencyId == 5238){
$hot_tag = 338;
}
$main_id = 0;
$reqs = array();
// if($hot_tag > 0){
$sql_hot = "SELECT *, (SELECT activity_id FROM requisitions_activities as ra WHERE ra.req_id = req.id AND activity_id = {$hot_tag} limit 1) as hot_tag";
if($enter_tag > 0){
$sql_hot .= ", (SELECT activity_id FROM requisitions_activities as ra WHERE ra.req_id = req.id AND activity_id = {$enter_tag} limit 1) as enter_tag";
}
$sql_hot .= " FROM requisitions as req WHERE client_id = {$client_id} AND who_work = {$req_main['who_work']} AND confirm = 1 AND deleted = 0 AND cancel = 0 AND is_manual = 0 order by created_at asc";
$q_hot = $this->db->query($sql_hot, true);
while ($r_hot = $this->db->fetch_assoc($q_hot)){
if($main_id == 0 && ($r_hot['hot_tag'] > 0 || $r_hot['enter_tag'] > 0)){
$main_id = (int)$r_hot['id'];
} else {
$reqs[] = (int)$r_hot['id'];
}
}
if($main_id > 0){ // Общие и удаленные
$sql = "SELECT * FROM requisitions WHERE client_id = {$client_id} AND ((deleted = 1 AND confirm = 1) OR (deleted = 0 AND who_work=0 AND confirm=0)) AND cancel = 0 order by created_at desc";
$q = $this->db->query($sql, true);
while($r = $this->db->fetch_assoc($q)){
$reqs[] = (int)$r['id'];
}
}
if($main_id > 0 && !empty($reqs)){
$this->save_union_reqs($reqs, $main_id);
} else {
$req_main = $this->get_req_main($req_id);
$this->check_mesages($req_main, [], 0);
}
}
}
/**
* Получение чат ид
*/
public function get_caht_id($user_id){
$chat_id = 0;
$sql = "SELECT * FROM users WHERE id = {$user_id}";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
if($r) $chat_id = (int)$r['telegramm_chat_id'];
return $chat_id;
}
/**
* Получение user ид
*/
public function get_user_id_max($user_id){
$user_id = 0;
$sql = "SELECT * FROM users WHERE id = {$user_id}";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
if($r && $r['max_notice'] > 0) $user_id = (int)$r['max_user_id'];
return $user_id;
}
/**
* Проверка на дополнительные уведомления
*/
private function check_mesages($req_main, $comments, $type = 1){
if($this->agencyId == 19895){
// file_put_contents(__DIR__.'/log_test_union.txt', date('d.m.Y').' '.$this->agencyId. "\n", FILE_APPEND);
$hot_tag = 0;
$enter_tag = 0;
if($this->agencyId == 19895){
$hot_tag = 3039;
$enter_tag = 3043;
}
else if ($this->agencyId == 117){
$hot_tag = 3232;
$enter_tag = 3233;
} else if ($this->agencyId == 5238){
$hot_tag = 338;
}
$telega = new Telegram();
$max = new MaxClass();
if($type == 1) {
$sql_user = "SELECT * FROM users WHERE id = {$req_main['who_work']}";
//file_put_contents(__DIR__.'/log_test_union.txt', date('d.m.Y').' '.$sql_user. "\n", FILE_APPEND);
$q_user = $this->db->query($sql_user);
$r_user = $this->db->fetch_assoc($q_user);
if($r_user['manager'] != 1 && $r_user['agency'] != 1 && $r_user['id_manager'] > 0){
$chat_id = $this->get_caht_id($r_user['id_manager']);
if($chat_id > 0){
//$telega = new Telegram();
$fio = $r_user['last_name'].' '.$r_user['first_name']. ' '. $r_user['middle_name'];
$text = "К заявке ID {$req_main['id']} вашего сотрудника {$fio} автоматически присоединена другая заявка: ";
$text .= "\n".str_replace("
", "\n", $comments['text']);
try {
$telega->send($text, $chat_id);
} catch(Exception $e){
}
//file_put_contents(__DIR__.'/log_test_union.txt', $req_main['id'].' '.$chat_id. ' ' .$text. "\n", FILE_APPEND);
}
$max_user_id = $this->get_user_id_max($r_user['id_manager']);
if($max_user_id > 0){
//$telega = new Telegram();
$fio = $r_user['last_name'].' '.$r_user['first_name']. ' '. $r_user['middle_name'];
$text = "К заявке ID {$req_main['id']} вашего сотрудника {$fio} автоматически присоединена другая заявка: ";
$text .= "\n".str_replace("
", "\n", $comments['text']);
try {
$max->send_messages_to_user($max_user_id, $text);
} catch(Exception $e){
}
//file_put_contents(__DIR__.'/log_test_union.txt', $req_main['id'].' '.$chat_id. ' ' .$text. "\n", FILE_APPEND);
}
}
} else if ($type == 2) { //Проверка ручной заявки
$chat_id = $this->get_caht_id($this->agencyId);
if($chat_id > 0){
//$telega = new Telegram();
if($req_main['id'] > 0 && $req_main['who_work'] > 0 && $req_main['client_id'] > 0){
$sql = "SELECT *, (SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) FROM users WHERE requisitions.who_work = users.id) as fio FROM requisitions WHERE client_id={$req_main['client_id']} AND who_work={$req_main['who_work']} AND cancel = 0 AND deleted=0 AND confirm=1 order by id desc limit 1";
$q = $this->db->query($sql);
if($this->db->num_rows($q)){
$r = $this->db->fetch_assoc($q);
$text = "Сотрудник ".$r['fio']." создал дубль. ID ".$req_main['id'];
//file_put_contents(__DIR__.'/log_test_union.txt', date('d.m.Y').' '.$req_main['id'].' '.$chat_id. ' ' .$text. "\n", FILE_APPEND);
try{
$telega->send($text, $chat_id);
} catch (Exception $e){
}
}
}
}
$max_user_id = $this->get_user_id_max($this->agencyId);
if($max_user_id > 0){
//$telega = new Telegram();
if($req_main['id'] > 0 && $req_main['who_work'] > 0 && $req_main['client_id'] > 0){
$sql = "SELECT *, (SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) FROM users WHERE requisitions.who_work = users.id) as fio FROM requisitions WHERE client_id={$req_main['client_id']} AND who_work={$req_main['who_work']} AND cancel = 0 AND deleted=0 AND confirm=1 order by id desc limit 1";
$q = $this->db->query($sql);
if($this->db->num_rows($q)){
$r = $this->db->fetch_assoc($q);
$text = "Сотрудник ".$r['fio']." создал дубль. ID ".$req_main['id'];
//file_put_contents(__DIR__.'/log_test_union.txt', date('d.m.Y').' '.$req_main['id'].' '.$chat_id. ' ' .$text. "\n", FILE_APPEND);
try{
$max->send_messages_to_user($max_user_id, $text);
} catch (Exception $e){
}
}
}
}
}
//Проверка дублей горячих и входящих
$chat_id = $this->get_caht_id($this->agencyId);
$max_user_id = $this->get_user_id_max($this->agencyId);
$reqs_duble = array();
$reqs_duble_hot = array();
$who_work_double = array();
$is_hot = false;
if($chat_id > 0 || $max_user_id > 0){
$sql_hot = "SELECT *, (SELECT activity_id FROM requisitions_activities as ra WHERE ra.req_id = req.id AND activity_id = {$hot_tag} limit 1) as hot_tag";
if($enter_tag > 0){
$sql_hot .= ", (SELECT activity_id FROM requisitions_activities as ra WHERE ra.req_id = req.id AND activity_id = {$enter_tag} limit 1) as enter_tag";
}
$sql_hot .= " FROM requisitions as req WHERE client_id = {$req_main['client_id']} AND confirm = 1 AND deleted = 0 AND cancel = 0 order by created_at asc";
//file_put_contents(__DIR__.'/log_test_union.txt', date('d.m.Y').' '.$sql_hot. "\n", FILE_APPEND);
$q_hot = $this->db->query($sql_hot, true);
while ($r_hot = $this->db->fetch_assoc($q_hot)){
if(($r_hot['hot_tag'] > 0)){
$reqs_duble_hot[] = $r_hot['id'];
$reqs_duble[] = $r_hot['id'];
} else if ($r_hot['enter_tag'] > 0){
$reqs_duble[] = $r_hot['id'];
}
}
if(count($reqs_duble_hot) > 1){
$text = "Найден дубль «Горячих» заявок у разных сотрудников: \n";
$text .= "ID ".implode(", ID ", $reqs_duble_hot);
if($chat_id > 0){
try{
$telega->send($text, $chat_id);
} catch (Exception $e){
}
}
if($max_user_id > 0){
try{
$max->send_messages_to_user($max_user_id, $text);
} catch (Exception $e){
}
}
}
if(count($reqs_duble) > 1 && count($reqs_duble) > count($reqs_duble_hot)){
$text = "Найден дубль заявок у разных сотрудников: \n";
$text .= "ID ".implode(", ID ", $reqs_duble);
if($chat_id > 0){
try{
$telega->send($text, $chat_id);
} catch (Exception $e){
}
}
if($max_user_id > 0){
try{
$max->send_messages_to_user($max_user_id, $text);
} catch (Exception $e){
}
}
}
}
}
}
public function getRequisitionsByStage($stageId, $funnelId = 0, $search = '', $period = '', $responsible = [], $offset = 0, $limit = 20) {
$sql = "SELECT r.* FROM requisitions r
WHERE r.stage = ? AND r.deleted = 0";
if ($funnelId > 0) {
$sql .= " AND r.funnel_id = ?";
}
if (!empty($search)) {
$sql .= " AND (r.fio LIKE ? OR r.phone LIKE ?)";
}
if (!empty($period)) {
// добавьте свою логику по периоду
}
if (!empty($responsible)) {
$placeholders = str_repeat('?,', count($responsible) - 1) . '?';
$sql .= " AND r.users_id IN ($placeholders)";
}
$sql .= " ORDER BY r.id DESC LIMIT ? OFFSET ?";
$params = [$stageId];
if ($funnelId > 0) $params[] = $funnelId;
if (!empty($search)) {
$like = '%' . $search . '%';
$params[] = $like;
$params[] = $like;
}
if (!empty($responsible)) {
foreach ($responsible as $uid) {
$params[] = (int)$uid;
}
}
$params[] = $limit;
$params[] = $offset;
$stmt = $this->pdo->prepare($sql);
$stmt->execute($params);
return [
'items' => $stmt->fetchAll(PDO::FETCH_ASSOC)
];
}
}
// Базовый тип: 1=Подбор, 2=Реализация, 3=Другие услуги, 4=Спрос. heir != 0 — кастомный наследник.
function requisition_base_type_id($typeRow) {
$heir = isset($typeRow['heir']) ? (int)$typeRow['heir'] : 0;
if ($heir !== 0) {
return $heir;
}
return (int)$typeRow['id'];
}
// object_id копируется только для типов 3 и 4.
function requisition_should_copy_object($baseTypeId) {
return in_array((int)$baseTypeId, [3, 4], true);
}
// Фильтры поиска копируются для всех типов кроме 1 (Подбор).
function requisition_should_copy_search_filters($baseTypeId) {
return (int)$baseTypeId !== 1;
}
?>