<?php
namespace AdminBundle\Admin;
use ApiBundle\Model\UnicommerceModel;
use CoreBundle\Entity\CallbackRequestLog;
use CoreBundle\Entity\ViDiDepartment;
use CoreBundle\Entity\ViDiWorker;
use CoreBundle\Model\DealerModel;
use CoreBundle\Model\ViDiWorkerModel;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Datagrid\ProxyQueryInterface;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Form\Type\ModelType;
use Sonata\AdminBundle\Route\RouteCollectionInterface;
use Sonata\MediaBundle\Form\Type\MediaType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email;
use Twig\Environment;
class ViDiWorkerAdmin extends BaseAdmin
{
protected MailerInterface $mailer;
protected Environment $twig;
public function setExtraServices(MailerInterface $mailer, Environment $twig)
{
$this->mailer = $mailer;
$this->twig = $twig;
}
/**
* @param $object
*/
public function prePersist($object): void
{
$dealer = $this->security->getUser()->getDealer();
$object->setDealer($dealer);
}
public function preRemove($object): void
{
$this->em->createQueryBuilder()
->update(CallbackRequestLog::class, 'c')
->set('c.worker', ':null')
->where('c.worker = :workerId')
->setParameter('workerId', $object->getId())
->setParameter('null', null)
->getQuery()
->execute();
}
/**
* @param ViDiWorker $object
* @throws Twig_Error_Loader
* @throws Twig_Error_Runtime
* @throws Twig_Error_Syntax
*/
public function sendToken($object)
{
$html = $this->twig->render('@Admin/Mail/tm_bot_token.html.twig', ['token' => $object->getToken()]);
$message = (new Email())
->subject('Доступ в TelegramBot')
->from(new Address('info@vidi.ua', 'TelegramBot'))
->setBody($html)
->to($object->getEmail());
$this->mailer->send($message);
}
/**
* @param RouteCollectionInterface $collection
*/
protected function configureRoutes(RouteCollectionInterface $collection): void
{
$collection->remove('view');
$collection->add('resendToken', $this->getRouterIdParameter() . '/resend_token');
}
/**
* @param DatagridMapper $datagridMapper
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$User = $this->getUser();
if (!$dealer = $User->getDealer()) {
throw new AccessDeniedException('User without dealer');
}
$queryBuilder = $this->getModelManager()
->getEntityManager(ViDiDepartment::class)
->createQueryBuilder('d')
->select('d')
->from(ViDiDepartment::class, 'd')
->where('d.dealer = :dealer')
->setParameter('dealer', $dealer);
$deps = [];
/** @var ViDiDepartment $item */
foreach ($queryBuilder->getQuery()->getResult() as $item) {
$deps[$item->getId()] = $item->getTitleRu();
}
$datagridMapper->add('id')
->add('department', 'doctrine_orm_choice', ['label' => 'Отдел'], ChoiceType::class, ['choices' => array_flip($deps)])
->add('dealer', null, ['label' => 'Дилерский центр']);
}
/**
* @param string $context
* @return ProxyQueryInterface
*/
public function configureQuery($context = 'list'): ProxyQueryInterface
{
$user = $this->security->getUser();
$dealer = $user->getDealer();
$query = parent::configureQuery($context);
if ($user->hasRole('ROLE_SUPER_ADMIN')) {
return $query;
}
$query->andWhere(
$query->expr()->eq($query->getRootAliases()[0] . '.dealer', ':dealer')
);
$query->setParameter('dealer', $dealer);
return $query;
}
/**
* @param FormMapper $formMapper
*/
protected function configureFormFields(FormMapper $formMapper): void
{
$dealer = $this->security->getUser()->getDealer();
$queryBuilder = $this->getModelManager()
->getEntityManager(ViDiDepartment::class)
->createQueryBuilder('d')
->select('d')
->from(ViDiDepartment::class, 'd')
->where('d.dealer = :dealer')
->setParameter('dealer', $dealer);
$formMapper
->with('Сотрудник', ['class' => 'col-lg-6'])
->add('callback_available', CheckboxType::class, [
'label' => 'Отвечает на обратные звонки?',
'required' => false,
])
->add('photo', MediaType::class, [
'label' => 'Фото',
'required' => false,
'provider' => 'sonata.media.provider.image',
'context' => 'dc_site'
])
->add('name_ru', null, ['label' => 'ФИО'])
->add('name_ua', null, ['label' => 'ПIБ'])
->add('department', ModelType::class, ['query' => $queryBuilder, 'label' => 'Отдел'])
->add('position', ChoiceType::class, ['label' => 'Должность', 'choices' => array_flip(ViDiWorkerModel::getPositions())])
->add('email', null, ['label' => 'E-mail'])
->add('phone_mobile', null, ['label' => 'Мобильный телефон'])
->add('phone_internal', null, ['label' => 'Внутренний телефон'])
->add('position_worker', null, ['label' => 'Порядок отображения персонала '])
->add('additional_page_available', CheckboxType::class, [
'label' => 'Показать на доп странице',
'required' => false,
]);
if ($dealer->getId() === DealerModel::UNICOMMERCE_DEALER) {
$formMapper->add('show_on_pages', ChoiceType::class, [
'label' => 'Сторінки на яких відображати',
'choices' => array_flip(UnicommerceModel::PAGES),
'multiple' => true,
'expanded' => false, // або true, якщо хочеш чекбокси
'required' => false,
]);
}
$formMapper->end();
}
/**
* @param ListMapper $listMapper
*/
protected function configureListFields(ListMapper $listMapper): void
{
$listMapper->addIdentifier('id')
->add('name', null, ['label' => 'Имя'])
->add('email', null, ['label' => 'E-mail'])
->add('position', ChoiceType::class, ['label' => 'Должность', 'choices' => ViDiWorkerModel::getPositions()])
->add('dealer', null, ['label' => 'Дилерский центр'])
->add('phone_internal', null, ['label' => 'Внутренний телефон'])
->add('callback_available', null, ['label' => 'Отвечает на обратные?'])
->add('department', null, ['label' => 'Отдел'])
->add('position_worker', null, ['label' => 'Порядок'])
->add('_action', 'actions', [
'label' => 'Действия',
'actions' => [
'edit' => [],
'resendToken' => [
'template' => '@AdminBundle/CRUD/list__action_resend_token.html.twig'
],
'delete' => [],
]
]);
}
}