<?php
namespace App\Form\Bus;
use App\Entity\Bus\BookingSeat;
use App\Entity\Bus\Route;
use App\Entity\Bus\Seat;
use App\Entity\Bus\Stop;
use App\Entity\Bus\Trip;
use App\Entity\Mpesa;
use DateTime;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
class BookingType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options){
/** @var Trip $trip */
$trip = $options['trip'];
$shortCode = $options['shortCode'];
$builder
/*->add('bookingFrom', EntityType::class,[
'class' => Stop::class,
'query_builder' => function(EntityRepository $er) use ($trip){
return $er->createQueryBuilder('i')
->andWhere('i.route = :route')
->setParameter('route', $trip->getRoute());
},
'placeholder' => 'Station',
'attr' =>[
'class' =>'form-control form-select'
],
'mapped' => false
])*/
->add('passenger', TextType::class, [
'attr' => [
'class' => 'form-control'
]
])
->add('phone', TextType::class, [
'attr' => [
'class' => 'form-control'
]
])
/*->add('seat', EntityType::class, [
'class' => Seat::class,
'query_builder' => function(EntityRepository $er) use ($trip){
return $er->createQueryBuilder('i')
->andWhere('i.trip = :trip')
->setParameter('trip', $trip);
},
'placeholder' => 'Select Seat',
'attr' =>[
'class' =>'form-control',
'id' => 'seatn'
],
'choice_attr' => function ($choice, $key, $value) {
return [
'id' => 'seat_'.($key+1)
];
},
])*/->add('origin', EntityType::class, [
'class' => Stop::class,
'query_builder' => function(EntityRepository $er) use ($trip){
return $er->createQueryBuilder('i')
->andWhere('i.route = :route')
->setParameter('route', $trip->getRoute());
},
'placeholder' => 'Select From',
'attr' =>[
'class' =>'form-control'
]
])->add('destination', EntityType::class, [
'class' => Stop::class,
'query_builder' => function(EntityRepository $er) use ($trip){
return $er->createQueryBuilder('i')
->andWhere('i.route = :route')
->setParameter('route', $trip->getRoute())
->orderBy('i.id','DESC');
},
'placeholder' => 'Select Destination',
'attr' =>[
'class' =>'form-control'
]
])->add('amount', NumberType::class,[
'attr' =>[
'class' =>'form-control'
]
])->add('paidVia', ChoiceType::class, [
'choices' => [
'CASH' => 'CASH',
'CASH_MPESA' => 'CASH_MPESA',
'MPESA' => 'MPESA',
],
'placeholder' => 'PAYMENT METHOD'
]);
$builder->get('paidVia')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($shortCode){
$form = $event->getForm();
$paymentMethod = $form->getData();
// dump($paymentMethod);
if($paymentMethod == 'MPESA' || $paymentMethod == 'CASH_MPESA'){
$form->getParent()->add('mpesa', EntityType::class, [
'class' => Mpesa::class,
'query_builder' => function(EntityRepository $er) use($shortCode) {
$date = new DateTime();
$formattedSearchDate = $date->format('Y-m-d');
// dump($ad);
return $er->createQueryBuilder('i')
->andWhere('i.isUsed = false')
->andWhere('i.shortCode = '.$shortCode)
->andWhere("date(i.createdAt) ='{$formattedSearchDate}'");
},
'choice_label' => function (Mpesa $mpesa) {
$amount = number_format($mpesa->getTransactionAmount());
return $mpesa->getFirstName()." [ {$amount} ] -:".$mpesa->getTransactionId();
},
'placeholder' => 'Select Mpesa',
'mapped' => false,
'attr' =>[
'class' =>'form-select'
],
'constraints' => [
new NotBlank([
'message' => 'Please select mpesa transaction'
])
]
]);
}
});
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => BookingSeat::class,
'trip' => null,
'shortCode' => null,
''
]);
}
}