<?php
namespace App\Service;
use App\Entity\Document;
use App\Entity\Dossier;
use App\Entity\Voyage;
use App\Entity\VoyageEtat;
use App\Entity\VoyageDayByDay;
use App\Entity\VoyageService AS VoyService;
use App\Entity\VoyageActiviteEdito;
use App\Entity\VoyageServiceDay;
use App\Entity\VoyageActiviteEditoDay;
use App\Entity\VoyageSousServices;
use App\Entity\VoyagePeriode;
use App\Entity\VoyageCotation;
use App\Entity\VoyagePeriodeCotation;
use App\Entity\Service;
use App\Entity\EditorialContenu;
use App\Entity\VoyagePdfPage;
use App\Entity\VoyagePdfModele;
use App\Entity\VoyagePdfPageTemplate;
use App\Entity\VoyagePdf;
use App\Entity\VoyagePeriodePlage;
use App\Entity\VoyageServiceGroupement;
use App\Entity\DocumentGenerator;
use App\Entity\DocumentGeneratorPage;
use App\Service\CompanyService;
use App\Service\ServiceService;
use App\Service\VoyageServiceService;
use App\Service\EditorialService;
use App\Service\VoyageActiviteService;
use App\Service\TraductionService;
use App\Service\PatternService;
use App\Service\DoliProposalService;
use App\Service\DoliOrderService;
use App\Service\DoliInvoiceService;
use App\Service\DossierService;
use App\Enum\ServiceTypeEnum;
use App\Repository\VoyageServiceGroupementRepository;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
class KernixApiService {
private $em;
private $serviceService;
private $voyageServiceService;
private $voyageActiviteService;
private $editorialService;
private $patternService;
private $traductionService;
private $proposalService;
private $orderService;
private $invoiceService;
private $params;
private $logger;
private $dossierService;
private $voyageServiceGroupementRepository;
public function __construct(
EntityManagerInterface $em,
ParameterBagInterface $params,
ServiceService $serviceService,
VoyageServiceService $voyageServiceService,
VoyageActiviteService $voyageActiviteService,
EditorialService $editorialService,
PatternService $patternService,
LoggerInterface $logger,
TraductionService $traductionService,
DoliProposalService $proposalService,
DoliOrderService $orderService,
DoliInvoiceService $invoiceService,
DossierService $dossierService,
VoyageServiceGroupementRepository $voyageServiceGroupementRepository
) {
$this->em = $em;
$this->serviceService = $serviceService;
$this->voyageServiceService = $voyageServiceService;
$this->voyageActiviteService = $voyageActiviteService;
$this->editorialService = $editorialService;
$this->traductionService = $traductionService;
$this->proposalService = $proposalService;
$this->orderService = $orderService;
$this->invoiceService = $invoiceService;
$this->params = $params;
$this->logger = $logger;
$this->dossierService = $dossierService;
$this->voyageServiceGroupementRepository = $voyageServiceGroupementRepository;
}
public function getFromEnum($constant) {
$fullConstantName = \App\Enum\KernixItemEnum::class . '::' . "$constant";
if (defined($fullConstantName)) {
return constant($fullConstantName);
}
return null;
}
// Exécute la requête et retourne les résultats
public function execute($item, $params) {
$results = array();
$elements = $this->getConfig($item, $params);
foreach ($elements as $key => $config) {
// remplace la string walkinn des tables
$key = str_replace('walkinn_', '', $key);
$request = $this->getRequest($config, $params);
$this->em->getConnection()->prepare($request);
$stmt = $this->em->getConnection()->executeQuery($request);
$results[$key] = $stmt->fetchAllAssociative();
}
return $results;
}
// Lance la requete puis execute des actions sur les résultats
public function get($item, $params) {
// Sauvegarde timestamp dans une variable si fourni
$timestamp = (array_key_exists('timestamp', $params) && null !== $params['timestamp']) ? $params['timestamp'] : null;
// Suppression du filtre timestamp
$params['timestamp'] = null;
$results = $this->execute($item, $params);
$data = [];
foreach ($results as $table => &$items) {
// gère les traduction dans les cas des editoriaux
if ((count($items) > 0) && (in_array('editorial_id', array_keys($items[0])))) {
foreach ($items as $key => &$item) {
if (null !== $item['editorial_id']) {
$item['content'] = $this->getEditorialById($item['editorial_id']);
unset($item['editorial_id']);
}
// Filtre selon le timestamp si fourni lorsque l'item est complet
if (false === $this->hasCorrectTimestamp($timestamp, $item)) {
unset($results[$table][$key]);
continue;
}
}
}
else {
foreach ($items as $key => &$item) {
// Filtre selon le timestamp si fourni
if (false === $this->hasCorrectTimestamp($timestamp, $item)) {
unset($results[$table][$key]);
continue;
}
}
}
}
foreach ($results as $table => $items) {
$data[$table] = array_values($items);
}
return $data;
}
public function getEditorialById($id) {
$params = array(
'conditions' => array(
'walkinn_editorial_contenu.editorial_id = '.$id
, 'walkinn_editorial_contenu.actif = 1'
, 'walkinn_editorial_contenu.langue IN ("FR", "GB") '
, '((IFNULL(walkinn_editorial.etape,0) = 1 AND walkinn_editorial_contenu.contexte_id = '.\App\Enum\EditorialContexteEnum::ITINERAIRES.' ) OR (IFNULL(walkinn_editorial.activite, 0) = 1 AND walkinn_editorial_contenu.contexte_id = '.\App\Enum\EditorialContexteEnum::WEB.') OR (IFNULL(etape,0)=0 AND IFNULL(activite, 0)=0));'
),
'joins' => array(
'LEFT JOIN walkinn_editorial ON walkinn_editorial.id = walkinn_editorial_contenu.editorial_id'
)
);
$content = $this->get('editorial', $params)['editorial_contenu'];
$arr = [];
foreach ($content as $contenu) {
$contenu['contenu'] = $this->stripHtmlAttribs($contenu['contenu']);
$arr[$contenu['langue']][] = $contenu;
}
return $arr;
}
public function hasCorrectTimestamp($timestamp, $row) {
if (null !== $timestamp) {
$updatedAtValues = [];
$this->extractUpdatedAt($row, $updatedAtValues);
if (count($updatedAtValues) > 0) {
$dateValue = max(array_filter($updatedAtValues));
$dateTimestamp = strtotime($dateValue);
// Comparaison des deux timestamps
if ($timestamp > $dateTimestamp) {
return false;
}
}
}
return true;
}
public function getRequest($config, $params) {
$request = sprintf('SELECT %s
FROM %s
%s
WHERE %s %s', implode(', ', $config['fields'])
, $config['table']
, implode(' ', $config['joins'])
, implode(' AND ', array_merge(array('1=1'), $config['conditions']))
, ((array_key_exists('order', $config)) ? $config['order'] : ''));
return $request;
}
public function getConfig($item, $params) {
$results = array();
$tables = $this->getTables($item, $params);
foreach ($tables as $code) {
$results[$code] = $this->getFromEnum($code) ;
$keys = ['conditions', 'joins', 'fields', 'order'];
if (array_key_exists('reset', $params) && true === $params['reset']) {
foreach ( $keys as $var) {
if (array_key_exists($var, $params)) {
$results[$code][$var] = $params[$var];
}
}
} else {
foreach ( $keys as $var) {
if (array_key_exists($var, $params)) {
if (array_key_exists($var, $results[$code])) {
$results[$code][$var] = array_merge($results[$code][$var], $params[$var]);
} else {
$results[$code][$var] = $params[$var];
}
}
}
}
}
return $results;
}
// retrouve les tables associées à l'item
public function getTables($item, $params) {
$item = strtoupper($item);
return $this->getFromEnum($item);
}
// Voyages / Séjours
public function getVoyages($item, $params, $includeFormule = true, $includeNiveauDifficulte = true, $includeTags = true, $includeDestination = true, $includeCircuit = true, $includeJours = true, $includeEtapes = true, $includeGrandItineraire = true, $includeBlocInfo = true, $includeAjustement = true) {
// Sauvegarde timestamp dans une variable si fourni
$timestamp = (array_key_exists('timestamp', $params) && null !== $params['timestamp']) ? $params['timestamp'] : null;
// Suppression du filtre timestamp
$params['timestamp'] = null;
// On récupère les données sans filtre de date
$data = $this->get($item, $params);
// Pour tous les voyages
foreach ($data['voyage'] as $key => &$row) {
// Voyage principal ou formule ?
$arrCode = explode('-', $row['code_vertuoz']);
$isFormule = ((null !== $row['formule_ordre']) && ($row['formule_ordre'] == 1)) || ((null === $row['formule_ordre']) && (array_pop($arrCode) == 1)) ? false : true;
// Supprime le code vertuoz qui a permis de trouver la formule
//unset($row['code_vertuoz']);
// ajuste les titres
if (true === $isFormule) {
//$row['titre'] = $row['']; // Dans le cas d'une formule le titre est alors le libellé de la formule
//$row['libelle_formule'] = $row['formule_libelle']; // Dans le cas d'une formule le titre est alors le libellé de la formule
$row['ordre'] = $row['formule_ordre'];
}
//unset($row['formule_libelle']);
unset($row['formule_ordre']);
// traduit les titres
if (strlen($row['titre']) > 0) { // Au cas où...
$row['titre'] = array_merge(array('fr_FR' => $row['titre']), $this->getDoliTraduction($row['titre']));
}
if (strlen($row['titre_court']) > 0) { // Le titre long n'est pas toujours renseigné
$row['titre_court'] = array_merge(array('fr_FR' => $row['titre_court']), $this->getDoliTraduction($row['titre_court']));
}
if (strlen($row['soustitre']) > 0) { // Le soustitre n'est pas toujours renseigné
$row['soustitre'] = array_merge(array('fr_FR' => $row['soustitre']), $this->getDoliTraduction($row['soustitre']));
}
// Ajoute les destinations
$row['destinations'] = $this->getDestinationsVoyage($row);
// Ajoute les tags
if (true === $includeTags) {
$row['tags'] = $this->getVoyagesTags($row);
}
// Ajoute les thèmes multiples
$row['themes'] = $this->getVoyageThemes($row);
// Ajoute les blocs info
if (true === $includeBlocInfo) {
$this->getVoyagesBlocInfo($row);
}
if (false === $isFormule) {
// Ajoute les velos
$row['velos'] = $this->getVoyagesVelos($row);
// Ajoute les activités
$row['activites'] = $this->getVoyageServicesActivite($row);
// Ajoute les grands itinéraires
$row['grand_itineraires'] = $this->getVoyageGrandItineraires($row);
// TODO à priori pas besoin de description
//$row['description'] = $this->getVoyageDescription($row);
$row['description'] = [];
// Ajoute les descriptions courtes/longues
$this->getVoyageDescriptions($row);
unset($row['descriptions_id']);
// Ajoute les informations pratiques
$this->getVoyageInformationPratique($row);
unset($row['info_pratiques_id']);
// Ajoute les forfaits
$this->getVoyageBlocForfait($row);
unset($row['bloc_forfait_id']);
}
// Ajoute les jours
if (true === $includeJours) {
$row['jours' ] = $this->getVoyagesJours($row);
}
// Ajoute les périodes
$row['periodes'] = $this->getVoyagesCotation($row);
if (true === $includeFormule) {
$row['formules'] = $this->getVoyagesFormules($row);
}
// Ajustements
if (true === $includeAjustement) {
$row['ajustements'] = $this->getVoyagesAjustements($row);
}
// Filtre selon le timestamp si fourni
if (null !== $timestamp) {
$updatedAtValues = [];
$this->extractUpdatedAt($row, $updatedAtValues);
$dateValue = max(array_filter($updatedAtValues));
$dateTimestamp = strtotime($dateValue);
// Comparaison des deux timestamps
if ($timestamp < $dateTimestamp) {
continue ;
}
unset($data['voyage'][$key]);
}
}
return array('voyage' => array_values($data['voyage']));
}
// thèmes pour un séjour
public function getVoyageThemes($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage_theme_kernix ON walkinn_voyage_theme_kernix.voyage_theme_id = walkinn_voyage_theme.id'
, 'INNER JOIN walkinn_voyage ON walkinn_voyage.id = walkinn_voyage_theme_kernix.voyage_id'
),
'timestamp' => $timestamp
);
$data = $this->get('theme_sejour', $params)['voyage_theme'];
foreach ($data as &$item) {
if (array_key_exists('content', $item)) {
foreach ($item['content'] as &$langues) {
foreach ($langues as &$element) {
unset($element['slug']);
unset($element['langue']);
}
}
}
}
return $data;
}
// grand-itineraires pour un séjour
public function getVoyageGrandItineraires($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN voyage_editorial ON voyage_editorial.editorial_id = walkinn_editorial.id'
, 'INNER JOIN walkinn_voyage ON walkinn_voyage.id = voyage_editorial.voyage_id'
),
'timestamp' => $timestamp
);
$data = $this->get('grand_itineraire', $params)['editorial_contenu_grand_itineraire'];
foreach ($data as &$item) {
if (array_key_exists('content', $item)) {
foreach ($item['content'] as &$langues) {
foreach ($langues as &$element) {
unset($element['slug']);
unset($element['langue']);
}
}
}
}
return $data;
}
public function getUsers($params) {
// Sauvegarde timestamp dans une variable si fourni
$timestamp = (array_key_exists('timestamp', $params) && null !== $params['timestamp']) ? $params['timestamp'] : null;
// Suppression du filtre timestamp
$params['timestamp'] = null;
$data = $this->get('user', $params)['user'];
$results = [];
if (!empty($data)) {
foreach ($data as &$user) {
// Filtre selon le timestamp si fourni
if (null !== $timestamp) {
$updatedAtValues = [];
$this->extractUpdatedAt($user, $updatedAtValues);
$dateValue = max(array_filter($updatedAtValues));
$dateTimestamp = strtotime($dateValue);
// Comparaison des deux timestamps
if ($timestamp > $dateTimestamp) {
continue ;
}
}
$results[] = $this->transformUser($user);
}
}
return $results;
}
// Statut publication pour un séjour
public function getVoyagesStatutPublication($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage ON walkinn_voyage.statut_publication_id = walkinn_voyage_statut_publication.id'
),
'timestamp' => $timestamp
);
return $this->get('statut_publication', $params)['voyage_statut_publication'];
}
// Statut publication pour un séjour
public function getDestinationsVoyage($row, $timestamp = null) {
$params = array(
'conditions' => array(
'voyage_destination.voyage_id = '.$row['id']
),
'joins' => array(
'INNER JOIN voyage_destination ON walkinn_destination.id = voyage_destination.destination_id'
),
'timestamp' => $timestamp
);
$destinations = $this->get('destination', $params)['destination'];
$results = [];
foreach ($destinations as $dest) {
$results[] = (null !== $dest["slug"]) ? $dest["slug"] : "";
continue;
}
$results[] = $row['destination'];
return $results;
}
// Statut publication par id
public function getStatutPublicationById($id) {
$params = array(
'conditions' => array(
'walkinn_voyage_statut_publication.id = '.$id
),
);
return $this->get('statut_publication', $params)['voyage_statut_publication'];
}
// TODO à supprimer
// Grand itinéraire pour un séjour
public function getVoyagesGrandItineraire($row, $timestamp = null) {
$arr = [];
if (null !== $row['grand_itineraire_id']) {
$params = array(
'conditions' => array(
'walkinn_editorial.id = '.$row['grand_itineraire_id']
),
'joins' => array(
'INNER JOIN walkinn_editorial ON walkinn_editorial.id = walkinn_editorial_contenu.editorial_id'
),
'timestamp' => $timestamp
);
$data = $this->get('editorial', $params)['editorial_contenu'];
foreach ($data as $contenu) {
$arr[$contenu['langue']][] = $contenu;
}
}
return $arr;
}
public function getVoyageInformationPratique(&$row, $timestamp = null) {
// Récupère les descriptions
$row['information_pratiques'] = null;
if (null !== $row['info_pratiques_id']) {
$r = array();
$infoPratiques = $this->getEditorialById($row['info_pratiques_id']);
foreach ($infoPratiques as $lang => $i) {
foreach ($i as $infoPratique) {
$r[$lang] = array(
'libelle' => $infoPratique['libelle'],
'content' => $infoPratique['contenu'],
'created_at' => $infoPratique['created_at'],
'updated_at' => $infoPratique['updated_at'],
);
}
}
$row['information_pratiques'] = $r;
unset($row['info_pratiques_id']);
}
return $row;
}
public function getVoyageDescriptions(&$row, $timestamp = null) {
// Récupère les descriptions
if (null !== $row['descriptions_id']) {
$r = array();
$descriptions = $this->getEditorialById($row['descriptions_id']);
foreach ($descriptions as $d) {
foreach ($d as $desc) {
$r[$desc['slug']][$desc['langue']] = array(
'content' => $desc['contenu'],
'created_at' => $desc['created_at'],
'updated_at' => $desc['updated_at'],
);
}
}
if (array_key_exists('long', $r)) {
$row['description_longue'] = $r['long'];
}
if (array_key_exists('short', $r)) {
$row['description_courte'] = $r['short'];
}
}
return $row;
}
public function getVoyageBlocInfo($editorialId, $typeId, $typeBloc = null) {
$r = array();
if (null !== $editorialId) {
$blocs = $this->getEditorialById($editorialId);
foreach ($blocs as $lang => $i) {
foreach ($i as $bloc) {
$r[$lang] = array(
'libelle' => $bloc['libelle'],
'content' => $bloc['contenu'],
'created_at' => $bloc['created_at'],
'updated_at' => $bloc['updated_at'],
);
}
}
}
return array('id' => $editorialId, 'bloc_type_slug' => $typeBloc, 'content' => $r);
}
public function getVoyageBlocInfoBagage($row, $timestamp = null) {
return $this->getVoyageBlocInfo($row['bloc_info_bagage_id']
, \App\Enum\EditorialEnum::TYPE_VOYAGE_BLOC_BAGAGES
, \App\Enum\KernixItemEnum::SLUG_BLOC_BAGAGES
);
}
public function getVoyageBlocInfoVelo($row, $timestamp = null) {
return $this->getVoyageBlocInfo($row['bloc_info_velo_id']
, \App\Enum\EditorialEnum::TYPE_VOYAGE_BLOC_VELOS
, \App\Enum\KernixItemEnum::SLUG_BLOC_VELOS
);
}
public function getVoyageBlocInfoGps($row, $timestamp = null) {
return $this->getVoyageBlocInfo($row['bloc_info_gps_id']
, \App\Enum\EditorialEnum::TYPE_VOYAGE_BLOC_GPS
, \App\Enum\KernixItemEnum::SLUG_BLOC_GPS
);
}
public function getVoyageBlocInfoDocument($row, $timestamp = null) {
return $this->getVoyageBlocInfo($row['bloc_info_document_id']
, \App\Enum\EditorialEnum::TYPE_VOYAGE_BLOC_DOCUMENTS
, \App\Enum\KernixItemEnum::SLUG_BLOC_DOCUMENTS
);
}
public function getVoyageBlocForfait(&$row, $timestamp = null) {
$forfait = $this->getVoyageBlocInfo($row['bloc_forfait_id'], \App\Enum\EditorialEnum::TYPE_VOYAGE_BLOC_FORFAIT);
$row['forfait']['content'] = $forfait['content'];
return $row;
}
// Grand itinéraire pour un séjour
public function getVoyagesBlocInfo(&$row, $timestamp = null) {
$arr = [];
$arr[] = $this->getVoyageBlocInfoBagage($row, $timestamp = null);
unset($row['bloc_info_bagage_id']);
$arr[] = $this->getVoyageBlocInfoVelo($row, $timestamp = null);
unset($row['bloc_info_velo_id']);
$arr[] = $this->getVoyageBlocInfoGps($row, $timestamp = null);
unset($row['bloc_info_gps_id']);
$arr[] = $this->getVoyageBlocInfoDocument($row, $timestamp = null);
unset($row['bloc_info_document_id']);
$row['bloc_infos'] = $arr;
return $row;
}
// Niveau de difficulté pour un séjour
public function getVoyagesNiveauDifficulte($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage ON walkinn_voyage.niveau_id = walkinn_voyage_niveau_difficulte.id'
),
'timestamp' => $timestamp
);
return $this->get('niveau_difficulte', $params)['voyage_niveau_difficulte'];
}
// Tags pour un séjour
public function getVoyagesTags($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN voyage_voyage_tag ON voyage_voyage_tag.voyage_tag_id = walkinn_voyage_tag.id',
'INNER JOIN walkinn_voyage ON walkinn_voyage.id = voyage_voyage_tag.voyage_id'
),
'timestamp' => $timestamp
);
$tags = $this->get('tag', $params)['voyage_tag'];
foreach ($tags as &$tag) {
$tag['libelle'] = array_merge(array('fr_FR' => $tag['libelle']), $this->getDoliTraduction($tag['libelle']));
}
return $tags;
}
// vélos pour un séjour
public function getVoyagesVelos($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage_velo ON walkinn_voyage_velo.velo_id = walkinn_velo.id',
'INNER JOIN walkinn_voyage ON walkinn_voyage.id = walkinn_voyage_velo.voyage_id'
),
'timestamp' => $timestamp
);
$data = $this->get('velo', $params);
if (array_key_exists('velo', $data)) {
$data = $data['velo'];
foreach ($data as &$velo) {
$velo['libelle'] = array_merge(array('fr_FR' => $velo['libelle']), $this->getDoliTraduction($velo['libelle']));
}
}
return $data;
}
// activités pour un séjour
public function getVoyageServicesActivite($row, $timestamp = null) {
$params = array(
'fields' => array(
'walkinn_editorial.id AS editorial_id' ,
'walkinn_editorial.id AS new_id' , // pour echanger l'id
),
'conditions' => array(
'walkinn_voyage_service.voyage_id = '.$row['id'],
'walkinn_service.type_id = '.\App\Enum\ServiceTypeEnum::ACTIVITE,
'walkinn_editorial.activite = 1'
),
'joins' => array(
'INNER JOIN walkinn_editorial ON walkinn_editorial.service_id = walkinn_service.id'
),
'timestamp' => $timestamp
);
$services = $this->get('voyage_service', $params)['voyage_service'];
// N'envoie plus les tarifs des services inclus
foreach ($services as &$service) {
$service['service_id'] = $service['id'] ;
$service['id'] = $service['new_id'];
unset($service['new_id']);
}
return $services;
}
// Types de circuit pour un séjour
public function getVoyagesCircuit($row, $timestamp = null) {
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage ON walkinn_voyage.type_circuit_id = walkinn_voyage_circuit.id'
),
'timestamp' => $timestamp
);
return $this->get('circuit', $params)['voyage_circuit'];
}
// Destination pour un séjour
public function getVoyagesDestination($row, $timestamp = null) {
$results = [];
$params = array(
'conditions' => array(
'walkinn_voyage.id = '.$row['id']
),
'joins' => array(
'INNER JOIN walkinn_voyage ON walkinn_voyage.destination_id = walkinn_destination.id'
)
);
return $this->get('destination', $params)['destination'];
}
// Les activités sont des contenus editoriaux avec une categorie sauf VELO
public function getVoyagesActivites($row) {
$params = array(
'conditions' => array(
'walkinn_voyage_activite_edito.voyage_id = '.$row['id']
, 'we.categorie_id <> '.\App\Enum\EditorialCategorieEnum::VELO
, 'we.categorie_id <> '.\App\Enum\EditorialCategorieEnum::JOURNEE_LIBRE
),
);
$data = $this->get('activite', $params)['voyage_activite'];
return $data;
}
// Les étapes sont des contenus editoriaux avec une categorie égale à VELO
public function getVoyagesEtapes($row) {
$params = array(
'conditions' => array(
'walkinn_voyage_activite_edito.voyage_id = '.$row['id']
, '(we.categorie_id = '.\App\Enum\EditorialCategorieEnum::VELO.' OR we.categorie_id = '.\App\Enum\EditorialCategorieEnum::JOURNEE_LIBRE.' OR ISNULL(we.etape, 0) = 1 )'
),
);
$data = $this->get('activite', $params)['voyage_activite'];
return $data;
}
// regroupe les étapes et activités sous forme de jour
public function getVoyagesJours($row) {
$results = [];
$params = array(
'conditions' => array(
'walkinn_voyage_activite_edito.voyage_id = '.$row['id']
),
);
$data = $this->get('activite', $params)['voyage_activite'];
foreach ($data as &$item) {
$item['jour'] = (null === $item['jour']) ? 0 : intval($item['jour']);
$item["distance"] = explode(',', $item["distance"]);
$item['contenu'] = $this->stripHtmlAttribs($item['contenu']);
//$results[intval($item['jour'])][(($item['categorie_id'] == \App\Enum\EditorialCategorieEnum::VELO) ? 'etapes' : 'activites')][$item['langue']][] = $item;
$results[$item['jour']]['etapes'][$item['langue']][] = $item;
}
// Remplacement des clés nulles
$results = array_combine(
array_map(fn($k) => $k ?? '_null_', array_keys($results)),
array_values($results)
);
//ksort($results);
return $results;
}
public function getVoyagesCotation($row) {
$results = array();
$params = array(
'conditions' => array(
'vp.voyage_id = '.$row['id']
),
);
// Retrouve les cotations
$data = $this->get('periode', $params)['voyage_periode_cotation'];
foreach ($data as $item) {
$cettePlage = ['date_debut' => $item['date_debut'], 'date_fin' => $item['date_fin']];
$plages = array_merge([$cettePlage], array_filter($this->extractDateGroups($item['plages'])));
$results[$item['periode_id']]['periode_id'] = $item['periode_id'];
$results[$item['periode_id']]['libelle'] = array_merge(array('fr_FR' => $item['libelle']), $this->getDoliTraduction($item['libelle']));
if ($item['base'] == 'BASE') {
$results[$item['periode_id']]['montant'] = $item['tarif'];
$results[$item['periode_id']]['sup_single_vente'] = $item['sup_single_vente'];
} else {
$results[$item['periode_id']]['tarifs'][$item['base']] = $item['tarif'];
}
$results[$item['periode_id']]['dates'] = $plages;
}
// Faire le calcul
// Malheureusement on traite 2 fois...
foreach ($results as $periodeId => &$result) {
$result['sup_voyageur_solo'] = null;
if (array_key_exists('tarifs', $result)) {
if (array_key_exists('BASE1', $result['tarifs']) && array_key_exists('BASE2', $result['tarifs'])) {
$result['sup_voyageur_solo'] = intval($result['tarifs']['BASE1']) - intval($result['tarifs']['BASE2']);
}
unset($result['tarifs']);
}
}
return array_values($results);
}
public function getVoyagesFormules($voyage, $includeFormule = false, $includeNiveauDifficulte = false, $includeTags = true, $includeDestination = false, $includeCircuit = false, $includeJours = false, $includeEtapes = false, $includeGrandItineraire = false, $includeBlocInfo = false, $includeAjustement = true) {
$params = array(
'conditions' => array(
sprintf('walkinn_voyage.id <> %s', $voyage['id']),
sprintf('walkinn_voyage.code_walkinn LIKE "%s-%%"', implode('-', array_slice(explode('-', $voyage['code_vertuoz']), 0, 3)))
),
);
return $this->getVoyages('voyage', $params, $includeFormule, $includeNiveauDifficulte, $includeTags, $includeDestination, $includeCircuit, $includeJours, $includeEtapes, $includeGrandItineraire, $includeBlocInfo, $includeAjustement)['voyage'];
}
public function getVoyagesAjustements($voyage, $includeFormule = false, $includeNiveauDifficulte = false, $includeTags = false, $includeDestination = false, $includeCircuit = false, $includeJours = false, $includeEtapes = false, $includeGrandItineraire = false, $includeBlocInfo = false, $includeAjustement = false) {
$params = array(
'fields' => array(
'walkinn_voyage_ajustement.jour'
),
'conditions' => array(
'walkinn_voyage_ajustement.voyage_id ='.$voyage['id'],
),
'joins' => array(
'INNER JOIN walkinn_voyage_ajustement ON walkinn_voyage_ajustement.ajustement_id = walkinn_ajustement.id'
),
'order' => 'GROUP BY walkinn_ajustement.id ORDER BY walkinn_voyage_ajustement.id'
);
$data = $this->get('ajustement', $params)['ajustement'];
$n = 0;
foreach ($data as &$item) {
if (null !== $item['prestation_id']) {
$params = array(
'fields' => array(
'walkinn_voyage.code_interne',
),
'conditions' => array(
sprintf('walkinn_voyage.id = %s', $item['prestation_id']),
),
);
$voyage = $this->getVoyages('voyage', $params, $includeFormule, $includeNiveauDifficulte, $includeTags, $includeDestination, $includeCircuit, $includeJours, $includeEtapes, $includeGrandItineraire, $includeBlocInfo, $includeAjustement)['voyage'];
if ( count($voyage) > 0 ) {
//$item['options'] = $voyage[0];
$item['libelle'] = $voyage[0]['titre'];
$item['soustitre'] = $voyage[0]['soustitre'];
$item['periodes'] = $voyage[0]['periodes'];
$item['code'] = $voyage[0]['code_interne'];
$item['ordre'] = $n;
$tarifs = [];
foreach (range(1,3) as $ordre) {
$arr = [
'tarif_id' => null,
'libelle' => "tarif".$ordre,
'ordre' => $ordre,
'code' => "",
];
$tarifs[] = $arr;
}
if (true == $item['envoi_tarif_service']) {
// Ajoute les tarifs
$params = array(
'fields' => array(
'walkinn_service2.libelle AS tarif_libelle',
'walkinn_service2.id AS tarif_id' ,
),
'conditions' => array(
'walkinn_voyage_service.voyage_id = '.$item['prestation_id'],
'walkinn_service2.parent_id = walkinn_service.id',
),
'joins' => array(
'LEFT JOIN walkinn_service AS walkinn_service2 ON walkinn_service2.parent_id = walkinn_service.id'
),
);
$vtarifs = $this->get('voyage_service', $params)['voyage_service'];
if (count($vtarifs) > 0) {
$tarifs = $vtarifs;
$n = 1;
foreach ($tarifs as &$tarif) {
$arr = [
'tarif_id' => $tarif['tarif_id'],
'libelle' => $tarif['tarif_libelle'],
'ordre' => $n,
'code' => sprintf('%s | %s | %s', $item['libelle']['fr_FR'], $tarif['libelle'], $tarif['tarif_libelle']),
];
$tarif = $arr;
$n++;
}
}
}
$item['type_tarif'] = $tarifs;
}
unset($item['envoi_tarif_service']);
unset($item['prestation_id']);
}
$n++;
}
return $data;
}
public function getReservations($params) {
// Sauvegarde timestamp dans une variable si fourni
$timestamp = (array_key_exists('timestamp', $params) && null !== $params['timestamp']) ? $params['timestamp'] : null;
// Suppression du filtre timestamp
$params['timestamp'] = null;
$reservations = $this->get('reservation', $params)['kernix_reservation'];
foreach($reservations as $key => &$reservation) {
$params = array(
'conditions' => array(
'kernix_reservation_participant.reservation_id = '.$reservation['id']
),
);
$participants = $this->get('reservation_participant', $params);
$reservation['participants'] = $participants['kernix_reservation_participant'];
$params = array(
'conditions' => array(
'kernix_reservation_ligne.reservation_id = '.$reservation['id']
),
);
$lignes = $this->get('reservation_ligne', $params);
$reservation['lignes'] = $lignes['kernix_reservation_ligne'];
$params = array(
'conditions' => array(
'kernix_reservation_facturation.reservation_id = '.$reservation['id']
),
);
$facturation = $this->get('reservation_facturation', $params);
$reservation['facturation'] = $facturation['kernix_reservation_facturation'];
$params = array(
'conditions' => array(
'kernix_reservation_livraison.reservation_id = '.$reservation['id']
),
);
$livraison = $this->get('reservation_livraison', $params);
$reservation['livraison'] = $livraison['kernix_reservation_livraison'];
$params = array(
'conditions' => array(
'kernix_reservation_ajustement.reservation_id = '.$reservation['id']
),
);
$ajustements = $this->get('reservation_ajustement', $params);
$reservation['ajustements'] = $ajustements['kernix_reservation_ajustement'];
// Filtre selon le timestamp si fourni
if (!$this->hasCorrectTimestamp($timestamp, $reservation)) {
unset($reservations[$key]);
}
}
return $reservations;
}
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ DOSSIER @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
public function getDossiersByMail($email, $timestamp = null) {
$filters = ['email' => $email, 'timestamp' => $timestamp];
return $this->getDossiers($filters);
}
public function getDossiersById($id, $timestamp = null) {
$filters = ['id' => $id, 'timestamp' => $timestamp];
return $this->getDossiers($filters);
}
public function getDevis($filters = []) {
// On récupère les données sans filtre de date
$params = array(
'conditions' => array(
),
);
$timestamp = null;
$dossiers = $this->get('devis', $params)['devis'];
// Pour tous les dossiers
foreach ($dossiers as $key => &$row) {
// participants
$participants = $this->em->getRepository(Dossier::class)->findParticipantsForKernix($row['id']);
$row['participants'] = count($participants);
// Filtre selon le timestamp si fourni
if (null !== $timestamp) {
$updatedAtValues = [];
$this->extractUpdatedAt($row, $updatedAtValues);
$dateValue = max(array_filter($updatedAtValues));
$dateTimestamp = strtotime($dateValue);
// Comparaison des deux timestamps
if ($timestamp < $dateTimestamp) {
continue ;
}
unset($dossiers[$key]);
}
}
return $dossiers;
}
public function getDossiers($filters = []) {
// On récupère les données sans filtre de date
$params = array(
'conditions' => array(
),
);
$timestamp = null;
if (count($filters) > 0) {
if (array_key_exists('timestamp', $filters)) {
$timestamp = $filters['timestamp'];
}
if (array_key_exists('email', $filters)) {
$params['conditions'][] = 'kr.client = "'.$filters['email'].'"';
}
if (array_key_exists('id', $filters)) {
$params['conditions'][] = 'walkinn_dossier.id = "'.$filters['id'].'"';
}
}
$dossiers = $this->get('dossier', $params)['dossier'];
$results = [];
// Pour tous les dossiers
foreach ($dossiers as $key => &$row) {
//$row['statut'] = $this->statutReservationDolibarrToKernix($row['statut']);
// participants
$participants = $this->em->getRepository(Dossier::class)->findParticipantsForKernix($row['id']);
$row['participants'] = $participants;
$ajustements = $this->em->getRepository(Dossier::class)->findAjustementsForKernix($row['id']);
$row['ajustements'] = $ajustements;
$livraison = $this->em->getRepository(Dossier::class)->findLivraisonForKernix($row['id'], 'facture');
$row['livraison'] = $livraison;
$facturation = $this->em->getRepository(Dossier::class)->findFacturationForKernix($row['id'], 'facture');
$row['facturation'] = $facturation;
$hebergements = $this->em->getRepository(Dossier::class)->findHebergementsForKernix($row['id']);
$row['hebergements'] = $hebergements;
$activites = $this->em->getRepository(Dossier::class)->findActivitesForKernix($row['id']);
$row['activites'] = $activites;
//if (array_key_exists('facture_id', $row) && null !== $row['facture_id']) {
$paiements = $this->em->getRepository(Dossier::class)->findPaymentsForKernixByDossierId($row['id'], $row['pending']);
$row['paiements'] = $paiements;
unset($row['pending']);
//}
$row['supplements'] = $this->em->getRepository(Dossier::class)->findLignesForKernix($row['id'], 'supp' );
$row['reductions' ] = $this->em->getRepository(Dossier::class)->findLignesForKernix($row['id'], 'reduc');
// Filtre selon le timestamp si fourni
if (null !== $timestamp) {
$updatedAtValues = [];
$this->extractUpdatedAt($row, $updatedAtValues);
$dateValue = max(array_filter($updatedAtValues));
$dateTimestamp = strtotime($dateValue);
// Comparaison des deux timestamps
if ($timestamp < $dateTimestamp) {
continue ;
}
unset($dossiers[$key]);
}
}
return $dossiers;
}
public function getDossierDocuments($dossierId) {
$params = array(
'conditions' => array(
'wd.id = '.$dossierId
, 'walkinn_document_generator.entite = "dossier"'
),
'joins' => array(
'INNER JOIN walkinn_dossier_segment wds ON wds.id = walkinn_document_generator.entite_id'
, 'INNER JOIN walkinn_dossier wd ON wd.id = wds.dossier_id'
)
);
$data = $this->get('document_itineraire', $params)['document_generator'];
return $data;
}
public function getDossierDevis($rowId) {
return $this->proposalService->downloadProposalFromRowid($rowId);
}
public function getDossierFacture($rowId) {
return $this->invoiceService->downloadInvoiceFromRowid($rowId);
}
public function getDossierCommande($rowId) {
return $this->orderService->downloadOrderFromRowid($rowId);
}
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ UTILS @@@@@@@@@@@@@@@@@@@@@@@@@@
// Retourne la traduction
public function getDoliTraduction($transkey) {
$results = [];
if (strlen($transkey) > 0) {
$params = array(
'conditions' => array(
'doli_overwrite_trans.transkey = "'. addslashes($transkey) .'"',
),
);
$data = $this->get('doli_overwrite', $params)['doli_overwrite_trans'];
foreach ($data as $traduction) {
$results[$traduction['lang']] = $traduction['transvalue'];
}
}
return $results;
}
function getDossierDocumentItineraire($dossierId) {
$dossier = $this->em->getRepository(Dossier::class)->findOneById($dossierId);
$basePath = sprintf('%s/uploads/Dossier/%s/arbo', $this->params->get('public_path'), $dossier->getCodeWalkinn());
$latestPdf = null;
$latestTime = 0;
// Ouvrir le répertoire de base
foreach (glob($basePath . '/SEGMENT-*') as $segmentDir) {
if (!is_dir($segmentDir)) {
continue;
}
// Chercher tous les .pdf du dossier SEGMENT
foreach (glob($segmentDir . '/*.pdf') as $pdfFile) {
$fileTime = filemtime($pdfFile);
if ($fileTime > $latestTime) {
$latestTime = $fileTime;
$latestPdf = $pdfFile;
}
}
}
if ($latestPdf) {
if (file_exists($latestPdf)) {
$payload = [
'filename' => basename($latestPdf),
'content-type' => 'application/pdf',
'filesize' => filesize($latestPdf),
'content' => base64_encode(file_get_contents($latestPdf)),
'encoding' => 'base64',
];
}
return $payload;
}
return null;
}
// Utils: les plages de date sont de la forme date1#date2|date1#date2|...
// retourne array([date1, date2], [date1, date2], ...)
function extractDateGroups($inputString) {
// Initialiser un tableau pour stocker les groupes de dates
$dateGroups = [];
// Diviser la chaîne par le délimiteur '|'
$groups = explode('|', $inputString);
// Parcourir chaque groupe de dates
foreach ($groups as $group) {
if (strlen($group) > 0) {
// Diviser le groupe par le délimiteur '#'
$dates = array_filter(explode('#', $group));
// Ajouter le tableau de dates au tableau de groupes
$dateGroups[] = array('date_debut' => $dates[0], 'date_fin' => ((count($dates)>1) ? $dates[1] : ''));
}
}
return $dateGroups;
}
// Fonction récursive pour extraire les valeurs 'updated_at'
function extractUpdatedAt($data, &$results) {
foreach ($data as $key => $value) {
if (is_array($value)) {
$this->extractUpdatedAt($value, $results);
} elseif ((strpos($key, 'updated_at') !== false || strpos($key, 'created_at') !== false)&&(null !== $value)) {
$results[] = $value;
}
}
}
// Teste la validité d'un email
function verifierEmail($email) {
// Utilisation de la fonction filter_var pour valider l'email
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
return true; // Email valide
} else {
return false; // Email invalide
}
}
// Teste l'existence d'un pax par son email
function isPaxByMail($email) {
$params = array(
'conditions' => array(
sprintf('doli_societe.email = "%s"', $email)
),
);
$data = $this->get('user', $params)['user'];
return (count($data) > 0) ? $data[0]['id'] : false;
}
// Teste l'existence d'un pax par son rowid
function isPaxById($id) {
$params = array(
'conditions' => array(
sprintf('doli_societe.rowid = %s', $id)
),
);
$data = $this->get('user', $params)['user'];
return (count($data) == 0) ? false : $id;
}
// Teste l'existence d'un user
// element est soit un rowid de la table societe, soit un email
// retourne le rowid, false si non trouvé
function isPaxExists($element) {
$bool = false;
if (false !== $this->verifierEmail($element)) {
return $this->isPaxByMail($element);
} else {
if (intval($element) > 1) {
return $this->isPaxById($element);
}
}
return $bool;
}
// Teste l'existence d'un voyage par son rowid
function isVoyageExistsById($id) {
$params = array(
'conditions' => array(
sprintf('walkinn_voyage.id = %s', $id)
),
);
$data = $this->get('voyage', $params)['voyage'];
return (count($data) == 0) ? false : $id;
}
function stripHtmlAttribs($html) {
$cleanHtml = preg_replace('/<(\w+)(\s+[^>]+)?>/', '<$1>', $html); // Supprime les attributs
return strip_tags($cleanHtml, '<br><em><p><span><table><th><tr><td><ul><ol><li><b><i><strong>'); // filtres les balises
}
public function transformUser(array $data): array
{
$result = [];
foreach ($data as $key => $value) {
// Nettoyage de clé (ex: "facturation_ birthday" → "facturation_birthday")
$key = str_replace(' ', '', $key);
// Gestion des préfixes à regrouper
if (preg_match('/^(facturation|livraison)_(.+)$/', $key, $matches)) {
[$_, $prefix, $field] = $matches;
if (!isset($result[$prefix])) {
$result[$prefix] = [];
}
$result[$prefix][$field] = $value;
}
// Autres clés laissées telles quelles
else {
$result[$key] = $value;
}
}
return $result;
}
public function statutReservationDolibarrToKernix($statutDolibarr) {
$statut = 'to_progress';
switch ($statutDolibarr) {
case (\App\Enum\DossierEtatEnum::EN_COURS_DE_RESERVATION) :
$statut = 'to_progress';
break;
default:
$statut = 'to_progress';
break;
}
return $statut;
}
}