feat: zodpovedna osoba za projekt - novy sloupec + editace

Pridano pole responsible_user_id do tabulky projects s FK na users.
Select zodpovedne osoby v ProjectDetail, ProjectCreate a sloupec v seznamu projektu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-13 12:03:44 +01:00
parent 308941449e
commit 9e3c95e576
44 changed files with 203 additions and 62 deletions

View File

@@ -7,6 +7,16 @@ function generateProjectNumber(PDO $pdo): string
return generateSharedNumber($pdo);
}
function handleGetUsers(PDO $pdo): void
{
$stmt = $pdo->query(
"SELECT id, CONCAT(first_name, ' ', last_name) as name
FROM users WHERE is_active = 1 ORDER BY first_name, last_name"
);
$users = $stmt->fetchAll();
successResponse(['users' => $users]);
}
function handleGetNextNumber(PDO $pdo): void
{
$number = generateProjectNumber($pdo);
@@ -37,6 +47,15 @@ function handleCreateProject(PDO $pdo): void
errorResponse('Zákazník nebyl nalezen', 404);
}
$responsibleUserId = isset($input['responsible_user_id']) ? (int)$input['responsible_user_id'] : null;
if ($responsibleUserId) {
$stmt = $pdo->prepare('SELECT id FROM users WHERE id = ?');
$stmt->execute([$responsibleUserId]);
if (!$stmt->fetch()) {
errorResponse('Zodpovědná osoba nebyla nalezena', 404);
}
}
$startDate = $input['start_date'] ?? date('Y-m-d');
if (!preg_match('/^\d{4}-\d{2}-\d{2}$/', $startDate)) {
errorResponse('Neplatný formát data zahájení');
@@ -79,14 +98,15 @@ function handleCreateProject(PDO $pdo): void
$stmt = $pdo->prepare("
INSERT INTO projects (
project_number, name, customer_id,
project_number, name, customer_id, responsible_user_id,
status, start_date, created_at, modified_at
) VALUES (?, ?, ?, 'aktivni', ?, NOW(), NOW())
) VALUES (?, ?, ?, ?, 'aktivni', ?, NOW(), NOW())
");
$stmt->execute([
$projectNumber,
$name,
$customerId,
$responsibleUserId,
$startDate,
]);
$projectId = (int)$pdo->lastInsertId();
@@ -185,15 +205,17 @@ function handleGetList(PDO $pdo): void
$from = "FROM projects p
LEFT JOIN customers c ON p.customer_id = c.id
LEFT JOIN orders o ON p.order_id = o.id";
LEFT JOIN orders o ON p.order_id = o.id
LEFT JOIN users u ON p.responsible_user_id = u.id";
$result = PaginationHelper::paginate(
$pdo,
"SELECT COUNT(*) {$from} {$where}",
"SELECT p.id, p.project_number, p.name, p.status, p.start_date, p.end_date,
p.order_id, p.quotation_id, p.created_at,
p.order_id, p.quotation_id, p.created_at, p.responsible_user_id,
c.name as customer_name,
o.order_number
o.order_number,
CONCAT(u.first_name, ' ', u.last_name) as responsible_user_name
{$from} {$where}
ORDER BY {$p['sort']} {$p['order']}",
$params,
@@ -212,14 +234,17 @@ function handleGetDetail(PDO $pdo, int $id): void
SELECT p.id, p.project_number, p.name, p.customer_id,
p.quotation_id, p.order_id, p.status,
p.start_date, p.end_date, p.notes,
p.responsible_user_id,
p.created_at, p.modified_at,
c.name as customer_name,
o.order_number, o.status as order_status,
q.quotation_number
q.quotation_number,
CONCAT(u.first_name, \' \', u.last_name) as responsible_user_name
FROM projects p
LEFT JOIN customers c ON p.customer_id = c.id
LEFT JOIN orders o ON p.order_id = o.id
LEFT JOIN quotations q ON p.quotation_id = q.id
LEFT JOIN users u ON p.responsible_user_id = u.id
WHERE p.id = ?
');
$stmt->execute([$id]);
@@ -235,7 +260,7 @@ function handleGetDetail(PDO $pdo, int $id): void
function handleUpdateProject(PDO $pdo, int $id): void
{
$stmt = $pdo->prepare(
'SELECT id, project_number, name, status, start_date, end_date, notes
'SELECT id, project_number, name, status, start_date, end_date, notes, responsible_user_id
FROM projects WHERE id = ?'
);
$stmt->execute([$id]);
@@ -282,6 +307,18 @@ function handleUpdateProject(PDO $pdo, int $id): void
errorResponse('Poznámky jsou příliš dlouhé (max 5000 znaků)');
}
// Zodpovedna osoba
$responsibleUserId = array_key_exists('responsible_user_id', $input)
? ($input['responsible_user_id'] ? (int)$input['responsible_user_id'] : null)
: $project['responsible_user_id'];
if ($responsibleUserId) {
$stmt = $pdo->prepare('SELECT id FROM users WHERE id = ?');
$stmt->execute([$responsibleUserId]);
if (!$stmt->fetch()) {
errorResponse('Zodpovědná osoba nebyla nalezena', 404);
}
}
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare('
@@ -291,6 +328,7 @@ function handleUpdateProject(PDO $pdo, int $id): void
start_date = ?,
end_date = ?,
notes = ?,
responsible_user_id = ?,
modified_at = NOW()
WHERE id = ?
');
@@ -300,6 +338,7 @@ function handleUpdateProject(PDO $pdo, int $id): void
$input['start_date'] ?? $project['start_date'],
$input['end_date'] ?? $project['end_date'],
$notes,
$responsibleUserId,
$id,
]);

View File

@@ -56,6 +56,9 @@ try {
requirePermission($authData, 'projects.create');
handleGetNextNumber($pdo);
break;
case 'users':
handleGetUsers($pdo);
break;
default:
handleGetList($pdo);
}