From 8907233ef5ce1e6170fadc6190ba2dd408fe0e22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Fromme?= Date: Thu, 25 Jun 2026 15:06:04 +0200 Subject: [PATCH] fix: adopt response format of bpn personal data endpoint --- src/BusProNet/ApiClient.php | 3 ++- .../Model/PersonalDataUpdateResponse.php | 15 ++++++++++++++ src/BusProNet/XmlParser/ApiResponseParser.php | 3 ++- .../XmlParser/PersonalDataUpdateParser.php | 20 +++++++++++++++++++ .../Account/PersonalDataController.php | 11 ++++++++++ templates/account/personal_data.html.twig | 1 + 6 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 src/BusProNet/Model/PersonalDataUpdateResponse.php create mode 100644 src/BusProNet/XmlParser/PersonalDataUpdateParser.php diff --git a/src/BusProNet/ApiClient.php b/src/BusProNet/ApiClient.php index 5107a61..5429e30 100644 --- a/src/BusProNet/ApiClient.php +++ b/src/BusProNet/ApiClient.php @@ -16,6 +16,7 @@ use App\BusProNet\Model\CrmAttributes; use App\BusProNet\Model\ExtendedServiceAvailabilityResponse; use App\BusProNet\Model\Notification; use App\BusProNet\Model\PersonalData; +use App\BusProNet\Model\PersonalDataUpdateResponse; use App\BusProNet\Model\PromoVoucher; use App\BusProNet\Model\PurchaseVoucher; use App\BusProNet\Model\RegistrationResponse; @@ -127,7 +128,7 @@ class ApiClient string $password, PersonalData $personalData, bool $debug = false, - ): Notification|PersonalData { + ): Notification|PersonalDataUpdateResponse { $data = [ 'user' => $this->config['bpn_username'], 'key' => $this->createKey($this->config['bpn_username'], $this->config['bpn_password'], static::TYPE_CUSTOMER_DATA), diff --git a/src/BusProNet/Model/PersonalDataUpdateResponse.php b/src/BusProNet/Model/PersonalDataUpdateResponse.php new file mode 100644 index 0000000..934e973 --- /dev/null +++ b/src/BusProNet/Model/PersonalDataUpdateResponse.php @@ -0,0 +1,15 @@ +parse($resultNode); + case 'Adressdaten_Ändern': + return (new PersonalDataUpdateParser())->parse($resultNode); case 'Adresse_Neu': return (new ContactFormResponseParser())->parse($resultNode); case 'SelektionCRM': diff --git a/src/BusProNet/XmlParser/PersonalDataUpdateParser.php b/src/BusProNet/XmlParser/PersonalDataUpdateParser.php new file mode 100644 index 0000000..f09ef59 --- /dev/null +++ b/src/BusProNet/XmlParser/PersonalDataUpdateParser.php @@ -0,0 +1,20 @@ +getIntOrNullValue($node->filterXPath('//idadresse')), + personId: $this->getIntOrNullValue($node->filterXPath('//idperson')), + changed: $this->getBoolValue($node->filterXPath('//änderung')), + ); + } +} diff --git a/src/Controller/Account/PersonalDataController.php b/src/Controller/Account/PersonalDataController.php index 131ae0b..e96890d 100644 --- a/src/Controller/Account/PersonalDataController.php +++ b/src/Controller/Account/PersonalDataController.php @@ -8,6 +8,7 @@ use App\BusProNet\ApiClient; use App\BusProNet\Exception\ApiClientException; use App\BusProNet\Model\Notification; use App\BusProNet\Model\PersonalData; +use App\BusProNet\Model\PersonalDataUpdateResponse; use App\Entity\User; use App\Exception\NewsletterProviderException; use App\Form\PersonalDataType; @@ -104,6 +105,16 @@ class PersonalDataController extends AbstractController return $this->redirectToRoute('app_personal_data'); } + if ($updateResult instanceof PersonalDataUpdateResponse && false === $updateResult->changed) { + $this->logger->error('BPN did not apply personal data update', [ + 'email' => $user->getEmail(), + 'addressId' => $updateResult->addressId, + ]); + $this->addFlash('error', 'Deine persönlichen Daten konnten nicht aktualisiert werden. Bitte versuche es erneut.'); + + return $this->redirectToRoute('app_personal_data'); + } + // Invalidate cached bookings to ensure edit mode shows updated applicant data $this->dataLoader->invalidateUserBookingCaches($user); diff --git a/templates/account/personal_data.html.twig b/templates/account/personal_data.html.twig index 2282a52..b62e9fe 100644 --- a/templates/account/personal_data.html.twig +++ b/templates/account/personal_data.html.twig @@ -15,6 +15,7 @@ } %} {% endif %} +