<?php
namespace App\Form\GestionComerciale;
use App\DataTransformer\Articles\IdToMarqueTransformer;
use App\DataTransformer\Clients\IdToClientTransformer;
use App\DataTransformer\Localisation\IdToSecteurGeographiqueTransformer;
use App\DataTransformer\Utilisateur\IdToContactTransformer;
use App\Entity\Adresses\Adresse;
use App\Entity\Clients\Client;
use App\Entity\Clients\ClientCategorie;
use App\Entity\GestionComerciale\Commande;
use App\Entity\Localisation\SecteurGeographique;
use App\Entity\Localisation\Zone;
use App\Entity\Transporteurs\Transporteur;
use App\Entity\Utilisateur\Contact;
use App\Entity\Utilisateur\Utilisateur;
use App\Entity\Utilisateur\UtilisateurZoneGeographique;
use App\Entity\Vehicules\VehiculeClient;
use App\Repository\Transporteurs\TransporteurRepository;
use App\Repository\Utilisateur\UtilisateurRepository;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\ChoiceList\ChoiceList;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
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\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class DevisType extends AbstractType
{
private EntityManagerInterface $entityManager;
private $transformerClient;
public function __construct(EntityManagerInterface $entityManager,IdToClientTransformer $transformerClient)
{
$this->entityManager = $entityManager;
$this->transformerClient = $transformerClient;
}
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('marge', HiddenType::class)
->add('tauxMarge', HiddenType::class)
->add('dureeValidite', DateType::class, [
'widget' => 'single_text',
]
)
->add('delaiRelance')
->add('commercial', EntityType::class, [
'class' => Utilisateur::class,
//'choice_name' => ChoiceList::fieldName($this, 'nomPrenom'),
'query_builder' => function (UtilisateurRepository $er) {
return $er->createQueryBuilder('x')
->where('x.type = :type')
->setParameters(["type" => "4"])
->orderBy('x.nom', 'ASC');
},
])
->add('assistanteCommercial', EntityType::class, [
'class' => Utilisateur::class,
//'choice_name' => ChoiceList::fieldName($this, 'nomPrenom'),
'query_builder' => function (UtilisateurRepository $er) {
return $er->createQueryBuilder('x')
->where('x.type = :type')
->setParameters(["type" => "5"])
->orderBy('x.nom', 'ASC');
},
])
->add('francoPort')
->add('fraisPortSupplementaire', TextType::class, ['attr' => ['class' => 'numeric']])
->add('tauxTvaFraisPort', HiddenType::class)
->add('dateApproximativeReception', DateType::class, [
'widget' => 'single_text',
]
)
->add('totalPoids', HiddenType::class)
->add('commentaire')
/*->add( 'statutCommande', EntityType::class, array(
'class' => 'DTC\GestionComercialeBundle\Entity\StatutCommande',
//'choice_name' => ChoiceList::fieldName($this, 'libelle'),
'query_builder' => function(StatutCommandeRepository $er ) {
return $er->createQueryBuilder('x')
->orderBy('x.libelle', 'ASC');
}
))
*/
->add('transporteur', EntityType::class, [
'class' => Transporteur::class,
// //'choice_name' => ChoiceList::fieldName($this, 'libelle'),
'required' => false,
'query_builder' => function (TransporteurRepository $er) {
return $er->createQueryBuilder('x')
->orderBy('x.libelle', 'ASC');
},
])
->add(
'client',
TextType::class,
[
'attr' => [
'class' => 'select2-hidden-accessible',
],
]
)
/*
->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('secteurGeographique', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => SecteurGeographique::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add('contactFacturation', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Contact::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add('contactLivraison', EntityType::class, [
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Contact::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
])
->add(
'contactAcheteur',
EntityType::class,
[
'multiple' => false, // Wether or not multiple values are allowed (default to false)
'class' => Contact::class,
'attr' => [
'class' => 'select2-hidden-accessible',
],
],
)
->add('dateLivraisonSouhaitee', DateType::class, [
'widget' => 'single_text',
]
)
->add('nbColis')
->add('telephone')
->add('telephone2')
->add('email');
$builder->add('referenceClient');
$builder->get('client')->addModelTransformer($this->transformerClient);
// $builder->get('contactFacturation')->addModelTransformer(new IdToContactTransformer($this->entityManager));
// $builder->get('contactLivraison')->addModelTransformer(new IdToContactTransformer($this->entityManager));
// $builder->get('contactAcheteur')->addModelTransformer(new IdToContactTransformer($this->entityManager));
//
//
//
// $builder->get('client')->addModelTransformer(new IdToClientTransformer($this->entityManager));
// $builder->get('secteurGeographique')->addModelTransformer(new IdToSecteurGeographiqueTransformer($this->entityManager));
$formModifier = function (FormInterface $form, Client $client = null) {
$adresses = null === $client ? [] : $client->getAdresses();
$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 = [];
foreach ($adresses as $a) {
$pays_obj = null;
$pays_id = null;
$paysUe = "0";
if (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();
}
$dataTva = 1;
if (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);
}
if ( ! is_object($data_secteur_obj) && is_object($pays_obj) && is_object($pays_obj->getSecteurGeographique())) {
$data_secteur_obj = $pays_obj;
}
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());
}
//if($data_secteur != "") $data_commercial = $repo_utilisateur_zone_geographique->findCommercialByCodePostal($data_secteur);
//if($data_secteur != "")
//if($data_cp != "") $data_assistante_commercial = $repo_utilisateur_zone_geographique->findSecteurGeographiqueByCodePostal($data_cp);
$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('adresseLivraison', EntityType::class, [
'class' => Adresse::class,
'placeholder' => '',
'choices' => $adresses,
'choice_attr' => $dataAtributes,
]);
$form->add('adresseFacturation', EntityType::class, [
'class' => Adresse::class,
'placeholder' => '',
'choices' => $adresses,
'choice_attr' => $dataAtributes,
]);
$vehicules = null === $client ? [] : $client->getVehiculesClient();
$dataKm = "";
$dataCT = "";
$dataSerie = "";
$dataImmat = "";
$dataModele = "";
$dataMarque = "";
$dataLibelle = "";
$dataAtributes = [];
foreach ($vehicules as $vehicule) {
$dataImmat = $vehicule->getImmatriculation();
$dataSerie = $vehicule->getNumSerie();
if (is_object($vehicule->getDateControleTechnique())) {
$dataCT = $vehicule->getDateControleTechnique()->format("d/m/Y");
} else {
$dataCT = "";
}
$dataKm = $vehicule->getKilometrage();
if (is_object($vehicule->getMarque())) {
$dataMarque = $vehicule->getMarque()->getLibelle();
}
if (is_object($vehicule->getModele())) {
$dataModele = $vehicule->getModele()->getLibelle();
} else {
$dataModele = $vehicule->getLibelle();
}
if ($vehicule->getLibelle() != '') {
$dataLibelle = $vehicule->getLibelle();
}
$adrTab = [
'data-km' => $dataKm,
'data-ct' => $dataCT,
'data-serie' => $dataSerie,
'data-immat' => $dataImmat,
'data-modele' => $dataModele,
'data-marque' => $dataMarque,
'data-libelle' => $dataLibelle,
];
$dataAtributes[] = $adrTab;
}
$form->add('vehiculesClient', EntityType::class, [
'class' => VehiculeClient::class,
'placeholder' => '',
'choices' => $vehicules,
'choice_attr' => $dataAtributes,
'choice_label' => function ($choiceValue, $key, $value) {
return $choiceValue->getLibelle().' ('.$choiceValue->getImmatriculation().')';
},
]);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getClient());
}
);
$builder->get('client')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
// 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();
// since we've added the listener to the child, we'll have to pass on
// the parent to the callback functions!
$formModifier($event->getForm()->getParent(), $client);
}
);
/*
$formModifier = function (FormInterface $form, Client $client = null) {
$vehicules = null === $client ? array() : $client->getVehiculesClient();
$dataKm = "";
$dataCT = "";
$dataSerie = "";
$dataImmat = "";
$dataModele = "";
$dataMarque = "";
$dataAtributes = array();
foreach($vehicules as $vehicule) {
$dataImmat = $vehicule->getImmatriculation();
$dataSerie = $vehicule->getNumSerie();
if(is_object($vehicule->getDateControleTechnique())) {
$dataCT = $vehicule->getDateControleTechnique()->format("d/m/Y");
}
else $dataCT = "";
$dataKm =$vehicule->getKilometrage();
if(is_object($vehicule->getMarque())) {
$dataMarque = $vehicule->getMarque()->getLibelle();
}
if(is_object($vehicule->getModele())) {
$dataModele = $vehicule->getModele()->getLibelle();
}
$adrTab = array('data-km' => $dataKm,'data-ct' => $dataCT,'data-serie' => $dataSerie,'data-immat' => $dataImmat,'data-modele' => $dataModele,'data-marque' => $dataMarque);
$dataAtributes[]=$adrTab;
}
$form->add('vehiculesClient',EntityType::class, array(
'class' => 'DTCVehiculesBundle:VehiculeClient',
'placeholder' => '',
'choices' => $vehicules,
'choice_attr' => $dataAtributes,
));
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getClient());
}
);
*/
/*
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) {
$form = $event->getForm();
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$client = $data->getClient();
$adresses = null === $client ? array() : $client->getAdresses();
$form->add('adresseLivraison',EntityType::class, array(
'class' => 'DTCAdressesBundle:Adresse',
'placeholder' => '',
'choices' => $adresses,
));
}
);
*/
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Commande::class,
]);
}
public function getName()
{
return 'dtc_gestioncomercialebundle_commande';
}
public function getBlockPrefix():string
{
return 'dtc_gestioncomercialebundle_commande';
}
}