src/Form/SalesFormType.php line 72

Open in your IDE?
  1. <?php
  2. namespace App\Form;
  3. use App\Entity\Company;
  4. use App\Entity\Customer;
  5. use App\Entity\Sales;
  6. use App\Entity\User;
  7. use App\Enum\PaymentStatus;
  8. use App\Enum\SalesStatus;
  9. use Doctrine\DBAL\Types\DateTimeImmutableType;
  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\ChoiceType;
  14. use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
  15. use Symfony\Component\Form\Extension\Core\Type\DateType;
  16. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  17. use Symfony\Component\Form\Extension\Core\Type\TextareaType;
  18. use Symfony\Component\Form\Extension\Core\Type\TextType;
  19. use Symfony\Component\Form\FormBuilderInterface;
  20. use Symfony\Component\OptionsResolver\OptionsResolver;
  21. use Symfony\Component\Form\CallbackTransformer;
  22. use Symfony\Component\Security\Core\Security;
  23. class SalesFormType extends AbstractType
  24. {
  25.     private Security $security;
  26.     /**
  27.      * @param Security $security
  28.      */
  29.     public function __construct(Security $security)
  30.     {
  31.         $this->security $security;
  32.     }
  33.     public function buildForm(FormBuilderInterface $builder, array $options): void
  34.     {
  35.         $builder
  36.             ->add('invoiceNumber'TextType::class, [
  37.                 'label' => 'forms.sales.newsale.invoicenumber',
  38.                 'required' => true,
  39.                 'disabled' => true,
  40.             ])
  41.             ->add('company'EntityType::class, [
  42.                 'label' => 'İşlemi Yapan Şirket',
  43.                 'class' => Company::class,
  44.                 'choice_label' => 'name',
  45.                 'placeholder' => 'Şirket Seçiniz',
  46.                 'required' => false,
  47.             ])
  48.             ->add('customer'EntityType::class, [
  49.                 'label' => 'customer',
  50.                 'class' => Customer::class,
  51.                 'choice_label' => function (Customer $customer) {
  52.                     return ($customer->getCode() . " - " $customer->getFullName()) . " - "
  53.                         . ($customer->getEmail() ? $customer->getEmail() :
  54.                             ($customer->getPhone() ? $customer->getPhone() : "Telefon veya Email kayıtlı değil"));
  55.                 },
  56.                 'placeholder' => 'selectCustomer'
  57.             ])
  58.             ->add('totalPurchasePrice'TextType::class, [
  59.                 'label' => 'forms.sales.newsale.totalpurchaseprice',
  60.                 'required' => true
  61.             ])
  62.             ->add('seller'EntityType::class, [
  63.                 'label' => 'forms.sales.newsale.sellername',
  64.                 'class' => User::class,
  65.                 'choice_label' => 'fullName',
  66.                 'query_builder' => function (EntityRepository $er) {
  67.                     return $er->createQueryBuilder('u')
  68.                         ->where('u.roles LIKE :role')
  69.                         ->setParameter('role''%"ROLE_SALES_REP"%'); // JSON string içinde "ROLE_SALES_REP" arar
  70.                 },
  71.                 //'data' => $this->security->getUser(),
  72.                 'placeholder' => 'selectSeller',
  73.             ])
  74.             ->add('status'ChoiceType::class, [
  75.                 'label' => 'forms.sales.newsale.status',
  76.                 'choices' => SalesStatus::cases(),
  77.                 'choice_value' => fn(?SalesStatus $status) => $status?->value,
  78.                 'choice_label' => fn(SalesStatus $status) => $status->getTranslationKey(),
  79.                 'required' => true,
  80.                 //'mapped' => false,
  81.             ])
  82.             ->add('description'TextareaType::class, [
  83.                 'label' => 'forms.sales.newsale.description'// Etiket: Açıklama
  84.                 'required' => false// Veritabanında nullable olduğu için zorunlu değil
  85.                 'attr' => ['rows' => 3], // Yüksekliği 3 satırla sınırlar
  86.             ])
  87.             ->add('shippingNotes'TextareaType::class, [
  88.                 'label' => 'forms.sales.newsale.shippingnotes'// Etiket: Kargo Notları
  89.                 'required' => false,
  90.                 'attr' => ['rows' => 3],
  91.             ])
  92.             ->add('paymentNotes'TextareaType::class, [
  93.                 'label' => 'forms.sales.newsale.paymentnotes'// Etiket: Ödeme Notları
  94.                 'required' => false,
  95.                 'attr' => ['rows' => 3],
  96.             ])
  97.             ->add('salesDate'DateType::class, [
  98.                 'label' => 'salesdate',
  99.                 'widget' => 'single_text',
  100.                 'required' => true,
  101.             ])
  102.             ->add('deliveryDate'DateType::class, [
  103.                 'label' => 'deliveryDate',
  104.                 'widget' => 'single_text',
  105.                 'required' => false,
  106.             ])
  107.             ->add('dueDate'DateType::class, [
  108.                 'label' => 'dueDate',
  109.                 'widget' => 'single_text',
  110.                 'required' => false,
  111.             ])
  112.             ->add('validDate'DateType::class, [
  113.                 'label' => 'validDate',
  114.                 'widget' => 'single_text',
  115.                 'required' => false,
  116.             ])
  117.         ;
  118.         $builder->get('totalPurchasePrice')
  119.             ->addModelTransformer(new CallbackTransformer(
  120.                 function ($tagsAsArray) {
  121.                     // transform the array to a string
  122.                     return $this->convertToMoney($tagsAsArray);
  123.                 },
  124.                 function ($tagsAsString) {
  125.                     // transform the string back to an array
  126.         
  127.                     return $this->convertToFloat($tagsAsString);
  128.                 }
  129.             ))
  130.         ;
  131.     }
  132.     // when you save any data you must use this method.
  133.     public function convertToFloat($value): float
  134.     {
  135.         if (is_float($value))
  136.             return $value;
  137.         $value str_replace(','''$value);
  138.         //        $value = str_replace(',', '.', $value);
  139.         return floatval($value);
  140.     }
  141.     // when you show any data in view you must use this method.
  142.     public function convertToMoney($value): string
  143.     {
  144.         return number_format($value4'.'",");
  145.     }
  146.     public function configureOptions(OptionsResolver $resolver): void
  147.     {
  148.         $resolver->setDefaults([
  149.             'data_class' => Sales::class,
  150.         ]);
  151.     }
  152. }