Gemeinderegister für Marktdurchführungen ergänzen

This commit is contained in:
gitea_admin committed 2026-09-20 11:48:00 +02:00
1 parent 273fb05833
commit 2d3c9ce4ab
8 files changed
+177 -18

No files matched your search

+6
View File
@@ -81,6 +81,7 @@ function market_management_mcp_tools(): array
['name' => 'market_management.list_market_organizers', 'description' => 'Aktive Veranstalter lesen', 'inputSchema' => ['type' => 'object', 'properties' => []]],
['name' => 'market_management.create_market_organizer', 'description' => 'Veranstalter mit optionalen Kontaktdaten anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['name'], 'properties' => ['name' => ['type' => 'string'], 'email' => ['type' => ['string', 'null'], 'format' => 'email'], 'phone' => ['type' => ['string', 'null']]]]],
['name' => 'market_management.list_reference_data', 'description' => 'Kategorien, Kantone und Gemeinden lesen', 'inputSchema' => ['type' => 'object', 'properties' => []]],
['name' => 'market_management.create_municipality', 'description' => 'Lokale Gemeinde im Markt-Gemeinderegister anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['name'], 'properties' => ['name' => ['type' => 'string']]]],
['name' => 'market_management.get_overview', 'description' => 'Marktübersicht mit serverseitigen Filtern lesen', 'inputSchema' => ['type' => 'object', 'properties' => $searchProperties]],
['name' => 'market_management.create_occurrence', 'description' => 'Marktdurchführung mit mindestens einem Markttag anlegen', 'inputSchema' => ['type' => 'object', 'required' => ['market_definition_id', 'days'], 'properties' => ['market_definition_id' => ['type' => 'integer'], 'status' => ['type' => 'string'], 'days' => ['type' => 'array', 'minItems' => 1, 'items' => ['type' => 'object', 'required' => ['date'], 'properties' => $dayProperties]] + $occurrenceProperties]]],
['name' => 'market_management.get_occurrence', 'description' => 'Marktdurchführung mit Markt, Markttagen und berechneten Verkaufsdaten lesen', 'inputSchema' => ['type' => 'object', 'required' => ['occurrence_id'], 'properties' => ['occurrence_id' => ['type' => 'integer'], 'include_archived' => ['type' => 'boolean']]]],
@@ -101,6 +102,7 @@ function market_management_mcp_is_write_tool(string $tool): bool
return in_array($tool, [
'market_management.create_market', 'market_management.update_market',
'market_management.create_market_organizer',
'market_management.create_municipality',
'market_management.archive_market', 'market_management.reactivate_market',
'market_management.create_occurrence', 'market_management.update_occurrence',
'market_management.archive_occurrence', 'market_management.reactivate_occurrence',
@@ -276,6 +278,10 @@ function market_management_mcp_call(PDO $pdo, string $tool, array $arguments): a
$arguments['phone'] ?? null
),
'market_management.list_reference_data' => market_management_list_reference_data($pdo, $arguments),
'market_management.create_municipality' => market_management_create_municipality(
$pdo,
(string) ($arguments['name'] ?? '')
),
'market_management.get_overview' => [
'markets' => market_management_search_markets($pdo, $arguments),
'occurrences' => market_management_search_occurrences($pdo, $arguments),
+95 -14
View File
@@ -55,6 +55,40 @@ function market_management_create_organizer(PDO $pdo, string $name, ?string $ema
return (array) $stmt->fetch();
}
function market_management_list_municipalities(PDO $pdo): array
{
return $pdo->query(
"SELECT id, name, canton_code, bfs_municipality_number, data_version, source
FROM market_municipality
WHERE is_active = TRUE
ORDER BY name ASC, id ASC"
)->fetchAll() ?: [];
}
function market_management_create_municipality(PDO $pdo, string $name): array
{
$name = trim($name);
if ($name === '') {
throw new InvalidArgumentException('Gemeindename fehlt.');
}
$stmt = $pdo->prepare(
"SELECT 1 FROM market_municipality WHERE is_active = TRUE AND LOWER(TRIM(name)) = LOWER(TRIM(:name))"
);
$stmt->execute([':name' => $name]);
if ($stmt->fetchColumn() !== false) {
throw new InvalidArgumentException('Diese Gemeinde ist bereits vorhanden.');
}
$stmt = $pdo->prepare(
"INSERT INTO market_municipality (name, source)
VALUES (:name, 'local')
RETURNING id, name, canton_code, bfs_municipality_number, data_version, source"
);
$stmt->execute([':name' => $name]);
return (array) $stmt->fetch();
}
function market_management_require_positive_id(mixed $value, string $field): int
{
if (!is_int($value) && !ctype_digit((string) $value)) {
@@ -501,10 +535,7 @@ function market_management_list_active_occurrence_options(PDO $pdo): array
function market_management_list_reference_data(PDO $pdo, array $input): array
{
$result = ['categories' => market_management_list_categories($pdo)];
$municipalities = $pdo->query(
'SELECT id, bfs_municipality_number, name, canton_code, data_version
FROM market_municipality_reference WHERE is_active = TRUE ORDER BY name ASC, id ASC'
)->fetchAll();
$municipalities = market_management_list_municipalities($pdo);
$result['municipalities'] = $municipalities;
$result['cantons'] = array_values(array_map(
static fn (array $row): array => ['code' => (string) $row['canton_code']],
@@ -622,6 +653,14 @@ function market_management_write_fields(array $input, array $definitions): array
function market_management_create_occurrence(PDO $pdo, array $input): array
{
$newMunicipalityName = null;
if (($input['municipality_reference_id'] ?? null) === '__new__') {
$newMunicipalityName = trim((string) ($input['municipality_name'] ?? ''));
if ($newMunicipalityName === '') {
throw new InvalidArgumentException('Gemeindename fehlt.');
}
unset($input['municipality_reference_id'], $input['municipality_name']);
}
$marketId = market_management_require_positive_id($input['market_definition_id'] ?? null, 'market_definition_id');
if (market_management_get_market($pdo, $marketId, true) === null) {
throw new InvalidArgumentException('market_definition_id verweist nicht auf einen Markt.');
@@ -658,6 +697,13 @@ function market_management_create_occurrence(PDO $pdo, array $input): array
$pdo->beginTransaction();
}
try {
if ($newMunicipalityName !== null) {
$municipality = market_management_create_municipality($pdo, $newMunicipalityName);
$fields[] = 'municipality_reference_id = :municipality_reference_id';
$params[':municipality_reference_id'] = (int) $municipality['id'];
$columns = array_map(static fn (string $field): string => explode(' = ', $field, 2)[0], $fields);
$values = array_map(static fn (string $field): string => explode(' = ', $field, 2)[1], $fields);
}
$stmt = $pdo->prepare(
'INSERT INTO market_occurrence (' . implode(', ', $columns) . ')
VALUES (' . implode(', ', $values) . ')
@@ -702,6 +748,14 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc
if (!is_array($occurrence)) {
return null;
}
$municipality = $pdo->prepare(
'SELECT id, name, canton_code, bfs_municipality_number, data_version, source
FROM market_municipality WHERE id = :id AND is_active = TRUE'
);
$municipality->execute([':id' => $occurrence['municipality_reference_id'] ?? null]);
$municipality = $municipality->fetch();
$occurrence['municipality'] = is_array($municipality) ? $municipality : null;
$occurrence['municipality_name'] = is_array($municipality) ? (string) $municipality['name'] : null;
$days = $pdo->prepare(
'SELECT * FROM market_occurrence_day
WHERE occurrence_id = :occurrence_id ORDER BY date ASC, id ASC'
@@ -837,6 +891,14 @@ function market_management_get_occurrence(PDO $pdo, int $occurrenceId, bool $inc
function market_management_update_occurrence(PDO $pdo, int $occurrenceId, array $input): array
{
$newMunicipalityName = null;
if (($input['municipality_reference_id'] ?? null) === '__new__') {
$newMunicipalityName = trim((string) ($input['municipality_name'] ?? ''));
if ($newMunicipalityName === '') {
throw new InvalidArgumentException('Gemeindename fehlt.');
}
unset($input['municipality_reference_id'], $input['municipality_name']);
}
$definitions = [
'status' => 'string', 'place' => 'string', 'address' => 'string', 'municipality_reference_id' => 'nullable_id',
'notes' => 'string', 'registration_deadline' => 'string', 'request_or_registration_date' => 'string',
@@ -858,18 +920,37 @@ function market_management_update_occurrence(PDO $pdo, int $occurrenceId, array
if (isset($params[':payment_status']) && !in_array($params[':payment_status'], ['paid', 'unpaid'], true)) {
throw new InvalidArgumentException('Ungültiger Zahlungsstatus.');
}
if ($fields === []) {
if ($fields === [] && $newMunicipalityName === null) {
throw new InvalidArgumentException('Mindestens ein änderbares Feld ist erforderlich.');
}
$fields[] = 'updated_at = NOW()';
$params[':id'] = $occurrenceId;
$stmt = $pdo->prepare(
'UPDATE market_occurrence SET ' . implode(', ', $fields) . ' WHERE id = :id RETURNING *'
);
$stmt->execute($params);
$occurrence = $stmt->fetch();
if (!is_array($occurrence)) {
throw new RuntimeException('Marktdurchführung nicht gefunden.');
$startedTransaction = $newMunicipalityName !== null && !$pdo->inTransaction();
if ($startedTransaction) {
$pdo->beginTransaction();
}
try {
if ($newMunicipalityName !== null) {
$municipality = market_management_create_municipality($pdo, $newMunicipalityName);
$fields[] = 'municipality_reference_id = :municipality_reference_id';
$params[':municipality_reference_id'] = (int) $municipality['id'];
}
$fields[] = 'updated_at = NOW()';
$params[':id'] = $occurrenceId;
$stmt = $pdo->prepare(
'UPDATE market_occurrence SET ' . implode(', ', $fields) . ' WHERE id = :id RETURNING *'
);
$stmt->execute($params);
$occurrence = $stmt->fetch();
if (!is_array($occurrence)) {
throw new RuntimeException('Marktdurchführung nicht gefunden.');
}
if ($startedTransaction) {
$pdo->commit();
}
} catch (Throwable $error) {
if ($startedTransaction && $pdo->inTransaction()) {
$pdo->rollBack();
}
throw $error;
}
return $occurrence;
}