242 lines
7.5 KiB
PHP
242 lines
7.5 KiB
PHP
<?php
|
||
|
||
class Project extends BaseEntity {
|
||
|
||
protected $db_name = 'project';
|
||
|
||
// Свойства проекта
|
||
public $id;
|
||
public $id_order;
|
||
public $name;
|
||
public $id_ready;
|
||
|
||
// Валидация данных
|
||
protected function validate() {
|
||
static::$error_message = [];
|
||
|
||
if (!$this->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;
|
||
}
|
||
}
|
||
|
||
?>
|