src/Admin/UserAdmin.php line 41
<?phpdeclare(strict_types=1);namespace App\Admin;use App\Entity\User;use App\Enum\RegionEnum;use App\Entity\Hierarchy;use App\Enum\EmployeeStatus;use Sonata\Form\Type\DatePickerType;use Sonata\Form\Type\CollectionType;use Sonata\Exporter\ExporterInterface;use Doctrine\ORM\EntityManagerInterface;use Sonata\AdminBundle\Admin\AbstractAdmin;use Symfony\Bundle\SecurityBundle\Security;use Sonata\AdminBundle\Form\Type\ModelType;use Sonata\AdminBundle\Datagrid\DatagridMapper;use Sonata\AdminBundle\Datagrid\ListMapper;use Sonata\AdminBundle\Form\FormMapper;use Sonata\AdminBundle\Show\ShowMapper;use Sonata\AdminBundle\Form\Type\ModelListType;use Sonata\AdminBundle\Filter\Model\FilterData;use Symfony\Bridge\Doctrine\Form\Type\EntityType;use Symfony\Component\Validator\Constraints\Regex;use Symfony\Component\HttpFoundation\RequestStack;use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;use Sonata\DoctrineORMAdminBundle\Filter\ChoiceFilter;use Symfony\Component\Form\Extension\Core\Type\ChoiceType;use Symfony\Component\Form\Extension\Core\Type\NumberType;use Symfony\Component\Form\Extension\Core\Type\RepeatedType;use Symfony\Component\Form\Extension\Core\Type\PasswordType;use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;final class UserAdmin extends AdminBase{public function __construct($code, $class, $baseControllerName, protected EntityManagerInterface $entityManager, protected UserPasswordHasherInterface $passwordEncoder, protected AuthorizationCheckerInterface $securityChecker, protected Security $security, protected RequestStack $requestStack){parent::__construct($code, $class, $baseControllerName);}protected function configureDatagridFilters(DatagridMapper $filter): void{$filter->add('id')->add('email')->add('firstName',null, ['show_filter' => true])->add('lastName',null, ['show_filter' => true])->add('employeeID',null, ['show_filter' => true])->add('title')->add('hasGuaranteePayments', CallbackFilter::class, ['callback' => static function(ProxyQueryInterface $query, string $alias, string $field, FilterData $data): bool {if (!$data->hasValue()) {return false;}if($data->getValue() == 'Yes'){$query->andWhere($alias.'.guaranteeStartDate IS NOT NULL');}if($data->getValue() == 'No'){$query->andWhere($alias.'.guaranteeStartDate IS NULL');}return true;},'field_type' => ChoiceType::class,'field_options' => ['choices' => ['Yes' => 'Yes','No' => 'No',],]])->add('roles',null, ['label' => 'Role','field_type' => ChoiceType::class,'field_options' => ['choices' => array_flip(User::getRolesList()),],])->add('employeeStatus', ChoiceFilter::class, ['label' => 'Employee Status','field_type' => ChoiceType::class,'field_options' => ['choices' => EmployeeStatus::cases(),'choice_label' => function ($choice, string $key, mixed $value) {return $choice->title();},],'show_filter' => true])->add('commissionEligible', null, ['label' => 'Commissionable','show_filter' => true]);}protected function configureListFields(ListMapper $list): void{$list->add('id')->add('rolesLabels', 'html', ['label' => 'Roles'])->add('title')->add('email')->add('firstName')->add('lastName')->add('managerName')->add('incentAccess')->add('creditEligible')->add('commissionEligible')->add('employeeID')->add('employeeStatus')->add('salary')->add('guaranteeStartDate')->add('guaranteePeriod', null, ['editable' => true,])->add('earningCommissionsStartDate')->add('earningCommissionsPeriod')->add('leaveOfAbsenceStartDate')->add('leaveOfAbsenceEndDate')->add('createdAt')->add(ListMapper::NAME_ACTIONS, null, ['actions' => ['show' => [],'edit' => [],'delete' => [],'impersonate' => ['template' => 'admin/user/impersonate.html.twig'],],]);}protected function configureFormFields(FormMapper $form): void{$form->tab('Profile')->with('Profile Details:', ['class' => 'col-md-6','box_class' => 'box box-solid box-primary',])->add('roles', ChoiceType::class,['choices' => array_flip(User::getRolesList()),'multiple' => true,])->add('email')->add('firstName')->add('lastName')->add('plainPassword', RepeatedType::class, ['type' => PasswordType::class,'invalid_message' => 'The password fields must match.','options' => ['attr' => ['class' => 'password-field']],'required' => false,'first_options' => ['label' => 'Password (Leave blank if not changing user\'s password)', 'help' => 'Your password must contain at least 1 uppercase letter, 1 lowercase letter, and 1 number. It must also be 8-20 characters long.'],'second_options' => ['label' => 'Confirm Password'],'constraints' => [new Regex(['pattern' => '/(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,20}/','message' => 'Your password must contain at least 1 uppercase letter, 1 lowercase letter, and 1 number. It must also be 8-20 characters long.'])],])->end()->with('Employment Details:', ['class' => 'col-md-6','box_class' => 'box box-solid box-primary',])->add('employeeID')->add('employeeStatus', ChoiceType::class,['choices' => EmployeeStatus::cases(),'choice_label' => function ($choice, string $key, mixed $value) {return $choice->title();},])->add('hireDate')->add('terminationDate')->end()->end()->tab('Compensation')->add('title')->add('plan')->add('salary')->add('creditEligible')->add('commissionEligible')->end()->end()->tab('Guarantee')->add('guaranteeStartDate', DatePickerType::class, ['required' => false,'label' => 'Guarantee Start Date','attr' => ['placeholder' => '','class' => 'w-full date-input'],])->add('guaranteeAmount', NumberType::class, ['required' => false,'label' => 'Monthly Guarantee Amount ','attr' => ['placeholder' => '','class' => 'w-full date-input'],])->add('guaranteePeriod')->add('earningCommissionsStartDate', DatePickerType::class, ['required' => false,'label' => 'Earning Commissions Start Date','attr' => ['placeholder' => '','class' => 'w-full date-input'],])->add('earningCommissionsPeriod')->end()->end()->tab('Leave of Absence')->with('Leave of Absence Details:', ['class' => 'col-md-6','box_class' => 'box box-solid box-primary','description' => 'When an employee is on Leave of Absence, their commissions will show $0 on the Payroll Report during the leave period. Commissions earned during leave will be included in the first payroll report after the leave ends.',])->add('leaveOfAbsenceStartDate', DatePickerType::class, ['required' => false,'label' => 'Leave Start Date','attr' => ['placeholder' => '','class' => 'w-full date-input'],])->add('leaveOfAbsenceEndDate', DatePickerType::class, ['required' => false,'label' => 'Leave End Date','attr' => ['placeholder' => '','class' => 'w-full date-input'],])->end()->end()->tab('Regions')->add('userRegions', CollectionType::class, ['by_reference' => false,'type_options' => ['delete' => true,],'btn_add' => 'Add Region',],['edit' => 'inline','inline' => 'table','sortable' => 'position',])->end()->end()->tab('Positions')->add('positions', CollectionType::class, ['by_reference' => false,'type_options' => ['delete' => true,],'btn_add' => 'Add Position',],['edit' => 'inline','inline' => 'table','sortable' => 'position',])->end()->end()->tab('Hierarchy')->add('hierarchies', CollectionType::class, ['label' => false,'type_options' => ['delete' => true,]],['edit' => 'inline','inline' => 'inline','sortable' => 'position',])->end();}protected function configureShowFields(ShowMapper $show): void{$show->add('id')->add('email')->add('roles')->add('password')->add('incentAccess')->add('userRegions')->add('groupName')->add('creditEligible')->add('commissionEligible')->add('employeeID')->add('employeeStatus')->add('guaranteePeriod')->add('guaranteeStartDate')->add('firstName')->add('lastName')->add('managerName')->add('guaranteeAmount')->add('guaranteeAmountUnitType')->add('guaranteePeriodUnitType')->add('middleName')->add('effectiveStartDate')->add('description')->add('hireDate')->add('terminationDate')->add('personalTarget')->add('proratedPersonalTarget')->add('personalCurrency')->add('proratedSalary')->add('paymentCurrency')->add('salary')->add('salaryCurrency')->add('leaveOfAbsenceStartDate')->add('leaveOfAbsenceEndDate');}public function preUpdate($object): void { // $object is an instance of App\Entity\User as specified in services.yaml$plainPassword = $object->plainPassword;if($plainPassword) {$object->setPassword($this->passwordEncoder->hashPassword($object,$plainPassword));}}public function prePersist($object): void { // $object is an instance of App\Entity\User as specified in services.yaml$plainPassword = $object->plainPassword;if(!$plainPassword){$plainPassword = uniqid();}$object->setPassword($this->passwordEncoder->hashPassword($object,$plainPassword));}public function configureExportFields(): array{return ['Id' => 'id','Title' => 'title','Email' => 'email','First Name' => 'firstName','Last Name' => 'lastName','Manager Name' => 'managerName','Incent Access' => 'incentAccess','Credit Eligible' => 'creditEligible','Commission Eligible' => 'commissionEligible','Employee ID' => 'employeeID','Employee Status' => 'employeeStatus','Guarantee Start Date' => 'guaranteeStartDate','Guarantee Period' => 'guaranteePeriod','Earning Commissions Start Date' => 'earningCommissionsStartDate','Earning Commissions Period' => 'earningCommissionsPeriod','Leave of Absence Start Date' => 'leaveOfAbsenceStartDate','Leave of Absence End Date' => 'leaveOfAbsenceEndDate',];}}