Veranstalter strikt von Lieferanten trennen
This commit is contained in:
1 parent
0e71aca89b
commit
36fb17ac32
9 files changed
+114
-152
No files matched your search
@@ -1,8 +1,6 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
|
||||
require_once __DIR__ . '/../erp/kontakte/service.php';
|
||||
|
||||
require_once __DIR__ . '/../shared/db.php';
|
||||
|
||||
const MARKET_MANAGEMENT_STATUSES = [
|
||||
@@ -20,6 +18,43 @@ const MARKET_OCCURRENCE_DAY_INHERITED_FIELDS = [
|
||||
'delivery_start_time', 'delivery_end_time',
|
||||
];
|
||||
|
||||
function market_management_list_organizers(PDO $pdo): array
|
||||
{
|
||||
return $pdo->query(
|
||||
"SELECT id, name, email, phone
|
||||
FROM market_organizer
|
||||
WHERE status = 'active'
|
||||
ORDER BY name ASC, id ASC"
|
||||
)->fetchAll() ?: [];
|
||||
}
|
||||
|
||||
function market_management_get_organizer(PDO $pdo, int $organizerId): ?array
|
||||
{
|
||||
$stmt = $pdo->prepare(
|
||||
"SELECT id, name, email, phone
|
||||
FROM market_organizer
|
||||
WHERE id = :id AND status = 'active'"
|
||||
);
|
||||
$stmt->execute([':id' => $organizerId]);
|
||||
$organizer = $stmt->fetch();
|
||||
return is_array($organizer) ? $organizer : null;
|
||||
}
|
||||
|
||||
function market_management_create_organizer(PDO $pdo, string $name, ?string $email = null, ?string $phone = null): array
|
||||
{
|
||||
$name = trim($name);
|
||||
if ($name === '') {
|
||||
throw new InvalidArgumentException('Veranstaltername fehlt.');
|
||||
}
|
||||
$stmt = $pdo->prepare(
|
||||
'INSERT INTO market_organizer (name, email, phone)
|
||||
VALUES (:name, :email, :phone)
|
||||
RETURNING id, name, email, phone'
|
||||
);
|
||||
$stmt->execute([':name' => $name, ':email' => $email ?: null, ':phone' => $phone ?: null]);
|
||||
return (array) $stmt->fetch();
|
||||
}
|
||||
|
||||
function market_management_require_positive_id(mixed $value, string $field): int
|
||||
{
|
||||
if (!is_int($value) && !ctype_digit((string) $value)) {
|
||||
@@ -212,7 +247,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');
|
||||
$organizerId = market_management_require_positive_id($input['organizer_id'] ?? null, 'organizer_id');
|
||||
$websiteUrl = market_management_optional_url($input, 'website_url');
|
||||
|
||||
if ($name === '') {
|
||||
@@ -221,16 +256,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.');
|
||||
if (market_management_get_organizer($pdo, $organizerId) === null) {
|
||||
throw new InvalidArgumentException('organizer_id verweist nicht auf einen aktiven Veranstalter.');
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare(
|
||||
'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'
|
||||
'INSERT INTO market_definition (name, category_id, organizer_id, website_url)
|
||||
VALUES (:name, :category_id, :organizer_id, :website_url)
|
||||
RETURNING id, name, category_id, organizer_id, website_url, archived_at, created_at, updated_at'
|
||||
);
|
||||
$stmt->execute([':name' => $name, ':category_id' => $categoryId, ':organizer_party_id' => $organizerPartyId, ':website_url' => $websiteUrl]);
|
||||
$stmt->execute([':name' => $name, ':category_id' => $categoryId, ':organizer_id' => $organizerId, ':website_url' => $websiteUrl]);
|
||||
return (array) $stmt->fetch();
|
||||
}
|
||||
|
||||
@@ -298,18 +333,18 @@ function market_management_search_markets(PDO $pdo, array $input): array
|
||||
}
|
||||
|
||||
$stmt = $pdo->prepare(
|
||||
'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,
|
||||
'SELECT m.id, m.name, m.category_id, m.organizer_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
|
||||
INNER JOIN market_organizer p ON p.id = m.organizer_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, m.organizer_party_id, c.code, c.name, p.name
|
||||
GROUP BY m.id, m.category_id, m.organizer_id, c.code, c.name, p.name
|
||||
ORDER BY ' . $sortColumn . ' ' . $sortDirection . ', m.id ASC
|
||||
LIMIT :limit OFFSET :offset'
|
||||
);
|
||||
@@ -324,12 +359,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.organizer_party_id, m.website_url, c.code AS category_code, c.name AS category_name,
|
||||
'SELECT m.id, m.name, m.category_id, m.organizer_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
|
||||
INNER JOIN market_organizer p ON p.id = m.organizer_id
|
||||
WHERE m.id = :id AND ' . $marketArchivePredicate
|
||||
);
|
||||
$stmt->execute([':id' => $marketId]);
|
||||
@@ -367,7 +402,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, m.organizer_party_id, c.name AS category_name
|
||||
'SELECT m.id, m.name, m.category_id, m.organizer_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
|
||||
@@ -501,13 +536,13 @@ 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.');
|
||||
if (array_key_exists('organizer_id', $input)) {
|
||||
$organizerId = market_management_require_positive_id($input['organizer_id'], 'organizer_id');
|
||||
if (market_management_get_organizer($pdo, $organizerId) === null) {
|
||||
throw new InvalidArgumentException('organizer_id verweist nicht auf einen aktiven Veranstalter.');
|
||||
}
|
||||
$sets[] = 'organizer_party_id = :organizer_party_id';
|
||||
$params[':organizer_party_id'] = $organizerPartyId;
|
||||
$sets[] = 'organizer_id = :organizer_id';
|
||||
$params[':organizer_id'] = $organizerId;
|
||||
}
|
||||
if (array_key_exists('website_url', $input)) {
|
||||
$sets[] = 'website_url = :website_url';
|
||||
@@ -520,7 +555,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, organizer_party_id, website_url, archived_at, created_at, updated_at'
|
||||
RETURNING id, name, category_id, organizer_id, website_url, archived_at, created_at, updated_at'
|
||||
);
|
||||
$stmt->execute($params);
|
||||
$market = $stmt->fetch();
|
||||
@@ -536,7 +571,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, organizer_party_id, website_url, archived_at, created_at, updated_at'
|
||||
RETURNING id, name, category_id, organizer_id, website_url, archived_at, created_at, updated_at'
|
||||
);
|
||||
$stmt->execute([':id' => $marketId]);
|
||||
$market = $stmt->fetch();
|
||||
@@ -748,7 +783,7 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc
|
||||
if (is_array($organizer)) {
|
||||
$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'])
|
||||
? market_management_get_organizer($pdo, (int) $market['organizer_id'])
|
||||
: null;
|
||||
$organizer['contact_person'] = [
|
||||
'first_name' => (string) ($organizer['contact_person_name'] ?? ''),
|
||||
@@ -758,14 +793,23 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc
|
||||
];
|
||||
}
|
||||
$occurrence['organizer'] = is_array($organizer) ? $organizer : null;
|
||||
$occurrence['organizer_party_id'] = is_array($occurrence['organizer']) && is_array($occurrence['organizer']['organization'] ?? null)
|
||||
$occurrence['organizer_id'] = is_array($occurrence['organizer']) && is_array($occurrence['organizer']['organization'] ?? null)
|
||||
? (int) $occurrence['organizer']['organization']['id']
|
||||
: null;
|
||||
$contactPersonName = (string) ($occurrence['organizer']['contact_person_name'] ?? '');
|
||||
$occurrence['contact_person_id'] = $contactPersonName;
|
||||
$referenceData = market_management_list_reference_data($pdo, []);
|
||||
$occurrence['reference_options'] = [
|
||||
'categories' => market_management_list_categories($pdo),
|
||||
'municipalities' => $referenceData['municipalities'] ?? [],
|
||||
'market_organizers' => get_market_organizer_options($pdo),
|
||||
'market_organizers' => market_management_list_organizers($pdo),
|
||||
'parties' => market_management_list_organizers($pdo),
|
||||
'contacts' => $contactPersonName === '' ? [] : [[
|
||||
'id' => $contactPersonName,
|
||||
'first_name' => $contactPersonName,
|
||||
'last_name' => '',
|
||||
'party_name' => '',
|
||||
]],
|
||||
];
|
||||
$costs = $pdo->prepare('SELECT * FROM market_occurrence_cost_item WHERE occurrence_id = :occurrence_id ORDER BY id ASC');
|
||||
$costs->execute([':occurrence_id' => $occurrenceId]);
|
||||
|
||||
Reference in new issue
Block a user