Joywork/api/v2/app/src/controllers/RequisitionsController.php
2026-05-22 21:21:54 +03:00

2592 lines
96 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\v2\Controller;
class RequisitionsController extends ApiController
{
public function getRequisitions($app, $get = null, $post = null, $need_return = false) {
$start_time = microtime(true);
$error = false;
if ($user_id = $_SESSION['id']) {
/*error_reporting(E_ERROR | E_WARNING | E_PARSE);
ini_set('display_errors', 1);*/
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$filters = [];
if (isset($get['filters'])) {
if (!is_array($get['filters']))
$filters = json_decode($get['filters'], true);
else
$filters = (array)$get['filters'];
}
$need_autosearch = false;
if (isset($get['need_autosearch']))
$need_autosearch = true;
$sort_order = null;
if (isset($get['sort_order']))
$sort_order = mb_strtolower(trim($get['sort_order']));
$req_filter = [
'order' => (($sort_order == 'desc') ? 2 : (($sort_order == 'asc') ? 1 : null)),
'search' => '',
'stages' => [
'work' => 0,
'hot' => 0,
'close' => 0,
'hit' => 0,
'ahency' => 0,
'confirm' => 0,
],
'emp' => null,
'type' => null,
'step' => null,
'priority' => null,
'send' => 0,
'denial' => null,
'source' => null,
'object_id' => null,
//'date_closer' => 10,
//'id' => null,
//'not_id' => null,
'is_contract' => false,
'type_contract' => [],
'numder_contract' => null,
'onDateContract' => null,
'offDateContract' => null,
'is_tasks' => false,
'noTasks' => false,
'todayTasks' => false,
'overTasks' => false,
'isPartner' => false,
//'expired_stages' => false,
'period' => 'all',
'activities' => null,
'employee_id' => null,
'fields' => null,
'is_date_step' => false,
'onDateStep' => null,
'offDateStep' => null,
];
$page = 1;
if (isset($get['page']))
$page = intval($get['page']);
$per_page = 10;
if (isset($get['per_page']))
$per_page = intval($get['per_page']);
$query = null;
if (isset($get['query']))
$query = trim($get['query']);
// Запрос поиска
if (!empty($query)) {
$req_filter['search'] = $query;
}
if (empty($query)) {
$funnel_id = 0;
if (isset($get['funnel_id']))
$funnel_id = intval($get['funnel_id']);
else if (isset($filters['funnel_id']))
$funnel_id = intval($filters['funnel_id']);
else {
/*$users = new \User();
$agency_id = $users->getUserAgencyID($user_id);
$sql = "SELECT * FROM funnel_default WHERE agency_id = {$agency_id} AND is_req = 1";
$query = $pdo->query($sql);
if ($pdo->num_rows($query) != 0) {
$row = $pdo->fetch_assoc($query);
//$funnel_id = (int)$row['id'];
}*/
}
} else {
$funnel_id = 'all';
}
$client_id = null;
if (isset($get['client_id']))
$client_id = intval($get['client_id']);
$object_id = null;
if (isset($get['object_id']))
$object_id = intval($get['object_id']);
$extended = false;
if (isset($get['extended']))
$extended = boolval($get['extended']);
$agency = new \User;
$agency->get($user_id);
$agency->checkPermissions($user_id, false);
$req_inst = new \Requisitions($pdo);
$sql_permissions = "SELECT * FROM user_permissions WHERE user_id = {$user_id}";
$q_permissions = mysql_query($sql_permissions);
$r_permissions = mysql_fetch_assoc($q_permissions);
$search_user_id = $user_id;
if ($agency->users_admin || $r_permissions['menu_all_submissions'] == 1) {
$search_user_id = $agency->getUserAgencyID();
$req_inst->set_agencyId($search_user_id);
}
$req_inst->set_user($agency);
$req_inst->set_page($page);
$req_inst->set_per_page(10);
// Статус заявки (В работе, Горичий, Закрытые, Успешные...)
if (isset($filters['status'])) {
switch (trim($filters['status'])) {
case 'stage_work':
$req_filter['stages']['work'] = 1;
break;
case 'stage_hot':
$req_filter['stages']['hot'] = 1;
break;
case 'stage_close':
$req_filter['stages']['close'] = 1;
break;
case 'stage_hit':
$req_filter['stages']['hit'] = 1;
break;
case 'confirmed_clients':
$req_filter['stages']['confirm'] = 1;
break;
case 'common_clients':
$req_filter['stages']['ahency'] = 1;
break;
}
}
// ИД объекта
if (isset($filters['object_id']))
$req_filter['object_id'] = trim($filters['object_id']);
// Приоритет
if (isset($filters['priority'])) {
$req_filter['priority'] = [
1 => intval($filters['priority'][1]) ? 1 : 0,
2 => intval($filters['priority'][2]) ? 1 : 0,
3 => intval($filters['priority'][3]) ? 1 : 0,
4 => intval($filters['priority'][4]) ? 1 : 0,
];
}
// Ответственный
if (isset($filters['employees']))
$req_filter['emp'] = array_values($filters['employees']);
// Тип заявки
if (isset($filters['type']))
$req_filter['type'] = array_values($filters['type']);
// Этап
if (isset($filters['stages']))
$req_filter['step'] = array_values($filters['stages']);
// Теги
if (isset($filters['activities']))
$req_filter['activities'] = array_values($filters['activities']);
// Причина закрытия
if (isset($filters['denials']))
$req_filter['denial'] = array_values($filters['denials']);
// Источники
if (isset($filters['sources']))
$req_filter['source'] = array_values($filters['sources']);
// Контракты
if (isset($filters['is_contract'])) {
if ((int)$filters['is_contract'] && isset($filters['is_contract']))
$req_filter['is_contract'] = boolval($filters['is_contract']);
if ((int)$filters['is_contract'] && isset($filters['contract_type']))
$req_filter['type_contract'] = array_values($filters['contract_type']);
if ((int)$filters['is_contract'] && isset($filters['contract_number']))
$req_filter['numder_contract'] = trim($filters['contract_number']);
if ((int)$filters['is_contract'] && isset($filters['contract_date_end_from']))
$req_filter['onDateContract'] = trim($filters['contract_date_end_from']);
if ((int)$filters['is_contract'] && isset($filters['contract_date_end_to']))
$req_filter['offDateContract'] = trim($filters['contract_date_end_to']);
}
// Договора
if (!empty($filters['is_contract'])) {
if ((int)$filters['is_contract'] && isset($filters['is_contract']))
$req_filter['is_contract'] = boolval($filters['is_contract']);
if ($req_filter['is_contract']) {
if (isset($filters['contract_number']) && !empty($filters['contract_number']))
$req_filter['numder_contract'] = trim($filters['contract_number']);
if (isset($filters['contract_type']) && !is_array($filters['contract_type']))
$req_filter['type_contract'] = $filters['contract_type'];
if (isset($filters['contract_start']) && !empty($filters['contract_start']))
$req_filter['onDateContract'] = date('Y-m-d ', strtotime($filters['contract_start']));
if (isset($filters['contract_end']) && !empty($filters['contract_end']))
$req_filter['offDateContract'] = date('Y-m-d ', strtotime($filters['contract_end']));
}
}
//Этапы
if(!empty($filters['is_date_step'])){
$req_filter['is_date_step'] = $filters['is_date_step'];
if (isset($filters['onDateStep']) && !empty($filters['onDateStep']))
$req_filter['onDateStep'] = date('Y-m-d ', strtotime($filters['onDateStep']));
if (isset($filters['offDateStep']) && !empty($filters['offDateStep']))
$req_filter['offDateStep'] = date('Y-m-d ', strtotime($filters['offDateStep']));
}
// Время добавления (период)
if (!empty($filters['period'])) {
if ((int)$filters['period'] && isset($filters['period']))
$req_filter['period'] = $filters['period'];
if (!empty($req_filter['period'])) {
switch ($req_filter['period']) {
case 1:
$req_filter['period'] = 'today';
break;
case 2:
$req_filter['period'] = 'week';
break;
case 3:
$req_filter['period'] = 'month';
break;
case 4:
$req_filter['period'] = '30days';
break;
case 5:
$req_filter['period'] = 'quarter';
break;
case 6:
$req_filter['period'] = '90days';
break;
case 7:
$req_filter['period'] = 'year';
break;
case 8:
$req_filter['period'] = 'all';
break;
case 9:
$req_filter['period'] = 'period';
break;
}
if ($req_filter['period'] == 'period') {
if (isset($filters['period_start']) && !empty($filters['period_start']))
$req_filter['onDate'] = date('Y-m-d ', strtotime($filters['period_start']));
if (isset($filters['period_end']) && !empty($filters['period_end']))
$req_filter['offDate'] = date('Y-m-d ', strtotime($filters['period_end']));
if (!empty($req_filter['onDate']) && empty($req_filter['offDate']))
$req_filter['offDate'] = date('Y-m-d ');
}
}
// Снимаем воронку, если выборка с периодом
$funnel_id = 0;
}
// Партнёры/сотрудники партнёра
if (isset($filters['partners']))
$req_filter['employee_id'] = array_values($filters['partners']);
// С задачами
if (isset($filters['is_tasks'])) {
$req_filter['is_tasks'] = boolval($filters['is_tasks']);
}
// Без задач
if (isset($filters['is_no_tasks']))
$req_filter['noTasks'] = boolval($filters['is_no_tasks']);
// С задачами на сегодня
if (isset($filters['is_today_tasks']))
$req_filter['todayTasks'] = boolval($filters['is_today_tasks']);
// С просроченными задачами
if (isset($filters['is_over_tasks']))
$req_filter['overTasks'] = boolval($filters['is_over_tasks']);
// Совместные заявки
if (isset($filters['is_partner']))
$req_filter['isPartner'] = boolval($filters['is_partner']);
// Цены на объекты в заявках
if (isset($filters['priceFrom']))
$req_filter['priceFrom'] = intval($filters['priceFrom']);
if (isset($filters['priceTo']))
$req_filter['priceTo'] = intval($filters['priceTo']);
// Кастомные поля
if (isset($filters['fields'])) {
$fields = [];
foreach ($filters['fields'] as $field => $value) {
if (is_null($value) || (empty($value) && $value != 0)) {
unset($filters['fields'][$field]);
} else {
$fields[$field] = $value;
}
}
if (!empty($fields)) {
$req_filter['fields'] = $fields;
}
}
$req_filter['funnel_id'] = $funnel_id;
// Очистка от пустых значений
foreach ($req_filter as $prop => $value) {
if (is_null($value) || (empty($value) && $value != 0)) {
unset($req_filter[$prop]);
}
}
$req_filter['stages'] = (object)$req_filter['stages'];
$results = $req_inst->get_all($search_user_id, (object)$req_filter, (string)$funnel_id, $client_id, $object_id, $need_autosearch);
$pagination = [
'pages' => (int)$results['allPages'],
'page' => $page,
'per_page' => $per_page,
'_time_overage' => (int)$results['_time_overage'],
'total' => (int)$results['total_req'],
'count' => (int)$results['count'],
];
$results = array_values($results['req']);
$req_ids = [];
foreach ($results as $req) {
$req_ids[] = (int)$req['id'];
}
// Подсчет событий по заявкам
$events_less = [];
$events_eq = [];
$events_more = [];
$req_activities = [];
if (count($req_ids) > 0) {
$sql = "SELECT count(`id`) AS `res`, `req_id`
FROM `user_client_events`
WHERE `calendar_view` = 0 AND
`cancel`=0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
`schedule_date` IS NOT NULL AND
`req_id` IN (" . implode(", ", $req_ids) . ") AND
`schedule_date` < '" . date("Y-m-d H:i:s") . "'
GROUP BY `req_id`";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_less[] = $row;
}
}
}
$sql = "SELECT count(id) as res, req_id
FROM user_client_events
WHERE calendar_view = 0 AND
cancel=0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
schedule_date IS NOT NULL AND
req_id IN (" . implode(", ", $req_ids) . ") AND
DATE_FORMAT(schedule_date, '%Y-%m-%d') = '" . date("Y-m-d") . "' AND
schedule_date > '" . date("Y-m-d H:i:s") . "'
GROUP BY req_id";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_eq[] = $row;
}
}
}
$sql = "SELECT count(id) as res, req_id
FROM user_client_events
WHERE calendar_view = 0 AND
cancel=0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
schedule_date IS NOT NULL AND
req_id IN (" . implode(", ", $req_ids) . ") AND
DATE_FORMAT(schedule_date, '%Y-%m-%d') > '" . date("Y-m-d") . "'
GROUP BY req_id";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_more[] = $row;
}
}
} else {
$error = true;
$errors[] = mysql_error();
}
// Формируем список тегов под заявки
$sql = "SELECT `activity_id`, `req_id`
FROM `requisitions_activities`
WHERE `req_id` IN (" . implode(", ", $req_ids) . ")";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$req_activities[$row['req_id']][] = $row['activity_id'];
}
}
} else {
$error = true;
$errors[] = mysql_error();
}
}
// Договоры
if ($extended) {
$contracts = [];
if (!empty($req_ids)) {
$contracts_inst = new \Contract();
foreach ($req_ids as $req_id) {
$contracts[$req_id] = $contracts_inst->getContracts($req_id, 'req');
foreach ($contracts[$req_id] as $key => $contract) {
if (isset($contract['date_start']))
$contracts[$req_id][$key]['date_start'] = date('Y-m-d H:i:s', strtotime($contract['date_start']));
if (isset($contract['date_end']))
$contracts[$req_id][$key]['date_end'] = date('Y-m-d H:i:s', strtotime($contract['date_end']));
}
}
}
}
$requisitions = [];
$clients_ids = [];
$objects_ids = [];
foreach ($results as $req) {
// Подсчет новых событий в Истории и задачах
$events_expired = 0;
$events_today = 0;
$events_count = 0;
foreach ($events_less as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_expired = (int)$event["res"];
break;
}
}
foreach ($events_eq as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_today = (int)$event["res"];
break;
}
}
foreach ($events_more as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_count = (int)$event["res"];
break;
}
}
// Совместная работа с Заявкой
$doers_ids = [];
$accepted_doers_ids = [];
$requested_doers_ids = [];
if (isset($req['doers'])) {
$doers = json_decode(html_entity_decode($req['doers'], ENT_QUOTES), true);
if (is_array($doers)) {
foreach ($doers as $doer_id => $is_accept) {
$doers_ids[] = $doer_id;
if ((int)$is_accept == 1)
$accepted_doers_ids[] = $doer_id;
else
$requested_doers_ids[] = $doer_id;
}
$doers_ids = array_unique(array_map('intval', $doers_ids));
$accepted_doers_ids = array_unique(array_map('intval', $accepted_doers_ids));
$requested_doers_ids = array_unique(array_map('intval', $requested_doers_ids));
}
}
// Миксуем старые и новые теги
if (is_array($req['activities']) && is_array($req_activities[$req['id']]))
$req['activities'] = array_merge($req['activities'], $req_activities[$req['id']]);
// Теги
$tags = [];
if (count($req['activities_temp'])) {
$tags = array_map('intval', $req['activities_temp']);
$tags = array_unique(array_values($tags));
}
if (isset($req['client_id']))
$clients_ids[] = (int)$req['client_id'];
if (isset($req['object_id']))
$objects_ids[] = (int)$req['object_id'];
$autosearch_id = null;
if (isset($req['autosearch_id']))
$autosearch_id = (int)$req['autosearch_id'];
if (!$autosearch_id && isset($req['asfilter_id']))
$autosearch_id = (int)$req['asfilter_id'];
$sql_check_manager = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$req['who_work'];
$result_check_manager = mysql_query($sql_check_manager);
$req_id_manager = mysql_fetch_assoc($result_check_manager);
$user = new \User();
$user->get($user_id);
$r_check_permissions = $user->checkMenuPermissions();
$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);
$user_allow_edit = false;
if ($_SESSION['agency'] || $_SESSION['users_admin'] || $r_check_permissions['menu_all_submissions_edit'] == 1 || $_SESSION['id'] == $req['who_work']) {
$user_allow_edit = true;
} elseif (($dep_user['role'] == 'admin_department' || $dep_user['role'] == 'manager_office') && $req_id_manager['department_id'] == $user_missing_fields['department_id']) {
$user_allow_edit = true;
} elseif ($dep_user['role'] == 'manager' && $user->id == $req_id_manager['id_manager']) {
$user_allow_edit = true;
} elseif ($dep_user['role'] == 'manager_office_menager' && ($user->id == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req['who_work'])) {
$user_allow_edit = true;
} elseif (!($dep_user['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $req_id_manager['id_manager']))) {
$user_allow_edit = true;
}
$requisitions[] = [
'id' => (int)$req['id'],
'name' => trim($req['name']),
'created_at' => date('d.m.Y H:i:s', strtotime(trim($req['created_at']))),
'client_id' => (int)$req['client_id'],
'object_id' => (int)$req['object_id'],
'funnel_id' => (int)$req['funnel_id'],
'type_id' => (int)$req['type_id'],
'heir_type_id' => (int)$req['heir_type'],
'step_id' => (int)$req['step_id'],
'user_id' => (int)$req['user_id'],
'object' => $req['object'],
'client' => $req['client'],
'description' => trim($req['description']),
'is_confirm' => (bool)$req['confirm'],
'is_hot' => (bool)$req['hot'],
'priority' => (int)$req['priority'],
'is_new' => (bool)$req['is_new'],
'is_deleted' => isset($req['deleted']) && $req['deleted'] > 0 && $req['confirm'] != 10,
'is_completed' => isset($req['deleted']) && $req['deleted'] > 0 && $req['confirm'] == 10,
'is_canceled' => (bool)$req['cancel'],
'close_reason' => (isset($req['reason'])) ? trim($req['reason']) : null,
'is_no_confirm' => (bool)$req['no_confirm'],
'is_no_confirm_doer' => (bool)$req['no_conf_doer'],
'is_can_see' => (bool)$req['can_see'],
'is_can_see_other' => (bool)$req['can_see_other'],
'is_can_edit' => (bool)$req['can_edit'],
'see_client' => (bool)$req['see_client'],
'stage_id' => (int)$req['steps']['stageId'],
'stage_name' => trim($req['steps']['stage']),
'source_id' => (int)$req['source'],
'contracts' => (isset($req['contracts'])) ? $req['contracts'] : [],
'events_count' => [
'requisitions' => [
'expired' => $events_expired,
'today' => $events_today,
'total' => $events_count,
]
],
'tags' => (!empty($tags)) ? $tags : null,
'who_work' => (int)$req['who_work'],
'can_see_contact_closed' => (bool)$r_permissions['menu_can_take_from_closed'],
'can_see_contact_common' => (bool)($_SESSION['agency'] || $_SESSION['users_admin']),
'employee_id' => (isset($req['who_work'])) ? intval($req['who_work']) : 0,
'manager' => (isset($req['manager'])) ? trim($req['manager']) : null,
'manager_phone' => (isset($req['manager_phone'])) ? trim($req['manager_phone']) : null,
'master_work_id' => (isset($req['master_work_id'])) ? (int)trim($req['master_work_id']) : null,
'master_work' => (isset($req['master_work'])) ? trim($req['master_work']) : null,
'master_work_phone' => (isset($req['master_work_phone'])) ? trim($req['master_work_phone']) : null,
'master_delete' => (isset($req['master_delete'])) ? trim($req['master_delete']) : null,
'master_delete_phone' => (isset($req['master_delete_phone'])) ? trim($req['master_delete_phone']) : null,
'doers_ids' => $doers_ids,
'requested_doers_ids' => $requested_doers_ids,
'requested_doers' => (!empty($req['doer_no'])) ? implode(', ', $req['doer_no']) : null,
'accepted_doers_ids' => $accepted_doers_ids,
'accepted_doers' => (!empty($req['doer_yes'])) ? implode(', ', $req['doer_yes']) : null,
'partner_id' => (int)$req['employee_id'],
'autosearch_id' => $autosearch_id,
'autosearch' => $req['autosearch'],
'autosearch_info' => trim($req['autosearch_info']),
'this_user_can_edit_req' => $user_allow_edit,
'expected_commission' => $req['expected_commission'],
'expenses_total' => $req['expenses_total'],
'expenses' => $req['expenses'],
'deposit' => (int)$req['deposit'],
'summa' => (!empty($req['summa'])) ? $req['summa'] : null,
'depositArr' => $req['depositArr']
//'_RAW' => $req,
];
}
if ($extended) {
$clients_list = null;
if (count($clients_ids)) {
$clientsController = new ClientsController();
$clients_list = $clientsController->getClients(
$app,
['clients_ids' => $clients_ids],
null,
true
);
}
$funnels_list = null;
$commonController = new CommonController();
$funnels_list = $commonController->getFunnels(
$app,
[
'section' => 'requisitions',
'filters' => []
],
null,
true
);
$objects_list = null;
if (count($objects_ids)) {
$objectsController = new ObjectsController();
$objects_list = $objectsController->getObjects(
$app,
['objects_ids' => $objects_ids],
null,
true
);
if ($objects_list)
$objects_list = $objects_list['objects'];
}
$types_list = $commonController->getTypes(
$app,
['section' => 'requisitions'],
null,
true
);
// Формируем список тегов
$commonController = new CommonController;
$activities = $commonController->getTags($app, ['with_managers' => true], $post, true);
}
$data = [
'success' => !$error,
'user_id' => (int)$user_id,
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
'is_extended' => $extended,
'req_filter' => $req_filter,
'pagination' => $pagination,
'count' => count($requisitions),
'list' => $requisitions,
];
if ($extended) {
$data['contracts_list'] = (!empty($contracts[$req['id']]) > 0) ? $contracts[$req['id']] : [];
$data['clients_list'] = $clients_list;
$data['funnels_list'] = $funnels_list;
$data['objects_list'] = $objects_list;
$data['types_list'] = $types_list;
$data['tags_list'] = $activities;
}
if ($need_return) {
return $data;
} else {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode($data, JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
if ($need_return) {
return false;
} else {
$app->response->header('Content-Type', 'application/json');
$app->response->setBody(json_encode([
'success' => false,
'user_id' => $_SESSION['id'],
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
public function getRequisition($app, $get = null, $post = null) {
$start_time = microtime(true);
$error = false;
$results = [];
$requisition = [];
$req_id = false;
if (isset($get['requisition_id']))
$req_id = intval($get['requisition_id']);
if (($user_id = $_SESSION['id']) && $req_id) {
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$users_inst = new \User();
$agency_id = $users_inst->getAgencyIdForUser($user_id);
$users_inst->get($user_id);
$req_inst = new \Requisitions($pdo);
$req_inst->set_user($users_inst);
$need_autosearch = false;
if (isset($get['need_autosearch']))
$need_autosearch = true;
$results = $req_inst->get_req_id($req_id, $need_autosearch);
if (!count($results)) {
$error = true;
} else if (isset($results["req".$req_id])) {
$req = $results["req".$req_id];
// Подсчет событий по заявкам
$events_less = [];
$events_eq = [];
$events_more = [];
$req_activities = [];
$sql = "SELECT count(`id`) AS `res`, `req_id`
FROM `user_client_events`
WHERE `calendar_view` = 0 AND
`cancel` = 0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
`schedule_date` IS NOT NULL AND
`req_id` = '$req_id' AND
`schedule_date` < '" . date("Y-m-d H:i:s") . "'
GROUP BY `req_id`";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_less[] = $row;
}
}
}
$sql = "SELECT count(id) as res, req_id
FROM user_client_events
WHERE calendar_view = 0 AND
cancel=0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
schedule_date IS NOT NULL AND
`req_id` = '$req_id' AND
DATE_FORMAT(schedule_date, '%Y-%m-%d') = '" . date("Y-m-d") . "' AND
schedule_date > '" . date("Y-m-d H:i:s") . "'
GROUP BY req_id";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_eq[] = $row;
}
}
}
$sql = "SELECT count(id) as res, req_id
FROM user_client_events
WHERE calendar_view = 0 AND
cancel=0 AND
`type` IN ('call', 'meet', 'show', 'deal', 'even') AND
schedule_date IS NOT NULL AND
`req_id` = '$req_id' AND
DATE_FORMAT(schedule_date, '%Y-%m-%d') > '" . date("Y-m-d") . "'
GROUP BY req_id";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$events_more[] = $row;
}
}
} else {
$error = true;
$errors[] = mysql_error();
}
// Совместная работа с Заявкой
$doers_ids = [];
$accepted_doers_ids = [];
$requested_doers_ids = [];
if (isset($req['doers'])) {
$doers = json_decode(html_entity_decode($req['doers'], ENT_QUOTES), true);
if (is_array($doers)) {
foreach ($doers as $doer_id => $is_accept) {
$doers_ids[] = $doer_id;
if ((int)$is_accept == 1)
$accepted_doers_ids[] = $doer_id;
else
$requested_doers_ids[] = $doer_id;
}
$doers_ids = array_unique(array_map('intval', $doers_ids));
$accepted_doers_ids = array_unique(array_map('intval', $accepted_doers_ids));
$requested_doers_ids = array_unique(array_map('intval', $requested_doers_ids));
}
}
// Формируем список тегов под зявку
$sql = "SELECT `activity_id`, `req_id`
FROM `requisitions_activities`
WHERE `req_id` = '$req_id'";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while ($row = mysql_fetch_assoc($query)) {
$req_activities[$row['req_id']][] = $row['activity_id'];
}
}
} else {
$error = true;
$errors[] = mysql_error();
}
$events_expired = 0;
$events_today = 0;
$events_count = 0;
foreach ($events_less as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_expired = (int)$event["res"];
break;
}
}
foreach ($events_eq as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_today = (int)$event["res"];
break;
}
}
foreach ($events_more as $event) {
if ((int)$event["req_id"] == (int)$req["id"]) {
$events_count = (int)$event["res"];
break;
}
}
// Миксуем старые и новые теги
if (is_array($req['activities']) && is_array($req_activities[$req['id']]))
$req['activities'] = array_merge($req['activities'], $req_activities[$req['id']]);
// Теги
$tags = [];
if (count($req['activities_temp'])) {
$tags = array_map('intval', $req['activities_temp']);
$tags = array_unique(array_values($tags));
}
// Договоры
$contracts_inst = new \Contract();
$contracts = $contracts_inst->getContracts((int)$req['id'], 'req');
foreach ($contracts as $key => $contract) {
if (isset($contract['date_start']))
$contracts[$key]['date_start'] = date('Y-m-d H:i:s', strtotime($contract['date_start']));
if (isset($contract['date_end']))
$contracts[$key]['date_end'] = date('Y-m-d H:i:s', strtotime($contract['date_end']));
}
// Дополнительные поля
$fields = [];
$fields_res = [];
$user = new \User();
$user->get($user_id);
if ($agency_id = $user->getUserAgencyID()) {
$fields_inst = new \Fields($pdo);
$fields_res = $fields_inst->get_req_fields($agency_id, (int)$req['id']);
if (!empty($fields_res['values'])) {
$fields = array_map('json_decode', $fields_res['values']);
}
}
/*$user = new \User();
$user->get($user_id);*/
$r_check_permissions = $user->checkMenuPermissions();
$depClassPerm = new \Department();
$dep_user = $depClassPerm->getDepartment($_SESSION['id']);
$sql_check_manager = "SELECT `id_manager`, `department_id` FROM `users` WHERE `id` = ".$req['who_work'];
$result_check_manager = mysql_query($sql_check_manager);
$req_id_manager = mysql_fetch_assoc($result_check_manager);
$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);
$user_allow_edit = false;
if ($_SESSION['agency'] || $_SESSION['users_admin'] || $r_check_permissions['menu_all_submissions_edit'] == 1 || $_SESSION['id'] == $req['who_work']) {
$user_allow_edit = true;
} elseif (($dep_user['role'] == 'admin_department' || $dep_user['role'] == 'manager_office') && $req_id_manager['department_id'] == $user_missing_fields['department_id']) {
$user_allow_edit = true;
} elseif ($dep_user['role'] == 'manager' && $user->id == $req_id_manager['id_manager']) {
$user_allow_edit = true;
} elseif ($dep_user['role'] == 'manager_office_menager' && ($user->id == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req_id_manager['id_manager'] || $_SESSION['id_manager'] == $req['who_work'])) {
$user_allow_edit = true;
} elseif (!($dep_user['role']) && ($_SESSION['manager'] && ($_SESSION['id'] == $req_id_manager['id_manager']))) {
$user_allow_edit = true;
}
$source_see = 1;
if($req['source'] > 0){
$commonController = new CommonController();
$sql_source = "SELECT * FROM `advertising_sources` WHERE id = {$req['source']}";
$q_source = mysql_query($sql_source);
$r_source = mysql_fetch_assoc($q_source);
if($commonController->is_see($app, $r_source['is_no_see'], $r_source['users_no_see']) === false)
$source_see = 0;
}
$requisition = [
'id' => (int)$req['id'],
'name' => trim($req['name']),
'created_at' => date('d.m.Y H:i:s', strtotime(trim($req['created_at']))),
'client_id' => (int)$req['client_id'],
'object_id' => (int)$req['object_id'],
'funnel_id' => (int)$req['funnel_id'],
'type_id' => (int)$req['type_id'],
'heir_type_id' => (int)$req['heir_type'],
'step_id' => (int)$req['step_id'],
'user_id' => (int)$req['user_id'],
//'object' => $req['object'],
//'client' => $req['client'],
'description' => trim($req['description']),
'is_confirm' => (bool)$req['confirm'],
'is_hot' => (bool)$req['hot'],
'priority' => (int)$req['priority'],
'is_new' => (bool)$req['is_new'],
'is_deleted' => isset($req['deleted']) && $req['deleted'] > 0 && $req['confirm'] != 10,
'is_completed' => isset($req['deleted']) && $req['deleted'] > 0 && $req['confirm'] == 10,
'is_canceled' => (bool)$req['cancel'],
'is_no_confirm' => (bool)$req['no_confirm'],
'is_no_confirm_doer' => (bool)$req['no_conf_doer'],
'is_can_see' => (bool)$req['can_see'],
'is_can_edit' => (bool)$req['can_edit'],
'see_client' => (bool)$req['see_client'],
'stage_id' => (int)$req['steps']['stageId'],
'stage_name' => trim($req['steps']['stage']),
'source_id' => (int)$req['source'],
'source_see' => $source_see,
'employee_id' => (int)$req['who_work'],
'events_count' => [
'requisitions' => [
'expired' => $events_expired,
'today' => $events_today,
'total' => $events_count,
]
],
'manager' => (isset($req['manager'])) ? trim($req['manager']) : null,
'manager_phone' => (isset($req['manager_phone'])) ? trim($req['manager_phone']) : null,
'master_work' => (isset($req['master_work'])) ? trim($req['master_work']) : null,
'master_work_phone' => (isset($req['master_work_phone'])) ? trim($req['master_work_phone']) : null,
'master_delete' => (isset($req['master_delete'])) ? trim($req['master_delete']) : null,
'master_delete_phone' => (isset($req['master_delete_phone'])) ? trim($req['master_delete_phone']) : null,
'tags' => (!empty($tags)) ? $tags : null,
'contracts' => (!empty($contracts)) ? $contracts : [],
'fields' => (!empty($fields)) ? $fields : null,
'doers_ids' => $doers_ids,
'requested_doers_ids' => $requested_doers_ids,
'requested_doers' => (!empty($req['doer_no'])) ? implode(', ', $req['doer_no']) : null,
'accepted_doers_ids' => $accepted_doers_ids,
'accepted_doers' => (!empty($req['doer_yes'])) ? implode(', ', $req['doer_yes']) : null,
'partner_id' => (int)$req['employee_id'],
'autosearch_id' => (isset($req['autosearch_id'])) ? (int)$req['autosearch_id'] : null,
'autosearch' => $req['autosearch'],
'autosearch_info' => trim($req['autosearch_info']),
'this_user_can_edit_req' => $user_allow_edit,
'expected_commission' => $req['expected_commission'],
'expenses_total' => $req['expenses_total'],
'expenses' => $req['expenses'],
'deposit' => (int)$req['deposit'],
'summa' => (!empty($req['summa'])) ? $req['summa'] : null,
'depositArr' => $req['depositArr']
//'_RAW' => $req,
];
}
}
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => !$error,
'user_id' => (int)$user_id,
'item' => $requisition,
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$app->response->header('Content-Type', 'application/json');
$app->response->setBody(json_encode([
'success' => false,
'user_id' => $_SESSION['id'],
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function addEditRequisition($app, $get = null, $post = null, $need_return = false) {
$error = false;
$errors = [];
$body = $app->request->getBody();
$data = json_decode($body, true);
$requisition_id = null;
if ($user_id = $_SESSION['id']) {
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$who_work = (isset($data['employee_id'])) ? (int)$data['employee_id'] : null;
if($who_work == -1) $who_work = 0;
$params = [
'req_id' => (isset($data['id'])) ? (int)$data['id'] : null,
'user_id' => $user_id,
'old_whowork' => $user_id,
'funnel_id' => (isset($data['funnel_id'])) ? $data['funnel_id'] : 0,
'name' => (isset($data['name'])) ? $data['name'] : null,
//'fio' => "",
'email' => (isset($data['email'])) ? $data['email'] : "",
'phone' => (isset($data['phone'])) ? $data['phone'] : "",
'opis' => (isset($data['description'])) ? html_entity_decode($data['description']) : "",
'type_id' => (isset($data['type_id'])) ? (int)$data['type_id'] : 0,
'object_price' => (isset($data['price'])) ? (int)$data['price'] : "",
'object_prep_price' => (isset($data['prep_price'])) ? (int)$data['prep_price'] : "",
'object_start_price' => (isset($data['start_price'])) ? (int)$data['start_price'] : "",
'object_fact_price' => (isset($data['fact_price'])) ? (int)$data['fact_price'] : "",
'client_id' => (isset($data['client_id'])) ? (int)$data['client_id'] : null,
'object_id' => (isset($data['object_id'])) ? (int)$data['object_id'] : 0,
'priority' => (isset($data['priority'])) ? (int)$data['priority'] : 0,
'confirm' => (isset($data['is_confirm'])) ? (int)$data['is_confirm'] : 1,
'who_work' => $who_work,
//'old_whowork' => null,
'hot' => (isset($data['is_hot'])) ? (int)$data['is_hot'] : 0,
'activities' => (isset($data['tags'])) ? (array)$data['tags'] : null,
'asfilter_id' => (isset($data['autosearch_id'])) ? (int)$data['autosearch_id'] : 'NULL',
//'autosearch_filter' => [],
'source' => (isset($data['source_id'])) ? (int)$data['source_id'] : null,
'employee_id' => (isset($data['partner_id'])) ? (int)$data['partner_id'] : null,
'autosearch_enabled' => (isset($data['autosearch_enabled'])) ? (int)$data['autosearch_enabled'] : 0,
'is_manual' => (isset($data['is_manual'])) ? (int)$data['is_manual'] : 0,
//'field_models' => (isset($data['fields'])) ? (array)$data['fields'] : null,
//'contracts' => null,
];
$fields_result = null;
$req = new \Requisitions($pdo);
$result = $req->add_edit($params);
if (isset($result['errors'])) {
$errors = $result['errors'];
} else {
$requisition_id = (int)$result;
// Доп. поля
$fields = (isset($data['fields'])) ? $data['fields'] : [];
if (!empty($requisition_id) && count($fields)) {
$field_inst = new \Fields($pdo);
$data = [];
foreach ($fields as $field => $value) {
$type = 1;
if (strpos(trim($field), "modelp_") !== false)
$type = 2;
$field_id = str_replace('model_', '', trim($field));
$field_id = str_replace('modelp_', '', $field_id);
if (!isset($data[(int)$field_id])) {
$data[(int)$field_id] = [
'type' => $type,
'value' => $value,
];
}
}
$fields_result = $field_inst->add_edit_data('requisitions', $requisition_id, $data);
if ($fields_result['success'] !== true)
$error = true;
if (isset($fields_result['errors']))
$errors = array_merge($errors, $fields_result['errors']);
}
}
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id,
'requisition_id' => $requisition_id,
'fields_result' => $fields_result
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function toggleWatched($app) {
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$data = json_decode(file_get_contents("php://input"), true);
$is_watched = $data['is_watched'];
$watched_req_id = $data['watched_req_id'];
$watched_obj_id = $data['watched_obj_id'];
$watched_user_id = $data['watched_user_id'];
if ($is_watched !== null) {
if (!$watched_req_id || !$watched_obj_id || !$watched_user_id) {
echo json_encode(['status' => 'error', 'message' => 'Missing parameters']);
exit;
}
$sql_check = "SELECT id FROM watched_requisitions
WHERE user_id = $watched_user_id AND req_id = $watched_req_id AND object_id = $watched_obj_id";
$result = $pdo->query($sql_check);
if ($result->rowCount() > 0) {
$sql_update = "UPDATE watched_requisitions
SET watched = $is_watched
WHERE user_id = $watched_user_id AND req_id = $watched_req_id AND object_id = $watched_obj_id";
mysql_query($sql_update);
} else {
$sql_insert = "INSERT INTO watched_requisitions (user_id, req_id, object_id, watched)
VALUES ($watched_user_id, $watched_req_id, $watched_obj_id, $is_watched)";
$pdo->query($sql_insert);
}
echo json_encode(['status' => 'success', 'watched' => $is_watched]);
}
}
public function checkRequisitionOwner($app, $get = null, $post = null) {
$requisition_id = (int)$app->request->get('requisition_id');
$response = ['has_owner' => false, 'owner_name' => ''];
if ($requisition_id > 0) {
$pdo = $app->container->get('mypdo');
$sql = "SELECT u.first_name, u.last_name, u.middle_name
FROM requisitions r
JOIN users u ON r.who_work = u.id
WHERE r.id = $requisition_id AND r.who_work > 0";
$result = $pdo->query($sql);
if ($pdo->num_rows($result) > 0) {
$row = $pdo->fetch_assoc($result);
$response['has_owner'] = true;
$response['owner_name'] = trim($row['last_name'] . ' ' . $row['first_name'] . ' ' . $row['middle_name']);
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode($response, JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function setRequisitionTransfers($app, $get = null, $post = null) {
$error = false;
$errors = [];
$body = $app->request->getBody();
$data = json_decode(stripslashes($body), true);
$requisitions_ids = $data['requisitions_ids'];
if (!is_array($requisitions_ids) && !empty($requisitions_ids))
$requisitions_ids = [intval($requisitions_ids)];
if (($user_id = $_SESSION['id']) && is_array($requisitions_ids)) {
$employee_id = $user_id;
if (isset($data['employee_id']))
$employee_id = intval($data['employee_id']);
if($employee_id == -1)
$employee_id = 0;
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$cancel_transfer = (bool)$data['cancel_transfer'];
if (!$cancel_transfer) {
if (count($requisitions_ids) > 0) {
$new_who_work = $employee_id;
$sql = "SELECT * FROM requisitions WHERE id in (".implode(',', $requisitions_ids).")";
$query = $pdo->query($sql);
while($row = $pdo->fetch_assoc($query)) {
$confirm = 0;
if ($new_who_work == $user_id)
$confirm = 1;
$sql = "UPDATE requisitions SET who_work='{$new_who_work}', confirm={$confirm} WHERE id=".$row['id'];
if ($pdo->query($sql)) {
if ($confirm) {
$sql2 = "UPDATE `clients`
JOIN `requisitions` AS `req` ON
`clients`.`id` = `req`.`client_id` AND
`clients`.`who_work` = 0 AND
`clients`.`confirm` = 0 AND
`req`.`id` = '$row[id]' AND
`clients`.`who_work` = 0 AND
`clients`.`confirm` = 0
SET `clients`.`who_work` = '$new_who_work',
`clients`.`confirm` = 1";
if (!$pdo->query($sql2)) {
$error = true;
$errors[] = $pdo->db->error();
}
}
} else {
$error = true;
$errors[] = $pdo->db->error();
}
if ($confirm == 1) {
$sqlup = "UPDATE user_client_events SET user_id=".$new_who_work." WHERE req_id=".$row['id']." and `type` != 'step' and `type` != 'file'";
if (!$pdo->query($sqlup)) {
$error = true;
$errors[] = $pdo->db->error();
}
} else if ($confirm == 0) {
$sql_conf = "INSERT INTO `events_clients` (`user_id`, `req_id`, `from_id`, `event`) VALUES (".$user_id.", ".$row['id'].", ".$new_who_work.", 'transmitted')";
if (!$pdo->query($sql_conf)) {
$error = true;
$errors[] = $pdo->db->error();
}
if($new_who_work == 0){
if (!$pdo->query("UPDATE requisitions SET deleted=0 WHERE id=".$row['id'])){
$error = true;
$errors[] = $pdo->db->error();
}
$dop_text = "Переведена в общие";
$sql_ev = "INSERT INTO events_clients (req_id, event, dop_text, user_id) VALUES ({$row['id']}, 'update', '{$dop_text}', {$user_id})";
if (!$pdo->query($sql_ev)){
$error = true;
$errors[] = $pdo->db->error();
}
}
}
// Определяем историю как просмотренную, чтобы сбросить счётчик (если пользователь не открывал её перед передачей другому сотруднику)
$sql = "UPDATE `events_clients` SET `viewed` = 1 WHERE `req_id` = ".$row['id']." AND `user_id` = '$user_id' AND `from_id` = '$user_id' AND (`event` = 'accepted' OR `event` = 'accepted_doer')";
if (!mysql_query($sql)) {
$error = true;
$errors[] = mysql_error();
}
}
} else {
$error = true;
}
}
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function setRequisitionTakeFromClosed($app, $get = null, $post = null) {
$error = false;
$errors = [];
$body = $app->request->getBody();
$data = json_decode(stripslashes($body), true);
$requisitions_ids = $data['requisitions_ids'];
$user_id = $_SESSION['id'];
if (is_array($requisitions_ids)) {
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$sql_check_permissions = "SELECT * FROM user_permissions WHERE user_id = $user_id";
$query_check_permissions = $pdo->query($sql_check_permissions);
$r_check_permissions = $pdo->fetch_assoc($query_check_permissions);
if (count($requisitions_ids) > 0) {
$available = $r_check_permissions['daily_closed_req_limit'] - $r_check_permissions['actual_daily_closed_req'];
if (count($requisitions_ids) > $available) {
$error = true;
$errors[] = "Превышен лимит. Можно взять только {$available} заявок.";
} else {
$sql = "SELECT * FROM requisitions WHERE id in (" . implode(',', $requisitions_ids) . ")";
$query = $pdo->query($sql);
while ($row = $pdo->fetch_assoc($query)) {
$sql = "UPDATE requisitions SET deleted=0, reason='', confirm = 1, who_work=$user_id, who_delete=NULL WHERE id=" . $row['id'];
if (!$pdo->query($sql)) {
$error = true;
$errors[] = $pdo->db->error();
}
$sql_2 = "INSERT INTO `events_clients` (user_id, req_id, from_id, event, `read`) VALUES ('" . $user_id . "', '" . $row['id'] . "', '" . $user_id . "', 'taken_from_closed', '1')";
if (!$pdo->query($sql_2)) {
$error = true;
$errors[] = $pdo->db->error();
}
}
$sql_counter = "UPDATE user_permissions SET actual_daily_closed_req = actual_daily_closed_req + " . count($requisitions_ids) . " WHERE user_id = $user_id";
if (!$pdo->query($sql_counter)) {
$error = true;
$errors[] = $pdo->db->error();
}
}
} else {
$error = true;
}
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
} else {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function setRequisitionClose($app, $get = null, $post = null) {
$error = false;
$errors = [];
$body = $app->request->getBody();
$data = json_decode(stripslashes($body), true);
$requisitions_ids = [];
if (isset($data['requisitions_ids']))
$requisitions_ids = $data['requisitions_ids'];
if (!is_array($requisitions_ids) && !empty($requisitions_ids))
$requisitions_ids = [intval($requisitions_ids)];
$denial = null;
if (isset($data['denial']))
$denial = intval($data['denial']);
$comment = null;
if (isset($data['comment']))
$comment = trim($data['comment']);
$is_deal = null;
if (isset($data['is_deal']))
$is_deal = boolval($data['is_deal']);
$commission = null;
if (isset($data['commission']))
$commission = intval($data['commission']);
if (($user_id = $_SESSION['id']) && is_array($requisitions_ids)) {
$requisitions_ids = array_unique($requisitions_ids);
// Открываем соединение с БД
//$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$req_inst = new \Requisitions($pdo);
if (count($requisitions_ids)) {
foreach($requisitions_ids as $requisition_id) {
if ($requisition_id) {
$req_inst->deleteReq($requisition_id, $user_id, [
'id_del_client',
'reason' => $comment,
'req_id' => $requisition_id,
'tempid' => 0,
'luck' => ($is_deal) ? 10 : 0,
'denial' => $denial,
'summa' => $commission
]);
}
}
}
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function setRequisitionRestored($app, $get = null, $post = null) {
$error = false;
$errors = [];
$body = $app->request->getBody();
$data = json_decode(stripslashes($body), true);
$requisitions_ids = [];
if (isset($data['requisitions_ids']))
$requisitions_ids = $data['requisitions_ids'];
if (!is_array($requisitions_ids) && !empty($requisitions_ids))
$requisitions_ids = [intval($requisitions_ids)];
if (($user_id = $_SESSION['id']) && is_array($requisitions_ids)) {
// Открываем соединение с БД
//$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
if (count($requisitions_ids)) {
foreach($requisitions_ids as $requisition_id) {
if ($requisition_id) {
$req_inst = new \Requisitions($pdo);
$results = $req_inst->renewReq($requisition_id, $user_id);
if (!($results === true))
$errors = $results;
}
}
}
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function deleteRequisition($app, $get = null, $post = null) {
$error = false;
$errors = [];
$requisition_id = null;
if (isset($get['requisition_id']))
$requisition_id = (int)$get['requisition_id'];
if (($user_id = $_SESSION['id']) && !is_null($requisition_id)) {
// Открываем соединение с БД
//$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$req_inst = new \Requisitions($pdo);
$results = $req_inst->cancelReq($requisition_id);
if ($results !== true)
$errors[] = $results;
if (count($errors))
$error = true;
if (!$error) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'errors' => $errors,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function getFunnels($app, $get = null, $post = null) {
$start_time = microtime(true);
$error = false;
if ($user_id = $_SESSION['id']) {
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$user = new \User();
$user->checkPermissions($user_id, false);
$agency_id = $user->agency_id;
$section = $get['section'];
$filter = $get['filter'];
$useCustomFunnel = boolval($get['use_custom']);
if (!in_array($agency_id, [6841, 6426, 7384, 7478, 8353, 8867, 9588]))
$useCustomFunnel = true;
$_SESSION['new_transfers']['clients'] = null;
$_SESSION['new_transfers']['requisitions'] = null;
$funnels = [];
$counts = [];
if ($section == 'clients'/* && ($filter['stage_work'] || $filter['stage_hot'])*/) {
$bd_stage = "";
if ($filter['stage_work']) {
if ($filter['confirm'] || $filter['stage_send']) {
$bd_stage = " AND `clients`.`deleted` <> '1'";
} else {
$bd_stage = " AND `clients`.`deleted` <> '1' AND `clients`.`confirm` > 0";
}
}
if ($filter['stage_hot']) {
$bd_stage .= " AND `clients`.`hot` = 1";
}
if (empty($bd_stage))
$bd_stage = " AND `clients`.`deleted` = '0'";
$sql1 = "SELECT `clients`.`funnel_id`, COUNT(DISTINCT `clients`.`id`) AS `count`
FROM `events_clients` AS `events`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `events`.`client_id`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`clients`.`confirm` = 1 OR `clients`.`doers_confirm` = 1) AND
`events`.`req_id` = 0 $bd_stage AND
(`clients`.`who_work` = '$user_id' OR `clients`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`clients`.`funnel_id` = 0
GROUP BY `clients`.`funnel_id`";
$sql1_list = "SELECT `clients`.`funnel_id`, `clients`.`id`
FROM `events_clients` AS `events`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `events`.`client_id`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`clients`.`confirm` = 1 OR `clients`.`doers_confirm` = 1) AND
`events`.`req_id` = 0 $bd_stage AND
(`clients`.`who_work` = '$user_id' OR `clients`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`clients`.`funnel_id` = 0";
$sql2 = "SELECT `clients`.`funnel_id`, COUNT(DISTINCT `clients`.`id`) AS `count`
FROM `events_clients` AS `events`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `events`.`client_id`
JOIN `funnel` AS `funnel`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`clients`.`confirm` = 1 OR `clients`.`doers_confirm` = 1) AND
`events`.`req_id` = 0 $bd_stage AND
(`clients`.`who_work` = '$user_id' OR `clients`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`clients`.`funnel_id` = `funnel`.`id` AND
`funnel`.`agency_id` = '$agency_id' AND `funnel`.`deleted` = 0
GROUP BY `clients`.`funnel_id`";
$sql2_list = "SELECT `clients`.`funnel_id`, `clients`.`id`
FROM `events_clients` AS `events`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `events`.`client_id`
JOIN `funnel` AS `funnel`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`clients`.`confirm` = 1 OR `clients`.`doers_confirm` = 1) AND
`events`.`req_id` = 0 $bd_stage AND
(`clients`.`who_work` = '$user_id' OR `clients`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`clients`.`funnel_id` = `funnel`.`id` AND
`funnel`.`agency_id` = '$agency_id' AND `funnel`.`deleted` = 0";
} else if ($section == 'requisitions'/* && ($filter['stage_work'] || $filter['stage_hot'])*/) {
$sql1 = "SELECT `req`.`funnel_id`, COUNT(DISTINCT `req`.`id`) AS `count`
FROM `events_clients` AS `events`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `events`.`req_id`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`req`.`confirm` = 1 OR `req`.`doers_confirm` = 1) AND
`events`.`client_id` = 0 AND `req`.`deleted` = 0 AND
(`req`.`who_work` = '$user_id' OR `req`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`req`.`funnel_id` = 0
GROUP BY `req`.`funnel_id`";
$sql1_list = "SELECT `req`.`funnel_id`, `req`.`id`
FROM `events_clients` AS `events`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `events`.`req_id`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`req`.`confirm` = 1 OR `req`.`doers_confirm` = 1) AND
`events`.`client_id` = 0 AND `req`.`deleted` = 0 AND
(`req`.`who_work` = '$user_id' OR `req`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`req`.`funnel_id` = 0";
$sql2 = "SELECT `req`.`funnel_id`, COUNT(DISTINCT `req`.`id`) AS `count`
FROM `events_clients` AS `events`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `events`.`req_id`
JOIN `funnel` AS `funnel`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`req`.`confirm` = 1 OR `req`.`doers_confirm` = 1) AND
`events`.`client_id` = 0 AND `req`.`deleted` = 0 AND
(`req`.`who_work` = '$user_id' OR `req`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`req`.`funnel_id` = `funnel`.`id` AND
`funnel`.`agency_id` = '$agency_id' AND `funnel`.`deleted` = 0
GROUP BY `req`.`funnel_id`";
$sql2_list = "SELECT `req`.`funnel_id`, `req`.`id`
FROM `events_clients` AS `events`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `events`.`req_id`
JOIN `funnel` AS `funnel`
WHERE (`events`.`user_id` = '$user_id' AND `events`.`from_id` = '$user_id') AND
(`events`.`event` = 'accepted' OR `events`.`event` = 'accepted_doer') AND
`events`.`viewed` = 0 AND `events`.`read` = 1 AND
(`req`.`confirm` = 1 OR `req`.`doers_confirm` = 1) AND
`events`.`client_id` = 0 AND `req`.`deleted` = 0 AND
(`req`.`who_work` = '$user_id' OR `req`.`doers` LIKE '%&quot;".$user_id."&quot;:1%') AND
`req`.`funnel_id` = `funnel`.`id` AND
`funnel`.`agency_id` = '$agency_id' AND `funnel`.`deleted` = 0";
} else {
// ...
}
$new_ids = [];
if (!($res1 = mysql_query($sql1)))
$error = true;
if (mysql_num_rows($res1)) {
while($counter = mysql_fetch_assoc($res1)) {
$counts[$counter['funnel_id']] = $counter['count'];
}
}
if (!($res1_list = mysql_query($sql1_list)))
$error = true;
if (mysql_num_rows($res1_list)) {
while($row = mysql_fetch_assoc($res1_list)) {
$new_ids[] = $row['id'];
}
}
if (!($res2 = mysql_query($sql2)))
$error = true;
if (mysql_num_rows($res2)) {
while($counter = mysql_fetch_assoc($res2)) {
$counts[$counter['funnel_id']] = $counter['count'];
}
}
if (!($res2_list = mysql_query($sql2_list)))
$error = true;
if (mysql_num_rows($res2_list)) {
while($row = mysql_fetch_assoc($res2_list)) {
$new_ids[] = $row['id'];
}
}
if (count($new_ids) > 0) {
if (($section == 'clients'))
$_SESSION['new_transfers']['clients'] = $new_ids;
else if (($section == 'requisitions'))
$_SESSION['new_transfers']['requisitions'] = $new_ids;
}
if ($useCustomFunnel || $_SESSION['agency_id'] == 8353) {
$funnels[] = [
'value' => 0,
'name' => 'Обычные',
'count' => intval($counts[0]),
'stages' => [
'1' => [
'value' => 1,
'name' => 'Новый',
],
'2' => [
'value' => 2,
'name' => 'В работе',
],
'3' => [
'value' => 3,
'name' => 'Презентация',
],
'4' => [
'value' => 4,
'name' => 'Показ',
],
'5' => [
'value' => 5,
'name' => 'Бронь',
],
'6' => [
'value' => 6,
'name' => 'Подаем на ипотеку',
],
'7' => [
'value' => 7,
'name' => 'Сделка',
],
'8' => [
'value' => 8,
'name' => 'Закрыт',
],
]
];
}
$sql = "SELECT * FROM `funnel`
WHERE `agency_id` = '$agency_id' AND `deleted`= 0
ORDER BY `id`";
if (!($data = mysql_query($sql)))
$error = true;
$i = 0;
while($funnel = mysql_fetch_assoc($data)) {
$funnel_id = intval($funnel['id']);
$funnels[$funnel_id] = [
'value' => intval($funnel_id),
'name' => $funnel['name'],
'count' => intval($counts[$funnel['id']]),
'stages' => []
];
$i++;
}
$sql = "SELECT `id`, `name`, `main`, `funnel_id`
FROM `funnel_steps`
WHERE `funnel_id` IN (".implode(',', array_keys($funnels)).") AND `deleted` = 0";
if (!($data = mysql_query($sql)))
$error = true;
while($step = mysql_fetch_assoc($data)) {
$funnel_id = intval($step['funnel_id']);
$step_id = intval($step['id']);
$funnels[$funnel_id]['stages'][$step_id] = [
'value' => $step_id,
'name' => $step['name'],
'is_main' => boolval($step['main']),
];
$i++;
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => !$error,
'user_id' => (int)$user_id,
'count' => count($funnels),
'list' => $funnels,
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'user_id' => (int)$user_id,
'overage_time' => round((microtime(true) - $start_time), 3) . " sec.",
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function checkObject($app, $get = null, $post = null) {
/*ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);*/
//var_dump($_SESSION['id']);
if ($user_id = $_SESSION['id']) {
$res = [];
// Открываем соединение с БД
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
//die("2");
$user = new \User();
$user->get($user_id);
$object_id = 0;
if(isset($get['object_id'])){
$object_id = (int)$get['object_id'];
}
// $req_id = 0;
// $agency_id = $user->agencyId;
// $filtr = (object) array('object_id'=>$object_id, 'type' => [2]);
// if ($req_id > 0) {
// $filtr = (object) array('object_id'=>$req_id, 'not_id'=>$req_id, 'type' => [2]);
// }
$res['result'] = 'done';
//$req = new \Requisitions($pdo, true);
//$search = $req->get_all($agency_id, $filtr, false, false, false, false);
$sql_check_exist_object_in_req = "SELECT * FROM requisitions WHERE object_id = {$object_id}";
$sql_check_exist_object_in_req .= " LIMIT 1";
$q_check_exist_object_in_req = mysql_query($sql_check_exist_object_in_req);
$search = mysql_fetch_assoc($q_check_exist_object_in_req);
if (!empty($search)) {
$res['result'] = 'error';
$res['mes'] = "Этот объект уже добавлен в заявку";
$keys = array_keys($search['req']);
$firstKey = $keys[0];
if (isset($search[$firstKey]['name'])) {
$res['mes'] .= " &laquo;".$search[$firstKey]['name']."&raquo;";
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'user_id' => (int)$user_id,
'res' => $res,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function transferClosedRequisitions($app, $get = null, $post = null) {
$body = $app->request->getBody();
$data = json_decode($body, true);
$reqs = isset($data['reqs_id']) ? $data['reqs_id'] : [];
$user_id = (int)(isset($_SESSION['id']) ? $_SESSION['id'] : 0);
$new_who_work = (int)(isset($data['to_user_id']) ? $data['to_user_id'] : 0);
$all = (int)(isset($data['all']) ? $data['all'] : 0);
$ids = isset($data['ids_exception']) ? $data['ids_exception'] : [];
if ($user_id <= 0) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(401);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Пользователь не авторизован'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$sql_check_permissions = "SELECT `menu_can_transfer_closed_to_others`, `daily_closed_transfer_limit`, `actual_daily_closed_transfers`
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);
$can_transfer = ($_SESSION['users_admin'] == 1) || ($_SESSION['agency'] == 1) || ($r_check_permissions['menu_can_transfer_closed_to_others'] == 1);
if (!$can_transfer) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Недостаточно прав для передачи закрытых заявок.',
'debug' => [
'is_admin' => $_SESSION['users_admin'],
'is_agency' => $_SESSION['agency'],
'can_transfer_closed' => $r_check_permissions['menu_can_transfer_closed_to_others'],
'user_id' => $user_id,
'r_check_permissions' => $r_check_permissions
]
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
// Проверка лимита
if (!$_SESSION['users_admin'] && !$_SESSION['agency']) {
$daily_limit = (int)$r_check_permissions['daily_closed_transfer_limit'];
$actual_transfer = (int)$r_check_permissions['actual_daily_closed_transfers'];
if ($actual_transfer >= $daily_limit) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'error' => "Превышен дневной лимит передачи закрытых заявок: {$daily_limit} шт."
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
if (empty($reqs) && $all == 0) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Список заявок для передачи пуст.'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$sql = "SELECT * FROM requisitions
WHERE id IN (" . implode(',', $reqs) . ") AND deleted = 1
ORDER BY FIELD(id, " . implode(',', $reqs) . ")";
if($all == 1){
if(isset($_SESSION['where_req_campaigns'])){
$sql = $_SESSION['where_req_campaigns'] . " AND deleted = 1";
if (!empty($ids)){
$sql .= " AND ID NOT IN (".implode(',', $ids).")";
}
} else {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Ошибка фильтрации.'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}
$q = mysql_query($sql);
$transferred_count = 0;
$remaining_limit = (int)$r_check_permissions['daily_closed_transfer_limit'] - (int)$r_check_permissions['actual_daily_closed_transfers'];
// ФИО отправителя
$sql_sender = "SELECT last_name, first_name, middle_name FROM users WHERE id = $user_id LIMIT 1";
$q_sender = mysql_query($sql_sender);
$r_sender = mysql_fetch_assoc($q_sender);
$sender_fio = $r_sender ? trim("{$r_sender['last_name']} {$r_sender['first_name']} {$r_sender['middle_name']}") : "Неизвестный пользователь";
// ФИО получателя
$sql_recipient = "SELECT last_name, first_name, middle_name FROM users WHERE id = $new_who_work LIMIT 1";
$q_recipient = mysql_query($sql_recipient);
$r_recipient = mysql_fetch_assoc($q_recipient);
$recipient_fio = $r_recipient ? trim("{$r_recipient['last_name']} {$r_recipient['first_name']} {$r_recipient['middle_name']}") : "Неизвестный пользователь";
while($r = mysql_fetch_assoc($q)) {
if (!$_SESSION['users_admin'] && !$_SESSION['agency'] && $remaining_limit <= 0) {
break;
}
if ($r['funnel_id'] > 0) {
$sql_update = "UPDATE requisitions SET who_work = {$new_who_work}, deleted = 0, step_id = 1 WHERE id = {$r['id']}";
} else {
$sql_update = "UPDATE requisitions SET who_work = {$new_who_work}, deleted = 0, stage = 1 WHERE id = {$r['id']}";
}
if (mysql_query($sql_update)) {
$transferred_count++;
// Логируем событие
$dop_text = "Закрытая заявка передана в работу сотруднику {$recipient_fio} сотрудником {$sender_fio}";
$sql_log = "INSERT INTO events_clients (req_id, event, dop_text, user_id, from_id, `read`)
VALUES ({$r['id']}, 'transfer_closed', '" . mysql_real_escape_string($dop_text) . "', {$new_who_work}, {$user_id}, 1)";
mysql_query($sql_log);
// Обновляем счётчик лимита (если не админ)
if (!$_SESSION['users_admin'] && !$_SESSION['agency']) {
$sql_update_limit = "UPDATE user_permissions
SET actual_daily_closed_transfers = actual_daily_closed_transfers + 1
WHERE user_id = {$user_id}";
mysql_query($sql_update_limit);
$remaining_limit--;
}
}
}
$not_transferred = count($reqs) - $transferred_count;
$message = "Успешно передано {$transferred_count} заявок.";
if ($not_transferred > 0) {
$message .= " {$not_transferred} заявок не были переданы из-за ограничения.";
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'message' => $message,
'transferred_count' => $transferred_count,
'notification_data' => [
'sender_user_id' => $user_id,
'recipient_user_id' => $new_who_work,
'transferred_req_ids' => $reqs,
'transferred_count' => $transferred_count,
'all' => $all,
'ids_exception' => $ids,
'actual_after' => !$_SESSION['users_admin'] && !$_SESSION['agency'] ? ((int)$r_check_permissions['actual_daily_closed_transfers'] + $transferred_count) : null,
'limit_after' => !$_SESSION['users_admin'] && !$_SESSION['agency'] ? (int)$r_check_permissions['daily_closed_transfer_limit'] : null,
]
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function sendTransferClosedNotifications($app, $get = null, $post = null) {
$body = $app->request->getBody();
$data = json_decode($body, true);
// Извлекаем данные из запроса
$sender_user_id = (int)(isset($data['sender_user_id']) ? $data['sender_user_id'] : 0);
$recipient_user_id = (int)(isset($data['recipient_user_id']) ? $data['recipient_user_id'] : 0);
$transferred_req_ids = isset($data['transferred_req_ids']) ? $data['transferred_req_ids'] : [];
$all = (int)(isset($data['all']) ? $data['all'] : 0);
$ids_exception = isset($data['ids_exception']) ? $data['ids_exception'] : [];
$actual_after = isset($data['actual_after']) ? $data['actual_after'] : null;
$limit_after = isset($data['limit_after']) ? $data['limit_after'] : null;
// Проверка обязательных параметров
if ($sender_user_id <= 0 || $recipient_user_id <= 0) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(400);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Некорректные ID пользователей'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
// Получаем ФИО отправителя
$sql_sender = "SELECT CONCAT(last_name, ' ', first_name, ' ', middle_name) as fio FROM users WHERE id = $sender_user_id LIMIT 1";
$result_sender = mysql_query($sql_sender);
$sender_data = mysql_fetch_assoc($result_sender);
$sender_fio = isset($sender_data['fio']) ? $sender_data['fio'] : 'Сотрудник';
// Получаем данные получателя (нового ответственного)
$sql_recipient = "SELECT telegramm_chat_id, max_user_id, max_notice CONCAT(last_name, ' ', first_name, ' ', middle_name) as fio FROM users WHERE id = $recipient_user_id LIMIT 1";
$result_recipient = mysql_query($sql_recipient);
$recipient = mysql_fetch_assoc($result_recipient);
$transferred_count = isset($data['transferred_count']) ? (int)$data['transferred_count'] : count($transferred_req_ids);
// ID переданных заявок для уведомления (если <= 10)
$transferred_req_ids_for_msg = [];
if ($transferred_count <= 10) {
$sql_ids = "SELECT id FROM requisitions WHERE who_work = $recipient_user_id AND id IN (" . implode(',', $transferred_req_ids) . ") AND deleted = 0 ORDER BY id DESC LIMIT 10";
if ($all == 1 && isset($_SESSION['where_req_campaigns'])) {
$sql_ids = $_SESSION['where_req_campaigns'] . " AND deleted = 0 AND who_work = $recipient_user_id ORDER BY id DESC LIMIT 10";
if (!empty($ids_exception)) {
$sql_ids .= " AND ID NOT IN (" . implode(',', $ids_exception) . ")";
}
}
$q_ids = mysql_query($sql_ids);
while ($row_id = mysql_fetch_assoc($q_ids)) {
$transferred_req_ids_for_msg[] = $row_id['id'];
}
}
// Сообщение новому ответственному
if ($recipient && !empty($recipient['telegramm_chat_id']) && $recipient['telegramm_chat_id'] > 0) {
$message_to_recipient = "Сотрудник {$sender_fio} передал вам ";
if ($transferred_count == 1) {
$message_to_recipient .= "1 заявку из Закрытых";
} else {
$message_to_recipient .= "{$transferred_count} заявки из Закрытых";
}
if ($transferred_count <= 10 && !empty($transferred_req_ids_for_msg)) {
$message_to_recipient .= ": " . implode(', ', $transferred_req_ids_for_msg);
}
$tel = new \Telegram(false);
try {
$tel->send($message_to_recipient, $recipient['telegramm_chat_id']);
} catch (\Exception $e) {
// Логируем ошибку, но не прерываем выполнение
error_log("Ошибка отправки Telegram-уведомления получателю: " . $e->getMessage());
}
}
// Уведомление новому ответственному (с ID, если <= 10, без ID если > 10) в макс
if ($recipient && !empty($recipient['max_user_id']) && $recipient['max_user_id'] > 0 && $recipient['max_notice'] > 0) {
$message_to_recipient = "Сотрудник {$sender_fio} передал вам ";
if ($transferred_count == 1) {
$message_to_recipient .= "1 заявку из Закрытых";
} else {
$message_to_recipient .= "{$transferred_count} заявки из Закрытых";
}
// Добавляем ID, только если их <= 10
if ($transferred_count <= 10 && !empty($transferred_req_ids_for_msg)) {
$message_to_recipient .= ": " . implode(', ', $transferred_req_ids_for_msg);
}
$max = new \MaxClass();
try {
$max->send_messages_to_user($recipient['max_user_id'], $message_to_recipient);
} catch (\Exception $e) {
file_put_contents(__DIR__ . '/debug_max.txt', "Max error: " . $e->getMessage() . "\n", FILE_APPEND);
}
}
// Уведомление директору/админу, если лимит исчерпан
if ($actual_after !== null && $limit_after !== null && $actual_after >= $limit_after) {
$send_agency_id = (int)$_SESSION['agency_id'];
$sql_admin = "SELECT telegramm_chat_id FROM users WHERE id = $send_agency_id AND telegramm_chat_id > 0 LIMIT 1";
$result_admin = mysql_query($sql_admin);
$admin = mysql_fetch_assoc($result_admin);
if ($admin && !empty($admin['telegramm_chat_id'])) {
$message_to_admin = "Сотрудник {$sender_fio} передал за сегодня {$actual_after} заявок из Закрытых";
$tel = new \Telegram(false);
try {
$tel->send($message_to_admin, $admin['telegramm_chat_id']);
} catch (\Exception $e) {
file_put_contents(__DIR__ . '/debug_telegram.txt', "Telegram error: " . $e->getMessage() . "\n", FILE_APPEND);
}
}
}
// Уведомление директору/админу, если лимит исчерпан в макс
if ($actual_after !== null && $limit_after !== null && $actual_after >= $limit_after) {
$send_agency_id = (int)$_SESSION['agency_id'];
$sql_admin = "SELECT max_user_id FROM users WHERE id = $send_agency_id AND max_user_id > 0 AND max_notice > 0 LIMIT 1";
$result_admin = mysql_query($sql_admin);
$admin = mysql_fetch_assoc($result_admin);
if ($admin && !empty($admin['max_user_id'])) {
$message_to_admin = "Сотрудник {$sender_fio} передал за сегодня {$actual_after} заявок из Закрытых";
$max = new \MaxClass();
try {
$max->send_messages_to_user($admin['max_user_id'], $message_to_admin);
} catch (\Exception $e) {
file_put_contents(__DIR__ . '/debug_max.txt', "Max error: " . $e->getMessage() . "\n", FILE_APPEND);
}
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'message' => 'Уведомления отправлены'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
public function editFinanceRequisition($app, $get = null, $post = null){
$body = $app->request->getBody();
$data = json_decode($body, true);
$userId = (int)(isset($_SESSION['id']) ? $_SESSION['id'] : 0);
$reqId = (int)$data['req_id'];
$depositId = 0;
if(isset($data['deposit_id'])){
$depositId = (int)$data['deposit_id'];
}
$expenseId = 0;
if(isset($data['expense_id'])){
$expenseId = (int)$data['expense_id'];
}
$comment = '';
if(isset($data['comment'])){
$comment = $data['comment'];
$result = preg_replace('/"([^"]*)"/', '«$1»', $comment);
$result = str_replace("\"", "", $result);
$result = str_replace("'", "", $result);
$comment = $result;
}
$field = $data['field'];
$value = $data['value'];
if ($userId <= 0) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(401);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Пользователь не авторизован'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$sql_req = "SELECT expected_commission, id, who_work FROM requisitions WHERE id = {$reqId}";
$q_req = $pdo->query($sql_req);
$r_req = $pdo->fetch_assoc($q_req);
if($field == 'expected_commission'){
$text_commission = '';
if ($r_req['expected_commission'] != $value) {
$text_commission = "Изменено: Ожидаемая комиссия с {$r_req['expected_commission']} на {$value}";
$sql_up = "UPDATE requisitions SET expected_commission = {$value} WHERE id = {$reqId}";
if($pdo->query($sql_up)) {
$sql_event = "INSERT INTO events_clients (user_id, from_id, req_id, `event`, dop_text, `read`) VALUES ({$userId}, {$userId}, {$reqId}, 'update', '{$text_commission}', 1)";
$pdo->query($sql_event);
}
}
}
if($field == 'deposit'){
$who_work = $userId;
$nameEvent = "Аванс";
if($r_req['who_work'] > 0){
$who_work = (int)$r_req['who_work'];
}
$sql_d = "SELECT id, deposit, step_id FROM deposits_clients_req WHERE id = {$depositId}";
$q_d = $pdo->query($sql_d);
$deposit = (int)$value;
if($pdo->num_rows($q_d) > 0){
$r_d = $pdo->fetch_assoc($q_d);
$sql_step = "SELECT * FROM `funnel_steps` WHERE id = {$r_d['step_id']}";
$q_step = $pdo->query($sql_step);
$r_step = $pdo->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'] == 'Задаток'){
$nameEvent = $pole['name'];
}
}
$id_d = (int)$r_d['id'];
$sql_up_d = "UPDATE deposits_clients_req SET deposit = {$deposit}, created_at= NOW(), user_id={$who_work} WHERE id = {$id_d}";
$pdo->query($sql_up_d);
if((int)$r_d['deposit'] != $deposit){
$text_deposit = "Изменено: {$nameEvent} с {$r_d['deposit']} на {$deposit}";
$sql_event = "INSERT INTO events_clients (user_id, from_id, req_id, `event`, dop_text, `read`) VALUES ({$userId}, {$userId}, {$reqId}, 'update', '{$text_deposit}', 1)";
$pdo->query($sql_event);
}
}
}
if($field == 'expense'){
$who_work = $userId;
$nameEvent = "Расходы";
$sql_d = "SELECT * FROM expenses_req WHERE id = {$expenseId}";
$q_d = $pdo->query($sql_d);
$expense = (int)$value;
if($pdo->num_rows($q_d) > 0){
$r_d = $pdo->fetch_assoc($q_d);
$sql_step = "SELECT * FROM `funnel_steps` WHERE id = {$r_d['step_id']}";
$q_step = $pdo->query($sql_step);
$r_step = $pdo->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'] == 'Расходы'){
$nameEvent = $pole['name'];
}
}
$sql_up_d = "UPDATE expenses_req SET amount = '{$expense}', comment = '{$comment}' WHERE id = {$expenseId}";
$pdo->query($sql_up_d);
if((int)$r_d['amount'] != $expense){
$text_expense = "Изменено: {$nameEvent} с {$r_d['amount']} на {$expense}";
if(!empty($comment)){
$text_expense .= " Добавлен комментарий: ".$comment;
}
$sql_event = "INSERT INTO events_clients (user_id, from_id, req_id, `event`, dop_text, `read`) VALUES ({$userId}, {$userId}, {$reqId}, 'update', '{$text_expense}', 1)";
$pdo->query($sql_event);
}
}
}
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'field ' => $field
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
/**
* Установка новой воронки
*/
public function funnel_change($app, $get = null, $post = null){
$body = $app->request->getBody();
$data = json_decode($body, true);
$userId = (int)(isset($_SESSION['id']) ? $_SESSION['id'] : 0);
$reqId = (int)$data['req_id'];
$funnel_id = (int)$data['funnel_id'];
if ($userId <= 0) {
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(401);
$app->response->setBody(json_encode([
'success' => false,
'error' => 'Пользователь не авторизован'
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
$mdb = $app->container->get('mysql');
$pdo = $app->container->get('mypdo');
$req = new \Requisitions($pdo);
$req->updateFunnel($funnel_id, $reqId);
$app->response->header('Content-Type', 'application/json');
$app->response->setStatus(200);
$app->response->setBody(json_encode([
'success' => true,
'funnel_id ' => $funnel_id
], JSON_UNESCAPED_UNICODE));
$app->stop();
}
}