<?php
namespace App\Form;
use App\Entity\Operacje;
use App\Entity\Przychody;
use App\Entity\Rozchody;
use App\Entity\Rodzaje;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;
class OperacjaType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
// Dodajemy odpowiednie pole w zależności od typu operacji
if ($options['typ_operacji'] === 'przychod') {
$builder->add('przychod', EntityType::class, [
'class' => Przychody::class,
'label' => 'Przychód',
'placeholder' => 'Wpisz aby wyszukać...',
'attr' => [
'class' => 'form-select select2-search',
'data-placeholder' => 'Wpisz aby wyszukać...'
],
'choice_label' => function($przychod) {
return $przychod->getKategoria() ?
'[' . $przychod->getKategoria()->getNazwa() . '] ---> ' . $przychod->getNazwa() :
$przychod->getNazwa();
},
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('p')
->leftJoin('p.kategoria', 'k')
->addSelect('k')
->orderBy('k.nazwa', 'ASC')
->addOrderBy('p.nazwa', 'ASC');
},
]);
} else {
$builder->add('rozchod', EntityType::class, [
'class' => Rozchody::class,
'label' => 'Wydatek',
'placeholder' => 'Wpisz aby wyszukać...',
'attr' => [
'class' => 'form-select select2-search',
'data-placeholder' => 'Wpisz aby wyszukać...'
],
'choice_label' => function($rozchod) {
return $rozchod->getKategoria() ?
'[' . $rozchod->getKategoria()->getNazwa() . '] --> ' . $rozchod->getNazwa() :
$rozchod->getNazwa();
},
'query_builder' => function (EntityRepository $er) {
return $er->createQueryBuilder('r')
->leftJoin('r.kategoria', 'k')
->addSelect('k')
->orderBy('k.nazwa', 'ASC')
->addOrderBy('r.nazwa', 'ASC');
},
]);
};
$builder
->add('dataOperacji', DateType::class, [
'label' => 'Data operacji',
'widget' => 'single_text',
'html5' => true,
'attr' => ['class' => 'form-control'],
'format' => 'yyyy-MM-dd',
])
->add('kwota', NumberType::class, [
'label' => 'Kwota',
'attr' => [
'class' => 'form-control',
'step' => '0.01',
'min' => '0.01',
],
'html5' => true,
])
->add('opis', TextareaType::class, [
'label' => 'Opis',
'required' => false,
'attr' => ['class' => 'form-control', 'rows' => 3],
])
// ->add('kto', null, [
// 'label' => 'Osoba',
// 'required' => false,
// 'attr' => ['class' => 'form-control'],
// ])
->add('rodzaj', EntityType::class, [
'class' => Rodzaje::class,
'label' => false,
'attr' => ['class' => 'd-none'],
'choice_label' => 'nazwa',
'query_builder' => function (EntityRepository $er) use ($options) {
$qb = $er->createQueryBuilder('r');
if ($options['typ_operacji'] === 'przychod') {
$qb->where('r.nazwa LIKE :przychod')
->setParameter('przychod', 'Przychód%');
} else {
$qb->where('r.nazwa NOT LIKE :przychod')
->setParameter('przychod', 'Przychód%');
}
return $qb->orderBy('r.nazwa', 'ASC');
},
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => Operacje::class,
'typ_operacji' => 'wydatek', // Domyślnie ustawiamy na wydatek
]);
}
public function buildView(FormView $view, FormInterface $form, array $options): void
{
parent::buildView($view, $form, $options);
// Add a flag to the view to indicate we should use select2
$view->vars['use_select2'] = true;
}
}