<?php
namespace App\Form\GestionComerciale;
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\FO\Societe;
use App\Entity\GestionComerciale\Commande;
use App\Entity\GestionComerciale\StatutPaiement;
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\GestionComerciale\StatutPaiementRepository;
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\FileType;
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 CommandeType 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)
{
$entity = $builder->getData();
$entityID = "";
//if($entity->getID() != NULL){
$entityID = $entity->getID();
//};
$builder
->add('marge', HiddenType::class)
->add('tauxMarge', HiddenType::class)
->add('email')
->add('telephone')
->add('telephone2')
->add('aBloquer')
->add('numeroSuivi')
->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('fraisPortSupplementaire', TextType::class, ['attr' => ['class' => 'numeric']])
->add('tauxTvaFraisPort', HiddenType::class)
->add('francoPort')
->add('dateBon', DateType::class, [
'widget' => 'single_text',
]
)
->add('date', DateType::class, [
'widget' => 'single_text',
'attr' => [
'min' => $this->getDateDebutEx2($entityID, true),
'max' => $this->getDateFinEx2($entityID, true),
],
]
)
->add('dateApproximativeReception', DateType::class, [
'widget' => 'single_text',
]
)
->add('totalPoids', HiddenType::class)
->add('typeDocumentCommercial')
->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')
->where('x.documentCommercial = :documentCommercial AND x.ordre IN (:ordre)')
->setParameters(array("documentCommercial"=>"2","ordre"=>array(0,1,2)))
->orderBy('x.ordre', 'DESC');
}
))
*/
->add('statutPaiement', EntityType::class, [
'class' => StatutPaiement::class,
//'choice_name' => ChoiceList::fieldName($this, 'libelle'),
'query_builder' => function (StatutPaiementRepository $er) {
return $er->createQueryBuilder('x')
->orderBy('x.ordre', '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.position,x.libelle', 'ASC');
},
])
->add(
'client',
TextType::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('valideManuellement')
->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('fichierImport', FileType::class, [])
;
$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->add('referenceClient');
// $builder->get('client')->addModelTransformer(new IdToClientTransformer($this->entityManager));
// $builder->get('secteurGeographique')->addModelTransformer(new IdToSecteurGeographiqueTransformer($this->entityManager));
$formModifier = function (FormInterface $form, Client $client = null, $entity) {
//$adresses = null === $client ? array() : $client->getAdresses();
//var_dump($form->getData());
$vehicules = null === $client ? [] : $client->getVehiculesClient();
if (null === $client) {
$adresses = [];
} else {
$adresses = $this->entityManager->getRepository(Adresse::class)->findBy([
'visible' => 1,
'client' => $client->getId(),
]);
}
if (is_object($entity->getAdresseLivraison()) && $entity->getAdresseLivraison()->getVisible() == false) {
$adresses[] = $entity->getAdresseLivraison();
}
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 = [];
foreach ($adresses as $a) {
$paysUe = "0";
$dataTva = 1;
$pays_obj = null;
$pays_id = null;
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();
}
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_pays = "";
$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 (is_object($a->getPays())) {
$data_pays = $a->getPays()->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-pays' => $data_pays,
'data-secteur' => $data_secteur,
'data-secteur-libelle' => $data_secteur_libelle,
'data-commercial' => $data_commercial,
'data-assistante-commercial' => $data_assistante_commercial,
];
$dataAtributes[] = $adrTab;
}
$dataKm = "";
$dataCT = "";
$dataSerie = "";
$dataImmat = "";
$dataModele = "";
$dataMarque = "";
$dataLibelle = "";
$dataAtributesVehicules = [];
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,
];
$dataAtributesVehicules[] = $adrTab;
}
$form->add('vehiculesClient', EntityType::class, [
'class' => VehiculeClient::class,
'placeholder' => '',
'choices' => $vehicules,
'choice_attr' => $dataAtributesVehicules,
'choice_label' => function ($choiceValue, $key, $value) {
return $choiceValue->getLibelle() . ' (' . $choiceValue->getImmatriculation() . ')';
},
]);
$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,
]);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier, $entity) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getClient(), $entity);
}
);
$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();
// 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, $entity);
}
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Commande::class,
]);
}
public function getBlockPrefix():string
{
return 'dtc_gestioncomercialebundle_commande';
}
public function getName()
{
return 'dtc_gestioncomercialebundle_commande';
}
public function getDateDebutEx($ID)
{
if ($ID == "") {
return false;
}
$repository = $this->entityManager->getRepository(Societe::class);
$societe = $repository->find(1);
$dateDebut = $societe->getDateDebutExercice(1);
$dateDebut = $dateDebut->format('d/m/Y');
$repository = $this->entityManager->getRepository(Commande::class);
$commande = $repository->find($ID);
$dateInit = $commande->getDate();
if (is_a($dateInit, 'DateTime')) {
$dateFacture = $dateInit->format('d/m/Y');
} else {
$dateFacture = new \DateTime;
$dateFacture = $dateFacture->format('d/m/Y');
}
list($monthDebut, $dayDebut, $yearDebut) = explode("/", $dateDebut);
$dayMonthDebut = $dayDebut . "/" . $monthDebut;
list($dayFacture, $monthFacture, $yearFacture) = explode("/", $dateFacture);
$dayMonthFacture = $dayFacture . "/" . $monthFacture;
//echo $dayMonthFacture."//".$dayMonthDebut;
//$dayMonthFin = new \DateTime($dayMonthFin);
$dayMonthDebut = \DateTime::createFromFormat('d/m', $dayMonthDebut);
//$dayMonthFacture = new \DateTime($dayMonthFacture);
$dayMonthFacture = \DateTime::createFromFormat('d/m', $dayMonthFacture);
if ($dayMonthDebut <= $dayMonthFacture) {
//echo "superieur dateDebut";
$dayMonthDebut = $dayMonthDebut->format('d/m');
$dayMonthFacture = $dayMonthFacture->format('d/m');
//echo $dayMonthFacture."//".$dayMonthDebut;
$Date = $dayMonthDebut . "/" . $yearFacture;
return $Date; //->format('d/m/Y');
} elseif ($dayMonthDebut >= $dayMonthFacture) {
//echo "inferieur dateDebut";
$yearFacture = $yearFacture - 1;
//echo $yearFacture;
$dayMonthDebut = $dayMonthDebut->format('d/m');
$dayMonthFacture = $dayMonthFacture->format('d/m');
//echo $dayMonthFacture."//".$dayMonthDebut;
$Date = $dayMonthDebut . "/" . $yearFacture;
//echo $Date;
return $Date;//->format('d/m/Y');
}
}
public function getDateFinEx($ID)
{
if ($ID == "") {
return false;
}
$repository = $this->entityManager->getRepository(Societe::class);
$societe = $repository->find(1);
$dateFin = $societe->getDateFinExercice(1);
$dateFin = $dateFin->format('d/m/Y');
$repository = $this->entityManager->getRepository(Commande::class);
$commande = $repository->find($ID);
$dateInit = $commande->getDate($ID);
if (is_a($dateInit, 'DateTime')) {
$dateFacture = $dateInit->format('d/m/Y');
} else {
$dateFacture = new \DateTime;
$dateFacture = $dateFacture->format('d/m/Y');
}
list($dayFin, $monthFin, $yearFin) = explode("/", $dateFin);
$dayMonthFin = $dayFin . "/" . $monthFin;
list($dayFacture, $monthFacture, $yearFacture) = explode("/", $dateFacture);
$dayMonthFacture = $dayFacture . "/" . $monthFacture;
//$dayMonthFin = new \DateTime($dayMonthFin);
$dayMonthFin = \DateTime::createFromFormat('d/m', $dayMonthFin);
//$dayMonthFacture = new \DateTime($dayMonthFacture);
$dayMonthFacture = \DateTime::createFromFormat('d/m', $dayMonthFacture);
if ($dayMonthFacture <= $dayMonthFin) {
//echo "inférieur datefin";
$dayMonthFin = $dayMonthFin->format('d/m');
$Date = $dayMonthFin . "/" . $yearFacture;
//echo $Date;
return $Date;//->format('d/m/Y');
} elseif ($dayMonthFacture >= $dayMonthFin) {
//echo "supérieur datefin";
$yearFacture = $yearFacture + 1;
//echo $yearFacture;
$dayMonthFin = $dayMonthFin->format('d/m');
//echo $dayMonthFin;
$Date = $dayMonthFin . "/" . $yearFacture;
//echo $Date;
return $Date;//->format('d/m/Y');
}
}
public function getDateFinEx2($ID, $formatage = false)
{
if ($ID == "") {
return false;
}
$repository = $this->entityManager->getRepository(Societe::class);
$societe = $repository->find(1);
$dateFin = $societe->getDateFinExercice();
//$dateFin = $dateFin->format('d/m/Y');
$repository = $this->entityManager->getRepository(Commande::class);
$commande = $repository->find($ID);
$dateInit = $commande->getDate();
if (!is_object($dateInit)) {
$dateInit = new \DateTime;
}
$dateFinEx = new \DateTime;
$dateFinEx->setDate($dateInit->format('Y'), $dateFin->format('m'), $dateFin->format('d'));
if ($dateFinEx < $dateInit) {
$dateFinEx->add(new \DateInterval('P1Y'));
}
if ($formatage) {
// $interval = $dateInit->diff($dateFinEx);
// return $interval->format('%R%ad');
return $dateFinEx->format('Y-m-d');
} else {
return $dateFinEx;
}
}
public function getDateDebutEx2($ID, $formatage = false)
{
if ($ID == "") {
return false;
}
$repository = $this->entityManager->getRepository(Commande::class);
$commande = $repository->find($ID);
$dateInit = $commande->getDate();
if (!is_object($dateInit)) {
$dateInit = new \DateTime;
}
$dateDebut = $this->getDateFinEx2($ID);
$dateDebut->sub(new \DateInterval('P1Y'));
if ($formatage) {
// $interval = $dateInit->diff($dateDebut);
// return $interval->format('%R%ad');
return $dateDebut->format('Y-m-d');
} else {
return $dateDebut;
}
}
}