src/V4/Form/Type/QuoteLine/QuoteLineType.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\V4\Form\Type\QuoteLine;
  3. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  4. use ApiPlatform\Core\Exception\ResourceClassNotSupportedException;
  5. use App\Form\Type\SpecificFieldType;
  6. use App\Form\Type\SubresourceChoicesTrait;
  7. use App\Normalizer\Form\TextAreaTypeNormalizer;
  8. use App\Service\Cache\CacheManager;
  9. use App\V4\Form\Type\QuoteLineInfo\QuoteLineInfoType;
  10. use App\V4\Form\Type\VatFilterTrait;
  11. use App\V4\Logger\SentryLogger;
  12. use App\V4\Model\QuoteLine\QuoteLine;
  13. use App\V4\Model\QuoteLineInfo\QuoteLineInfo;
  14. use Psr\Cache\CacheException;
  15. use Psr\Cache\InvalidArgumentException;
  16. use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
  17. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  18. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  19. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  20. use Symfony\Component\Form\Extension\Core\Type\TextType;
  21. use Symfony\Component\Form\FormBuilderInterface;
  22. use Symfony\Component\OptionsResolver\OptionsResolver;
  23. class QuoteLineType extends SpecificFieldType
  24. {
  25.     use VatFilterTrait;
  26.     use SubresourceChoicesTrait {
  27.         getEntityChoices as private getEntityChoicesTrait;
  28.     }
  29.     /**
  30.      * @var CollectionDataProviderInterface
  31.      */
  32.     private $collectionDataProvider;
  33.     /**
  34.      * @var CacheManager
  35.      */
  36.     private $cacheManager;
  37.     /**
  38.      * @var SentryLogger
  39.      */
  40.     private $sentryLogger;
  41.     /**
  42.      * @param CollectionDataProviderInterface $collectionDataProvider
  43.      * @param CacheManager                    $cacheManager
  44.      * @param SentryLogger                    $sentryLogger
  45.      */
  46.     public function __construct(
  47.         CollectionDataProviderInterface $collectionDataProvider,
  48.         CacheManager $cacheManager,
  49.         SentryLogger $sentryLogger
  50.     ) {
  51.         $this->collectionDataProvider $collectionDataProvider;
  52.         $this->cacheManager $cacheManager;
  53.         $this->sentryLogger $sentryLogger;
  54.     }
  55.     /**
  56.      * {@inheritdoc}
  57.      *
  58.      * @throws ResourceClassNotSupportedException
  59.      */
  60.     public function buildForm(FormBuilderInterface $builder, array $options): void
  61.     {
  62.         $quoteLine $builder->getData();
  63.         $currentVatRate QuoteLine::DEFAULT_VAT_RATE_VALUE;
  64.         if ($quoteLine instanceof QuoteLine) {
  65.             $currentVatRate $quoteLine->getVatRate();
  66.         }
  67.         $builder
  68.             ->add('isOptional'CheckboxType::class, [
  69.                 'required' => false,
  70.                 'false_values' => ['false''0'''null],
  71.             ])
  72.             ->add('name'TextType::class, [
  73.                 'label' => 'quoteline_name',
  74.                 'required' => true,
  75.             ])
  76.             ->add('unitPriceExclVat'NumberType::class, [
  77.                 'label' => 'quoteline_unit_price_excl_vat',
  78.                 'empty_data' => '0.00',
  79.                 'scale' => 5,
  80.                 'input' => 'string',
  81.             ])
  82.             ->add('quantity'NumberType::class, [
  83.                 'label' => 'quoteline_quantity',
  84.                 'required' => true,
  85.             ])
  86.             ->add('discountType'ChoiceType::class, [
  87.                 'label' => 'quoteline_discount_type',
  88.                 'choices' => [
  89.                     '%' => QuoteLine::DISCOUNT_TYPE_PERCENTAGE,
  90.                     '€' => QuoteLine::DISCOUNT_TYPE_AMOUNT,
  91.                 ],
  92.             ])
  93.             ->add('discountValue'NumberType::class, [
  94.                 'label' => 'quoteline_discount_value',
  95.                 'empty_data' => '0.00',
  96.                 'input' => 'string',
  97.                 'scale' => 5,
  98.             ])
  99.             ->add('sectionName'TextType::class)
  100.             ->add('comment'TextareaType::class, [
  101.                 'label' => 'quoteline_comment',
  102.             ])
  103.             ->add('description'TextareaType::class, [
  104.                 'attr' => [
  105.                     TextAreaTypeNormalizer::DATA_ATTR_WYSIWYG_MODE => TextAreaTypeNormalizer::WYSIWYG_MODE_RESTRICTED,
  106.                 ],
  107.             ])
  108.             ->add('quoteLineInfo'QuoteLineInfoType::class, [
  109.                 'allow_extra_fields' => $options['allow_extra_fields'] ?? false,
  110.                 'empty_data' => function () {
  111.                     return new QuoteLineInfo();
  112.                 },
  113.             ])
  114.             ->add('vatRate'ChoiceType::class, [
  115.                 'choices' => $this->getVatChoices($this->collectionDataProvider$currentVatRate),
  116.                 'empty_data' => QuoteLine::DEFAULT_VAT_RATE_VALUE,
  117.             ])
  118.         ;
  119.     }
  120.     /**
  121.      * {@inheritdoc}
  122.      */
  123.     public function configureOptions(OptionsResolver $resolver): void
  124.     {
  125.         $resolver->setDefaults([
  126.             'data_class' => QuoteLine::class,
  127.             'required' => false,
  128.             'productId' => null,
  129.         ]);
  130.     }
  131.     /**
  132.      * @param string $entityFQCN
  133.      * @param string $libelleProperty
  134.      *
  135.      * @return array<string, object>
  136.      *
  137.      * @throws CacheException
  138.      * @throws InvalidArgumentException
  139.      */
  140.     private function getEntityChoices(string $entityFQCNstring $libelleProperty): array
  141.     {
  142.         return $this->getEntityChoicesTrait(
  143.             $this->collectionDataProvider,
  144.             $this->cacheManager,
  145.             $this->sentryLogger,
  146.             $entityFQCN
  147.         );
  148.     }
  149. }