163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace frontend\modules\api\services;
 | 
						|
 | 
						|
use common\models\Entity;
 | 
						|
use common\models\forms\TasksImportForm;
 | 
						|
use common\services\ImportProjectTaskService;
 | 
						|
use DateTime;
 | 
						|
use frontend\modules\api\models\project\ProjectTask;
 | 
						|
use frontend\modules\api\models\project\ProjectTaskUser;
 | 
						|
use frontend\modules\api\models\Timer;
 | 
						|
use yii\web\BadRequestHttpException;
 | 
						|
 | 
						|
class TaskService
 | 
						|
{
 | 
						|
    public ImportProjectTaskService $importProjectTaskService;
 | 
						|
 | 
						|
    public function __construct(ImportProjectTaskService $importProjectTaskService)
 | 
						|
    {
 | 
						|
        $this->importProjectTaskService = $importProjectTaskService;
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getOpenTaskCount(int $user_id, int $project_id): bool|int|string|null
 | 
						|
    {
 | 
						|
        return ProjectTask::find()
 | 
						|
            ->where(['user_id' => $user_id])
 | 
						|
            ->andWhere(['project_id' => $project_id])
 | 
						|
            ->andWhere(['in', 'status', ProjectTask::openTaskStatusList()])
 | 
						|
            ->count();
 | 
						|
    }
 | 
						|
 | 
						|
    public static function getHoursWorkedForCurrentMonth(int $user_id, int $project_id)
 | 
						|
    {
 | 
						|
        $projectTaskIdArr = ProjectTask::find()
 | 
						|
            ->select('id')
 | 
						|
            ->where(['user_id' => $user_id])
 | 
						|
            ->andWhere(['project_id' => $project_id])
 | 
						|
            ->column();
 | 
						|
 | 
						|
        $firstMonthDay = new DateTime('first day of this month');
 | 
						|
        $firstMonthDay->setTime(00, 00, 01);
 | 
						|
        $firstMonthDay = $firstMonthDay->format('Y-m-d H:i:s');
 | 
						|
 | 
						|
 | 
						|
        $lastMonthDay = new DateTime('last day of this month');
 | 
						|
        $lastMonthDay->setTime(23, 59, 00);
 | 
						|
        $lastMonthDay = $lastMonthDay->format('Y-m-d H:i:s');
 | 
						|
 | 
						|
        $timers = Timer::find()
 | 
						|
            ->where(['user_id' => $user_id])
 | 
						|
            ->andWhere(['entity_type' => Entity::ENTITY_TYPE_TASK])
 | 
						|
            ->andWhere(['in', 'entity_id', $projectTaskIdArr])
 | 
						|
            ->andWhere(['between', 'created_at', $firstMonthDay, $lastMonthDay ])
 | 
						|
            ->all();
 | 
						|
 | 
						|
        $hours = 0;
 | 
						|
        /** @var Timer $timer */
 | 
						|
        foreach ($timers as $timer) {
 | 
						|
            // Create two new DateTime-objects...
 | 
						|
            $date1 = new DateTime($timer->created_at);
 | 
						|
            $date2 = new DateTime($timer->stopped_at);
 | 
						|
 | 
						|
            $diff = $date2->diff($date1);
 | 
						|
 | 
						|
            $hours += $diff->h + ($diff->days*24);
 | 
						|
 | 
						|
        }
 | 
						|
        return $hours;
 | 
						|
    }
 | 
						|
 | 
						|
    public function createTask($taskParams)
 | 
						|
    {
 | 
						|
        $task = new ProjectTask();
 | 
						|
        $task->load($taskParams, '');
 | 
						|
        $task->save();
 | 
						|
        return $task;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getTask($task_id): ?ProjectTask
 | 
						|
    {
 | 
						|
        return ProjectTask::findOne($task_id);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getTaskList($status = null): array
 | 
						|
    {
 | 
						|
        return ProjectTask::find()->asArray()->all();
 | 
						|
    }
 | 
						|
 | 
						|
    public function getTaskListByProject($project_id, $user_id): array
 | 
						|
    {
 | 
						|
        $query = ProjectTask::find()->where(['project_id' => $project_id]);
 | 
						|
 | 
						|
        if ($user_id) {
 | 
						|
            $query->andWhere(['user_id' => $user_id]);
 | 
						|
        }
 | 
						|
        return $query->orderBy('priority DESC')->all();
 | 
						|
    }
 | 
						|
 | 
						|
    public function getArchiveTask($project_id, $user_id): array
 | 
						|
    {
 | 
						|
        $query = ProjectTask::find()->where(['project_id' => $project_id])->andWhere(['status' => ProjectTask::STATUS_ARCHIVE]);
 | 
						|
 | 
						|
        if ($user_id) {
 | 
						|
            $query->andWhere(['user_id' => $user_id]);
 | 
						|
        }
 | 
						|
        return $query->orderBy('priority DESC')->all();
 | 
						|
    }
 | 
						|
 | 
						|
    public function getTaskListByUser($user_id): array
 | 
						|
    {
 | 
						|
        $taskIdList = ProjectTaskUser::find()->where(['user_id' => $user_id])->select('task_id')->column();
 | 
						|
        return ProjectTask::find()->where([ 'IN', 'id', $taskIdList])->orWhere(['user_id' => $user_id])->orderBy('priority DESC')->all();
 | 
						|
    }
 | 
						|
 | 
						|
    public function updateTask($task_params): ?ProjectTask
 | 
						|
    {
 | 
						|
        $modelTask = ProjectTask::findOne($task_params['task_id']);
 | 
						|
 | 
						|
        if (isset($task_params['executor_id']) && $task_params['executor_id'] == 0){
 | 
						|
            $task_params['executor_id'] = null;
 | 
						|
        }
 | 
						|
 | 
						|
        $modelTask->load($task_params, '');
 | 
						|
        $modelTask->save();
 | 
						|
 | 
						|
        return $modelTask;
 | 
						|
    }
 | 
						|
 | 
						|
    public function taskExists($task_id): bool
 | 
						|
    {
 | 
						|
        return ProjectTask::find()->where(['id' => $task_id])->exists();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @throws BadRequestHttpException
 | 
						|
     */
 | 
						|
    public function importTasks(array $params)
 | 
						|
    {
 | 
						|
        $form = new TasksImportForm();
 | 
						|
        $form->load($params);
 | 
						|
 | 
						|
        if (!$form->validate()){
 | 
						|
            $errors = $form->errors;
 | 
						|
            throw new BadRequestHttpException(array_shift($errors)[0]);
 | 
						|
        }
 | 
						|
 | 
						|
        $query = ProjectTask::genQueryToImport(
 | 
						|
            $form->companyId,
 | 
						|
            $form->userId,
 | 
						|
            $form->projectId,
 | 
						|
            $form->fromDate,
 | 
						|
            $form->toDate
 | 
						|
        );
 | 
						|
 | 
						|
        $tasks = $query->all();
 | 
						|
 | 
						|
        if (!$tasks) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        return $this->importProjectTaskService->importTasks($tasks);
 | 
						|
    }
 | 
						|
} |