Veranstalter am Markt verankern

This commit is contained in:
gitea_admin committed 2026-09-20 10:57:40 +02:00
1 parent ba36485180
commit 0e71aca89b
10 files changed
+271 -106

No files matched your search

+64 -25
View File
@@ -212,6 +212,7 @@ function market_management_create_market(PDO $pdo, array $input): array
{
$name = trim((string) ($input['name'] ?? ''));
$categoryId = market_management_require_positive_id($input['category_id'] ?? null, 'category_id');
$organizerPartyId = market_management_require_positive_id($input['organizer_party_id'] ?? null, 'organizer_party_id');
$websiteUrl = market_management_optional_url($input, 'website_url');
if ($name === '') {
@@ -220,13 +221,16 @@ function market_management_create_market(PDO $pdo, array $input): array
if (!market_management_category_exists($pdo, $categoryId)) {
throw new InvalidArgumentException('category_id verweist nicht auf eine aktive Kategorie.');
}
if (get_market_organizer_reference($pdo, $organizerPartyId) === null) {
throw new InvalidArgumentException('organizer_party_id verweist nicht auf einen aktiven Veranstalter.');
}
$stmt = $pdo->prepare(
'INSERT INTO market_definition (name, category_id, website_url)
VALUES (:name, :category_id, :website_url)
RETURNING id, name, category_id, website_url, archived_at, created_at, updated_at'
'INSERT INTO market_definition (name, category_id, organizer_party_id, website_url)
VALUES (:name, :category_id, :organizer_party_id, :website_url)
RETURNING id, name, category_id, organizer_party_id, website_url, archived_at, created_at, updated_at'
);
$stmt->execute([':name' => $name, ':category_id' => $categoryId, ':website_url' => $websiteUrl]);
$stmt->execute([':name' => $name, ':category_id' => $categoryId, ':organizer_party_id' => $organizerPartyId, ':website_url' => $websiteUrl]);
return (array) $stmt->fetch();
}
@@ -294,16 +298,18 @@ function market_management_search_markets(PDO $pdo, array $input): array
}
$stmt = $pdo->prepare(
'SELECT m.id, m.name, m.category_id, m.website_url, c.code AS category_code, c.name AS category_name,
'SELECT m.id, m.name, m.category_id, m.organizer_party_id, m.website_url, c.code AS category_code, c.name AS category_name,
p.name AS organizer_name,
m.archived_at, m.created_at, m.updated_at,
MIN(d.date) AS earliest_date, MAX(d.date) AS latest_date,
COUNT(DISTINCT o.id) AS occurrence_count
FROM market_definition m
INNER JOIN market_category c ON c.id = m.category_id
INNER JOIN party p ON p.id = m.organizer_party_id
LEFT JOIN market_occurrence o ON o.market_definition_id = m.id AND ' . $occurrenceArchivePredicate . '
LEFT JOIN market_occurrence_day d ON d.occurrence_id = o.id
WHERE ' . ($where === [] ? 'TRUE' : implode(' AND ', $where)) . '
GROUP BY m.id, m.category_id, c.code, c.name
GROUP BY m.id, m.category_id, m.organizer_party_id, c.code, c.name, p.name
ORDER BY ' . $sortColumn . ' ' . $sortDirection . ', m.id ASC
LIMIT :limit OFFSET :offset'
);
@@ -318,10 +324,12 @@ function market_management_get_market(PDO $pdo, int $marketId, bool $includeArch
{
$marketArchivePredicate = $includeArchived ? 'TRUE' : 'm.archived_at IS NULL';
$stmt = $pdo->prepare(
'SELECT m.id, m.name, m.category_id, m.website_url, c.code AS category_code, c.name AS category_name,
'SELECT m.id, m.name, m.category_id, m.organizer_party_id, m.website_url, c.code AS category_code, c.name AS category_name,
p.name AS organizer_name,
m.archived_at, m.created_at, m.updated_at
FROM market_definition m
INNER JOIN market_category c ON c.id = m.category_id
INNER JOIN party p ON p.id = m.organizer_party_id
WHERE m.id = :id AND ' . $marketArchivePredicate
);
$stmt->execute([':id' => $marketId]);
@@ -359,7 +367,7 @@ function market_management_get_market(PDO $pdo, int $marketId, bool $includeArch
function market_management_list_active_market_definitions(PDO $pdo): array
{
$stmt = $pdo->query(
'SELECT m.id, m.name, m.category_id, c.name AS category_name
'SELECT m.id, m.name, m.category_id, m.organizer_party_id, c.name AS category_name
FROM market_definition m
INNER JOIN market_category c ON c.id = m.category_id
WHERE m.archived_at IS NULL
@@ -493,6 +501,14 @@ function market_management_update_market(PDO $pdo, int $marketId, array $input):
$sets[] = 'category_id = :category_id';
$params[':category_id'] = $categoryId;
}
if (array_key_exists('organizer_party_id', $input)) {
$organizerPartyId = market_management_require_positive_id($input['organizer_party_id'], 'organizer_party_id');
if (get_market_organizer_reference($pdo, $organizerPartyId) === null) {
throw new InvalidArgumentException('organizer_party_id verweist nicht auf einen aktiven Veranstalter.');
}
$sets[] = 'organizer_party_id = :organizer_party_id';
$params[':organizer_party_id'] = $organizerPartyId;
}
if (array_key_exists('website_url', $input)) {
$sets[] = 'website_url = :website_url';
$params[':website_url'] = market_management_optional_url($input, 'website_url');
@@ -504,7 +520,7 @@ function market_management_update_market(PDO $pdo, int $marketId, array $input):
$sets[] = 'updated_at = NOW()';
$stmt = $pdo->prepare(
'UPDATE market_definition SET ' . implode(', ', $sets) . ' WHERE id = :id
RETURNING id, name, category_id, website_url, archived_at, created_at, updated_at'
RETURNING id, name, category_id, organizer_party_id, website_url, archived_at, created_at, updated_at'
);
$stmt->execute($params);
$market = $stmt->fetch();
@@ -520,7 +536,7 @@ function market_management_set_market_archive(PDO $pdo, int $marketId, bool $arc
'UPDATE market_definition
SET archived_at = ' . ($archive ? 'COALESCE(archived_at, NOW())' : 'NULL') . ', updated_at = NOW()
WHERE id = :id
RETURNING id, name, category_id, website_url, archived_at, created_at, updated_at'
RETURNING id, name, category_id, organizer_party_id, website_url, archived_at, created_at, updated_at'
);
$stmt->execute([':id' => $marketId]);
$market = $stmt->fetch();
@@ -621,6 +637,12 @@ function market_management_create_occurrence(PDO $pdo, array $input): array
$day['occurrence_id'] = (int) $occurrence['id'];
market_management_create_day($pdo, $day);
}
market_management_set_occurrence_contact($pdo, [
'occurrence_id' => (int) $occurrence['id'],
'contact_person_name' => null,
'contact_email' => null,
'contact_phone' => null,
]);
if ($startedTransaction) {
$pdo->commit();
}
@@ -724,18 +746,26 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc
$organizer->execute([':occurrence_id' => $occurrenceId]);
$organizer = $organizer->fetch();
if (is_array($organizer)) {
$organizer['organization'] = get_party_reference($pdo, (int) $organizer['organization_contact_id']);
$organizer['contact_person'] = get_contact_reference($pdo, (int) $organizer['contact_person_id']);
$market = market_management_get_market($pdo, (int) $occurrence['market_definition_id'], true);
$organizer['organization'] = is_array($market)
? get_market_organizer_reference($pdo, (int) $market['organizer_party_id'])
: null;
$organizer['contact_person'] = [
'first_name' => (string) ($organizer['contact_person_name'] ?? ''),
'last_name' => '',
'email' => (string) ($organizer['contact_email'] ?? ''),
'phone' => (string) ($organizer['contact_phone'] ?? ''),
];
}
$occurrence['organizer'] = is_array($organizer) ? $organizer : null;
$occurrence['organization_contact_id'] = is_array($organizer) ? (int) $organizer['organization_contact_id'] : null;
$occurrence['contact_person_id'] = is_array($organizer) ? (int) $organizer['contact_person_id'] : null;
$occurrence['organizer_party_id'] = is_array($occurrence['organizer']) && is_array($occurrence['organizer']['organization'] ?? null)
? (int) $occurrence['organizer']['organization']['id']
: null;
$referenceData = market_management_list_reference_data($pdo, []);
$occurrence['reference_options'] = [
'categories' => market_management_list_categories($pdo),
'municipalities' => $referenceData['municipalities'] ?? [],
'parties' => get_party_options($pdo),
'contacts' => get_contact_options($pdo),
'market_organizers' => get_market_organizer_options($pdo),
];
$costs = $pdo->prepare('SELECT * FROM market_occurrence_cost_item WHERE occurrence_id = :occurrence_id ORDER BY id ASC');
$costs->execute([':occurrence_id' => $occurrenceId]);
@@ -1005,24 +1035,33 @@ function market_management_delete_day(PDO $pdo, int $dayId): array
return $day;
}
function market_management_set_organizer(PDO $pdo, array $input): array
function market_management_set_occurrence_contact(PDO $pdo, array $input): array
{
$occurrenceId = market_management_require_positive_id($input['occurrence_id'] ?? null, 'occurrence_id');
$organizationId = market_management_require_positive_id($input['organization_contact_id'] ?? null, 'organization_contact_id');
$contactPersonId = market_management_require_positive_id($input['contact_person_id'] ?? null, 'contact_person_id');
$name = array_key_exists('contact_person_name', $input)
? market_management_optional_string($input, 'contact_person_name')
: null;
$email = array_key_exists('contact_email', $input)
? market_management_optional_string($input, 'contact_email')
: null;
$phone = array_key_exists('contact_phone', $input)
? market_management_optional_string($input, 'contact_phone')
: null;
$stmt = $pdo->prepare(
'INSERT INTO market_occurrence_organizer (occurrence_id, organization_contact_id, contact_person_id)
VALUES (:occurrence_id, :organization_contact_id, :contact_person_id)
'INSERT INTO market_occurrence_organizer (occurrence_id, contact_person_name, contact_email, contact_phone)
VALUES (:occurrence_id, :contact_person_name, :contact_email, :contact_phone)
ON CONFLICT (occurrence_id) DO UPDATE
SET organization_contact_id = EXCLUDED.organization_contact_id,
contact_person_id = EXCLUDED.contact_person_id,
SET contact_person_name = EXCLUDED.contact_person_name,
contact_email = EXCLUDED.contact_email,
contact_phone = EXCLUDED.contact_phone,
updated_at = NOW()
RETURNING *'
);
$stmt->execute([
':occurrence_id' => $occurrenceId,
':organization_contact_id' => $organizationId,
':contact_person_id' => $contactPersonId,
':contact_person_name' => $name,
':contact_email' => $email,
':contact_phone' => $phone,
]);
return (array) $stmt->fetch();
}