WIP: Implement crm selections

This commit is contained in:
Björn Fromme
2023-10-11 14:35:40 +02:00
parent 7084e1528e
commit b472dab6c8
6 changed files with 103 additions and 5 deletions
+31
View File
@@ -0,0 +1,31 @@
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20231011122510 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE teamer ADD crm_selections JSON DEFAULT NULL COMMENT \'(DC2Type:json)\'');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE teamer DROP crm_selections');
}
}
@@ -55,4 +55,25 @@ class CrmAttributesResponse
return $this; return $this;
} }
public function toArray(): array
{
$crmSelections = [];
foreach ($this->getAttributeGroups() as $group) {
/** @var CrmAttributeGroup $group */
if (false === isset($crmSelections[$group->getLabel()])) {
$crmSelections[$group->getLabel()] = [];
}
foreach ($group->getAttributes() as $attribute) {
/** @var CrmAttribute $attribute */
if (false === $attribute->isSelected()) {
continue;
}
$crmSelections[$group->getLabel()][] = $attribute->getLabel();
}
}
return $crmSelections;
}
} }
+10 -3
View File
@@ -48,8 +48,12 @@ class UserDataHandler
]); ]);
} }
public function createLocalUser(ProfileResponse $profileResponse, array $roles, bool $isTeamer = false): User public function createLocalUser(
{ ProfileResponse $profileResponse,
array $roles,
bool $isTeamer = false,
array $crmSelections = []
): User {
$user = new User(); $user = new User();
$user $user
->setFirstName($profileResponse->getFirstName()) ->setFirstName($profileResponse->getFirstName())
@@ -62,6 +66,7 @@ class UserDataHandler
if (true === $isTeamer) { if (true === $isTeamer) {
$teamer = Teamer::fromApiResponse($profileResponse); $teamer = Teamer::fromApiResponse($profileResponse);
$teamer->setCrmSelections($crmSelections);
$user->setTeamer($teamer); $user->setTeamer($teamer);
$this->logger->info('Create teamer', [ $this->logger->info('Create teamer', [
'uuid' => $teamer->getUuid(), 'uuid' => $teamer->getUuid(),
@@ -82,7 +87,8 @@ class UserDataHandler
User $user, User $user,
ProfileResponse $profileResponse, ProfileResponse $profileResponse,
array $roles, array $roles,
bool $isTeamer = false bool $isTeamer = false,
array $crmSelections = []
): void { ): void {
$user->setRoles($roles); $user->setRoles($roles);
@@ -93,6 +99,7 @@ class UserDataHandler
->getTeamer() ->getTeamer()
->setAddress($address) ->setAddress($address)
->setCommunication($communication) ->setCommunication($communication)
->setCrmSelections($crmSelections)
; ;
} }
+15
View File
@@ -128,6 +128,9 @@ class Teamer implements TimestampableEntityInterface
#[ORM\Column(length: 2, nullable: true)] #[ORM\Column(length: 2, nullable: true)]
private ?string $size = null; private ?string $size = null;
#[ORM\Column(nullable: true)]
private ?array $crmSelections = null;
public function __construct() public function __construct()
{ {
$this->uuid = Uuid::v4(); $this->uuid = Uuid::v4();
@@ -720,4 +723,16 @@ class Teamer implements TimestampableEntityInterface
return $this; return $this;
} }
public function getCrmSelections(): ?array
{
return $this->crmSelections;
}
public function setCrmSelections(?array $crmSelections): static
{
$this->crmSelections = $crmSelections;
return $this;
}
} }
+7 -2
View File
@@ -4,6 +4,8 @@ namespace App\Security;
use App\BusProNet\ApiClient; use App\BusProNet\ApiClient;
use App\BusProNet\ApiClientException; use App\BusProNet\ApiClientException;
use App\BusProNet\Model\CrmAttribute;
use App\BusProNet\Model\CrmAttributeGroup;
use App\BusProNet\Model\CrmAttributesResponse; use App\BusProNet\Model\CrmAttributesResponse;
use App\BusProNet\Model\ProfileResponse; use App\BusProNet\Model\ProfileResponse;
use App\BusProNet\UserDataHandler; use App\BusProNet\UserDataHandler;
@@ -117,6 +119,9 @@ class BpnAuthenticator extends AbstractLoginFormAuthenticator implements Authent
return null; return null;
} }
// Flatten selected CRM attributes
$crmSelections = $crmAttributes->toArray();
// Determine teamer status from CRM attributes // Determine teamer status from CRM attributes
$isTeamer = $crmAttributes->isTeamer(); $isTeamer = $crmAttributes->isTeamer();
@@ -130,7 +135,7 @@ class BpnAuthenticator extends AbstractLoginFormAuthenticator implements Authent
if (null !== $user) { if (null !== $user) {
$this $this
->userDataHandler ->userDataHandler
->updateLocalUser($user, $profileResponse, $roles, $isTeamer) ->updateLocalUser($user, $profileResponse, $roles, $isTeamer, $crmSelections)
; ;
return $user; return $user;
@@ -138,7 +143,7 @@ class BpnAuthenticator extends AbstractLoginFormAuthenticator implements Authent
return $this return $this
->userDataHandler ->userDataHandler
->createLocalUser($profileResponse, $roles, $isTeamer) ->createLocalUser($profileResponse, $roles, $isTeamer, $crmSelections)
; ;
} }
} }
@@ -11,6 +11,25 @@
<h1 class="text-2xl font-bold pb-8"> <h1 class="text-2xl font-bold pb-8">
Selektionsmerkmale {{ teamer }} Selektionsmerkmale {{ teamer }}
</h1> </h1>
{% for group, attributes in teamer.crmSelections %}
<h2 class="font-bold text-lg">
{{ group }}
</h2>
{% if attributes|length %}
<ul class="pb-4">
{% for attribute in attributes %}
<li class="flex items-center space-x-2">
{{ icon('check', 'w-4 h-4') }}
<span>{{ attribute }}</span>
</li>
{% endfor %}
</ul>
{% else %}
<div class="text-sm pb-4">
-
</div>
{% endif %}
{% endfor %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}