<?php
namespace App\Form;
use App\Entity\Lot;
use App\Entity\Product;
use App\Repository\ProductRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use App\Entity\PieceLine;
use Symfony\Component\Validator\Constraints\NotBlank;
class PieceLineType extends AbstractType
{
private $productRepo;
public function __construct(ProductRepository $productRepo)
{
$this->productRepo = $productRepo;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$products = $this->productRepo->findBy([],['name'=>'ASC']);
$tab = $options['products'];
foreach($products as $product){
if($product->hasStock() and $tab->contains($product) === false){
$tab->add($product);
}
}
$builder
->add('qty', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
'autocomplete' => 'off',
'placeholder' => 'Quantité',
'class' => 'qte_product'
],
'constraints'=>[
new NotBlank([
'message' => 'Saisissez une qté'
])
]
])
->add('priceBuyHT', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
"class" => "text-right",
"readonly" => "readonly",
'autocomplete' => 'off',
'placeholder' => 'Prix Achat HT']
])
->add('marge', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
"class" => "text-right",
"readonly" => "readonly",
'autocomplete' => 'off',
'placeholder' => 'Marge']
])
->add('priceHT', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
"class" => "text-right",
"readonly" => "readonly",
'autocomplete' => 'off',
'placeholder' => 'Prix HT']
])
->add('totalHT', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
"class" => "text-right",
"readonly" => "readonly",
'autocomplete' => 'off',
'placeholder' => 'Total HT']
])
->add('rabais', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
'class' => 'rabais_product',
'autocomplete' => 'off',
'placeholder' => 'Remise']
])
->add('amountRabais', TextType::class, [
"label" => false,
"required" => false,
'attr' => [
"class" => "text-right",
"readonly" => "readonly",
'autocomplete' => 'off',
'placeholder' => 'montant rabais']
])
->add('tva', ChoiceType::class,
[
'choices' => $options['config'],
'multiple' => false,
'expanded' => false,
"label" => false,
"required" => false,
'placeholder' => 'Tva',
'attr' => [
'class' => 'tva_product']
]
)
->add('product', EntityType::class, [
'class' => Product::class,
'choices' => $tab,
'choice_label' => 'codeName',
'placeholder' => 'Produit',
'label' => false,
'required' => false,
'attr' => [
'class' => 'select_product'
],
'constraints'=>[
new NotBlank([
'message' => 'Choisissez un produit'
])
]
]);
$addFacilityForm = function (FormInterface $form, $product_id) {
$form->add('lot', EntityType::class, [
'class' => Lot::class,
"required" => false,
'choice_label' => 'infoLot',
'label' => "Lot",
'placeholder' => "Lot",
'query_builder' => function (EntityRepository $er) use ($product_id) {
// this does the trick to get the right options
return $er->createQueryBuilder('l')
->where('l.product = :product')
->setParameter('product',$product_id);
}
]);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($addFacilityForm) {
$product = $event->getData() ? $event->getData()->getProduct() : null;
$product_id = $product ? $product->getId() : null;
$addFacilityForm($event->getForm(), $product_id);
}
);
$builder->addEventListener(
FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($addFacilityForm) {
$data = $event->getData();
$product_id = array_key_exists('product', $data) ? $data['product'] : null;
$addFacilityForm($event->getForm(), $product_id);
}
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => PieceLine::class,
'products' => null
]);
$resolver->setRequired('config');
}
}