<?php
namespace App\Form\Manager;
use App\Entity\Provider;
use App\Entity\ProviderOrder;
use App\Form\Helpers\CollectionType;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\AbstractType;
use App\Form\Manager\ProviderOrderItemType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
class ProviderOrderType extends AbstractType
{
protected $authorizationChecker;
public function __construct(AuthorizationCheckerInterface $authorizationChecker)
{
$this->authorizationChecker = $authorizationChecker;
}
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('reference', TextType::class, [
'label' => 'N° Commande'
])
->add('orderedAt', DateType::class, [
'label' => 'Date',
'input' => 'datetime_immutable',
'widget' => 'single_text'
])
->add('deliveredEstimationAt', DateType::class, [
'label' => 'Livraison estimée',
'input' => 'datetime_immutable',
'widget' => 'single_text'
])
->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($options){
$entity = $event->getData();
$form = $event->getForm();
$persisted = $entity && $entity->getId();
$form->add('provider', EntityType::class, [
'label' => 'Fournisseur',
'class' => Provider::class,
'disabled' => $persisted,
'attr' => ['data-controller' => 'select2', 'data-parent' => $options['is_ajax'] ? '#forecastingOrderModal' : false]
]);
if ($persisted) {
$hasProducts = !$this->authorizationChecker->isGranted('ROLE_SUPER_ADMIN') && $entity->getProductCount();
$form->add('providerOrderItems', CollectionType::class, [
'entry_type' => ProviderOrderItemType::class,
'allow_add' => !$hasProducts,
'allow_delete' => !$hasProducts,
'allow_delete_persisted' => false,
'entry_options' => [
'label' => false,
'attr' => [ 'class' => 'form-row provider-order-item' ],
'provider' => $entity->getProvider()->getId(),
'is_ajax' => $options['is_ajax']
],
'by_reference' => false,
'label' => false,
'attr' => [ 'class' => 'provider-order-items' ],
'button_label' => 'Ajouter un produit',
'disabled' => $hasProducts,
]);
}
})
;
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => ProviderOrder::class,
'is_ajax' => false
]);
}
}