id) { $this->addError('id', 'ID проекта не указан'); } if (!$this->name) { $this->addError('name', 'Название проекта не может быть пустым'); } return $this->getErrors(); } // Валидация данных (для create) protected function validateCreate() { static::$error_message = []; if (!$this->name) { $this->addError('name', 'Название проекта не может быть пустым'); } return $this->getErrors(); } // Создание проекта public function create() { // Валидация if ($errors = $this->validateCreate()) { return $errors; } // Получаем максимальный order $maxOrder = Database::max($this->db_name, 'id_order') ?? 0; // Вставляем в базу Database::insert($this->db_name, [ 'name' => $this->name, 'id_order' => $maxOrder + 1, 'id_ready' => $this->id_ready ]); $this->id = Database::id(); return [ 'success' => true, 'id' => $this->id ]; } // Обновление проекта public function update() { // Валидация if ($errors = $this->validate()) { return $errors; } // Проверка что проект существует $project = Database::get($this->db_name, ['id'], ['id' => $this->id]); if (!$project) { $this->addError('project', 'Проект не найден'); return $this->getErrors(); } // Формируем данные для обновления $update_data = [ 'name' => $this->name ]; // id_ready обновляем только если передан if ($this->id_ready !== null) { $update_data['id_ready'] = $this->id_ready; } // id_order обновляем только если передан if ($this->id_order !== null) { $update_data['id_order'] = $this->id_order; } // Обновляем в БД Database::update($this->db_name, $update_data, [ 'id' => $this->id ]); return ['success' => true]; } // Удаление проекта public static function delete($id) { // Проверка что проект существует $project = self::checkProject($id); if (!$project) { return ['success' => false, 'errors' => ['project' => 'Проект не найден']]; } // Удаляем все связанные данные // Удаляем задачи проекта (и их файлы) $tasks = Database::select('cards_task', ['id'], ['id_project' => $id]); foreach ($tasks as $task) { Task::delete($task['id']); } // Удаляем колонки проекта Database::delete('columns', ['id_project' => $id]); // Удаляем отделы проекта Database::delete('departments', ['id_project' => $id]); // Удаляем сам проект Database::delete('project', ['id' => $id]); return ['success' => true]; } // Получение всех проектов public function getAll() { return Database::select($this->db_name, [ 'id', 'id_order', 'name', 'id_ready' ], [ 'ORDER' => ['id_order' => 'ASC'] ]); } // Получение одного проекта public static function get($id) { return Database::get('project', [ 'id', 'id_order', 'name', 'id_ready' ], ['id' => $id]); } // Получение id_ready (ID колонки "Готово") по ID проекта public static function getReadyColumnId($project_id) { $project = Database::get('project', ['id_ready'], ['id' => $project_id]); return $project ? (int)$project['id_ready'] : null; } // Установка id_ready для проекта public static function setReadyColumn($project_id, $column_id) { // Проверка что проект существует $project = self::checkProject($project_id); if (!$project) { return ['success' => false, 'errors' => ['project' => 'Проект не найден']]; } // Проверка что колонка существует и принадлежит этому проекту $column = Database::get('columns', ['id', 'id_project'], ['id' => $column_id]); if (!$column || (int)$column['id_project'] !== (int)$project_id) { return ['success' => false, 'errors' => ['column' => 'Колонка не найдена или не принадлежит проекту']]; } // Обновляем id_ready Database::update('project', [ 'id_ready' => $column_id ], [ 'id' => $project_id ]); return ['success' => true, 'id_ready' => $column_id]; } // Получение колонок проекта public static function getColumns($project_id) { return Database::select('columns', [ 'id', 'name_columns', 'color', 'id_order' ], [ 'id_project' => $project_id, 'ORDER' => ['id_order' => 'ASC'] ]); } // Получение отделов проекта public static function getDepartments($project_id) { return Database::select('departments', [ 'id', 'name_departments', 'color' ], [ 'id_project' => $project_id ]); } // Получение всех данных проекта (проект + колонки + отделы + метки) public static function getProjectData($project_id) { $project = self::get($project_id); if (!$project) { return null; } // Получаем метки (глобальные) $labels = Database::select('labels', [ 'id', 'name_labels', 'icon', 'color' ]); return [ 'project' => $project, 'columns' => self::getColumns($project_id), 'departments' => self::getDepartments($project_id), 'labels' => $labels ]; } // Проверка и получение проекта public static function checkProject($project_id) { return Database::get('project', '*', ['id' => $project_id]); } // Проверка проекта с ответом (при ошибке — сразу ответ и exit) public static function check($project_id) { $project = self::checkProject($project_id); if (!$project_id || !$project) { RestApi::response(['success' => false, 'errors' => ['project' => 'Проект не найден']], 400); } return $project; } } ?>