src/Form/Bus/BookingType.php line 89

Open in your IDE?
  1. <?php
  2. namespace App\Form\Bus;
  3. use App\Entity\Bus\BookingSeat;
  4. use App\Entity\Bus\Route;
  5. use App\Entity\Bus\Seat;
  6. use App\Entity\Bus\Stop;
  7. use App\Entity\Bus\Trip;
  8. use App\Entity\Mpesa;
  9. use DateTime;
  10. use Doctrine\ORM\EntityRepository;
  11. use Symfony\Bridge\Doctrine\Form\Type\EntityType;
  12. use Symfony\Component\Form\AbstractType;
  13. use Symfony\Component\Form\Extension\Core\Type\ButtonType;
  14. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  15. use Symfony\Component\Form\Extension\Core\Type\NumberType;
  16. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  17. use Symfony\Component\Form\Extension\Core\Type\TextType;
  18. use Symfony\Component\Form\FormBuilderInterface;
  19. use Symfony\Component\Form\FormEvent;
  20. use Symfony\Component\Form\FormEvents;
  21. use Symfony\Component\OptionsResolver\OptionsResolver;
  22. use Symfony\Component\Validator\Constraints\NotBlank;
  23. class BookingType extends AbstractType {
  24. public function buildForm(FormBuilderInterface $builder, array $options){
  25. /** @var Trip $trip */
  26. $trip = $options['trip'];
  27. $shortCode = $options['shortCode'];
  28. $builder
  29. /*->add('bookingFrom', EntityType::class,[
  30. 'class' => Stop::class,
  31. 'query_builder' => function(EntityRepository $er) use ($trip){
  32. return $er->createQueryBuilder('i')
  33. ->andWhere('i.route = :route')
  34. ->setParameter('route', $trip->getRoute());
  35. },
  36. 'placeholder' => 'Station',
  37. 'attr' =>[
  38. 'class' =>'form-control form-select'
  39. ],
  40. 'mapped' => false
  41. ])*/
  42. ->add('passenger', TextType::class, [
  43. 'attr' => [
  44. 'class' => 'form-control'
  45. ]
  46. ])
  47. ->add('phone', TextType::class, [
  48. 'attr' => [
  49. 'class' => 'form-control'
  50. ]
  51. ])
  52. /*->add('seat', EntityType::class, [
  53. 'class' => Seat::class,
  54. 'query_builder' => function(EntityRepository $er) use ($trip){
  55. return $er->createQueryBuilder('i')
  56. ->andWhere('i.trip = :trip')
  57. ->setParameter('trip', $trip);
  58. },
  59. 'placeholder' => 'Select Seat',
  60. 'attr' =>[
  61. 'class' =>'form-control',
  62. 'id' => 'seatn'
  63. ],
  64. 'choice_attr' => function ($choice, $key, $value) {
  65. return [
  66. 'id' => 'seat_'.($key+1)
  67. ];
  68. },
  69. ])*/->add('origin', EntityType::class, [
  70. 'class' => Stop::class,
  71. 'query_builder' => function(EntityRepository $er) use ($trip){
  72. return $er->createQueryBuilder('i')
  73. ->andWhere('i.route = :route')
  74. ->setParameter('route', $trip->getRoute());
  75. },
  76. 'placeholder' => 'Select From',
  77. 'attr' =>[
  78. 'class' =>'form-control'
  79. ]
  80. ])->add('destination', EntityType::class, [
  81. 'class' => Stop::class,
  82. 'query_builder' => function(EntityRepository $er) use ($trip){
  83. return $er->createQueryBuilder('i')
  84. ->andWhere('i.route = :route')
  85. ->setParameter('route', $trip->getRoute())
  86. ->orderBy('i.id','DESC');
  87. },
  88. 'placeholder' => 'Select Destination',
  89. 'attr' =>[
  90. 'class' =>'form-control'
  91. ]
  92. ])->add('amount', NumberType::class,[
  93. 'attr' =>[
  94. 'class' =>'form-control'
  95. ]
  96. ])->add('paidVia', ChoiceType::class, [
  97. 'choices' => [
  98. 'CASH' => 'CASH',
  99. 'CASH_MPESA' => 'CASH_MPESA',
  100. 'MPESA' => 'MPESA',
  101. ],
  102. 'placeholder' => 'PAYMENT METHOD'
  103. ]);
  104. $builder->get('paidVia')->addEventListener(
  105. FormEvents::POST_SUBMIT,
  106. function (FormEvent $event) use ($shortCode){
  107. $form = $event->getForm();
  108. $paymentMethod = $form->getData();
  109. // dump($paymentMethod);
  110. if($paymentMethod == 'MPESA' || $paymentMethod == 'CASH_MPESA'){
  111. $form->getParent()->add('mpesa', EntityType::class, [
  112. 'class' => Mpesa::class,
  113. 'query_builder' => function(EntityRepository $er) use($shortCode) {
  114. $date = new DateTime();
  115. $formattedSearchDate = $date->format('Y-m-d');
  116. // dump($ad);
  117. return $er->createQueryBuilder('i')
  118. ->andWhere('i.isUsed = false')
  119. ->andWhere('i.shortCode = '.$shortCode)
  120. ->andWhere("date(i.createdAt) ='{$formattedSearchDate}'");
  121. },
  122. 'choice_label' => function (Mpesa $mpesa) {
  123. $amount = number_format($mpesa->getTransactionAmount());
  124. return $mpesa->getFirstName()." [ {$amount} ] -:".$mpesa->getTransactionId();
  125. },
  126. 'placeholder' => 'Select Mpesa',
  127. 'mapped' => false,
  128. 'attr' =>[
  129. 'class' =>'form-select'
  130. ],
  131. 'constraints' => [
  132. new NotBlank([
  133. 'message' => 'Please select mpesa transaction'
  134. ])
  135. ]
  136. ]);
  137. }
  138. });
  139. }
  140. public function configureOptions(OptionsResolver $resolver): void
  141. {
  142. $resolver->setDefaults([
  143. 'data_class' => BookingSeat::class,
  144. 'trip' => null,
  145. 'shortCode' => null,
  146. ''
  147. ]);
  148. }
  149. }