HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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;
    }

}