File: /var/www/heifetz/heifetz-app/models/Logs.php
<?php
namespace Models;
use App\Exceptions\CrmException;
use Core\DbLib\DbDriver;
use Core\DbLib\DbModel;
use Core\Models\Acl;
use Core\Models\CoreHelper;
use Core\Models\Navigation;
use Core\Models\OldUser;
use Models\Repositories\CallStatisticRepository;
use Traits\ModelGetQuery;
/**
* Class Logs
*
* @property int $id
* @property int $user_id
* @property int $unit_id
* @property string $text
* @property string $param
* @property string $log
* @property string $created_at
* @property int $action
* @property int $company_id
*/
class Logs extends DbModel
{
use ModelGetQuery;
const ACTION_UNKNOWN = 0;
const ACTION_CREATE = 1;
const ACTION_UPDATE = 2;
const ACTION_DELETE = 3;
static string $tableName = 'ev_logs';
/**
* @param string $log текстовое описание лога
* @param int $unitId соискатель, параметры которого были изменены
* @param string $param параметр, который был изменён
* @param string $value новое значение
* @param int $userId идентификатор пользователя
* @param int $action тип действия с данными
*
* @throws CrmException
*/
public static function log($log, $unitId, $param = '', $value = '', $userId = null, $action = self::ACTION_UNKNOWN): void
{
if (is_array($log)) {
$log = implode(PHP_EOL, $log);
}
if (trim($log) == '') {
return;
}
if (is_null($value)) {
$value = '';
}
if (is_null($userId) || $userId !== 0) {
$userId = OldUser::getRealId();
}
$unit = Unit::find($unitId, DbDriver::SERVER_WRITE);
if (empty($unit)) {
throw new CrmException('Невозможно создать лог для соискателя, его не существует (id = ' . $unitId . ')');
}
if ($userId == $unit->work_by) {
Unit::setRecruitUpdatedAt($unitId);
}
$data = [
'user_id' => $userId,
'unit_id' => $unitId,
'log' => $log,
'param' => $param,
'value' => $value,
'action' => $action,
'created_at' => date('Y-m-d H:i:s'),
'company_id' => CoreHelper::$companyId,
];
self::create($data, false);
if ($unitId) {
Unit::modifiedAtUpdate($unitId);
}
if ($param == WorkDate::$tableName) {
$data = WorkDate::prepareWorkDateComment((object) $data);
if (empty($data->comment)) {
return;
}
UnitCommentCache::addComment($userId, $unitId, $data->comment, UnitCommentCache::TYPE_WORK_DATE);
}
}
/**
* @param $unitId
* @param string $param
* @param string $value
* @param null $userId
*
* @deprecated logCreateNew()
*/
public static function logCreate($unitId, $param = '', $value = '', $userId = null)
{
$log = self::pretty($unitId, $param, $value, self::ACTION_CREATE);
self::log($log, $unitId, $param, $value, $userId, self::ACTION_CREATE);
}
public static function logCreateNew($unitId, $tableName, $entityId, $userId = null)
{
$log = self::prettyNew($tableName, $entityId, null, self::ACTION_CREATE);
self::log($log, $unitId, $tableName, '', $userId, self::ACTION_CREATE);
}
/**
* @param $unitId
* @param string $param
* @param string $value
* @param null $userId
*
* @deprecated logUpdateNew()
*/
public static function logUpdate($unitId, $param = '', $value = '', $userId = null)
{
$log = self::pretty($unitId, $param, $value, self::ACTION_UPDATE);
self::log($log, $unitId, $param, $value, $userId, self::ACTION_UPDATE);
}
public static function logUpdateNew($unitId, $tableName, $entityId, $oldEntity = null, $userId = null)
{
$log = self::prettyNew($tableName, $entityId, $oldEntity, self::ACTION_UPDATE);
$userId = is_null($userId) ? OldUser::getRealId() : 0;
self::log($log, $unitId, $tableName, '', $userId, self::ACTION_UPDATE);
}
/**
* @param $unitId
* @param string $param
* @param string $value
* @param null $userId
*
* @deprecated logDeleteNew()
*/
public static function logDelete($unitId, $param = '', $value = '', $userId = null)
{
$log = self::pretty($unitId, $param, $value, self::ACTION_DELETE);
self::log($log, $unitId, $param, $value, $userId, self::ACTION_DELETE);
}
public static function logDeleteNew($unitId, $tableName, $entityId, $oldEntity = null, $userId = null)
{
$log = self::prettyNew($tableName, $entityId, $oldEntity, self::ACTION_DELETE);
self::log($log, $unitId, $tableName, '', $userId, self::ACTION_DELETE);
}
public static function prettyNew($tableName, $entityId, $oldEntity = null, $action = self::ACTION_UNKNOWN)
{
$log = '';
switch ($tableName) {
case UnitPaymentCards::$tableName:
return UnitPaymentCards::log($entityId, $oldEntity, $action);
case WorkDate::$tableName:
return WorkDate::log($entityId, $oldEntity, $action);
case AccommodationPeriod::$tableName:
return AccommodationPeriod::log($entityId, $oldEntity, $action);
case Insurance::$tableName:
return Insurance::log($entityId, $oldEntity, $action);
}
return $log;
}
public static function getTimeline(int $unitId): array
{
$timeline = new Timeline();
$comments = Comment::model(['u.username', 'c.*'], 'c')
->joinLeft(OldUser::$tableName . ' u', 'u.id = c.user_id')
->where('c.unit_id = ?', $unitId)
->order('created_at')
->fetchAll();
$timeline->add($comments);
$unitTicketIds = Ticket::model(['id'])->where('unit_id = ?', $unitId)->fetchCol();
if (!empty($unitTicketIds)) {
/** @var TicketComment[] $ticketComments */
$ticketComments = TicketComment::model()
->whereIn('entity_id', $unitTicketIds)
->where('entity_type = ?', TicketComment::ENTITY_TYPE_TICKET)
->order('created_at')
->fetchAll();
foreach ($ticketComments as $ticketComment) {
$ticketComment->comment .= ' <a href="' . Navigation::buildRoute(Acl::PRESENTER_TICKETS, 'edit', $ticketComment->entity_id) . '">Тикет №' . $ticketComment->entity_id . '</a>';
}
$timeline->add($ticketComments);
}
$timeline->addCall(CallStatisticRepository::getByUnitId($unitId));
if (!OldUser::isRecruit() && !OldUser::isFreelancer()) {
/** @var Logs[] $workDateLogs */
$workDateLogs = self::getQuery(['u.username', 'l.*'], 'l')
->joinLeft(OldUser::$tableName . ' u', 'u.id = l.user_id')
->where('l.unit_id = ?', $unitId)
->where('l.param = ?', WorkDate::$tableName)
->order('l.created_at')
->fetchAll();
if (!empty($workDateLogs)) {
foreach ($workDateLogs as $dataRow) {
$logItems = explode("\r\n", $dataRow->log);
$dataRow->log = '';
foreach ($logItems as $logItem) {
$dataRow->log .= $logItem . "\r\n";
}
$log = WorkDate::prettyLog($dataRow, true);
if (empty($log)) {
continue;
}
$dataRow->comment = $log;
$dataRow->log = $dataRow->comment;
}
}
$workDateLogs = array_filter($workDateLogs, fn($item) => !empty($item->comment));
$timeline->add($workDateLogs);
}
return $timeline->group();
}
public static function icon($log)
{
switch ($log->param) {
case 'status':
switch ($log->value) {
case Unit::STATUS_ORIENTED:
return 'icon-user-plus text-success';
break;
case Unit::STATUS_WORK:
return 'icon-user-tie text-success';
break;
default:
return 'icon-user';
break;
}
break;
case 'master_status':
switch ($log->value) {
case Unit::MASTER_STATUS_APPLIED:
return 'icon-user-check text-success';
break;
case Unit::MASTER_STATUS_DENIED:
return 'icon-user-block text-danger';
break;
case Unit::MASTER_STATUS_RESERVED:
return 'icon-users text-warning';
break;
case Unit::MASTER_STATUS_NOT_AVAILABLE:
return ' icon-user-lock text-slate';
break;
}
break;
case 'accommodation':
return ' icon-home text-info';
break;
}
}
public static function pretty($unitId, $param, $value, $action, $sourceLog = '')
{
$log = '';
switch ($param) {
case UnitsContract::$tableName:
if ($action == self::ACTION_UNKNOWN) {
if (mb_strpos($sourceLog, 'Добавил') !== false) {
return self::pretty($unitId, $param, $value, self::ACTION_CREATE, $log);
} else {
return self::pretty($unitId, $param, $value, self::ACTION_UPDATE, $log);
}
} else {
$unitContract = json_decode($value);
return UnitsContract::log($unitContract, $action);
}
}
return $log;
}
public static function groupLogs(array $data): array
{
$groupData = [];
$group = [];
$last = false;
foreach ($data as $row) {
if (empty($last)) {
$last = $row;
}
if (empty($group)) {
} elseif ($last->user_id == $row->user_id && date('dmY', strtotime($row->created_at)) == date('dmY', strtotime($last->created_at))) {
} else {
$groupData[] = $group;
$group = [];
}
$group[] = $row;
$last = $row;
}
if (!empty($group)) {
$groupData[] = $group;
}
return $groupData;
}
}