<?php
/******************************************************************************
* Copyright (c) Echo-numeric 2020-2023. *
******************************************************************************/
namespace App\Listener;
use App\Entity\CustomProductField;
use App\Entity\CustomProductTemplate;
use App\Entity\CustomProductType;
use App\Entity\Setting;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Query\QueryException;
use Symfony\Component\HttpFoundation\RequestStack;
class PreRequiredListener
{
private EntityManagerInterface $em;
private RequestStack $requestStack;
public function __construct(
EntityManagerInterface $em,
RequestStack $requestStack
)
{
$this->em = $em;
$this->requestStack = $requestStack;
}
/**
* @throws QueryException
*/
public function onKernelController()
{
if ( $_SERVER[ 'APP_ENV' ] === 'test' ) {
return;
}
$host = $_SERVER[ 'HTTP_HOST' ];
// TODO à mettre en tache cron
// $this->yamlChecker->check($host, TRUE);
// si on est sur la route www.dtv.loc/dbb-up, on n'exécute pas les maj et on redirige sur un controller qui update les schemas.
if ( !( ( str_contains( $host, '.dtv.loc' ) || $host == 'developpetesventes.loc' )
&& $this->requestStack->getMainRequest()->get( '_route' ) == 'dev_update_bdd' )
) {
$this->addSettingsIfNotExist();
$this->addCustomProductIfNotExist();
}
}
/**
* Add les settings qui ne sont pas présent
*
* @return void
*
* @throws QueryException
*/
private function addSettingsIfNotExist(): void
{
$settings = $this->getSettingData();
// Récupère tous les Setting avec leur nom en index du tableau
$qb = $this->em->createQueryBuilder();
$qb->select( 's' )
->from( Setting::class, 's' )
->indexBy( 's', 's.name' )
;
$settingsInBdd = $qb->getQuery()->getResult();
$newSettingCreated = FALSE;
foreach ( $settings as $setting ) {
if ( !isset( $settingsInBdd[ $setting[ 'name' ] ] ) ) {
$entry = ( new Setting() )
->setName( $setting[ 'name' ] )
->setValue( $setting[ 'value' ] )
->setDescription( $setting[ 'description' ] )
->setFieldType( $setting[ 'fieldType' ] )
->setTitle( $setting[ 'title' ] )
;
$this->em->persist( $entry );
$newSettingCreated = TRUE;
}
}
if ( $newSettingCreated ) {
$this->em->flush();
}
}
/**
* @return array[]
*/
private function getSettingData(): array
{
return [
[
'name' => 'CLOSE_SITE',
'value' => '0',
'description' => 'Fermeture du site',
'fieldType' => 'boolean',
'title' => NULL,
],
[
'name' => 'CLOSE_SITE_DATEFROM',
'value' => NULL,
'description' => 'Date de fermeture du site',
'fieldType' => 'datetime',
'title' => NULL,
],
[
'name' => 'CLOSE_SITE_MESSAGE',
'value' => 'Le site est en maintenance...',
'description' => 'Message sur la page de la maintenance',
'fieldType' => 'textarea',
'title' => NULL,
],
[
'name' => 'CLOSE_ECOMMERCE_DATEFROM',
'value' => NULL,
'description' => 'Date de fermeture du ecommerce',
'fieldType' => 'datetime',
'title' => NULL,
],
[
'name' => 'CLOSE_ECOMMERCE_DATETO',
'value' => NULL,
'description' => 'Date de réouverture du ecommerce',
'fieldType' => 'datetime',
'title' => NULL,
],
[
'name' => 'CLOSE_ECOMMERCE_MESSAGE',
'value' => 'Vous ne pouvez pas <b>commander</b> pour le moment',
'description' => 'Message modal lors de l\'ajout au panie',
'fieldType' => 'textarea',
'title' => NULL,
],
[
'name' => 'PAYMENT_ALLOWCB_STATUS',
'value' => '0',
'description' => 'Complément monétaire',
'fieldType' => 'text',
'title' => NULL,
],
[
'name' => 'PAYMENT_ALLOWCB_MINPTS',
'value' => '1',
'description' => 'Points minimum pour autoriser un complément monétaire',
'fieldType' => 'text',
'title' => NULL,
],
[
'name' => 'PAYMENT_ALLOWCB_RATE',
'value' => '0.8',
'description' => 'Taux de conversion',
'fieldType' => 'text',
'title' => NULL,
],
[
'name' => 'CGU_NOT_ACCEPTED_TIME',
'value' => '-1 year',
'description' => 'Le temps au bout duquel un utilisateur va être archivé s\'il n\'a pas ré-accepté les cgu.',
'fieldType' => 'Text',
'title' => NULL,
],
[
'name' => 'HIGHLIGHT_CURRENT',
'value' => '1',
'description' => "Le temps fort de l'année en cours",
'fieldType' => 'int',
'title' => NULL,
],
[
'name' => 'UNSUBSCRIBE_REASONS',
'value' => '{"reasons":{"cessation-of-activity":"Cessation de l’activité","programme-not-attractive-enough":"Je ne trouve pas le programme assez attractif","other":"Autre"}}',
'description' => "Liste des motifs pour la désinscription",
'fieldType' => 'json',
'title' => NULL,
],
];
}
/**
* Création des données minimum dans la BDD pour les customs Product
*
* @return void
*/
private function addCustomProductIfNotExist(): void
{
if ( count( $this->em->getRepository( CustomProductType::class )->findAll() ) > 0 ) {
return;
}
$typePro = new CustomProductType();
$typePro->setSlug( "service_pro" )
->setName( 'Services Pros' )
;
$this->em->persist( $typePro );
$typeActivity = new CustomProductType();
$typeActivity->setSlug( "activity" )
->setName( 'Activités' )
;
$this->em->persist( $typeActivity );
$typeEvent = new CustomProductType();
$typeEvent->setSlug( "event" )
->setName( 'Evènements' )
;
$this->em->persist( $typeEvent );
$this->buildTemplateService( $typePro );
$this->buildTemplateActivity( $typeActivity );
$this->buildTemplateEvent( $typeEvent );
$this->em->flush();
}
/**
* @param CustomProductType $type
*
* @return void
*/
private function buildTemplateService( CustomProductType $type )
{
$field1 = ( new CustomProductField() )
->setLabel( 'Société' )
->setType( 'string' )
->setPosition( 1 )
->setRequired( TRUE )
;
$field2 = ( new CustomProductField() )
->setLabel( 'Nom' )
->setType( 'string' )
->setPosition( 2 )
->setRequired( TRUE )
;
$field3 = ( new CustomProductField() )
->setLabel( 'Prénom' )
->setType( 'string' )
->setPosition( 3 )
->setRequired( TRUE )
;
$field4 = ( new CustomProductField() )
->setLabel( 'Email' )
->setType( 'string' )
->setPosition( 4 )
->setRequired( TRUE )
;
$field5 = ( new CustomProductField() )
->setLabel( 'Description du besoin' )
->setType( 'text' )
->setPosition( 5 )
->setRequired( TRUE )
;
$template = ( new CustomProductTemplate() )
->setName( 'default' )
->setType( $type )
->addField( $field1 )
->addField( $field2 )
->addField( $field3 )
->addField( $field4 )
->addField( $field5 )
;
$this->em->persist( $template );
}
/**
* @param CustomProductType $type
*
* @return void
*/
private function buildTemplateActivity( CustomProductType $type )
{
$field1 = ( new CustomProductField() )
->setLabel( 'Votre prénom' )
->setType( 'string' )
->setPosition( 1 )
->setRequired( TRUE )
;
$field2 = ( new CustomProductField() )
->setLabel( 'Votre nom' )
->setType( 'string' )
->setPosition( 2 )
->setRequired( TRUE )
;
$field3 = ( new CustomProductField() )
->setLabel( 'Votre téléphone' )
->setType( 'string' )
->setPosition( 3 )
->setRequired( TRUE )
;
$field8 = ( new CustomProductField() )
->setLabel( 'Nombre de personnes' )
->setType( 'string' )
->setPosition( 4 )
->setRequired( TRUE )
;
$field4 = ( new CustomProductField() )
->setLabel( 'Votre budget' )
->setType( 'string' )
->setPosition( 5 )
->setRequired( TRUE )
;
$field5 = ( new CustomProductField() )
->setLabel( 'Lieu' )
->setType( 'string' )
->setPosition( 6 )
->setRequired( TRUE )
;
$field6 = ( new CustomProductField() )
->setLabel( 'Date souhaitée' )
->setType( 'date' )
->setPosition( 7 )
->setRequired( TRUE )
;
$field7 = ( new CustomProductField() )
->setLabel( 'Décrivez-nous votre demande' )
->setType( 'text' )
->setPosition( 8 )
->setRequired( TRUE )
;
$template = ( new CustomProductTemplate() )
->setName( 'default' )
->setType( $type )
->addField( $field1 )
->addField( $field2 )
->addField( $field3 )
->addField( $field4 )
->addField( $field5 )
->addField( $field6 )
->addField( $field7 )
->addField( $field8 )
;
$this->em->persist( $template );
}
/**
* @param CustomProductType $type
*
* @return void
*/
private function buildTemplateEvent( CustomProductType $type )
{
$field0 = ( new CustomProductField() )
->setLabel( 'Ajoutez votre fichier' )
->setType( 'file' )
->setPosition( 0 )
->setRequired( FALSE )
;
$field1 = ( new CustomProductField() )
->setLabel( 'Prénom' )
->setType( 'string' )
->setPosition( 1 )
->setRequired( TRUE )
;
$field2 = ( new CustomProductField() )
->setLabel( 'Nom' )
->setType( 'string' )
->setPosition( 2 )
->setRequired( TRUE )
;
$field3 = ( new CustomProductField() )
->setLabel( 'Email' )
->setType( 'string' )
->setPosition( 3 )
->setRequired( TRUE )
;
$field4 = ( new CustomProductField() )
->setLabel( 'Téléphone' )
->setType( 'string' )
->setPosition( 4 )
->setRequired( TRUE )
;
$field5 = ( new CustomProductField() )
->setLabel( 'Société' )
->setType( 'string' )
->setPosition( 5 )
->setRequired( TRUE )
;
$field6 = ( new CustomProductField() )
->setLabel( 'Adresse' )
->setType( 'string' )
->setPosition( 6 )
->setRequired( TRUE )
;
$field7 = ( new CustomProductField() )
->setLabel( 'Code postal' )
->setType( 'string' )
->setPosition( 7 )
->setRequired( TRUE )
;
$field8 = ( new CustomProductField() )
->setLabel( 'Ville' )
->setType( 'string' )
->setPosition( 8 )
->setRequired( TRUE )
;
$field9 = ( new CustomProductField() )
->setLabel( "À combien d'adultes venez-vous accompagné ?" )
->setType( 'string' )
->setPosition( 9 )
->setRequired( TRUE )
;
$field10 = ( new CustomProductField() )
->setLabel( "Avec combien d'enfants venez-vous accompagné ?" )
->setType( 'string' )
->setPosition( 10 )
->setRequired( TRUE )
;
$template = ( new CustomProductTemplate() )
->setName( 'default' )
->setType( $type )
->addField( $field0 )
->addField( $field1 )
->addField( $field2 )
->addField( $field3 )
->addField( $field4 )
->addField( $field5 )
->addField( $field6 )
->addField( $field7 )
->addField( $field8 )
->addField( $field9 )
->addField( $field10 )
;
$this->em->persist( $template );
}
}