1
0

Добавление проектов

Добавили возможность создавания разных проектов.
This commit is contained in:
2026-01-14 10:46:38 +07:00
parent 04e88cb7fa
commit 719aecd09e
22 changed files with 996 additions and 233 deletions

View File

@@ -0,0 +1,241 @@
<?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;
}
}
?>