Files
crowd-fund-api/src/Benzina/UsersPump.php
T

134 lines
3.5 KiB
PHP

<?php
namespace App\Benzina;
use App\Entity\User\Organization;
use App\Entity\User\Person;
use App\Entity\User\User;
use App\Entity\User\UserType;
use App\Service\UserService;
use Goteo\Benzina\Pump\ArrayPumpTrait;
use Goteo\Benzina\Pump\DoctrinePumpTrait;
use Goteo\Benzina\Pump\PumpInterface;
class UsersPump implements PumpInterface
{
use ArrayPumpTrait;
use DoctrinePumpTrait;
use UsersPumpTrait;
private int $userCount = 0;
public function supports(mixed $sample): bool
{
if ($this->hasAllKeys($sample, self::USER_KEYS)) {
return true;
}
return false;
}
public function pump(mixed $record, array $context): void
{
$user = new User();
$user->setHandle($this->buildHandle($record));
$user->setPassword($record['password'] ?? '');
$user->setEmail($record['email']);
$user->setEmailConfirmed(false);
$user->setActive(false);
$user->setMigrated(true);
$user->setMigratedId($record['id']);
$user->setDateCreated($this->getDateCreated($record));
$user->setDateUpdated(new \DateTime());
$user->setType($this->getUserType($record));
match ($user->getType()) {
UserType::Individual => $user = $this->setUserPerson($record, $user),
UserType::Organization => $user = $this->setUserOrganization($record, $user),
};
$this->persist($user, $context);
++$this->userCount;
}
private function buildHandle(array $record): string
{
try {
$handle = UserService::asHandle($record['id']);
} catch (\Exception $e) {
$handle = UserService::asHandle($record['email']);
}
return \sprintf('%s_%02d', $handle, $this->userCount % 100);
}
private function getDateCreated(array $record): \DateTime
{
$created = new \DateTime($record['created'] ?? '0000-00-00');
if ($created > new \DateTime('2011-01-01')) {
return $created;
}
return new \DateTime($record['modified'] ?? 'now');
}
private function getUserType(array $record): UserType
{
switch ($record['legal_entity']) {
case 0:
case 1:
return UserType::Individual;
case 2:
case 3:
case 4:
case 5:
case 6:
return UserType::Organization;
default:
return UserType::Individual;
}
}
private function setUserPerson(array $record, User $user): User
{
$namePieces = \explode(' ', $record['name']);
$namePiecesCount = \count($namePieces);
$firstName = $record['name'];
$lastName = '';
if ($namePiecesCount === 2) {
[$firstName, $lastName] = $namePieces;
}
if ($namePiecesCount === 3) {
$firstName = $namePieces[0];
$lastName = \join(' ', \array_slice($namePieces, 1));
}
if ($namePiecesCount > 3) {
$firstName = \join(' ', \array_slice($namePieces, 0, 2));
$lastName = \join(' ', \array_slice($namePieces, 2));
}
$person = new Person();
$person->setFirstName($firstName);
$person->setLastName($lastName);
$user->setPerson($person);
return $user;
}
private function setUserOrganization(array $record, User $user): User
{
$org = new Organization();
$org->setBusinessName($record['name']);
$user->setOrganization($org);
return $user;
}
}