From e43b5d34e01d1a26c3412f9469eb4e0f98698c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Sun, 6 Sep 2026 10:21:25 +0200 Subject: [PATCH] Prevent duplicate manufacturer parties --- docs/architektur/database/module_db_ownership.md | 1 + docs/modules/erp/kontakte/README.md | 1 + modules/erp/kontakte/service.php | 6 +++++- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/architektur/database/module_db_ownership.md b/docs/architektur/database/module_db_ownership.md index e322cc0..4ef5a71 100644 --- a/docs/architektur/database/module_db_ownership.md +++ b/docs/architektur/database/module_db_ownership.md @@ -11,6 +11,7 @@ Diese Referenz ordnet die aktuellen Tabellen, Views und technischen DB-Artefakte ### `kontakte` - `party` +- `party_role` - `address` - `contact` - `party_external_identity` diff --git a/docs/modules/erp/kontakte/README.md b/docs/modules/erp/kontakte/README.md index a5b8085..5d58b5d 100644 --- a/docs/modules/erp/kontakte/README.md +++ b/docs/modules/erp/kontakte/README.md @@ -14,6 +14,7 @@ Zentraler Kontaktstamm fuer Kunden, Lieferanten und sonstige Parteien. ## Writes - Kontaktstamm +- Herstellerrollen im Parteien-Stamm - Adressen - Kommunikationsdaten diff --git a/modules/erp/kontakte/service.php b/modules/erp/kontakte/service.php index 14b101e..7eb2795 100644 --- a/modules/erp/kontakte/service.php +++ b/modules/erp/kontakte/service.php @@ -138,7 +138,6 @@ function create_manufacturer(PDO $pdo, string $name, ?string $email = null, ?str $existingStmt = $pdo->prepare( "SELECT p.id, p.name, p.email, p.phone FROM party p - INNER JOIN party_role pr ON pr.party_id = p.id AND pr.role_code = 'manufacturer' WHERE LOWER(TRIM(p.name)) = LOWER(:name) LIMIT 1 FOR UPDATE" @@ -146,6 +145,11 @@ function create_manufacturer(PDO $pdo, string $name, ?string $email = null, ?str $existingStmt->execute([':name' => $name]); $existing = $existingStmt->fetch(); if (is_array($existing)) { + $roleStmt = $pdo->prepare( + "INSERT INTO party_role (party_id, role_code) VALUES (:party_id, 'manufacturer') + ON CONFLICT (party_id, role_code) DO NOTHING" + ); + $roleStmt->execute([':party_id' => (int) $existing['id']]); return [ 'id' => (int) $existing['id'], 'name' => (string) $existing['name'],