fix: adopt response format of bpn personal data endpoint

This commit is contained in:
Björn Fromme
2026-06-25 15:06:15 +02:00
parent 7a3d3a3a96
commit 8907233ef5
6 changed files with 51 additions and 2 deletions
+2 -1
View File
@@ -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),
@@ -0,0 +1,15 @@
<?php
declare(strict_types=1);
namespace App\BusProNet\Model;
class PersonalDataUpdateResponse
{
public function __construct(
public readonly ?int $addressId,
public readonly ?int $personId,
public readonly bool $changed,
) {
}
}
@@ -38,9 +38,10 @@ class ApiResponseParser extends AbstractParser
switch ($subType) {
case 'Adressdaten':
case 'Adressdaten_Ändern':
case 'Newsletter':
return (new PersonalDataParser())->parse($resultNode);
case 'Adressdaten_Ändern':
return (new PersonalDataUpdateParser())->parse($resultNode);
case 'Adresse_Neu':
return (new ContactFormResponseParser())->parse($resultNode);
case 'SelektionCRM':
@@ -0,0 +1,20 @@
<?php
declare(strict_types=1);
namespace App\BusProNet\XmlParser;
use App\BusProNet\Model\PersonalDataUpdateResponse;
use Symfony\Component\DomCrawler\Crawler;
class PersonalDataUpdateParser extends AbstractParser
{
public function parse(Crawler $node): PersonalDataUpdateResponse
{
return new PersonalDataUpdateResponse(
addressId: $this->getIntOrNullValue($node->filterXPath('//idadresse')),
personId: $this->getIntOrNullValue($node->filterXPath('//idperson')),
changed: $this->getBoolValue($node->filterXPath('//änderung')),
);
}
}
@@ -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);
@@ -15,6 +15,7 @@
} %}
</div>
{% endif %}
<!-- address id: {{ personalData.addressId}} person id: {{ personalData.personId}} -->
<div class="p-4 lg:p-8">
<div class="divide-y divide-primary-bg/40">
<div class="grid md:grid-cols-2 gap-x-8 gap-y-4 pb-8">