<?php
namespace App\Form\Notes;
use App\DataTransformer\Clients\IdToClientTransformer;
use App\DataTransformer\Fournisseurs\IdToFournisseurTransformer;
use App\DataTransformer\Utilisateur\IdToContactTransformer;
use App\Entity\Adresses\Adresse;
use App\Entity\Clients\Client;
use App\Entity\Clients\ClientCategorie;
use App\Entity\Fournisseurs\Fournisseur;
use App\Entity\Localisation\Zone;
use App\Entity\Notes\Categorie;
use App\Entity\Notes\Note;
use App\Entity\Utilisateur\Contact;
use App\Entity\Utilisateur\Utilisateur;
use App\Entity\Utilisateur\UtilisateurZoneGeographique;
use App\Repository\Notes\CategorieRepository;
use App\Repository\Utilisateur\UtilisateurRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\ChoiceList;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\OptionsResolver\OptionsResolver;
class NoteType extends AbstractType
{
private EntityManagerInterface $entityManager;
private RequestStack $requestStack;
private ParameterBagInterface $params;
public function __construct(EntityManagerInterface $entityManager, ParameterBagInterface $params, RequestStack $requestStack)
{
$this->entityManager = $entityManager;
$this->requestStack = $requestStack;
$this->params = $params;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$entity = $builder->getData();
$entityID = "";
//if($entity->getID() != NULL){
$entityID = $entity->getID();
$builder
->add('dateDebut', DateTimeType::class, ['widget' => 'single_text',])
->add('dateFin', DateTimeType::class, ['widget' => 'single_text',])
->add('libelle')
//->add('utilisateur')
->add('utilisateur', EntityType::class, [
'class' => Utilisateur::class,
// //'choice_name' => ChoiceList::fieldName($this, 'nomPrenom'),
'choice_label' => function (Utilisateur $utilisateur) {
return $utilisateur->getNomPrenom();
},
'required' => false,
'query_builder' => function (UtilisateurRepository $er) use ($entity) {
if (is_object($entity->getUtilisateur())) {
return $er->createQueryBuilder('x')
->where(' x.visible = 1 and (x.archive = 0 or x.id = '.$entity->getUtilisateur()->getId().' )')
->setParameters([])
->orderBy('x.prenom', 'ASC');
} else {
return $er->createQueryBuilder('x')
->where('x.visible = 1 and (x.archive = 0)')
->setParameters([])
->orderBy('x.prenom', 'ASC');
}
},
])
->add('adresseVille')
->add('adresseNumero')
->add('adresseRue')
->add('adresseCp')
->add('adresseComplement')
->add('adresseComplement2')
//->add('tempsTrajet')
//->add('recurrence')
->add('alerte', ChoiceType::class, [
'choices' => [
'Aucune' => '',
'Au moment de l\'événement' => '0',
'5 minutes avant' => '5',
'10 minutes avant' => '10',
'15 minutes avant' => '15',
'30 minutes avant' => '30',
'1 heure avant' => '60',
'2 heures avant' => '120',
'1 jour avant' => '2880',
'2 jours avant' => '5760',
'1 semaine avant' => '10080',
],
// *this line is important*
])
->add('tempsTrajet', ChoiceType::class, [
'choices' => [
'Aucun' => '0',
'5 minutes' => '5',
'10 minutes' => '10',
'15 minutes' => '15',
'30 minutes' => '30',
'45 minutes' => '45',
'1 heure' => '60',
'1 heure 15' => '75',
'1 heure 30' => '90',
'1 heure 45' => '105',
'2 heures ' => '120',
],
// *this line is important*
])
->add('recurrence', ChoiceType::class, [
'choices' => [
'Aucune' => '',
'Tous les jours' => 'jour',
'Tous les semaines' => 'semaine',
'Tous les mois' => 'mois',
'Tous les ans' => 'an',
],
// *this line is important*
])
->add('finRecurrence', DateType::class, [
'widget' => 'single_text',
]
)
// ->add('dateSaisie', DateTimeType::class, array( 'pickerOptions' =>array('format' => 'dd/mm/yyyy hh:ii')))
->add('dateRappel', DateTimeType::class, ['widget' => 'single_text',])
//->add('categorie')
->add('categorie', EntityType::class, [
'class' => Categorie::class,
//'choice_name' => ChoiceList::fieldName($this, 'libelle'),
'choice_label' => function (Categorie $categorie) {
return $categorie->getLibelle();
},
'required' => false,
'query_builder' => function (CategorieRepository $er) use ($entity) {
if (1 == 1) {
return $er->createQueryBuilder('x')
->where('1=1')
->setParameters([])
->orderBy('x.libelle', 'ASC');
} else {
return $er->createQueryBuilder('x')
->where('1=1')
->setParameters([])
->orderBy('x.libelle', 'ASC');
}
},
])
->add('statut')
//->add('message')
->add('message', TextareaType::class, [
'attr' => [
'style' => 'height:180px;',
'class' => 'tinymce',
'data-theme' => 'bbcode', // Skip it if you want to use default theme
],
])
->add('prive', ChoiceType::class, [
'label' => 'Privé',
'attr' => [
'class' => '_form-control',
],
'choices' => [['1' => 'Oui'], ['0' => 'Non']],
'expanded' => true,
'multiple' => false,
'required' => true,
])
->add('client', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Client::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add('fournisseur', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Fournisseur::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add('contact', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Contact::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add('contactFournisseur', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Contact::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
]);
$formModifier = function (FormInterface $form, Client $client = null, Fournisseur $fournisseur = null, $entity, $mode = "") {
//$adresses = null === $client ? array() : $client->getAdresses();
//var_dump($form->getData());
if ($mode == "client") {
/*
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy(array(
'visible' => 1,
'client' => $client->getId(),
));
$adresses_siege = $this->entityManager->getRepository(Adresse::class)->findOneBy(array("id"=>$this->params->get('adresse_siege')));
//$adresses[]=$adresses_siege;
*/
//$adresses = $this->entityManager->getRepository(Adresse::class)->getAdresseClientNote($client->getId(),"");
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy([
'visible' => 1,
'client' => $client->getId(),
]);
$adresses_siege = $this->entityManager->getRepository(Adresse::class)->findOneBy(["id" => $this->params->get('adresse_siege')]);
$adresses[] = $adresses_siege;
} elseif ($mode == "fournisseur") {
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy([
'visible' => 1,
'fournisseur' => $fournisseur->getId(),
]);
$adresses_siege = $this->entityManager->getRepository(Adresse::class)->findOneBy(["id" => $this->params->get('adresse_siege')]);
//$adresses[] = $adresses_siege;
} elseif (null === $client && null === $fournisseur) {
$adresses = [];
//adresses = $this->entityManager->getRepository(Adresse::class)->findBy(["id" => $this->params->get('adresse_siege')]);
} elseif ($client != null) {
/*
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy(array(
'visible' => 1,
'client' => $client->getId(),
));
*/
$fournisseur_id = null;
if ($fournisseur != null) {
$fournisseur_id = $fournisseur->getId();
}
$adresses = $this->entityManager->getRepository(Adresse::class)->getAdresseClientEtFournisseur($client->getId(), $fournisseur_id);
$adresses_siege = $this->entityManager->getRepository(Adresse::class)->findOneBy(["id" => $this->params->get('adresse_siege')]);
//$adresses[] = $adresses_siege;
} elseif ($fournisseur != null) {
/*
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy(array(
'visible' => 1,
'fournisseur' => $fournisseur->getId(),
));
*/
$client_id = null;
if ($client != null) {
$client_id = $client->getId();
}
$adresses = $this->entityManager->getRepository(Adresse::class)->getAdresseClientEtFournisseur($fournisseur->getId(), $client_id);
$adresses_siege = $this->entityManager->getRepository(Adresse::class)->findOneBy(["id" => $this->params->get('adresse_siege')]);
//$adresses[] = $adresses_siege;
}
if (is_object($entity->getAdresse()) && $entity->getAdresse()->getVisible() == false) {
$adresses[] = $entity->getAdresse();
}
//if(is_object($entity->getAdresseFacturation()) && $entity->getAdresseFacturation()->getVisible() == false) $adresses[]= $entity->getAdresseFacturation();
$reglement = null === $client ?: $client->getModeReglement();
$pro = "0";
if (is_object($client)) {
$repo_client_categorie = $this->entityManager->getRepository(ClientCategorie::class);
$premiere_categorie = $repo_client_categorie->getCategorieRacinePourClient($client);
if ( ! is_object($premiere_categorie)) {
$pro = "0";
} elseif ( ! is_object($premiere_categorie->getCategorie())) {
$pro = "0";
} elseif ( ! $premiere_categorie->getCategorie()->getProfessionnel()) {
$pro = "0";
} else {
$pro = "1";
}
}
/*if(is_object($client)) {
if(is_object($client->getTypeClient())) {
if($client->getTypeClient()->getId() == "2") $pro = "1";
}
}*/
$repo_utilisateur_zone_geographique = $this->entityManager->getRepository(UtilisateurZoneGeographique::class);
$repo_zone = $this->entityManager->getRepository(Zone::class);
$dataTva = 1;
$dataAtributes = [];
//print_r($adresses);
foreach ($adresses as $a) {
$paysUe = "0";
$dataTva = 1;
$pays_obj = null;
$pays_id = null;
if ($a !== null && is_object($a->getPays())) {
if ($a->getPays()->getId() != "370095" && $a->getPays()->getEurope()) {
$paysUe = "1";
}
if ($pro == 1 && $a->getPays()->getId() != "370095") {
$dataTva = 0;
}
if ($pro == 0 && $a->getPays()->getEurope() == false) {
$dataTva = 0;
}
$pays_obj = $a->getPays();
$pays_id = $a->getPays()->getId();
}
if (is_object($client) && is_object($client->getCompta()) && $client->getCompta()->getTva() == 0) {
// echo "eeee";
$dataTva = 0;
}
$data_societe = "";
$data_numero = "";
$data_rue = "";
$data_complement = "";
$data_complement2 = "";
$data_cp = "";
$data_ville = "";
$data_secteur = "";
$data_secteur_libelle = "";
$data_secteur_obj = "";
$data_commercial = "";
$data_assistante_commercial = "";
$data_societe = $a->getSociete();
$data_numero = $a->getNumero();
$data_rue = $a->getRue();
$data_complement = $a->getComplement();
$data_complement_2 = $a->getComplement2();
if (is_object($a->getCodePostal())) {
$data_cp = $a->getCodePostal()->getCodePostal();
}
if (is_object($a->getVille())) {
$data_ville = $a->getVille()->getTitre();
}
if ($data_cp != "") {
$data_secteur_obj = $repo_zone->findSecteurGeograhiqueByCodePostal($data_cp, $pays_id);
//echo "XXX";
}
if ( ! is_object($data_secteur_obj) && is_object($pays_obj) && is_object($pays_obj->getSecteurGeographique())) {
$data_secteur_obj = $pays_obj;
//echo "YYYY";
}
//echo "AAAA";
if (is_object($data_secteur_obj) && is_object($data_secteur_obj->getSecteurGeographique())) {
$data_secteur = $data_secteur_obj->getSecteurGeographique()->getId();
$data_secteur_libelle = $data_secteur_obj->getSecteurGeographique()->getLibelle();
$data_assistante_commercial = $repo_utilisateur_zone_geographique->findAssistanteCommercialByCodePostal($data_secteur_obj->getSecteurGeographique());
$data_commercial = $repo_utilisateur_zone_geographique->findCommercialByCodePostal($data_secteur_obj->getSecteurGeographique());
}
$adrTab = [
'data-pro' => $pro,
'data-ue' => $paysUe,
'data-tva' => $dataTva,
'data-societe' => $data_societe,
'data-numero' => $data_numero,
'data-rue' => $data_rue,
'data-complement' => $data_complement,
'data-complement2' => $data_complement2,
'data-cp' => $data_cp,
'data-ville' => $data_ville,
'data-secteur' => $data_secteur,
'data-secteur-libelle' => $data_secteur_libelle,
'data-commercial' => $data_commercial,
'data-assistante-commercial' => $data_assistante_commercial,
];
$dataAtributes[] = $adrTab;
}
$form->add('adresse', EntityType::class, [
'class' => Adresse::class,
'placeholder' => '',
'choices' => $adresses,
'choice_attr' => $dataAtributes,
]);
};
// $builder->get('fournisseur')->addModelTransformer(new IdToFournisseurTransformer($this->entityManager));
// $builder->get('client')->addModelTransformer(new IdToClientTransformer($this->entityManager));
// $builder->get('contact')->addModelTransformer(new IdToContactTransformer($this->entityManager));
// $builder->get('contactFournisseur')->addModelTransformer(new IdToContactTransformer($this->entityManager));
//$builder->get('categorie')->addModelTransformer(new IdToCategorieNoteTransformer($this->entityManager));
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier, $entity) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
if (is_object($data->getAdresse()) && is_object($data->getAdresse()->getFournisseur())) {
$formModifier($event->getForm(), null, $data->getFournisseur(), $entity, $mode = "fournisseur");
//echo "A";
//exit;
} elseif (is_object($data->getAdresse()) && is_object($data->getAdresse()->getClient())) {
$formModifier($event->getForm(), $data->getClient(), null, $entity, $mode = "client");
//echo "B";
//exit;
} else {
$formModifier($event->getForm(), $data->getClient(), $data->getFournisseur(), $entity);
//echo "C";
//exit;
}
}
);
$builder->get('client')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier, $entity) {
// It's important here to fetch $event->getForm()->getData(), as
// $event->getData() will get you the client data (that is, the ID)
$client = $event->getForm()->getData();
//$fournisseur = $event->getForm()->getData()->getFournisseur();
// since we've added the listener to the child, we'll have to pass on
// the parent to the callback functions!
$frn_temp = $this->requestStack->getMainRequest()->request->get($this->getBlockPrefix());
if (isset($frn_temp['fournisseur'])) {
$frn_temp = $this->entityManager->getRepository(Fournisseur::class)->find($frn_temp['fournisseur']);
if ($client != null) {
$formModifier($event->getForm()->getParent(), $client, $frn_temp, $entity);
}
}
}
);
$builder->get('fournisseur')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier, $entity) {
// It's important here to fetch $event->getForm()->getData(), as
// $event->getData() will get you the client data (that is, the ID)
$fournisseur = $event->getForm()->getData();
//$client = $event->getForm()->getData()->getClient();
$client_temp = $this->requestStack->getMainRequest()->request->get($this->getBlockPrefix());
if (isset($client_temp['client'])) {
$client_temp = $this->entityManager->getRepository(Client::class)->find($client_temp);
// since we've added the listener to the child, we'll have to pass on
if ($fournisseur != null) {
$formModifier($event->getForm()->getParent(), $client_temp, $fournisseur, $entity);
}
}
}
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Note::class,
]);
}
// public function getBlockPrefix():string
// {
// return 'dtc_notesbundle_note';
// }
public function getBlockPrefix(): string
{
return 'dtc_notesbundle_note';
}
}