Your IP : 3.21.241.17


Current Path : /var/www/axolotl/data/www/kirov.axolotls.ru/bitrix/modules/timeman/lib/controller/
Upload File :
Current File : /var/www/axolotl/data/www/kirov.axolotls.ru/bitrix/modules/timeman/lib/controller/worktime.php

<?php
namespace Bitrix\Timeman\Controller;

use Bitrix\Main\Engine\ActionFilter\Scope;
use Bitrix\Main\Error;
use Bitrix\Timeman\Form\Worktime\WorktimeRecordForm;
use Bitrix\Timeman\Helper\TimeHelper;
use Bitrix\Timeman\Model\Worktime\EventLog\WorktimeEventTable;
use Bitrix\Timeman\Model\Worktime\Record\WorktimeRecord;
use Bitrix\Timeman\Model\Worktime\Record\WorktimeRecordTable;
use Bitrix\Timeman\UseCase\Worktime\Manage;
use Bitrix\Timeman\Service\Worktime\Result\WorktimeServiceResult;
use Bitrix\Main\Engine\Controller;

class Worktime extends Controller
{
	public function configureActions()
	{
		$configureActions = parent::configureActions();
		$restOnlyScope = new Scope(Scope::REST);
		$actionsForRest = [
			'start',
			'stop',
			'relaunch',
			'pause',
		];
		foreach ($actionsForRest as $name)
		{
			$configureActions[$name] = [
				'-prefilters' => [Scope::class],
				'+prefilters' => [$restOnlyScope,],
			];
		}

		return $configureActions;
	}

	protected function getDefaultPreFilters()
	{
		return array_merge(
			parent::getDefaultPreFilters(),
			[
				new Scope(Scope::AJAX),
			]
		);
	}

	public function pauseAction($userId, $latitudeClose = null, $longitudeClose = null, $ipClose = null, $device = null)
	{
		$recordForm = WorktimeRecordForm::createWithEventForm();
		$recordForm->userId = $userId;
		$recordForm->latitudeClose = $latitudeClose;
		$recordForm->longitudeClose = $longitudeClose;
		$recordForm->ipClose = $ipClose;
		$recordForm->device = $device;

		if (!$recordForm->validate())
		{
			return $recordForm->getErrors();
		}

		$result = (new Manage\Pause\Handler())->handle($recordForm);
		return $this->decorateServiceResult($result);
	}

	public function startAction($userId, $startSeconds = null, $startDate = null, $reason = null, $latitudeOpen = null, $longitudeOpen = null, $ipOpen = null, $device = null)
	{
		$recordForm = WorktimeRecordForm::createWithEventForm();
		$recordForm->userId = $userId;
		$recordForm->recordedStartSeconds = $startSeconds;
		$recordForm->getFirstEventForm()->reason = $reason;
		$recordForm->latitudeOpen = $latitudeOpen;
		$recordForm->longitudeOpen = $longitudeOpen;
		$recordForm->ipOpen = $ipOpen;
		$recordForm->device = $device;
		$recordForm->recordedStartDateFormatted = $startDate;

		if (!$recordForm->validate())
		{
			return $recordForm->getErrors();
		}
		$result = (new Manage\Start\Handler())->handle($recordForm);
		return $this->decorateServiceResult($result);
	}

	public function stopAction($userId, $stopSeconds = null, $stopDate = null, $reason = null, $latitudeClose = null, $longitudeClose = null, $ipClose = null, $device = null)
	{
		$recordForm = WorktimeRecordForm::createWithEventForm();
		$recordForm->userId = $userId;
		$recordForm->recordedStopSeconds = $stopSeconds;
		$recordForm->getFirstEventForm()->reason = $reason;
		$recordForm->latitudeClose = $latitudeClose;
		$recordForm->longitudeClose = $longitudeClose;
		$recordForm->ipClose = $ipClose;
		$recordForm->device = $device;
		$recordForm->recordedStopDateFormatted = $stopDate;

		if (!$recordForm->validate())
		{
			return $recordForm->getErrors();
		}
		$result = (new Manage\Stop\Handler())->handle($recordForm);
		return $this->decorateServiceResult($result);
	}

	public function relaunchAction($userId, $device = null)
	{
		$recordForm = WorktimeRecordForm::createWithEventForm();
		$recordForm->userId = $userId;
		$recordForm->device = $device;

		if (!$recordForm->validate())
		{
			return $recordForm->getErrors();
		}
		$result = (new Manage\Relaunch\Handler())->handle($recordForm);
		return $this->decorateServiceResult($result);
	}

	##### AJAX

	public function approveRecordAction()
	{
		$worktimeForm = WorktimeRecordForm::createWithEventForm(WorktimeEventTable::EVENT_TYPE_APPROVE);
		$worktimeForm->approvedBy = $this->getCurrentUser()->getId();
		$worktimeForm->load($this->getRequest());

		if ($worktimeForm->validate())
		{
			$oldStart = WorktimeRecordTable::query()
				->addSelect('ID')
				->addSelect('RECORDED_START_TIMESTAMP')
				->where('ID', $worktimeForm->id)
				->exec()
				->fetchObject();
			$result = (new Manage\Approve\Handler())->handle($worktimeForm);
			if (WorktimeServiceResult::isSuccessResult($result))
			{
				return $this->makeAjaxResult($result, $worktimeForm, $oldStart);
			}
			$this->addErrors($result->getErrors());
			return [];
		}
		$this->addError($worktimeForm->getFirstError());
		return [];
	}

	/**
	 * @param WorktimeServiceResult $serviceResult
	 * @param WorktimeRecordForm $worktimeForm
	 * @param WorktimeRecord $oldRecord
	 * @return array
	 */
	private function makeAjaxResult($serviceResult, $worktimeForm, $oldRecord)
	{
		/** @var array $result */
		$result = $this->convertKeysToCamelCase($serviceResult->getWorktimeRecord()->collectValues());

		$updatedRecord = $serviceResult->getWorktimeRecord();
		$startTimestampBefore = $oldRecord ? $oldRecord->getRecordedStartTimestamp() : $updatedRecord->getRecordedStartTimestamp();
		$startTimestampAfter = $updatedRecord->getRecordedStartTimestamp();
		if ($worktimeForm->useEmployeesTimezone)
		{
			$offset = $updatedRecord->getStartOffset();
		}
		else
		{
			$offset = TimeHelper::getInstance()->getUserUtcOffset($this->getCurrentUser()->getId());
		}
		$dateBefore = TimeHelper::getInstance()->createDateTimeFromFormat('U', $startTimestampBefore, $offset);
		$dateAfter = TimeHelper::getInstance()->createDateTimeFromFormat('U', $startTimestampAfter, $offset);
		$dates = [];
		$dates[$dateBefore->format('d.m.Y')] = $dateBefore;
		$dates[$dateAfter->format('d.m.Y')] = $dateAfter;
		global $APPLICATION;
		$result['dayCellsHtml'] = [];
		foreach ($dates as $date)
		{
			ob_start();
			$APPLICATION->includeComponent(
				'bitrix:timeman.worktime.grid',
				'.default',
				[
					'PARTIAL_ITEM' => 'shiftCell',
					'DRAWING_TIMESTAMP' => $date->getTimestamp(),
					'INCLUDE_CSS' => false,
					'IS_SHIFTPLAN' => $this->getRequest()->get('isShiftplan') === 'true',
					'USER_ID' => $serviceResult->getWorktimeRecord()->getUserId(),
				]
			);
			$result['dayCellsHtml'][] = ob_get_clean();
		}

		return ['record' => $result];
	}

	private function decorateServiceResult(WorktimeServiceResult $result)
	{
		if (!$result->isSuccess())
		{
			$error = $result->getFirstError();
			if ($error && !empty($error->getCustomData()) && !empty($error->getCustomData()['reasonCode']))
			{
				$code = $error->getCustomData()['reasonCode'];
				if ($code === WorktimeServiceResult::ERROR_EMPTY_ACTIONS)
				{
					return new Error('Can not perform such an action for this user');
				}
				return new Error('', $code);
			}
			return $result->getErrors();
		}
		return $this->convertKeysToCamelCase($result->getWorktimeRecord()->collectRawValues());
	}
}