<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Contracts\Translation\TranslatorInterface;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Dossier;
use App\Entity\DossierEtat;
use App\Entity\DossierSegment;
use App\Entity\DossierSegmentService AS SegService;
use App\Entity\DossierSegmentServiceGroupement;
use App\Entity\DossierSegmentServicePax;
use App\Entity\Evenement;
use App\Entity\PlanDeTransport;
use App\Entity\RoadmapItem;
use App\Entity\Document;
use App\Entity\EditorialDocument;
use App\Entity\ChangePeriode;
use App\Entity\DossierSegmentPax;
use App\Entity\DossierSegmentPaxEtat;
use App\Entity\DossierSegmentPaxRooming;
use App\Entity\DossierSegmentTransfertAerienPax;
use App\Entity\DossierSegmentTransfertAerienService;
use App\Entity\DossierSegmentTransfertAerien;
use App\Entity\DossierSegmentPlanDeVol;
use App\Entity\DossierSegmentTodo;
use App\Entity\PaxType;
use App\Entity\PaxRooming;
use App\Entity\EvenementType;
use App\Entity\TransfertAerien;
use App\Entity\TaskListe;
use App\Entity\TransfertAerienPlanDeVol;
use App\Entity\PlanDeVol;
use App\Entity\DocumentGenerator;
use App\Entity\DocumentGeneratorModele;
use App\Entity\DocumentGeneratorPage;
use App\Entity\DocumentGeneratorPageTemplate;
use App\Entity\DossierCommandeFournisseurEtat;
use App\Entity\DossierCommandeFournisseurTampon;
use App\Entity\EditorialCategorie;
use App\Entity\Service;
use App\Entity\ServiceType;
use App\Entity\DossierGuide;
use App\Entity\DossierSegmentActiviteEdito;
use App\Form\DossierFormType;
use App\Form\PlanDeVolFormType;
use App\Form\DocumentGeneratorPageFormType;
use App\Form\DossierSegmentFormType;
use App\Form\TransfertAerienType;
use App\Form\DossierSegmentPaxFormType;
use App\Service\CompanyService;
use App\Service\DossierService;
use App\Service\VoyageService;
use App\Service\DossierSegmentService;
use App\Service\DocumentService;
use App\Service\EditorialService;
use App\Service\PatternService;
use App\Service\DocumentGeneratorService;
use App\Service\UserService;
use App\Service\GraphService;
use App\Enum\ServiceTypeEnum;
use App\Enum\DossierTypeEnum;
use App\Enum\VoyageTypeEnum;
use App\Enum\EditorialEnum;
use App\Enum\VoyagePdfModeleEnum;
use App\Enum\VoyagePdfPageTemplateType;
use App\Form\DossierSegmentTodoListFormType;
use App\Form\DossierTodoListFormType;
use App\Form\DossierSegmentCompositionDaysFormType;
use App\Form\DossierSegmentCompositionTypesFormType;
use App\Form\DossierVentesFormType;
use App\Service\PaxService;
use App\Service\TraductionService;
use App\Service\CustomImportService;
use App\Service\DossierSegmentServiceService;
use App\Service\ServiceService;
use App\Utils\Encoding;
use App\Utils\Functions;
use ErrorException;
use Psr\Log\LoggerInterface;
use Segment;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
/**
* @Route("/", name="dossier_", methods={"GET","POST","FILES"})
*/
class DossierController extends AbstractController
{
/**
* @var CompanyService $companyService
*/
private $companyService;
/**
* @var EntityManagerInterface $em
*/
private $em;
/**
* @var DossierSegmentService $dossierSegmentService
*/
private $dossierSegmentService;
public function __construct(
CompanyService $companyService,
EntityManagerInterface $em,
DossierSegmentService $dossierSegmentService
) {
$this->companyService = $companyService;
$this->em = $em;
$this->dossierSegmentService = $dossierSegmentService;
}
/**
* @Route("/dossiers", name="index")
*/
public function index(Request $request, DossierService $dossierService, TranslatorInterface $translator)
{
// Params
$user = $this->getUser();
$userId = $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
$guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
$destinationId = $request->query->get('destinationId');
$destinationsId = $this->get('session')->get('destinationsId');
$etatId = $request->query->get('etatId');
$categorieId = $request->query->get('categorieId');
$proprietaireInstance = $this->getParameter('instance_proprietaire');
if ($destinationsId)
{
$destinations = "AND (EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.destination_id IN($destinationsId) AND dode.dossier_id = walkinn_dossier.id) OR NOT EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.dossier_id = walkinn_dossier.id))";
} else
{
$destinations = "";
}
if ($destinationId)
{
$destination = "AND EXISTS (SELECT dode.destination_id FROM dossier_destination dode WHERE dode.destination_id = $destinationId AND dode.dossier_id = walkinn_dossier.id)";
} else
{
$destination = "";
}
if ($categorieId) {
$categorie = "AND walkinn_dossier.dossier_type_id = " . $categorieId . " ";
} else {
$categorie = "";
}
if ($etatId) {
$etat = "AND walkinn_dossier.dossier_etat_id = " . $etatId . " ";
} else {
$etat = "";
}
// SQL
$sql_list =
' SELECT walkinn_dossier.id
, CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
, walkinn_dossier.code_walkinn
, walkinn_dossier.code
, walkinn_dossier.libelle
, walkinn_dossier.annee
, (
SELECT GROUP_CONCAT("<div class=\'m-2\'>", de.libelle ,"</div>" SEPARATOR "")
FROM dossier_destination dode
LEFT JOIN walkinn_destination de ON de.id = dode.destination_id
WHERE dode.dossier_id = walkinn_dossier.id
) AS "_esc_destinations"
, CONCAT(ba_user.firstname, " ", ba_user.lastname) AS `ba_user-lastname`
, (
SELECT GROUP_CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>" ORDER BY date_depart SEPARATOR "")
FROM walkinn_dossier_segment
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
WHERE dossier_id = walkinn_dossier.id AND actif = 1
) AS "_esc_clients"
, (
SELECT GROUP_CONCAT("<a href=\'", CONCAT("/symfony/public/dossier/", dossier_id, "/segment/", id, "/composition") ,"\' class=\'btn btn-link p-1 mt-1 mb-1\'>#", code_walkinn ,"</a>" ORDER BY date_depart SEPARATOR "<br>")
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1
) AS "_esc_segments"
, IF(walkinn_dossier_type.is_taux_de_remplissage = 1
, (
SELECT GROUP_CONCAT("<div class=\'segment-stats m-1\' style=\'width:100px\' data-pax=\'", ( SELECT COUNT(id) FROM walkinn_dossier_segment_pax WHERE segment_id = walkinn_dossier_segment.id AND actif = 1 AND pax_type_id != ' . $guidePaxTypeId .'), "\' data-min=\'", min_pax, "\' data-max=\'", max_pax, "\'></div>" ORDER BY walkinn_dossier_segment.date_depart ASC SEPARATOR "<br>")
FROM walkinn_dossier_segment walkinn_dossier_segment
WHERE walkinn_dossier_segment.dossier_id = walkinn_dossier.id AND walkinn_dossier_segment.actif = 1
)
, (
SELECT GROUP_CONCAT("<div class=\'m-2\'>", ( SELECT COUNT(id) FROM walkinn_dossier_segment_pax WHERE segment_id = walkinn_dossier_segment.id AND actif = 1 AND pax_type_id != ' . $guidePaxTypeId .'), " PAX</div> " ORDER BY walkinn_dossier_segment.date_depart SEPARATOR "")
FROM walkinn_dossier_segment walkinn_dossier_segment
WHERE walkinn_dossier_segment.dossier_id = walkinn_dossier.id AND walkinn_dossier_segment.actif = 1
)
) AS "_esc_infos"
, (
SELECT GROUP_CONCAT("<div class=\'m-2\'>", DATE_FORMAT(date_depart , "%d/%m/%Y"), IF(nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", nb_jours," jour", IF(nb_jours > 1, "s", ""), ")</div>" ORDER BY date_depart SEPARATOR "")
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1
) AS "_esc_dates"
, walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
'
. ' FROM walkinn_dossier walkinn_dossier '
// . ' LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id '
. ' LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id '
. ' LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id '
. ' LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id '
. ' WHERE walkinn_dossier.actif = 1 AND walkinn_dossier.is_valide = 1 ' . $destinations . $destination . $categorie . $etat
;
// Widgets
$widgets =
[
[
'titre' => 'Liste des dossiers en production',
'code' => 'dossier_list',
'taille' => 12,
'sql' => $sql_list,
'champs' =>
[
"id" =>
[
'affichage' => false,
'filtre' => false,
'label' => $translator->trans('ID')
],
"walkinn_dossier_etat-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Etat')
],
"code_walkinn" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Code ' . $proprietaireInstance)
],
"code" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Code client')
],
"libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Libellé')
],
"slug" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Slug')
],
"annee" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Année')
],
"nb_jours" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Durée en jours')
],
"walkinn_destination-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Destination')
],
"walkinn_dossier_theme-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Thème')
],
"walkinn_dossier_type-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Type')
],
"walkinn_dossier_categorie-libelle" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Catégorie')
],
"doli_societe-nom" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Client')
],
"ba_user-lastname" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Chargé dossier')
],
"_esc_destinations" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Destination(s)'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(desti.libelle)
FROM dossier_destination dode
LEFT JOIN walkinn_destination desti ON dode.destination_id = desti.id
WHERE dossier_id = walkinn_dossier.id AND desti.libelle LIKE "%%%s%%" LIMIT 1) > 0
)',
)
],
"_esc_clients" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Client'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(doli_societe.nom)
FROM walkinn_dossier_segment
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
)',
)
],
"_esc_segments" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Segment'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(code_walkinn)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
)',
)
],
"_esc_infos" =>
[
'affichage' => true,
'filtre' => false,
'label' => $translator->trans('Infos Pax')
],
"_esc_dates" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Dates'),
'attr' => array(
'type' => 'date',
'search' => '(
(
SELECT COUNT(date_depart)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1
AND
( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
) > 0
)',
)
],
]
,
'config' =>
[
'new' => true,
'newPath' => "/dossier/new?isValide=1",
'edit' => true,
'delete' => true,
'inline' => false,
'print' => true,
'copy' => true,
'excel' => true,
'csv' => true,
'pdf' => true,
'reset' => true,
'viewAll' => false,
'selectAll' => true,
'selectNone' => true,
'colvis' => true,
],
]
]
;
$dossiersListForNew = null;
return $this->render('dossier/index.html.twig', [
'controller_name' => 'DossierController',
'widgets' => $widgets,
'dossiersListForNew' => $dossiersListForNew,
'user' => $user
]);
}
/**
* @Route("/dossiers/contact/{contactId}", name="index_by_contact")
*/
public function indexByContact(Request $request, $contactId, TranslatorInterface $translator)
{
// Params
$user = $this->getUser();
$userId = $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
$guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
$isDolibarr = $request->query->get('dolibarr');
if ($isDolibarr)
{
$request->query->set('iframe', 1);
$link = "/externalsite/frames.php?idmenu=13&mainmenu=externalsite&leftmenu=&path=/dossier/{{id}}";
} else
{
$link = "/dossier/{{id}}";
}
$proprietaireInstance = $this->getParameter('instance_proprietaire');
// SQL
$sql_list =
' SELECT walkinn_dossier.id
, CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
, walkinn_dossier.code_walkinn
, walkinn_dossier.code
, walkinn_dossier.libelle
, CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>") AS"_esc_clients"
, CONCAT("<a href=\'", "/symfony/public/dossier/", walkinn_dossier_segment.dossier_id, "/segment/", walkinn_dossier_segment.id, "/composition" ,"\' class=\'btn btn-link p-1\'>#", walkinn_dossier_segment.code_walkinn ,"</a>") AS "_esc_segments"
, CONCAT("<div class=\'m-2\'>", DATE_FORMAT(walkinn_dossier_segment.date_depart , "%d/%m/%Y"), IF(walkinn_dossier_segment.nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(walkinn_dossier_segment.date_depart, INTERVAL (walkinn_dossier_segment.nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", walkinn_dossier_segment.nb_jours," jour", IF(walkinn_dossier_segment.nb_jours > 1, "s", ""), ")</div>") AS "_esc_dates"
, walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
FROM walkinn_dossier walkinn_dossier
LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id
LEFT JOIN walkinn_dossier_segment_pax walkinn_dossier_segment_pax ON walkinn_dossier_segment_pax.segment_id = walkinn_dossier_segment.id
LEFT JOIN doli_socpeople doli_socpeople ON doli_socpeople.rowid = walkinn_dossier_segment_pax.contact_id
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = walkinn_dossier_segment.client_id
LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id
LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id
LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id
WHERE walkinn_dossier.actif = 1 AND walkinn_dossier_segment_pax.actif = 1 AND walkinn_dossier_segment_pax.contact_id = ' . $contactId . ' '
;
// Widgets
$widgets =
[
[
'titre' => 'Liste des dossiers',
'code' => 'dossier_list',
'taille' => 12,
'sql' => $sql_list,
'champs' =>
[
"id" =>
[
'affichage' => false,
'filtre' => false,
'label' => $translator->trans('ID')
],
"walkinn_dossier_etat-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Etat')
],
"walkinn_dossier-code_walkinn" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Code ' . $proprietaireInstance)
],
"walkinn_dossier-code" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Code client')
],
"slug" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Slug')
],
"annee" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Année')
],
"walkinn_dossier-nb_jours" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Durée en jours')
],
"walkinn_destination-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Destination')
],
"walkinn_dossier-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Dossier')
],
"walkinn_dossier_theme-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Thème')
],
"walkinn_dossier_type-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Type')
],
"walkinn_dossier_categorie-libelle" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Catégorie')
],
"_esc_clients" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Client'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(doli_societe.nom)
FROM walkinn_dossier_segment
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
)',
)
],
"_esc_segments" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Segment'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(code_walkinn)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
)',
)
],
"_esc_infos" =>
[
'affichage' => true,
'filtre' => false,
'label' => $translator->trans('Infos Pax')
],
"_esc_dates" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Dates'),
'attr' => array(
'type' => 'date',
'search' => '(
(
SELECT COUNT(date_depart)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1
AND
( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
) > 0
)',
)
],
]
,
'config' =>
[
'new' => false,
'edit' => true,
'editPath' => $link,
'delete' => false,
'inline' => false,
'print' => false,
'copy' => false,
'excel' => false,
'csv' => false,
'pdf' => false,
'reset' => false,
'viewAll' => false,
'selectAll' => false,
'selectNone' => false,
'colvis' => true,
],
]
]
;
$dossiersListForNew = null;
return $this->render('dossier/index.html.twig', [
'controller_name' => 'DossierController',
'widgets' => $widgets,
'dossiersListForNew' => $dossiersListForNew,
'user' => $user
]);
}
/**
* @Route("/dossiers/tiers/{tiersId}", name="index_by_customer")
*/
public function indexByTiers(Request $request, $tiersId, TranslatorInterface $translator)
{
// Params
$user = $this->getUser();
$userId = $this->getUser() && $this->getUser()->getId() ? $this->getUser()->getId() : 0;
$guidePaxTypeId = \App\Enum\PaxType::GUIDE_ID;
$isDolibarr = $request->query->get('dolibarr');
if ($isDolibarr)
{
$request->query->set('iframe', 1);
$link = "/externalsite/frames.php?idmenu=13&mainmenu=externalsite&leftmenu=&path=/dossier/{{id}}";
} else
{
$link = "/dossier/{{id}}";
}
$proprietaireInstance = $this->getParameter('instance_proprietaire');
// SQL
$sql_list =
' SELECT walkinn_dossier.id
, CONCAT("<span class=\'fa fa-circle fa-lg mr-1\' style=\'color:", walkinn_dossier_etat.color, "\'></span> ", walkinn_dossier_etat.libelle) AS `walkinn_dossier_etat-libelle`
, walkinn_dossier.code_walkinn
, walkinn_dossier.code
, walkinn_dossier.libelle
, CONCAT("<div class=\'m-2\'>", doli_societe.nom ,"</div>") AS "_esc_clients"
-- , CONCAT("<div class=\'m-2\'>", walkinn_dossier_segment_pax.libelle ,"</div>") AS "_esc_contact"
, CONCAT("<a href=\'", "/symfony/public/dossier/", walkinn_dossier_segment.dossier_id, "/segment/", walkinn_dossier_segment.id, "/composition" ,"\' class=\'btn btn-link p-1\'>#", walkinn_dossier_segment.code_walkinn ,"</a>") AS "_esc_segments"
, CONCAT("<div class=\'m-2\'>", DATE_FORMAT(walkinn_dossier_segment.date_depart , "%d/%m/%Y"), IF(walkinn_dossier_segment.nb_jours > 1, CONCAT(" - ", DATE_FORMAT(DATE_ADD(walkinn_dossier_segment.date_depart, INTERVAL (walkinn_dossier_segment.nb_jours -1) DAY) , "%d/%m/%Y")), ""), " (", walkinn_dossier_segment.nb_jours," jour", IF(walkinn_dossier_segment.nb_jours > 1, "s", ""), ")</div>") AS "_esc_dates"
, walkinn_dossier_type.libelle AS `walkinn_dossier_type-libelle`
FROM walkinn_dossier walkinn_dossier
LEFT JOIN walkinn_dossier_segment walkinn_dossier_segment ON walkinn_dossier_segment.dossier_id = walkinn_dossier.id
LEFT JOIN walkinn_dossier_segment_pax walkinn_dossier_segment_pax ON walkinn_dossier_segment_pax.segment_id = walkinn_dossier_segment.id
LEFT JOIN doli_socpeople doli_socpeople ON doli_socpeople.rowid = walkinn_dossier_segment_pax.contact_id
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = walkinn_dossier_segment.client_id
LEFT JOIN walkinn_dossier_etat walkinn_dossier_etat ON walkinn_dossier_etat.id = walkinn_dossier.dossier_etat_id
LEFT JOIN walkinn_dossier_type walkinn_dossier_type ON walkinn_dossier_type.id = walkinn_dossier.dossier_type_id
LEFT JOIN ba_user ba_user ON ba_user.id = walkinn_dossier.charge_dossier_id
WHERE walkinn_dossier.actif = 1 AND walkinn_dossier_segment_pax.actif = 1 AND doli_socpeople.fk_soc = ' . $tiersId . ' GROUP BY walkinn_dossier.id '
;
// Widgets
$widgets =
[
[
'titre' => 'Liste des dossiers',
'code' => 'dossier_list',
'taille' => 12,
'sql' => $sql_list,
'champs' =>
[
"id" =>
[
'affichage' => false,
'filtre' => false,
'label' => $translator->trans('ID')
],
"walkinn_dossier_etat-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Etat')
],
"walkinn_dossier-code_walkinn" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Code ' . $proprietaireInstance)
],
"walkinn_dossier-code" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Code client')
],
"slug" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Slug')
],
"annee" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Année')
],
"walkinn_dossier-nb_jours" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Durée en jours')
],
"walkinn_destination-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Destination')
],
"walkinn_dossier-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Dossier')
],
"walkinn_dossier_theme-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Thème')
],
"walkinn_dossier_type-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Type')
],
"walkinn_dossier_categorie-libelle" =>
[
'affichage' => false,
'filtre' => true,
'label' => $translator->trans('Catégorie')
],
/*
"_esc_contact" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Pax'),
'attr' => array(
'type' => 'varchar',
'search' => 'walkinn_dossier_segment_pax.libelle LIKE "%%%s%%"',
)
],
*/
"_esc_clients" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Client'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(doli_societe.nom)
FROM walkinn_dossier_segment
LEFT JOIN doli_societe doli_societe ON doli_societe.rowid = client_id
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND doli_societe.nom LIKE "%%%s%%" LIMIT 1) > 0
)',
)
],
"_esc_segments" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Segment'),
'attr' => array(
'type' => 'varchar',
'search' => '(
(
SELECT COUNT(code_walkinn)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1 AND code_walkinn LIKE "%%%s%%") > 0
)',
)
],
"_esc_infos" =>
[
'affichage' => true,
'filtre' => false,
'label' => $translator->trans('Infos Pax')
],
"_esc_dates" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Dates'),
'attr' => array(
'type' => 'date',
'search' => '(
(
SELECT COUNT(date_depart)
FROM walkinn_dossier_segment
WHERE dossier_id = walkinn_dossier.id AND actif = 1
AND
( "%1$s" BETWEEN DATE_FORMAT(date_depart, "%%Y-%%m-%%d") AND DATE_FORMAT(DATE_ADD(date_depart, INTERVAL (nb_jours -1) DAY), "%%Y-%%m-%%d"))
) > 0
)',
)
],
]
,
'config' =>
[
'new' => false,
'edit' => true,
'editPath' => $link,
'delete' => false,
'inline' => false,
'print' => false,
'copy' => false,
'excel' => false,
'csv' => false,
'pdf' => false,
'reset' => false,
'viewAll' => false,
'selectAll' => false,
'selectNone' => false,
'colvis' => true,
],
]
]
;
$dossiersListForNew = null;
return $this->render('dossier/index.html.twig', [
'controller_name' => 'DossierController',
'widgets' => $widgets,
'dossiersListForNew' => $dossiersListForNew,
'user' => $user
]);
}
/**
* @Route("/dossier/new-custom", name="new_custom", methods={"GET","POST"})
*/
public function newCustom(Request $request, EntityManagerInterface $em, DossierService $dossierService): Response
{
/*
// TO DO LATER
// Params
$params = [];
$params['type'] = $request->request->get('type');
$params['year'] = $request->request->get('year');
$modelId = $request->request->get('model');
// Parent
$dossier = $em->getRepository(Dossier::class)->find($modelId);
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Check enfant existe
if ($params['type'] == "enfant" && $params['year']) {
$enfantExists = $em->getRepository(Dossier::class)->findOneBy(['parent' => $dossier, 'actif' => true, 'annee' => $params['year']]);
if ($enfantExists) {
$this->addFlash(
'warning',
"Une dossier existe déjà pour l'année " . $params['year'] . ", veuillez choisir une autre année ou créer un nouveau dossier !"
);
$referer = $request->headers->get('referer');
return $this->redirect($referer);
} elseif ($dossier->getAnnee() == $params['year']) {
$this->addFlash(
'warning',
"Une dossier existe déjà pour l'année " . $params['year'] . ", veuillez choisir une autre année ou créer une variante !"
);
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
}
// Duplication
$newDossier = $dossierService->duplicateDossier($dossier, $params);
if ($newDossier && $newDossier->getId()) {
$this->addFlash(
'success',
"Le dossier " . $dossier->getLibelle() . ' a été dupliqué !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $newDossier->getId(),
]);
}
$this->addFlash(
'warning',
"Le dossier " . $dossier->getLibelle() . " n'a pas pu être dupliqué !"
);
*/
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
/**
* @Route("/new_walkinn_dossier", name="newWalkinnDossier", methods={"GET","POST"})
* @Route("/dossier/new", name="new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
// Params
$user = $this->getUser();
$isValide = $request->query->get('isValide');
$dossier = new Dossier();
if ($isValide)
{
$dossier->setIsValide(1);
$defautEtatId = $this->getParameter('dossier_etat_defaut');
$defautEtat = $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
} else
{
$defautEtatId = $this->getParameter('devis_etat_defaut');
$defautEtat = $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
}
if($defautEtat)
{
$dossier->setDossierEtat($defautEtat);
}
$date = new \Datetime();
$dossier->setAnnee($date->format('Y'));
$dossier->setChargeDossier($user);
$form = $this->createForm(DossierFormType::class, $dossier);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($dossier);
$entityManager->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' a été ajouté !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
return $this->render('dossier/new.html.twig', [
'dossier' => $dossier,
'form' => $form->createView(),
'action' => 'Ajouter un dossier',
'retour' => 'dossier_index'
]);
}
/**
* @Route("/edit_walkinn_dossier/{id}", name="editWalkinnDossier", methods={"GET","POST"})
* @Route("/dossier/{id}", name="edit", methods={"GET","POST"})
*/
public function edit(Request $request, Dossier $dossier, CompanyService $companyService, DossierService $dossierService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
if(!$dossier->getAnnee())
{
$date = new \Datetime();
$dossier->setAnnee($date->format('Y'));
}
if(!$dossier->getChargeDossier())
{
$user = $this->getUser();
$dossier->setChargeDossier($user);
}
// Segments
$segments = $this->getDoctrine()->getManager()->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Paxes
$paxes = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForDossier($dossier->getId());
$dossier->setPaxesData($paxes);
foreach($segments as $segment)
{
$segment = $segmentService->checkSegmentComposition($segment);
$segment = $segmentService->checkAchatsAndVentes($segment);
}
$exEtat = $dossier->getDossierEtat()->getId();
$form = $this->createForm(DossierFormType::class, $dossier);
$form->handleRequest($request);
$traductions = $dossierService->getTraductions($dossier);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
// Gestion dans service
if (!empty($data)) {
$dossierService->checkFormData($segments, $data, $dossier, $this->getUser());
// Dans le cas ou le dossier bascule vers confirmé
if ($dossier->getDossierEtat()->getId() != $exEtat) {
if ($dossier->getDossierEtat()->getId() == \App\Enum\DossierEtatEnum::VALIDE && $exEtat == \App\Enum\DossierEtatEnum::EN_COURS_DE_RESERVATION) {
$dossier->setDateConfirmation(new \DateTime);
} else {
$dossier->setDateConfirmation(null);
}
}
}
if ( null !== $dossier->getDossierSegments()) {
$codeClient = null;
$theme = null;
$categorie = null;
// Pour ajouter le code client du voyage dans le dossier
// le code client est ajouté au segment, c'est le champ code
// Trouve le premier code client contenu dans un segment
foreach ($dossier->getDossierSegments() as $segment) {
$codeClient = (null === $codeClient) ? $segment->getCode() : $segment->getCode() ;
// theme
$theme = (null === $theme) ? $segment->getVoyageTheme() : $segment->getVoyageTheme() ;
// categorie
$categorie = (null === $categorie) ? $segment->getVoyageCategorie() : $segment->getVoyageCategorie() ;
}
$dossier->setCode($codeClient);
// code client
if (null === $dossier->getCodeClient() && null !== $codeClient) {
$dossier->setCodeCLient($codeClient);
}
// theme
if (null === $dossier->getTheme() && null !== $theme) {
$dossier->setTheme($theme);
}
// categorie
if (null === $dossier->getCategorie() && null !== $categorie) {
$dossier->setCategorie($categorie);
}
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
return $this->render('dossier/edit.html.twig', [
'dossier' => $dossier,
'form' => $form->createView(),
'action' => 'Dossier: ' . $dossier->getLibelle(),
'traductions' => $traductions,
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/evenements", name="evenements", methods={"GET","POST"})
*/
public function evenements(Request $request, Dossier $dossier, CompanyService $companyService, DossierService $dossierService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Events Types
$eventsTypes = $this->getDoctrine()->getManager()->getRepository(EvenementType::class)->getFiltersForTimeline();
return $this->render('dossier/evenements.html.twig', [
'dossier' => $dossier,
'eventsTypes' => $eventsTypes,
'action' => 'Evènements: ' . $dossier->getLibelle(),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/documents", name="documents", methods={"GET","POST"})
*/
public function documents(Request $request, Dossier $dossier, CompanyService $companyService, DossierService $dossierService, DocumentService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Check Arbo
$dossierService->checkFolders($dossier);
$user = $this->getUser();
$docUrl = $this->getParameter('doc_url');
$docFolder = $this->getParameter('doc_path');
$dynamicPath = $documentService->getEntityArboPath($dossier);
return $this->render('dossier/documents.html.twig', [
'dossier' => $dossier,
'docUrl' => $docUrl,
'docFolder' => $docFolder,
'dynamicPath' => $dynamicPath,
'user' => $user,
'action' => 'Documents: ' . $dossier->getLibelle(),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/tasks", name="tasks", methods={"GET","POST"})
*/
public function tasks(Request $request, EntityManagerInterface $em, Dossier $dossier): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$responsable = $this->getDoctrine()->getManager()->getRepository(\App\Entity\User::class)->findOneById($dossier->getChargeDossier()->getId());
$form = $this->createForm(DossierTodoListFormType::class, $dossier, ['responsable' => $responsable]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_tasks', [
'id' => $dossier->getId(),
'iframe' => 1
]);
}
$retour = 'dossier_index';
return $this->render('dossier/tasks/tasks.html.twig', [
'dossier' => $dossier,
'form' => $form->createView(),
'action' => 'Tâches: ' . $dossier->getLibelle(),
'retour' => $retour
]);
}
/**
* @Route("/dossier/{id}/ventes", name="segment_ventes", methods={"GET","POST"})
*/
public function ventes(Request $request, EntityManagerInterface $em, Dossier $dossier, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Set Fake DATA for Ventes
$dossier = $segmentService->setDataForVentes($dossier);
$form = $this->createForm(DossierVentesFormType::class, $dossier);
$form->handleRequest($request);
// if ($form->isSubmitted() && $form->isValid()) {
if ($form->isSubmitted() && $this->isCsrfTokenValid('maxence', $request->request->get('_token'))) {
$data = $form->getData();
$dossier->setIsVentesValide(1);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_segment_ventes', [
'id' => $dossier->getId(),
]);
}
return $this->render('dossier/ventes.html.twig', [
'dossier' => $dossier,
'form' => $form->createView(),
'action' => 'Ventes: ' . $dossier->getLibelle(),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/achats", name="segment_achats", methods={"GET","POST"})
*/
public function achats(Request $request, EntityManagerInterface $em, Dossier $dossier, DossierService $dossierService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Set Fake DATA for Ventes
$dossier = $dossierService->setDataForAchats($dossier);
if($dossier->getTest())
{
return $this->redirectToRoute('dossier_segment_achats', [
'id' => $dossier->getId(),
]);
}
$serviceTypes = $em->getRepository(ServiceType::class)->findBy(['actif' => true], ['id' => 'ASC']);
$dossierAchatsEtats = $this->getDoctrine()->getRepository(DossierCommandeFournisseurEtat::class)->findBy(['actif' => true], ['id' => 'ASC']);
if($request->isMethod('POST'))
{
$postParams = $request->request->all();
foreach($postParams as $key => $param)
{
if (strpos($key, 'note') !== false && $param)
{
$explode = explode("-", $key);
$id = end($explode);
$tampon = $em->getRepository(DossierCommandeFournisseurTampon::class)->find($id);
$tampon->setNote($param);
} else if (strpos($key, 'acompte') !== false && $param > 0)
{
$explode = explode("-", $key);
$id = end($explode);
$tampon = $em->getRepository(DossierCommandeFournisseurTampon::class)->find($id);
$tampon->setAcompte($param);
}
}
$dossier->setIsAchatsValide(1);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_segment_achats', [
'id' => $dossier->getId(),
]);
}
return $this->render('dossier/achats.html.twig', [
'dossier' => $dossier,
'doli_email_relance_id_fr' => $this->getParameter('doli_email_relance_id_fr'),
'doli_email_relance_id_en' => $this->getParameter('doli_email_relance_id_en'),
'serviceTypes' => $serviceTypes,
'dossierAchatsEtats' => $dossierAchatsEtats,
'action' => 'Achats: ' . $dossier->getLibelle(),
'filters' => (($this->getParameter('instance') == 'wi') ? 1 : 0),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/plandetransport/{id}", name="plandetransport_details", methods={"GET","POST"})
*/
public function pdtDetails(Request $request, PlanDeTransport $planDeTransport, EntityManagerInterface $em)
{
if($request->isMethod('POST'))
{
$planDeTransport->setContent($request->request->get('plantransport-content'));
$em->persist($planDeTransport);
$em->flush();
}
$serviceTypes = $em->getRepository(ServiceType::class)->findBy(['actif' => true], ['id' => 'ASC']);
return $this->render('dossier/plandetransportDetails.html.twig', [
'pdt' => $planDeTransport,
'dossier' => $planDeTransport->getDossier()
]);
}
/**
* @Route("/api/plandetransport/delete", name="plandetransport_delete", methods={"POST"})
*/
public function pdtDelete(Request $request, EntityManagerInterface $em)
{
$data = json_decode($request->getContent(), true);
$pdt = $em->getRepository(PlanDeTransport::class)->findOneBy(['id' => $data['id']]);
$pdt->setActif(false);
$em->persist($pdt);
$em->flush();
return $this->json(['message' => 'OK'], 200);
}
/**
* @Route("/api/plandetransport/create", name="plandetransport_create", methods={"POST"})
*/
public function pdtCreate(Request $request, EntityManagerInterface $em, CompanyService $companyService, PaxService $paxService)
{
$data = json_decode($request->getContent(), true);
$pdt = new PlanDeTransport();
$dossier = $em->getRepository(Dossier::class)->findOneBy(['id' => (int)$data['dossierId']]);
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = null;
$ok = true;
foreach ($dossier->getDossierSegments() as $seg) {
if ($seg->getIsPrestationSeche() != true && true === $ok) {
$segment = $seg;
$ok = false; // le segment est le premier segment de voyage
}
}
if ($this->getParameter('instance') == 'wi')
{
$logo = 'https://rootcms.elocms.com/assets/images/www.walkinn.fr/logo.png';
}
else
{
$logo = 'https://www.levelovoyageur.com/web/velov/images/logo-footer.png';
}
$responses = array();
// Le libellé du dossier
$codeWalkinn = $dossier->getLibelle();
$nombrePax = 0;
$DateArrivee = '';
$client = '';
$nomGuide = array();
$telephoneGuide = array();
if (null !== $segment) {
// Pax
$pax = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
$pax = $paxService->checkPaxes($pax);
$nombrePax = count($segment->getDossierSegmentPaxesActifs());
foreach ($segment->getDossierSegmentPaxes() as $p) {
if ($p->getPaxType()->getId() == 3) {
$guide = $companyService->getOneContactById($p->getContactId());
$nomGuide[] = $p->getLibelle();
$telephoneGuide[] = (strlen($guide['phone_mobile']) > 0) ? $guide['phone_mobile'] : ((strlen($guide['phone']) > 0) ? $guide['phone'] : $guide['phone_perso'] );
}
}
$DateArrivee = $segment->getDateDepart()->format('d/m/Y');
$client = $companyService->getOneById($segment->getClientId());
}
$responses[] = $this->renderView('dossier/template_plandetransport.html.twig', [
'logo' => $logo
, 'codeWalkinn' => $codeWalkinn
, 'nombrePax' => $nombrePax
, 'DateArrivee' => $DateArrivee
, 'client' => $client
, 'nomGuide' => implode(', ', $nomGuide)
, 'telephoneGuide' => implode(', ', $telephoneGuide)
, 'pax' => $pax
]);
// #2 Ajoute les plans de vols au pdf
$responses[] = '<!-- pagebreak --><div>'; // Sur une nouvelle page
$n = 0;
foreach ($dossier->getDossierSegments() as $segment) {
$write = false;
if (true !== $segment->GetIsPrestationSeche()) {
if ( count($segment->getDossierSegmentPlanDeVols()) > 0 ) {
foreach ($segment->getDossierSegmentPlanDeVols() as $planDeVol) {
if (count($planDeVol->getDossierSegmentTransfertAeriens()) > 0 ) {
$write = true;
}
}
if ( true === $write ) {
$response = $this->forward('App\Controller\DossierController::vols', [
'request' => $request,
'id' => $dossier,
'segmentId' => $segment->getId(),
'isIframe' => true,
'parent' => 'vueGuide',
'pdt' => true
]);
$regex = '~(<body[^>]*>)(.*)(</body>)~s';
preg_match_all($regex, $response->getContent(), $out);
if (array_key_exists(3, $out) && count($out) > 2) {
if ($n != 0) {
$responses[] = '<hr class="visible" style="margin: 40px 0">'; // Sépare les segment avec <HR> cf mail emmanuel 24/06/21
}
$c = str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
$c = str_replace(array('<h4', '</h4'), array('<span', '</span'), $c);
$c = str_replace(array('table-striped'), array(''), $c);
$c = str_replace(array('>IN<', '>OUT<'), array('><b>IN</b><', '><b>OUT</b><'), $c);
$responses[] = '<span style="visibility: visible; font-weight: bold;">'.'PLAN DE VOLS'.'</span>' . $c;
}
$n++;
}
}
}
}
$responses[] = '</div>';
// #4 Ajoute la vue guide au pdf
foreach ($dossier->getDossierSegments() as $segment) {
if (true !== $segment->getIsPrestationSeche()) {
$response = $this->forward('App\Controller\DossierController::vueGuidePdt', [
'request' => $request,
'id' => $dossier,
'segmentId' => $segment->getId(),
'parent' => 'vueGuide',
'fournList' => $data['fournList'],
'pdt' => true
]);
//$responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$dossier->getLibelle().'</h2>'.$response->getContent().'</div>';
$c1 = $response->getContent();
$c1 = str_replace(array('<h5 class="text-custom">', '</h5'), array('<span style="font-weight: bold">', '</span'), $c1);
$c1 = str_replace(array('class="border"'), array('class=""'), $c1);
$c1 = str_replace(array('day-unit col-12 p-3'), array('day-unit col-12'), $c1);
$c1 = str_replace(array('row p-3'), array('row'), $c1);
$responses[] = '<!-- pagebreak --><div class="" style="page-break-before: always;"><div><span style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$dossier->getLibelle().'</span>'.$c1.'</div>';
}
}
$htmlContent = implode('', $responses);
$pdt->setLibelle($data['libelle']);
$pdt->setDossier($dossier);
$pdt->setActif(true);
$pdt->setCreatedAt(new \DateTime('now'));
$pdt->setContent($htmlContent);
$em->persist($pdt);
$em->flush();
return $this->json(['id' => $pdt->getId()], 200);
}
/**
* @Route("/delete_walkinn_dossier/{id}", name="deleteWalkinnDossier", methods={"DELETE"})
* @Route("/dossier/{id}", name="delete", methods={"DELETE"})
*/
public function delete(Request $request, Dossier $dossier): Response
{
$eventTypeRepo = $this->getDoctrine()->getRepository(EvenementType::class);
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$entityManager = $this->getDoctrine()->getManager();
$dossier->setActif(0);
$event = new Evenement();
$event->setLibelle('Suppression manuelle dossier: ' . $dossier->getLibelle());
$event->setCreatedBy($this->getUser());
$event->setUser($this->getUser());
$event->setType($eventTypeRepo->findOneBy(['id' => 2]));
$event->setCreatedAt(new \Datetime('now'));
$event->setUpdatedAt(new \Datetime('now'));
$event->setDateDebut(new \Datetime('now'));
$event->setDateFin(new \Datetime('now'));
$event->setEntite('Dossier');
$event->setEntiteId($dossier->getId());
$entityManager->persist($event);
$entityManager->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' a été supprimé !'
);
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
/**
* @Route("/dossier/{id}/validate", name="validate", methods={"GET"})
*/
public function validate(Request $request, Dossier $dossier): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$entityManager = $this->getDoctrine()->getManager();
$dossier->setIsValide(1);
$defautEtatId = $this->getParameter('dossier_etat_defaut');
if($defautEtatId)
{
$etat = $this->getDoctrine()->getManager()->getRepository(DossierEtat::class)->find($defautEtatId);
} else
{
$etat = $entityManager->getRepository(DossierEtat::class)->findOneBy(['actif' => 1, 'isValide' => 1]);
}
$dossier->setDossierEtat($etat);
$entityManager->flush();
$this->addFlash(
'info',
"Le dossier " . $dossier->getLibelle() . ' a été validé !'
);
$referer = $request->headers->get('referer');
return $this->redirect($referer);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/change", name="segment_change", methods={"GET","POST"})
*/
public function segmentChange(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, DossierService $dossierService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Params
$date = $request->query->get('date');
// Traitement
if($date)
{
$datetime = \DateTime::createFromFormat('d/m/Y', $date);
if($datetime)
{
$segment->setDateDepart($datetime);
$segment->setIsCompoValide(0);
$segment->setIsPaxValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le segment " . $segment->getLibelle() . ' a été modifié !'
);
return $this->redirectToRoute('dossier_segment_rooming', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
]);
}
}
$this->addFlash(
'info',
"La date n'est pas valide !"
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/duplicate", name="segment_duplicate", methods={"GET","POST"})
*/
public function segmentDuplicate(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, DossierService $dossierService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Params
$date = $request->query->get('date');
// Traitement dans service
$newSegment = $segmentService->duplicateSegment($segment, $date);
$this->addFlash(
'info',
"Le segment " . $segment->getLibelle() . ' a été dupliqué !'
);
return $this->redirectToRoute('dossier_segment_rooming', [
'id' => $dossier->getId(),
'segmentId' => $newSegment->getId(),
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/tasks", name="segment_tasks", methods={"GET","POST"})
*/
public function segmentTasks(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$form = $this->createForm(DossierSegmentTodoListFormType::class, $segment, ['responsable' => $dossier->getChargeDossier()]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le segment " . $segment->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_segment_tasks', array('id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'iframe' => 1));
}
$retour = 'dossier_index';
return $this->render('dossier/tasks/tasks.html.twig', [
'dossier' => $dossier,
'form' => $form->createView(),
'action' => 'Tâches: ' . $segment->getLibelle(),
'retour' => $retour
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}", name="segment_itineraire", methods={"GET","POST"})
*/
public function itineraire(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, TranslatorInterface $translator, EditorialService $editorialService, PaxService $paxService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
// Check Special Walkinn
$itiCopyEnabled = $this->getParameter('iti_copy_enabled') ? true : false;
// Liste des documents disponibles
// $baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$baseurl = $this->getParameter('cdn_url');
// Widgets
$sql = 'SELECT walkinn_document_generator.id
, CONCAT("<span class=\"btn btn-sm btn-success btn-editorial\">", walkinn_document_generator.langue, "</span>") AS langue
, CONCAT("<b>", walkinn_document_generator_modele.libelle,"</b>") AS "walkinn_document_generator_modele-libelle"
-- , IFNULL(pax.libelle, "TOUTES/TOUS") AS "_esc_contexte"
, CONCAT("<a href=\"", "'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")),"\" target=\"_blank\">'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")), "</a>", "<button type=\"button\" id=\"copy-", walkinn_document_generator.id ,"\" class=\"btn btn-link\" data-copy=\"", "'.$baseurl.'/itineraire/", TO_BASE64(CONCAT("dossier/document/", walkinn_document_generator.id, "/preview/single")),"\" onclick=\"copyToClipboard(", walkinn_document_generator.id ,")\"><i class=\"fas fa-clipboard\"></i></button>") AS "entite"
,
CASE
WHEN (walkinn_document_generator.updated_at IS NOT NULL) THEN CONCAT( DATE_FORMAT(walkinn_document_generator.updated_at, "%%d/%%m/%%Y à %%hh%%m"), " par ", modifier.firstname, " ", modifier.lastname)
ELSE CONCAT( walkinn_document_generator.created_at, " par ", createur.firstname, " ", createur.lastname)
END
as created_by
FROM walkinn_document_generator walkinn_document_generator
LEFT JOIN walkinn_document_generator_modele walkinn_document_generator_modele ON walkinn_document_generator_modele.id = walkinn_document_generator.modele_id
LEFT JOIN walkinn_dossier_segment_pax pax ON pax.id = walkinn_document_generator.segment_pax_id
LEFT JOIN ba_user createur ON createur.id = walkinn_document_generator.created_by
LEFT JOIN ba_user modifier ON modifier.id = walkinn_document_generator.updated_by
WHERE walkinn_document_generator.entite="%s" AND walkinn_document_generator.entite_id="%d" AND walkinn_document_generator.actif=1';
$requete = sprintf($sql, 'dossier', $segment->getId());
$widgets =
[
[
'titre' => 'Liste des documents',
'code' => 'document_generator_list',
'taille' => 12,
'sql' => $requete,
'champs' =>
[
"id" =>
[
'affichage' => false,
'filtre' => false,
'label' => $translator->trans('ID')
],
"langue" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Langue')
],
"walkinn_document_generator_modele-libelle" =>
[
'affichage' => true,
'filtre' => true,
'label' => $translator->trans('Modèle')
],
"created_by" =>
[
'affichage' => true,
'filtre' => false,
'label' => $translator->trans('Dernière modification')
],
"entite" =>
[
'affichage' => true,
'filtre' => false,
'label' => $translator->trans('Lien Web')
],
// "_esc_contexte" =>
// [
// 'affichage' => true,
// 'filtre' => true,
// 'label' => $translator->trans('Contexte voy.'),
// 'attr' => array(
// 'type' => 'varchar',
// 'search' => 'IFNULL(pax.libelle, "TOUTES/TOUS") LIKE "%%%s%%"',
// )
// ],
]
,
'config' =>
[
'new' => false,
'edit' => true,
'delete' => false,
'inline' => false,
'print' => false,
'copy' => false,
'excel' => false,
'csv' => false,
'pdf' => false,
'reset' => true,
'viewAll' => false,
'selectAll' => false,
'selectNone' => false,
'colvis' => false,
],
]
];
// Retrouve les langues disponibles
$langues = $editorialService->getDolibarrFavoriteLanguage();
// Retrouve les modeles disponibles
$modeles = $em->getRepository(DocumentGeneratorModele::class)->findBy(array('entite' => 'dossier', 'actif' => 1));
$modeles = array();
// Pax
$pax = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
$pax = $paxService->checkPaxes($pax);
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
$form = $this->createForm(DossierSegmentFormType::class, $segment);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le segment " . $segment->getLibelle() . ' est mis à jour !'
);
return $this->redirectToRoute('dossier_segment_itineraire', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
]);
}
return $this->render('dossier/itineraire.html.twig', [
'dossier' => $dossier,
'widgets' => $widgets,
'langues' => $langues,
'modeles' => $modeles,
'linked' => $linked,
'segment' => $segment,
'form' => $form->createView(),
'client' => $client,
'pax' => $pax,
'action' => 'Itinéraire: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'itiCopyEnabled' => $itiCopyEnabled,
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/itineraire_duplicate", name="segment_itineraire_duplicate", methods={"GET","POST"})
*/
public function itineraireDuplicate(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CustomImportService $customImportService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$test = $customImportService->handleSegmentVoyageItinaire($segment);
$referer = $request->headers->get('referer');
if($referer)
{
return $this->redirect($referer);
} else
{
return $this->redirectToRoute('dossier_segment_itineraire', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
]);
}
}
/**
* @Route("/dossier/{id}/edit_document_generator_dossier/{documentId}", name="edit_segment_document_dossier", methods={"GET","POST"}, defaults={})
* @Route("/dossier/{id}/edit_document_generator_dossier", name="new_segment_document_dossier", methods={"GET","POST"}, defaults={"documentId"=null})
*/
public function edit_itineraire($save = false, Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, TranslatorInterface $translator, EditorialService $editorialService, $documentId, PatternService $patternService, DocumentGeneratorService $documentGeneratorService, TraductionService $traductionService, DossierSegmentServiceService $segmentServiceService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
// Retrouve les langues disponibles
$langues = $editorialService->getDolibarrFavoriteLanguage();
$add_day = ($request->query->get('add_day', 0) == 0) ? false : true;
$segments = $request->query->get('segments', false);
$modele_id = $request->query->get('modele', 1);
$segmentPaxId = $request->query->get('paxContexte', null);
$saveAuto = $request->query->get('save', 0);
$instance = $this->getParameter('instance');
$langue = ($request->query->get('langue', 0) == 0) ? $request->query->get('langue') : 'FR';
if ($saveAuto == "1")
$save = true;
$document = null;
if (null === $documentId) {
$segmentId = $request->query->get('entiteId', null);
if (null !== $segmentId) {
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
$modele = $em->getRepository(DocumentGeneratorModele::class)->findOneById($modele_id);
$document = $documentGeneratorService->getDocumentGeneratorByModeleAndLangueAndEntite($segmentId, 'dossier', $modele, $langue, true, $add_day, $segmentPaxId, $segments);
return $this->redirectToRoute('dossier_edit_segment_document_dossier', [
'id' => $dossier->getId(),
'documentId' => $document->getId(),
'save' => $saveAuto == "1" || $saveAuto == 1 || $saveAuto == '1' ? true : false,
]);
}
} else {
$document = $em->getRepository(DocumentGenerator::class)->findOneById($documentId);
$segment = $em->getRepository(DossierSegment::class)->find($document->getEntiteId());
}
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Templates disponibles
$templates = $em->getRepository(DocumentGeneratorPageTemplate::class)->findBy(array('actif' => 1, 'langue' => $document->getLangue()));
// Retrouve les modeles disponibles
$modeles = $em->getRepository(DocumentGeneratorModele::class)->findBy(array('entite' => 'dossier', 'actif' => 1, 'langue' => $document->getLangue()));
// Locale
$locale = strtolower($traductionService->getLanguageCodeFromCountryCode($document->getLangue()));
$request->setLocale($locale);
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
$langue = $document->getLangue();
$modele = $document->getModele();
// Retrouve les champs Custom affichés par défaut
$customs = array();
if (null !== $langue) { // que lorsqu'une langue est définie
$contexte = EditorialEnum::CATEGORIE_ACTIVITE;
$customs = $editorialService->getEditorialContentCustomByLangue($langue, null, $contexte, null);
}
$baseurl = $this->getParameter('cdn_url');
$bg_color = $this->getParameter('document_generator_title_background');
$color2 = $this->getParameter('document_generator_editorial_title_color');
$previewLink = $baseurl . "/itineraire/" . base64_encode("dossier/document/" . $documentId ."/preview/single");
$downloadLink = $baseurl . "/itineraire/" . base64_encode("dossier/document/" . $documentId ."/single");
// $entities = (strlen($document->getEntityIds()) > 0) ? $document->getEntityIds() : $segment->getId();
$entities = (strlen($document->getEntityIds()) > 0) ? implode(',', array($document->getEntityIds(), $segment->getId())) : $segment->getId();
$patterns = $patternService->getPatterns('dossier', $segment->getId(), array('Langue' => $document->getLangue()), array(':entities' => $entities ));
$form = $this->createForm(DocumentGeneratorPageFormType::class, null, [ 'document' => $document ]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$data = $request->request->get('document_generator_page_form');
$toSubmit = array();
// reconstruit les datas
foreach ($data as $key => $value) {
$arrKey = explode('_', $key);
if (count($arrKey) == 3) {
list($field,$pdfId,$id) = $arrKey;
if (strlen($value) > 0) {
$toSubmit[$id][$field] = $value;
}
}
}
// persiste les pages
foreach ($toSubmit as $id => $fields) {
// force la suppression des contours oranges
$fields['contenu'] = str_replace('style="border: 1px dashed orange; border-radius: 5px;"', '', $fields['contenu']);
$page = $this->getDoctrine()->getManager()->getRepository(DocumentGeneratorPage::class)->findOneById($id);
if (array_key_exists('libelle', $fields)) {
$page->setLibelle($fields['libelle']);
}
if (array_key_exists('contenu', $fields)) {
$page->setHtml($fields['contenu']);
}
$this->getDoctrine()->getManager()->persist($page);
}
// Session
$currentNavPage = $request->request->get('current-nav-page');
$this->get('session')->set('dossier-nav-page', $currentNavPage);
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
'Le dossier est mis à jour !'
);
// Save to Arbo
$documentGeneratorService->saveDocumentInArbo($document);
//return $this->redirectToRoute('voyage_itineraire_v2', [
// 'id' => $voyage->getId(),
//]);
}
$retour = 'dossier_segment_itineraire';
return $this->render('dossier/itineraire_v2.html.twig', [
'dossier' => $dossier
, 'linked' => null
, 'segment' => $segment
, 'client' => $client
, 'form' => $form->createView()
, 'action' => 'Itinéraire: ' . $segment->getLibelle()
, 'retour' => $retour
, 'document' => $document
, 'modeles' => $modeles
, 'bg_color' => $bg_color
, 'color2' => $color2
, 'langues' => $langues
, 'langue' => $langue
, 'new' => (null === $document) ? 1 : 0
, 'templates' => $templates
, 'patterns' => $patterns
, 'customs' => $customs
, 'previewLink' => $previewLink
, 'downloadLink' => $downloadLink
, 'modeleLock' => VoyagePdfModeleEnum::LIBRE
, 'templateLock' => array(VoyagePdfPageTemplateType::FREE, VoyagePdfPageTemplateType::DAY)
, 'save' => $save
, 'instance' => $instance
]);
}
/**
* @Route("/dossier/edit_document_generator_dossier/save-page", name="save_page_segment_document_dossier", methods={"GET","POST"})
*/
public function save_page_itineraire(Request $request, EntityManagerInterface $em, DocumentGeneratorService $documentGeneratorService, TraductionService $traductionService)
{
$id = $request->request->get('id' , null);
$html = $request->request->get('html', null);
$libelle = $request->request->get('libelle', null);
if (null === $id || null === $html) {
return new Response(1);
}
$page = $this->getDoctrine()->getManager()->getRepository(DocumentGeneratorPage::class)->findOneById($id);
if (null === $page) {
return new Response(1);
}
$html = str_replace('style="border: 1px dashed orange; border-radius: 5px;"', '', $html);
$page->setLibelle($libelle);
$page->setHtml($html);
$this->getDoctrine()->getManager()->flush();
return new Response(0);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/rooming/groupements/select2", name="segment_rooming_groupement_liste", methods={"GET","POST"})
*/
public function getGroupementRoomingForSelect2(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, PaxService $paxService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$term = $request->query->get('term', null);
// Multi Pax
$multiPossibilites = $paxService->getPaxTiersForForm($segmentId, false, $term);
//dd($multiPossibilites);
$responseCode = 200;
$response = new Response(json_encode($multiPossibilites), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/rooming", name="segment_rooming", methods={"GET","POST"}, defaults={"iframe" = false, "parent" = null})
*/
public function rooming(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService,PaxService $paxService, $iframe = false, $parent = null): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
$segment->setIsPaxValide(1);
$this->getDoctrine()->getManager()->flush();
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// PaxRooming
$roomingTypes = $em->getRepository(PaxRooming::class)->findBy(['actif' => true], ['value' => 'ASC']);
// PaxEtat
$paxEtats = $em->getRepository(DossierSegmentPaxEtat::class)->findForForm();
// Auto Pax
$autoPossibilites = $client['is_pax'] ? $paxService->getPaxWithOrigine($segmentId, $segment->getClientId()) : null;
// Multi Pax
$multiPossibilites = []; //$paxService->getPaxTiersForForm($segmentId);
// Check
$check = $em->getRepository(DossierSegmentPaxRooming::class)->checkForSegment($segment->getId());
// Pax
$pax = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
$pax = $paxService->checkPaxes($pax);
return $this->render('dossier/rooming.html.twig', [
'dossier' => $dossier,
'linked' => $linked,
'segment' => $segment,
'client' => $client,
'roomingTypes' => $roomingTypes,
'paxEtats' => $paxEtats,
'autoPossibilites' => $autoPossibilites,
'multiPossibilites' => $multiPossibilites,
'check' => $check,
'pax' => $pax,
'iframe' => $iframe,
'parent' => $parent,
'action' => 'Pax: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/rooming/drag-and-drop", name="segment_rooming_drag_and_drop", methods={"GET","POST"})
*/
public function roomingDragAndDrop(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, PaxService $paxService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// PaxRooming
$roomingTypes = $em->getRepository(PaxRooming::class)->findBy(['actif' => true], ['value' => 'ASC']);
// Rooming
$rooming = $em->getRepository(DossierSegmentPaxRooming::class)->findForSegment($segment->getId());
// Pax
$paxes = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findForSegment($segment->getId());
$paxService->checkPaxes($paxes);
return $this->render('dossier/rooming/drag.html.twig', [
'segment' => $segment,
'roomingTypes' => $roomingTypes,
'rooming' => $rooming,
'paxes' => $paxes,
'action' => 'Gestion du rooming',
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols", name="segment_vols", methods={"GET","POST"}, defaults={"isIframe" = false, "parent" = null, "pdt" = false})
* @Route("/dossier/{id}/segment/{segmentId}/vols-iframe", name="segment_vols_iframe", methods={"GET","POST"}, defaults={"isIframe" = true, "parent" = null, "pdt" = false})
*/
public function vols(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, $isIframe, $parent, $pdt): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$AllPaxes = $segment->getDossierSegmentPaxes();
$freePaxes = array();
foreach ($AllPaxes as $pax) {
$isFree = true;
if (true == $pax->getActif()) {
$data = $pax->getDossierSegmentTransfertAerienPaxes();
if (count($data) == 0) {
$isFree = ($pax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) ? false : $isFree;
}
else {
foreach ($data as $i) {
if ($segmentId == $i->getPlanDeVol()->getSegment()->getId()) { // filtre sur le segment
$isFree = false;
}
}
}
if (true === $isFree) {
$freePaxes[] = $pax;
}
}
}
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Transfers aériens
$tables = array();
// Plan de vols
$plansDeVol = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findBy(array('segment' => $segment));
$pdvs = array(); // pour contenir tous les plan de vol des segments
// Plan de vols des autres segments
foreach ($dossier->getDossierSegments() as $dossierSegment) {
foreach ($dossierSegment->getDossierSegmentPlanDeVols() as $plan) {
$pdvs[] = array(
'text' => implode( '/', array( $dossierSegment->getLibelle(), implode(' ', array($plan->getPlanDeVol()->getLibelle())))),
'id' => $plan->getId()
);
}
}
foreach ($plansDeVol as $planDeVol) {
if ($planDeVol->getPlanDeVol()->getActif() == 1) {
$arr = array();
$transferts = $planDeVol->getDossierSegmentTransfertAeriens();
$paxes = $planDeVol->getDossierSegmentTransfertAerienPaxes();
foreach ($transferts as &$transfert) {
foreach ($transfert->getDossierSegmentTransfertAerienServices() as &$relation) {
// Calcul de la date
$days = $relation->getDossierSegmentService()->getDossierSegmentServiceDays()->toArray();
//$day = $days[0]->getJour();
$day = (array_key_exists(0,$days)) ? $days[0]->getJour() : 1;
$date = clone $segment->getDateDepart();
$dayDiff = $day - 1;
$dateInterval = new \DateInterval('P' . abs($dayDiff) . 'D');
if ($dayDiff < 0) $dateInterval->invert = 1;
$date->add($dateInterval);
$date = $date->format('d/m/Y');
$fournisseur = $companyService->getOneById($relation->getDossierSegmentService()->getService()->getPrestataireId());
$nomFournisseur = '';
if (null !== $fournisseur) {
$nomFournisseur = implode(" - ", array($fournisseur['nom'], $fournisseur['code_fournisseur']));
}
$nomService = implode(' - ', array("J{$day}", $nomFournisseur, substr($relation->getDossierSegmentService()->getService()->getLibelle(),0,10).'...'));
$relation->setName($nomService);
}
$arr[] = $transfert;
}
$tables[$planDeVol->getId()]['transferts'] = $arr;
$tables[$planDeVol->getId()]['paxes'] = $paxes;
$tables[$planDeVol->getId()]['libelle'] = $planDeVol->getPlanDeVol()->getLibelle();
$tables[$planDeVol->getId()]['note'] = $planDeVol->getPlanDeVol()->getNote();
}
}
//$transferts = $this->getDoctrine()->getManager()->getRepository(TransfertAerien::class)->findAllBySegment($segment->getId());
$template = (true === $isIframe) ? 'dossier/vols-iframe.html.twig' : 'dossier/vols.html.twig';
if ($request->isMethod('POST')) {
$segment->setIsTransferValide(1);
$em->flush();
}
return $this->render($template, [
'dossier' => $dossier
, 'linked' => $linked
, 'segment' => $segment
, 'isIframe' => $isIframe
, 'client' => $client
, 'tables' => $tables
, 'freePaxes' => $freePaxes
, 'pdvs' => $pdvs
, 'transferts' => null//$transferts
, 'parent' => $parent
, 'pdt' => $pdt
, 'action' => 'Vols: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/dupliquer/{planId}", name="dupliquer_plan_de_vol", methods={"GET", "POST"})
*/
public function dupliquer_plan_de_vol(Request $request, $id, EntityManagerInterface $em, TranslatorInterface $translator, $segmentId, $planId) : Response
{
$responseCode = 200;
$data = array();
$transferts = array();
$relation = $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
$segment = $em->getRepository(DossierSegment::class)->findOneById($segmentId);
$transfertAeriens = $em->getRepository(DossierSegmentTransfertAerien::class)->findBy(array('planDeVol' => $relation));
$planDeVol = clone $relation->getPlanDeVol();
$em->persist($planDeVol);
$em->flush();
$newRelation = clone $relation;
$newRelation->setSegment($segment);
$newRelation->setPlanDeVol($planDeVol);
$em->persist($newRelation);
$em->flush();
if (null !== $transfertAeriens) {
foreach ($transfertAeriens as $transfert) {
$newTransfert = clone $transfert;
$newTransfert->setPlanDeVol($newRelation);
$em->persist($newTransfert);
$em->flush();
}
}
$response = new Response(json_encode($data), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/manage-pax", name="segment_vols_manage_pax", methods={"GET","POST"})
*/
public function vols_manage_pax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Retrouve les datas
$params = $request->request->all();
$pax = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findOneById($params['paxId']);
$plan = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findOneById($params['planId']);
$transfertPax = $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerienPax::class)->findOneBy(array('planDeVol' => $plan, 'segmentPax' => $pax)) ;
if (null === $transfertPax) { // Ajoute si inconnu
$transfertPax = new DossierSegmentTransfertAerienPax();
$transfertPax->setPlanDeVol($plan)->setSegmentPax($pax)->setActif(1);
$this->getDoctrine()->getManager()->persist($transfertPax);
} else { // Supprime si connu
$this->getDoctrine()->getManager()->remove($transfertPax);
}
$statut = ($pax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) ? false : $pax->getActif();
$this->getDoctrine()->getManager()->flush();
return new Response(json_encode(array('actif' => $statut)), 200, ['Content-Type' => 'application/json']);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/delete-transfert/{planId}/{transfertId}", name="segment_vols_delete_transfert", methods={"GET","POST"} , defaults={"isIframe" = false})
* @Route("/dossier/{id}/segment/{segmentId}/vols/delete-transfert/{planId}/{transfertId}/iframe", name="segment_vols_delete_transfert_iframe", methods={"GET","POST"}, defaults={"isIframe" = true})
*/
public function vols_delete_transfert(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $planId, $transfertId, $isIframe) : Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Retrouve les datas
$relation = $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId) ;
foreach ($relation->getDossierSegmentTransfertAerienServices() as $service) {
$em->remove($service);
}
$em->remove($relation);
$em->flush();
if (true === $isIframe) {
return $this->redirectToRoute('dossier_segment_vols_iframe', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
}
return $this->redirectToRoute('dossier_segment_vols', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/delete/{planId}", name="segment_vols_delete_plan", methods={"GET","POST"} , defaults={"isIframe" = false})
* @Route("/dossier/{id}/segment/{segmentId}/vols/delete/{planId}/iframe", name="segment_vols_delete_plan_iframe", methods={"GET","POST"}, defaults={"isIframe" = true})
*/
public function vols_delete_plan(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $planId, $isIframe) : Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$plan = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
// Supprime les relation Plan-pax
$paxes = $this->getDoctrine()->getManager()->getRepository(DossierSegmentTransfertAerienPax::class)->findBy(array('planDeVol' => $plan));
foreach ($paxes as $planPax) {
$em->remove($planPax);
}
$transferts = $plan->getDossierSegmentTransfertAeriens();
foreach ($transferts as $transfert) {
// relations avec les services
foreach ($transfert->getDossierSegmentTransfertAerienServices() as $service) {
$em->remove($service);
}
$em->remove($transfert);
}
// supprime le plan
$em->remove($plan);
$em->flush();
if (true === $isIframe) {
return $this->redirectToRoute('dossier_segment_vols_iframe', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
}
return $this->redirectToRoute('dossier_segment_vols', array('id' => $dossier->getId(), 'segmentId' => $segment->getId()));
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}/{transfertId}", name="segment_vols_edit_transfert", methods={"GET","POST"})
* @Route("/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}" , name="segment_vols_new_transfert" , methods={"GET","POST"}, defaults={ "transfertId" = null })
*/
public function vols_edit_transfert(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $planId, $transfertId) : Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$rel = null;
if (null !== $transfertId) {
$rel = $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
$transfert = $rel->getTransfertAerien();
$edit = true;
} else {
$transfert = new TransfertAerien();
$edit = false;
}
$form = $this->createForm(TransfertAerienType::class, $transfert, []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$dateDepart = $form->get('dateDepart')->getData()." ".$form->get('heureDepart')->getData();
$dateArrive = $form->get('dateArrive')->getData()." ".$form->get('heureArrive')->getData();
$debut = \DateTime::createFromFormat("dmy Hi",$dateDepart);
$fin = \DateTime::createFromFormat("dmy Hi",$dateArrive);
if(!$debut || !$fin){
$this->addFlash(
'warning',
"Dates invalide"
);
return $this->redirectToRoute('dossier_close_modal', []);
}
$em = $this->getDoctrine()->getManager();
$plan = $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
$transfert->setDebutVol($debut);
$transfert->setFinVol($fin);
//$transfert->setPlanDeVol($plan);
$em->persist($transfert);
$em->flush();
if (null === $rel) {
// ajoute le lien avec le segment
$rel = new DossierSegmentTransfertAerien();
$rel->setSegment($segment);
$rel->setTransfertAerien($transfert);
$rel->setPlanDeVol($plan);
$em->persist($rel);
$em->flush();
}
$em->flush();
return $this->redirectToRoute('dossier_close_modal', []);
}
return $this->render('dossier/transfert/_transfert_edit.html.twig', [
'transfert' => $transfert
, 'form' => $form->createView()
, 'action' => 'Vols: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
, 'edit' => $edit
]);
}
/**
* @Route("/render/dossier/{id}/segment/{segmentId}/vols/new-transfert/{planId}", name="render_segment_vols_new_transfert" , methods={"GET","POST"})
* @Route("/render/dossier/{id}/segment/{segmentId}/vols/edit-transfert/{planId}", name="render_segment_vols_edit_transfert", methods={"GET","POST"})
*/
public function vols_new_transfert_render(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $planId) : Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$rel = null;
$transfert = new TransfertAerien();
$edit = true;
$form = $this->createForm(TransfertAerienType::class, $transfert, []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$dateDepart = $form->get('dateDepart')->getData()." ".$form->get('heureDepart')->getData();
$dateArrive = $form->get('dateArrive')->getData()." ".$form->get('heureArrive')->getData();
$debut = \DateTime::createFromFormat("dmy Hi",$dateDepart);
$fin = \DateTime::createFromFormat("dmy Hi",$dateArrive);
if(!$debut || !$fin){
$this->addFlash(
'warning',
"Dates invalide"
);
return $this->redirectToRoute('dossier_close_modal', []);
}
$em = $this->getDoctrine()->getManager();
$plan = $em->getRepository(DossierSegmentPlanDeVol::class)->findOneById($planId);
$transfert->setDebutVol($debut);
$transfert->setFinVol($fin);
$em->persist($transfert);
$em->flush();
if (null === $rel) {
// ajoute le lien avec le segment
$rel = new DossierSegmentTransfertAerien();
$rel->setSegment($segment);
$rel->setTransfertAerien($transfert);
$rel->setPlanDeVol($plan);
$em->persist($rel);
$em->flush();
}
$em->flush();
return $this->redirectToRoute('dossier_close_modal', []);
}
return $this->render('dossier/transfert/_transfert_edit.html.twig', [
'transfert' => $transfert
, 'form' => $form->createView()
, 'action' => 'Vols: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
, 'edit' => $edit
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vols/add" , name="segment_vols_new" , methods={"GET","POST"})
*/
public function vols_new(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId) : Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$entity = new PlanDeVol();
$form = $this->createForm(PlanDeVolFormType::class, $entity, []);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->addFlash(
'info',
"Enregistrement OK"
);
$em = $this->getDoctrine()->getManager();
$entity->setActif(1);
$em->persist($entity);
$relation = new DossierSegmentPlanDeVol();
$relation->setSegment($segment);
$relation->setPlanDeVol($entity);
$em->persist($relation);
$em->flush();
return $this->redirectToRoute('dossier_close_modal', []);
}
return $this->render('dossier/transfert/_plan_de_vol_edit.html.twig', [
'entity' => $entity
, 'form' => $form->createView()
, 'action' => 'Vols: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/transfert/{transfertId}/add-service/{serviceId}/{planId}" , name="segment_transfert_add_service" , methods={"GET","POST"})
*/
public function segment_transfert_add_service(Request $request, $id, EntityManagerInterface $em, TranslatorInterface $translator, CompanyService $companyService, $segmentId, $transfertId, $serviceId, $planId)
{
$data = array();
$transfert = $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
$service = $em->getRepository(SegService::class)->findOneById($serviceId);
$segment = $em->getRepository(DossierSegment::class)->findOneById($segmentId);
// Calcul de la date
$days = $service->getDossierSegmentServiceDays()->toArray();
$day = $days[0]->getJour();
$date = clone $segment->getDateDepart();
$dayDiff = $day - 1;
$dateInterval = new \DateInterval('P' . abs($dayDiff) . 'D');
if ($dayDiff < 0) $dateInterval->invert = 1;
$date->add($dateInterval);
$date = $date->format('d/m/Y');
$fournisseur = $companyService->getOneById($service->getService()->getPrestataireId());
$nomFournisseur = '';
if (null !== $fournisseur) {
$nomFournisseur = implode(" - ", array($fournisseur['nom'], $fournisseur['code_fournisseur']));
}
$exists = $em->getRepository(DossierSegmentTransfertAerienService::class)->findOneBy(array('TransfertAerien' => $transfert, 'DossierSegmentService' => $service, 'DossierSegment' => $segment));
//$paxesTransfert = $em->getRepository(DossierSegmentServicePax::class)->findBy(array('dossierSegmentService' => $service));
if (null === $exists) {
$relationService = new DossierSegmentTransfertAerienService();
$relationService->setTransfertAerien($transfert);
$relationService->setDossierSegment($segment);
$relationService->setDossierSegmentService($service);
$em->persist($relationService);
$em->flush();
$data = array(
'type' => $service->getService()->getType()->getLibelle()
, 'libelle' => implode(' - ', array_filter(array( $date, $nomFournisseur, substr($service->getService()->getLibelle(),0,10).'...')))
, 'color' => $service->getService()->getType()->getColor()
, 'id' => $service->getId()
);
// Calcul la différence des paxes
$inService = array();
$inTransfert = array();
$paxesService = $em->getRepository(DossierSegmentServicePax::class)->findBy(array('dossierSegmentService' => $service));
foreach ($paxesService as $row) {
$inService[] = $row->getDossierSegmentPax()->getId();
}
$paxesPlanDeVol = $em->getRepository(DossierSegmentTransfertAerienPax::class)->findBy(array('planDeVol' => $transfert->getPlanDeVol()));
foreach ($paxesPlanDeVol as $row) {
$inTransfert[] = $row->getSegmentPax()->getId();
}
$diff = array_diff($inService, $inTransfert);
if (count($diff) > 0) {
$data['diff'] = $diff;
}
}
$responseCode = 200;
$response = new Response(json_encode($data), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/transfert/{transfertId}/delete-service/{serviceId}" , name="segment_transfert_delete_service" , methods={"GET","POST"})
*/
public function segment_transfert_delete_service(Request $request, $id, EntityManagerInterface $em, TranslatorInterface $translator, $segmentId, $transfertId, $serviceId)
{
$data = array();
$transfert = $em->getRepository(DossierSegmentTransfertAerien::class)->findOneById($transfertId);
$service = $em->getRepository(SegService::class)->findOneById($serviceId);
$segment = $em->getRepository(DossierSegment::class)->findOneById($segmentId);
$exists = $em->getRepository(DossierSegmentTransfertAerienService::class)->findOneBy(array('TransfertAerien' => $transfert, 'DossierSegmentService' => $service, 'DossierSegment' => $segment));
if (null !== $exists) {
$em->remove($exists);
}
$em->flush();
$responseCode = 200;
$response = new Response(json_encode($data), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/services-lies", name="segment_services_lies", methods={"GET","POST"})
*/
public function services_lies(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, DossierSegmentService $segmentService, CompanyService $companyService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
$groupements = $em->getRepository(DossierSegmentServiceGroupement::class)->findForDrag($segment);
foreach ($groupements as &$rows) {
foreach ($rows as &$row) {
if (null !== $row->getService()->getService()) {
$fournisseur = $companyService->getOneById($row->getService()->getService()->getPrestataireId());
$row->setFournisseurData($fournisseur);
}
}
}
$template = 'dossier/liaisons-iframe.html.twig';
return $this->render($template, [
'dossier' => $dossier
, 'segment' => $segment
, 'groupes' => $groupements
, 'action' => 'Liaisons: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/services-lies/{serviceId}/delete" , name="segment_delete_service_lie" , methods={"GET","POST"})
*/
public function segment_delete_service_lie(Request $request, $id, EntityManagerInterface $em, TranslatorInterface $translator, $segmentId, $serviceId)
{
$data = array();
$service = $em->getRepository(DossierSegmentServiceGroupement::class)->findOneById($serviceId);
if (null !== $service) {
$em->remove($service);
}
$em->flush();
$responseCode = 200;
$response = new Response(json_encode($data), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/liaison/{serviceId}/{day}/groupement/{groupement}", name="segment_services_link", methods={"GET","POST"})
* @Route("/dossier/{id}/segment/{segmentId}/liaison/{serviceId}/{day}/groupement/", name="segment_services_link_new", methods={"GET","POST"}, defaults={"groupement"=null})
*/
public function services_link(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, $segmentId, $day, $serviceId, $groupement): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
$service = $em->getRepository(SegService::class)->find($serviceId);
$data = array('action' => 'edit');
if (null === $groupement) {
$groupement = $em->getRepository(DossierSegmentServiceGroupement::class)->setNewGroupement($segment);
$exists = null;
$data['action'] = 'new';
} else {
$exists = $em->getRepository(DossierSegmentServiceGroupement::class)->findOneBy(array('segment' => $segment, 'groupement' => intval($groupement), 'service' => $service));
}
if (null === $exists) {
$entity = new DossierSegmentServiceGroupement();
$entity->setSegment($segment);
$entity->setGroupement(intval($groupement));
$entity->setDay($day);
$entity->setService($service);
$em->persist($entity);
$em->flush();
$fournisseur = $companyService->getOneById($entity->getService()->getService()->getPrestataireId());
$libelle = array('Jour '.$day);
if (null !== $fournisseur) {
$libelle[] = implode(' ', array($fournisseur['nom'], $fournisseur['code_fournisseur']));
}
$libelle[] = $entity->getService()->getService()->getLibelle();
$data['id' ] = $entity->getId();
$data['type' ] = $entity->getService()->getService()->getType()->getLibelle();
$data['libelle'] = implode(' - ', $libelle);
$data['serviceId'] = $entity->getService()->getId();
$data['groupement'] = $groupement;
}
else {
$data['action'] = 'exists';
}
$responseCode = 200;
$response = new Response(json_encode($data), $responseCode);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/composition", name="segment_composition", methods={"GET","POST"})
*/
public function composition(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, DossierSegmentServiceService $segmentServiceService, PaxService $paxService, ServiceService $serviceService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
$instance = $this->getParameter('instance', 'wi');
$result = $segmentService->checkDuree($segment);
// Params
$savedIndex = $this->get('session')->get('compositionIndex', 1);
$index = $request->query->get('index', $savedIndex) == 2 ? $request->query->get('index', $savedIndex) : $savedIndex;
$newIndex = $request->request->get('index') ? $request->request->get('index') : $index;
$closeDays = $request->query->get('closeDays', false);
$newDayIndex = $request->query->get('newDayIndex', false);
$this->get('session')->set('compositionIndex', $newIndex);
// Recovery
$recoveryFrom = $request->get('recovery');
if($recoveryFrom)
{
$recovers = $segmentService->recoverServices($segment, $recoveryFrom);
if($recovers)
{
$this->addFlash(
'info',
$recovers . ' service(s) récupéré(s) !'
);
}
}
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Prestations
if(!$segment->getIsPrestationSeche())
{
$segment = $segmentService->setSiblingsData($segment);
}
// Check Days (ANPU Itinéraire V1)
/*
$result = $segmentService->checkDays($segment);
if ($result['diff']) {
$this->addFlash(
'warning',
'L\'itinéraire est composé de ' . $result['diff'] . ' jour(s) en plus que le paramètre prévu dans le segment !'
);
}
if ($result['newDaysCount']) {
if ($result == 1) {
$message = $result['newDaysCount'] . ' jour a été généré !';
} else {
$message = $result['newDaysCount'] . ' jours ont été générés !';
}
$this->addFlash(
'info',
$message
);
}
*/
$compositionDate = $segment->getDateDepart();
// Type
if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE)
{
$guideParDefaut = true;
} else {
$guideParDefaut = false;
}
if ($instance === 'wi') { // force à true pour WI
$guideParDefaut = true;
}
// Services
if ($index == 2) {
$services = $segmentService->getBySegmentForComposition($segment);
// MAJ Compo avec DATA sans Ajax
foreach($services as $type => $subData)
{
foreach($subData as $subDataIndex => $segmentServiceEntity)
{
// Sub Services
$params = [];
$params['tarifJour'] = $segmentServiceEntity->getTarifJour() ? "true" : "false";
$params['inclus'] = $segmentServiceEntity->getInclus() ? "true" : "false";
$params['payantPourGuide'] = $segmentServiceEntity->getPayantPourGuide() ? "true" : "false";
$params['payeWalkinn'] = $segmentServiceEntity->getPayeWalkinn() ? "true" : "false";
$params['compterGuide'] = $segmentServiceEntity->getCompterLeGuide() ? "true" : "false";
$params['compterGroupe'] = $segmentServiceEntity->getCompterLeGroupe() ? "true" : "false";
$parent = $segmentServiceEntity->getService();
$joursArray = $segmentServiceService->explodeDossierSegmentServiceJoursString($segmentServiceEntity->getJours());
if ($parent && $segment && count($joursArray) > 0)
{
$subServices = $em->getRepository(Service::class)->getByParentId($parent->getId());
$subServices = $serviceService->getSegmentSousServicesForComposition($segment, $joursArray, $subServices, $params);
} else {
$subServices = null;
}
$segmentServiceEntity->setSubServicesData($subServices);
// Paxes
$params = [];
$params['inclus'] = $segmentServiceEntity->getInclus() ? "true" : "false";
$params['compterGuide'] = $segmentServiceEntity->getCompterLeGuide() ? "true" : "false";
$params['compterGroupe'] = $segmentServiceEntity->getCompterLeGroupe() ? "true" : "false";
$paxes = $paxService->getForSegmentService($segmentServiceEntity, $params);
$segmentServiceEntity->setPaxesData($paxes);
// Total
$params = [];
$params['segment'] = $segment->getId();
$params['segmentService'] = $segmentServiceEntity->getId();
$params['jours'] = $segmentServiceEntity->getJours();
$params['tarifJour'] = $segmentServiceEntity->getTarifJour() ? "true" : "false";
$params['inclus'] = $segmentServiceEntity->getInclus() ? "true" : "false";
$params['payantPourGuide'] = $segmentServiceEntity->getPayantPourGuide() ? "true" : "false";
$params['payeWalkinn'] = $segmentServiceEntity->getPayeWalkinn() ? "true" : "false";
$params['compterGuide'] = $segmentServiceEntity->getCompterLeGuide() ? "true" : "false";
$params['compterGroupe'] = $segmentServiceEntity->getCompterLeGroupe() ? "true" : "false";
$params['quantite'] = $segmentServiceEntity->getQuantite();
$params['date'] = $segment->getDateDepart();
$service = $em->getRepository(Service::class)->findByParentId($segmentServiceEntity->getService()->getId());
$total = $serviceService->getTarifForSegmentComposition($service, $params);
$segmentServiceEntity->setTotalData($total);
}
}
$segment->setTransports($services['transports']);
$segment->setHebergements($services['hebergements']);
$segment->setActivites($services['activites']);
$segment->setRepas($services['repas']);
$segment->setGuides($services['guides']);
$segment->setDivers($services['divers']);
// Sup Single
$date = $segment->getDateDepart();
$supSingle = $segmentService->getSupSingle($segment, $date);
$segment->setSupSingleData($supSingle);
$rooming = $segmentService->getRoomingBySegmentForComposition($segment);
$activitiesTypes = false;
$form = $this->createForm(DossierSegmentCompositionTypesFormType::class, $segment, array('instance' => $instance));
} else {
$services = $segmentService->getBySegmentDayByDay($segment);
$segment->setDaysJourParJour($services['days']);
$rooming = false;
$activitiesTypes = $em->getRepository(EditorialCategorie::class)->findActivites();
$form = $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment, array('instance' => $instance));
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Gestion dans service
if ($index == 2) {
$data = $form->getData();
if (!empty($data)) {
$segmentService->checkFormData($services, $data, $segment);
}
$segment->setIsCompoValide(1);
} else
{
$data = $request->request->all();
if (!empty($data)) {
$segmentService->checkDaysFormData($services, $data, $segment);
}
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le voyage " . $segment->getLibelle() . ' est mis à jour !'
);
$result = $segmentService->checkDuree($segment);
if ($result) {
$this->addFlash(
'warning',
'La durée du segment a été mise à jour !'
);
}
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
} else if ($form->isSubmitted() && !$form->isValid()) {
// Message
$this->addFlash(
'warning',
"Les informations n\'ont PAS été mises à jour !"
);
// Erreurs
foreach ($form->getErrors(true) as $formError) {
$currentError = $formError->getMessage();
foreach($formError->getMessageParameters() as $formErrorParameter) {
$currentError .= " - " . $formErrorParameter;
}
$this->addFlash(
'warning',
$currentError
);
}
}
/*
if ($result['newDaysCount']) {
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
}
*/
return $this->render('dossier/composition.html.twig', [
'dossier' => $dossier,
'linked' => $linked,
'segment' => $segment,
'rooming' => $rooming,
'activitiesTypes' => $activitiesTypes,
'client' => $client,
'form' => $form->createView(),
'action' => 'Composition: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'retour' => 'dossier_index',
'compositionDate' => $compositionDate,
'guideParDefaut' => $guideParDefaut,
'index' => $index,
'closeDays' => $closeDays,
'newDayIndex' => $newDayIndex,
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/roadbook", name="segment_roadbook", methods={"GET","POST"})
*/
public function roadbook(Request $request, UserService $userService, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, DossierSegmentServiceService $segmentServiceService, PaxService $paxService, ServiceService $serviceService, DocumentService $documentService): Response
{
// dd($request->request->all());
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
$instance = $this->getParameter('instance', 'wi');
$result = $segmentService->checkDuree($segment);
// Params
$index = 1;
$newIndex = $request->request->get('index') ? $request->request->get('index') : $index;
$closeDays = $request->query->get('closeDays', false);
$newDayIndex = $request->query->get('newDayIndex', false);
// Recovery
$recoveryFrom = $request->get('recovery');
if($recoveryFrom)
{
$recovers = $segmentService->recoverServices($segment, $recoveryFrom);
if($recovers)
{
$this->addFlash(
'info',
$recovers . ' service(s) récupéré(s) !'
);
}
}
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Prestations
if(!$segment->getIsPrestationSeche())
{
$segment = $segmentService->setSiblingsData($segment);
}
$compositionDate = $segment->getDateDepart();
// Type
if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE)
{
$guideParDefaut = true;
} else {
$guideParDefaut = false;
}
if ($instance === 'wi') { // force à true pour WI
$guideParDefaut = true;
}
$rooming = false;
$activitiesTypes = $em->getRepository(EditorialCategorie::class)->findActivites();
$form = $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment, array('instance' => $instance));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$dossier = $segment->getDossier();
// suppression anciennes lignes
// $arrItems = $em->getRepository(RoadmapItem::class)->findBy(['dossier' => $dossier]);
// foreach($arrItems as $item) {
// $em->remove($item);
// }
// ajout/edit lignes roadmap
foreach($request->request->all() as $key => $value) {
if (strpos($key, 'roadbook_pos_') !== false) {
$sp = explode('_', $key);
$jour = $sp[2];
$uid = $sp[3];
$objDoc = null;
if(is_numeric($uid)) {
$idDoc = intval($uid);
$objDoc = $em->getRepository(EditorialDocument::class)->find($idDoc);
$sharepointId = $objDoc ? $objDoc->getSharepointId() : null;
}
else {
$sharepointId = $uid;
}
$objItem = $em->getRepository(RoadmapItem::class)->findByDossierJourAndSharepointId($dossier, $jour, $sharepointId);
if(is_null($objItem)) {
$objItem = new RoadmapItem();
}
if(!is_null($objDoc)) {
$objItem->setDocument($objDoc);
}
$objItem->setDossier($dossier);
$objItem->setOrdre($value);
$objItem->setJour($jour);
$em->persist($objItem);
}
}
$em->flush();
if($request->request->get("download") !== "1") {
$this->addFlash(
'success',
"Composition du roadbook sauvegardée avec succès."
);
if(!is_null($request->request->get("redirect"))) {
return $this->redirect($request->request->get("redirect"));
}
}
// Téléchargement du roadbook
else {
$token = $userService->getUserOfficeToken($this->getUser());
return $documentService->generateDossierRoadbook($dossier, $token);
}
} else if ($form->isSubmitted() && !$form->isValid()) {
// Message
$this->addFlash(
'warning',
"Les informations n\'ont PAS été mises à jour !"
);
// Erreurs
foreach ($form->getErrors(true) as $formError) {
$currentError = $formError->getMessage();
foreach($formError->getMessageParameters() as $formErrorParameter) {
$currentError .= " - " . $formErrorParameter;
}
$this->addFlash(
'warning',
$currentError
);
}
}
// Services
$langue = isset(explode("_", $client["default_lang"])[1]) ? explode("_", $client["default_lang"])[1] : "GB";
$services = $segmentService->getBySegmentDayByDay($segment, $langue);
$segment->setDaysJourParJour($services['days']);
// dd($services['activites_documents']);
return $this->render('dossier/composition_roadbook.html.twig', [
'dossier' => $dossier,
'linked' => $linked,
'segment' => $segment,
'rooming' => $rooming,
'activitiesTypes' => $activitiesTypes,
'client' => $client,
'form' => $form->createView(),
'action' => 'Composition: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'retour' => 'dossier_index',
'compositionDate' => $compositionDate,
'guideParDefaut' => $guideParDefaut,
'index' => $index,
'closeDays' => $closeDays,
'newDayIndex' => $newDayIndex,
'roadbook' => $services['activites_documents'],
'langue' => $langue
]);
}
/**
* @Route("/dossier/{id}/dossier-guide/fiche-recapitulative", name="fiche_recapitulative_guide", methods={"GET","POST"})
*/
public function ficheRecapitulative(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$guideNames = array();
$montant = 0 ;
foreach ($dossier->getDossierSegments() as $segment) {
$guides = $segment->getDossierSegmentGuidesActifs();
if (null !== $guides) {
foreach ($guides as $guide) {
$guideNames[] = $guide->getLibelle();
}
$guideNames = array_unique($guideNames);
}
// traite le montant payé guide
$services = $em->getRepository(SegService::class)->findBy(array('segment' => $segment, 'actif' => 1, 'payeWalkinn' => 0));
if (null !== $services) {
foreach ($services as $service) {
$montant = $montant + $service->getPrixAchatFixe();
}
}
}
$segment = $dossier->getDossierSegments()[0];
$client = $companyService->getOneById($segment->getClientId());
return $this->render('document-generator/fiche-recapitulative.html.twig', [
'dossier' => $dossier,
//'linked' => $linked ,
'segment' => $segment,
'client' => $client ,
'guideNames' => $guideNames,
'montant' => ceil($montant/10)*10 // il faut arrondir aux 10 euros supérieur
]);
}
/**
* @Route("/dossier/{id}/dossier-guide/budget-guide", name="budget_guide", methods={"GET","POST"})
*/
public function ficheBudgetGuide(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService, DossierSegmentServiceService $segmentServiceService, ServiceService $serviceService, PaxService $paxService, VoyageService $voyageService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$guideNames = array();
$montant = 0 ;
$mesServices = array();
$devise = array();
foreach ($dossier->getDossierSegments() as $seg) {
$guides = $seg->getDossierSegmentGuidesActifs();
if (null !== $guides) {
foreach ($guides as $guide) {
$guideNames[] = $guide->getLibelle();
}
$guideNames = array_unique($guideNames);
}
// traite le montant payé guide
$services = $em->getRepository(SegService::class)->findBy(array('segment' => $seg, 'actif' => 1, 'payeWalkinn' => 0), array('ordre'=>'ASC'));
if (null !== $services) {
foreach ($services as $service) {
if (null !== $service->getService()) {
$paxData = array();
$paxes = $em->getRepository(DossierSegmentServicePax::class)->findBy(array('actif' => 1, 'dossierSegmentService' => $service));
foreach ($paxes as $pax) {
if ($pax->getDossierSegmentPax()->getPaxType()->getId() != \App\Enum\PaxType::GUIDE_ID) {
$isInclude = 0;
foreach ($paxData as $test)
{
if ($test->getDossierSegmentPax()->getLibelle() == $pax->getDossierSegmentPax()->getLibelle())
{
$isInclude = 1;
}
}
if ($isInclude == 0)
$paxData[] = $pax;
} else {
if ( $service->getPayantPourGuide() == true) {
$isInclude = 0;
foreach ($paxData as $test)
{
if ($test->getDossierSegmentPax()->getLibelle() == $pax->getDossierSegmentPax()->getLibelle())
{
$isInclude = 1;
}
}
if ($isInclude == 0)
$paxData[] = $pax;
}
}
}
$service->setPaxesData( count($paxData) );
// Converti le tarif en fonction de la devise du fournisseur
//$prix = (null === $service->getPrixAchatFixeDevises()) ? $service->getPrixAchatFixe() : $service->getPrixAchatFixeDevises();
$devise = $voyageService->getPrestataireDeviseByService($service->getService());
//if (array_key_exists('multicurrency_code', $devise) && null !== $devise['multicurrency_code'] ) {
//$prix = $em->getRepository(ChangePeriode::class)->getConvertByDevise( $prix, $devise['multicurrency_code'] );
//$service->setPrixAchatFixeDevises($prix);
//}
// Retrouve les dates par services
$arrLesDates = array();
foreach ($seg->getDaysJourParJour() as $jour) {
if (array_key_exists('services', $jour) && null !== $jour['services']) {
foreach ($jour['services'] as $serviceDay) {
if ($serviceDay->getId() === $service->getId()) {
$arrLesDates[] = $jour['datee'] ;
}
}
}
}
$laDate = new \Datetime() ;
$strOrdered = $laDate->format('Y-m-d');
if (count($arrLesDates) > 0) {
$laDate = new \Datetime($arrLesDates[0]);
$strOrdered = $laDate->format('Y-m-d');
foreach ($arrLesDates as &$date) {
$date = new \Datetime($date);
$date = $date->format('d/m');
}
} else {
$arrLesDates[] = $laDate->format('Y-m-d');
}
$service->setDates(implode('<br>', $arrLesDates));
$mesServices[$strOrdered][$service->getService()->getType()->getLibelle()][] = $service;
}
}
}
}
// tri par date
ksort($mesServices);
$sortedServices = array();
foreach ($mesServices as $key1 => $serv) {
foreach ($serv as $key => $ser) {
foreach ($ser as $se) {
$sortedServices[$key][] = $se;
}
}
}
$segment = $dossier->getDossierSegments()[0];
$client = $companyService->getOneById($segment->getClientId());
return $this->render('document-generator/fiche-budget-guide.html.twig', [
'dossier' => $dossier,
//'linked' => $linked ,
'segment' => $segment,
'client' => $client ,
'guideNames' => $guideNames,
'mesServices'=> $sortedServices,
'devise' => (array_key_exists('symbol', $devise) && null !== $devise['symbol']) ? $devise['symbol'] : '€',
'montant' => ($montant > 0) ? ceil($montant/10)*10 : 0 // il faut arrondir aux 10 euros supérieur
]);
}
/**
* @Route("/dossier/{id}/dossier-guide/prestataires", name="prestataire_guide", methods={"GET","POST"})
*/
public function prestatairesGuide(Request $request, EntityManagerInterface $em, Dossier $dossier, DossierService $dossierService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$dossier = $dossierService->setDataForAchats($dossier);
return $this->render('document-generator/liste-prestataires-guide.html.twig', [
'dossier' => $dossier,
]);
}
/**
* @Route("/dossier/{id}/dossier-guide/intro", name="intro_guide", methods={"GET","POST"})
*/
public function introDossierGuide(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$dates = array();
$paxes = array();
foreach ($dossier->getDossierSegments() as $segment) {
// Trouve les dates
$dates[] = $segment->getDateDepart()->format('Y-m-d');
$dates[] = $segment->getDateFin()->format('Y-m-d');
$paxes[] = count($segment->getDossierSegmentPaxesActifs());
}
// Traitement des dates
sort($dates);
$dateDebut = array_shift($dates);
$dateFin = array_pop($dates);
// Traitement nombre de pax
sort($paxes);
// Utilise le premier segment pour récupérer les infos du voyage/client
$segment = $dossier->getDossierSegments()[0];
$projet_dir = $this->getParameter('kernel.project_dir');
$rootDir = $this->getParameter('doli_root');
// Client
$client = $companyService->getOneById($segment->getClientId());
$logoTo = $rootDir."/documents/societe/".$client['rowid']."/logos/".$client['logo'];
if (is_file($logoTo)) {
$temp = \sys_get_temp_dir().'/'.$client['rowid'].$client['logo'];
if (copy($logoTo, $temp)) {
$client['logo'] = $temp;
}
}
$dates = array(implode('/', array_reverse(explode('-', $dateDebut))), implode('/', array_reverse(explode('-', $dateFin))));
return $this->render('document-generator/intro-dossier-guide.html.twig', [
'dossier' => $dossier,
//'linked' => $linked ,
'segment' => $segment,
'client' => $client ,
'dates' => $dates ,
'nombrePax' => array_pop($paxes),
]);
}
/**
* @Route("/dossier/{id}/dossier-guide-saving", name="guide_save", methods={"GET","POST"})
*/
public function save_guide(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$htmlContent = $request->request->get('html', false);
if (false === $htmlContent) {
throw $this->createNotFoundException("Le HTTML n'a pas été fourni");
}
if (null === $dossier->getDossierGuide()) {
$dossierGuide = new DossierGuide();
$dossierGuide->setHtml($htmlContent);
$dossier->setDossierguide($dossierGuide);
$this->getDoctrine()->getManager()->persist($dossierGuide);
}
else {
$dossierGuide = $dossier->getDossierGuide();
$dossierGuide->setHtml($htmlContent);
}
$this->getDoctrine()->getManager()->flush();
$data = json_encode(array(true), TRUE);
$response = new Response($data, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/dossier-guide-get", name="guide_get", methods={"GET","POST"})
*/
public function get_guide(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
if (null !== $dossier->getDossierGuide()) {
$html = $dossier->getDossierGuide()->getHtml();
}
$data = json_encode(array('html' => $html), TRUE);
$response = new Response($data, 200);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/dossier-guide", name="guide", methods={"GET","POST"})
*/
public function guide(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$htmlContent = $request->request->get('html', false);
if (false === $htmlContent) {
throw $this->createNotFoundException("Le HTTML n'a pas été fourni");
}
$htmlContent = str_replace('<!-- pagebreak -->', '<div style="display:block; clear:both; page-break-after:always;" class="mce-pagebreak"></div>', $htmlContent);
// chaque page transformé en pdf
//$projet_dir = $this->params->get('kernel.project_dir'); // "/var/www/intura-erp/htdocs/symfony"
$projet_dir = $this->getParameter('kernel.project_dir');
$file = tmpfile();
$path = stream_get_meta_data($file)['uri'].'.html';
// Crée le fichier html
$header = '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
html body *
{
visibility: hidden;
font-size: 100%;
/* height: 0px; */
}
html body table ,
html body table * ,
html body h4 span ,
html body h5
{
visibility: visible;
height: auto;
margin: 10px 0;
}
html body table button
{
visibility: hidden;
}
html body table {
border: 1px solid black;
border-collapse: collapse;
margin: 10px auto;
}
html body table th,
html body table td,
table th,
table td
{
border: 1px solid black;
padding: 5px;
margin: 0;
font-size: 90%;
}
.page {
page-break-before: always;
}
.modal ,
.align-items-center {
display: none;
}
/*
html body #rooming--container table td:first-child,
html body #rooming--container table th:first-child
{
display: none;
}
*/
.visible,
.visible * {
visibility: visible;
}
.hide {
display: none;
}
.badge {
border: 1px solid black;
}
h5 {
margin: 15px 0;
}
</style></head><body>';
$footer = '</body></html>';
$html = implode('', array($header, $htmlContent, $footer));
$html = str_replace('/symfony', $projet_dir, $html);
$html = str_replace('badge-info', '', $html);
file_put_contents($path, $html);
// Retrouve la référence du dossier
$commandeRef = $dossier->getCodeWalkinn();
if (!is_dir('uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers')) {
mkdir('uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers', 0777, true);
}
$dest = 'uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers/vue-guide.pdf';
// Convertit le html to pdf
`wkhtmltopdf --margin-top 10 --margin-bottom 10 --margin-left 10 --margin-right 10 --print-media-type --enable-local-file-access {$path} {$dest}`;
$dest = '/symfony/public/'.$dest;
$data = json_encode($dest, TRUE);
$code = 200;
$response = new Response($data, $code);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/download-dossier-guide", name="guide_download", methods={"GET","POST"})
*/
public function guide_download(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$projet_dir = $this->getParameter('kernel.project_dir');
// Retrouve la référence du dossier
$commandeRef = $dossier->getCodeWalkinn();
$dest = 'uploads/Dossier/'.$commandeRef.'/arbo/Documents_divers/vue-guide.pdf';
if (!is_file($dest)) {
$code = 404;
$dest = "Le fichier pdf n'a pas été trouvé";
}
else {
$code = 200;
$dest = '/symfony/public/'.$dest;
}
$data = json_encode($dest, TRUE);
$response = new Response($data, $code);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/dossier-guide-html", name="guide_html", methods={"GET","POST"})
*/
public function guide_html(Request $request, EntityManagerInterface $em, Dossier $dossier, CompanyService $companyService, DossierSegmentService $segmentService, DocumentGeneratorService $documentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$pdfFiles = array();
$responses = array();
// #1 Ajoute la page de couverture
$response = $this->forward('App\Controller\DossierController::introDossierGuide', [
'request' => $request,
'id' => $dossier,
]);
$responses[] = '<div class="">' . $response->getContent() .'</div>';
// #2 Ajoute les plans de vols au pdf
$responses[] = '<!-- pagebreak --><div>'; // Sur une nouvelle page
$n = 0;
foreach ($dossier->getDossierSegments() as $segment) {
$write = false;
if (true !== $segment->GetIsPrestationSeche()) {
if ( count($segment->getDossierSegmentPlanDeVols()) > 0 ) {
foreach ($segment->getDossierSegmentPlanDeVols() as $planDeVol) {
if (count($planDeVol->getDossierSegmentTransfertAeriens()) > 0 ) {
$write = true;
}
}
if ( true === $write ) {
$response = $this->forward('App\Controller\DossierController::vols', [
'request' => $request,
'id' => $dossier,
'segmentId' => $segment->getId(),
'isIframe' => true,
'parent' => 'vueGuide',
'pdt' => false
]);
$regex = '~(<body[^>]*>)(.*)(</body>)~s';
preg_match_all($regex, $response->getContent(), $out);
if (array_key_exists(3, $out) && count($out) > 2) {
if ($n != 0) {
$responses[] = '<hr class="visible" style="margin: 40px 0">'; // Sépare les segment avec <HR> cf mail emmanuel 24/06/21
}
$responses[] = '<h2 style="visibility: visible; font-weight: bold;">'.'Plan de vols'.'</h2>' . str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
}
$n++;
}
}
}
}
$responses[] = '</div>';
// #3 Ajoute les paxs au pdf
$responses[] = '<!-- pagebreak --><div>'; // Sur une nouvelle page
$n = 0;
foreach ($dossier->getDossierSegments() as $segment) {
if (true !== $segment->GetIsPrestationSeche()) {
$dateDepart = $segment->getDateDepart()->format('d/m/Y');
$dateArrivee = (clone $segment->getDateDepart())->modify('+'.($segment->getNbJours() -1 ).' day')->format('d/m/Y');
$response = $this->forward('App\Controller\DossierController::rooming', [
'request' => $request,
'id' => $dossier,
'segmentId' => $segment->getId(),
'iframe' => true,
'parent' => 'vueGuide'
]);
$regex = '~(<body[^>]*>)(.*)(</body>)~s';
preg_match_all($regex, $response->getContent(), $out);
if (array_key_exists(3, $out) && count($out) > 2) {
if ($n != 0) {
$responses[] = '<hr class="visible" style="margin: 40px 0">'; // Sépare les segment avec <HR> cf mail emmanuel 24/06/21
}
$responses[] = '<h2 style="visibility: visible; font-weight: bold;">'.'Rooming list'.'</h2><h3 style="visibility: visible; font-weight: bold;">'.$dateDepart.' - '.$dateArrivee.'</h3>' . str_replace(array($out[1][0], $out[3][0]), array(''), $out[2][0]);
}
$n++;
}
}
$responses[] = '</div>';
// #4 Ajoute la vue guide au pdf
$segmentsIds = $dossier->getDossierSegments()
->filter(function (DossierSegment $segment) {
return !$segment->getIsPrestationSeche();
})
->map(function (DossierSegment $segment) {
return $segment->getId();
});
$responses[] = $this->renderVueGuideMultiSegment($segmentsIds->toArray());
// Ancienne méthode (pas possible de fusionner les différents jorus des segments)
// foreach ($dossier->getDossierSegments() as $segment) {
// if (true !== $segment->getIsPrestationSeche()) {
// $response = $this->forward('App\Controller\DossierController::vueGuide', [
// 'request' => $request,
// 'id' => $dossier,
// 'segmentId' => $segment->getId(),
// 'parent' => 'vueGuide'
// ]);
// $responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Programme'.' '.$segment->getLibelle().'</h2>'.$response->getContent().'</div>';
// }
// }
// #5 Ajoute la fiche recapitulative des dépenses au pdf
$response = $this->forward('App\Controller\DossierController::ficheRecapitulative', [
'request' => $request,
'id' => $dossier,
]);
$responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Fiche récapitulative des dépenses'.'</h2>' . $response->getContent() .'</div>';
// #6 Ajoute la fiche budget-guide au pdf
$response = $this->forward('App\Controller\DossierController::ficheBudgetGuide', [
'request' => $request,
'id' => $dossier,
]);
$responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Fiche budget guide'.'</h2>' . $response->getContent() .'</div>';
// #7 Ajoute la liste des prestataires
$response = $this->forward('App\Controller\DossierController::prestatairesGuide', [
'request' => $request,
'id' => $dossier,
]);
$responses[] = '<!-- pagebreak --><div><h2 style="visibility: visible; font-weight: bold;">'.'Liste des prestataires'.'</h2>' . $response->getContent() .'</div>';
$htmlContent = implode('', $responses);
$data = json_encode($htmlContent, TRUE);
$code = 200;
$response = new Response($data, $code);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vue-guide-pdt", name="segment_vue_guide_pdt", methods={"GET","POST"}, defaults={"parent" = null})
*/
public function vueGuidePdt(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, $parent = null, $fournList = [], $pdt = false): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
throw $this->createNotFoundException("Aucun client trouvé pour le segment !");
}
$result = $segmentService->checkDuree($segment);
// Params
$savedIndex = $this->get('session')->get('compositionIndex', 1);
$index = $request->query->get('index', $savedIndex) == 2 ? $request->query->get('index', $savedIndex) : $savedIndex;
$newIndex = $request->request->get('index') ? $request->request->get('index') : $index;
$this->get('session')->set('compositionIndex', $newIndex);
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Prestations
if(!$segment->getIsPrestationSeche())
{
$segment = $segmentService->setSiblingsData($segment);
}
$compositionDate = $segment->getDateDepart();
// Type
if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE)
{
$guideParDefaut = true;
} else {
$guideParDefaut = false;
}
$fournisseurs = array();
$services = $segmentService->getBySegmentDayByDay($segment);
if (array_key_exists('days', $services) && count($services['days']) > 0) {
foreach ($services['days'] as $day) {
if (array_key_exists('services', $day) && (null !== $day['services']) && count($day['services']) > 0) {
foreach ($day['services'] as $service) {
$fournisseur = $companyService->getOneById($service->getService()->getPrestataireId());
$fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
}
foreach ($day['activites'] as $service) {
if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
$fournisseur = $companyService->getOneById($service->getEditorial()->getSocieteId());
$fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
}
}
}
}
}
$segment->setDaysJourParJour($services['days']);
$theDays = array();
foreach ($segment->getDaysJourParJour() as $key => $theDay) {
$array = array();
if (array_key_exists('activites', $theDay) && null !== $theDay['activites']) {
foreach ($theDay['activites'] as $activite) {
if (true === $activite->getIsVueGuide()) {
$arr = array(
'currentType' => 3
, 'isPrestation' => $activite->getIsPrestation()
, 'segmentId' => $activite->getDossierSegment()->getId()
, 'id' => $activite->getId()
, 'ordre' => $activite->getOrdre()
, 'libelle' => $activite->getEditorialContenu()->getLibelle()
, 'note' => $activite->getNote()
, 'isVueGuide' => $activite->getIsVueGuide()
, 'payeWalkinn' => ''
, 'fournisseur' => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
);
$array[] = $arr;
}
}
}
if (array_key_exists('services', $theDay) && null !== $theDay['services']) {
foreach ($theDay['services'] as $service) {
if (true === $service->getIsVueGuide()) {
$arr = array(
'currentType' => $service->getService()->getType()->getId()
, 'isPrestation' => $service->getIsPrestation()
, 'segmentId' => $service->getSegment()->getId()
, 'id' => $service->getId()
, 'ordre' => $service->getOrdre()
, 'libelle' => $service->getService()->getLibelle()
, 'note' => $service->getNote()
, 'isVueGuide' => $service->getIsVueGuide()
, 'payeWalkinn' => (true === $service->getPayeWalkinn()) ? 'Walkinn' : 'Guide'
, 'fournisseur' => $fournisseurs[$service->getService()->getPrestataireId()]
);
$array[] = $arr;
}
}
}
if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
usort($array, function ($item1, $item2) {
return $item1['ordre'] <=> $item2['ordre'];
});
}
$theDays[$key] = $array;
}
$rooming = false;
$activitiesTypes = $em->getRepository(EditorialCategorie::Class)->findActivites();
$form = $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Gestion dans service
if ($index == 2) {
$data = $form->getData();
if (!empty($data)) {
$segmentService->checkFormData($services, $data, $segment);
}
$segment->setIsCompoValide(1);
} else
{
$data = $request->request->all();
if (!empty($data)) {
$segmentService->checkDaysFormData($services, $data, $segment);
}
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le voyage " . $segment->getLibelle() . ' est mis à jour !'
);
$result = $segmentService->checkDuree($segment);
if ($result) {
$this->addFlash(
'warning',
'La durée du segment a été mise à jour !'
);
}
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
} else if ($form->isSubmitted() && !$form->isValid()) {
// Message
$this->addFlash(
'warning',
"Les informations n\'ont PAS été mises à jour !"
);
// Erreurs
foreach ($form->getErrors(true) as $formError) {
$currentError = $formError->getMessage();
foreach($formError->getMessageParameters() as $formErrorParameter) {
$currentError .= " - " . $formErrorParameter;
}
$this->addFlash(
'warning',
$currentError
);
}
}
/*
if ($result['newDaysCount']) {
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
}
*/
return $this->render('dossier/vue-guide-pdt.html.twig', [
'dossier' => $dossier,
'linked' => $linked,
'segment' => $segment,
'theDays' => $theDays, // Contient les services/activités ordonnés par jour
'rooming' => $rooming,
'activitiesTypes' => $activitiesTypes,
'client' => $client,
'fournisseurs' => $fournisseurs,
'form' => $form->createView(),
'action' => 'Composition: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'retour' => 'dossier_index',
'compositionDate' => $compositionDate,
'guideParDefaut' => $guideParDefaut,
'index' => $index,
'parent' => $parent,
'fournList' => $fournList,
'pdt' => $pdt
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/vue-guide", name="segment_vue_guide", methods={"GET","POST"}, defaults={"parent" = null})
*/
public function vueGuide(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService, $parent = null): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
/** @var DossierSegment $segment */
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
throw $this->createNotFoundException("Aucun client trouvé pour le segment !");
}
$result = $segmentService->checkDuree($segment);
// Params
$savedIndex = $this->get('session')->get('compositionIndex', 1);
$index = $request->query->get('index', $savedIndex) == 2 ? $request->query->get('index', $savedIndex) : $savedIndex;
$newIndex = $request->request->get('index') ? $request->request->get('index') : $index;
$this->get('session')->set('compositionIndex', $newIndex);
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
// Prestations
if(!$segment->getIsPrestationSeche())
{
$segment = $segmentService->setSiblingsData($segment);
//$segment = $segmentService->setAllData($segment);
}
$compositionDate = $segment->getDateDepart();
// Type
if ($segment->getVoyage() && $segment->getVoyage()->getVoyageType() && $segment->getVoyage()->getVoyageType()->getId() == VoyageTypeEnum::GUIDE)
{
$guideParDefaut = true;
} else {
$guideParDefaut = false;
}
$fournisseurs = array();
$services = $segmentService->getBySegmentDayByDay($segment);
if (array_key_exists('days', $services) && count($services['days']) > 0) {
foreach ($services['days'] as $day) {
if (array_key_exists('services', $day) && (null !== $day['services']) && count($day['services']) > 0) {
foreach ($day['services'] as $service) {
$fournisseur = $companyService->getOneById($service->getService()->getPrestataireId());
$fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
}
foreach ($day['activites'] as $service) {
if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
$fournisseur = $companyService->getOneById($service->getEditorial()->getSocieteId());
$fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
}
}
}
}
}
$theDays = $this->getVueGuideDaysInfos($segment);
// /** @var DossierSegment $segment */
// $segment->setDaysJourParJour($services['days']);
//
// $theDays = array();
//
// foreach ($segment->getDaysJourParJour() as $key => $theDay) {
// $array = array();
//
// if (array_key_exists('activites', $theDay) && null !== $theDay['activites']) {
// foreach ($theDay['activites'] as $activite) {
// if (true === $activite->getIsVueGuide()) {
// $arr = array(
// 'currentType' => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getId() : ""
// , 'currentTypeLabel' => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getLibelle() : ""
// , 'date' => $theDay['datee']
// , 'isPrestation' => $activite->getIsPrestation()
// , 'segmentId' => $activite->getDossierSegment()->getId()
// , 'isPrestationSeche' => $activite->getDossierSegment()->getIsPrestationSeche()
// , 'id' => $activite->getId()
// , 'ordre' => $activite->getOrdre()
// , 'libelle' => (null !== $activite->getEditorialContenu()) ? $activite->getEditorialContenu()->getLibelle() : ''
// , 'note' => $activite->getNote()
// , 'isVueGuide' => $activite->getIsVueGuide()
// , 'payeWalkinn' => ''
// , 'type' => 'activite'
// , 'fournisseur' => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
// );
// $array[] = $arr;
// }
// }
// }
// if (array_key_exists('services', $theDay) && null !== $theDay['services']) {
// foreach ($theDay['services'] as $service) {
// if (true === $service->getIsVueGuide()) {
// $arr = array(
// 'currentType' => $service->getService()->getType()->getId()
// , 'currentTypeLabel' => $service->getService()->getType()->getLibelle()
// , 'date' => $theDay['datee']
// , 'isPrestation' => $service->getIsPrestation()
// , 'segmentId' => $service->getSegment()->getId()
// , 'isPrestationSeche' => $service->getSegment()->getIsPrestationSeche()
// , 'id' => $service->getId()
// , 'ordre' => $service->getOrdre()
// , 'libelle' => $service->getService()->getLibelle()
// , 'note' => $service->getNote()
// , 'isVueGuide' => $service->getIsVueGuide()
// , 'payeWalkinn' => (true === $service->getPayeWalkinn()) ? 'Walkinn' : 'Guide'
// , 'type' => 'service'
// , 'fournisseur' => $fournisseurs[$service->getService()->getPrestataireId()]
// );
// $array[] = $arr;
// }
// }
// }
//
// if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
// usort($array, function ($item1, $item2) {
// return $item1['ordre'] <=> $item2['ordre'];
// });
// }
// $theDays[$key] = $array;
// }
$rooming = false;
$activitiesTypes = $em->getRepository(EditorialCategorie::Class)->findActivites();
$form = $this->createForm(DossierSegmentCompositionDaysFormType::class, $segment);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Gestion dans service
if ($index == 2) {
$data = $form->getData();
if (!empty($data)) {
$segmentService->checkFormData($services, $data, $segment);
}
$segment->setIsCompoValide(1);
} else
{
$data = $request->request->all();
if (!empty($data)) {
$segmentService->checkDaysFormData($services, $data, $segment);
}
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le voyage " . $segment->getLibelle() . ' est mis à jour !'
);
$result = $segmentService->checkDuree($segment);
if ($result) {
$this->addFlash(
'warning',
'La durée du segment a été mise à jour !'
);
}
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
} else if ($form->isSubmitted() && !$form->isValid()) {
// Message
$this->addFlash(
'warning',
"Les informations n\'ont PAS été mises à jour !"
);
// Erreurs
foreach ($form->getErrors(true) as $formError) {
$currentError = $formError->getMessage();
foreach($formError->getMessageParameters() as $formErrorParameter) {
$currentError .= " - " . $formErrorParameter;
}
$this->addFlash(
'warning',
$currentError
);
}
}
/*
if ($result['newDaysCount']) {
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'index' => $newIndex
]);
}
*/
return $this->render('dossier/vue-guide.html.twig', [
'dossier' => $dossier,
'linked' => $linked,
'segment' => $segment,
'theDays' => $theDays, // Contient les services/activités ordonnés par jour
'rooming' => $rooming,
'activitiesTypes' => $activitiesTypes,
'client' => $client,
'fournisseurs' => $fournisseurs,
'form' => $form->createView(),
'action' => 'Composition: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle(),
'retour' => 'dossier_index',
'compositionDate' => $compositionDate,
'guideParDefaut' => $guideParDefaut,
'index' => $index,
'parent' => $parent
]);
}
private function getVueGuideDaysInfos(DossierSegment $segment)
{
if (!$segment->getClientId()) {
throw $this->createNotFoundException("Aucun client trouvé pour le segment !");
}
$result = $this->dossierSegmentService->checkDuree($segment);
// Prestations
if(!$segment->getIsPrestationSeche()) {
$segment = $this->dossierSegmentService->setSiblingsData($segment);
}
$fournisseurs = array();
$services = $this->dossierSegmentService->getBySegmentDayByDay($segment);
if (array_key_exists('days', $services) && count($services['days']) > 0) {
foreach ($services['days'] as $day) {
if (array_key_exists('services', $day) && (null !== $day['services']) && count($day['services']) > 0) {
foreach ($day['services'] as $service) {
$fournisseur = $this->companyService->getOneById($service->getService()->getPrestataireId());
$fournisseurs[$service->getService()->getPrestataireId()] = $fournisseur['four_nom'];
}
foreach ($day['activites'] as $service) {
if (null !== $service->getEditorial() && null !== $service->getEditorial()->getSocieteId() ) {
$fournisseur = $this->companyService->getOneById($service->getEditorial()->getSocieteId());
$fournisseurs[$service->getEditorial()->getSocieteId()] = $fournisseur['four_nom'];
}
}
}
}
}
/** @var DossierSegment $segment */
$segment->setDaysJourParJour($services['days']);
$daysInfos = array();
foreach ($segment->getDaysJourParJour() as $key => $dayInfos) {
$array = array();
if (array_key_exists('activites', $dayInfos) && null !== $dayInfos['activites']) {
/** @var DossierSegmentActiviteEdito $activite */
foreach ($dayInfos['activites'] as $activite) {
if (true === $activite->getIsVueGuide()) {
$arr = array(
'currentType' => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getId() : ""
, 'currentTypeLabel' => (null !== $activite->getEditorialWrapper()->getCategorie()) ? $activite->getEditorialWrapper()->getCategorie()->getLibelle() : ""
, 'date' => $dayInfos['datee']
, 'isPrestation' => $activite->getIsPrestation()
, 'segmentId' => $activite->getDossierSegment()->getId()
, 'isPrestationSeche' => $activite->getDossierSegment()->getIsPrestationSeche()
, 'id' => $activite->getId()
, 'ordre' => $activite->getOrdre()
, 'libelle' => (null !== $activite->getEditorialContenu()) ? $activite->getEditorialContenu()->getLibelle() : ''
, 'note' => $activite->getNote()
, 'isVueGuide' => $activite->getIsVueGuide()
, 'payeWalkinn' => ''
, 'type' => 'activite'
, 'fournisseur' => (null !== $activite->getEditorial()->getSocieteId() && array_key_exists($activite->getEditorial()->getSocieteId(), $fournisseurs)) ? $fournisseurs[$activite->getEditorial()->getSocieteId()] : ''
);
$array[] = $arr;
}
}
}
if (array_key_exists('services', $dayInfos) && null !== $dayInfos['services']) {
/** @var SegService $service */
foreach ($dayInfos['services'] as $service) {
if (true === $service->getIsVueGuide()) {
$arr = array(
'currentType' => $service->getService()->getType()->getId()
, 'currentTypeLabel' => $service->getService()->getType()->getLibelle()
, 'date' => $dayInfos['datee']
, 'isPrestation' => $service->getIsPrestation()
, 'segmentId' => $service->getSegment()->getId()
, 'isPrestationSeche' => $service->getSegment()->getIsPrestationSeche()
, 'id' => $service->getId()
, 'ordre' => $service->getOrdre()
, 'libelle' => $service->getService()->getLibelle()
, 'note' => $service->getNote()
, 'isVueGuide' => $service->getIsVueGuide()
, 'payeWalkinn' => (true === $service->getPayeWalkinn()) ? 'Walkinn' : 'Guide'
, 'type' => 'service'
, 'fournisseur' => $fournisseurs[$service->getService()->getPrestataireId()]
);
$array[] = $arr;
}
}
}
if (count($array) > 1) { // ré-ordonne les activités et les services selon 'ordre'
usort($array, function ($item1, $item2) {
return $item1['ordre'] <=> $item2['ordre'];
});
}
$daysInfos[$key] = $array;
}
return $daysInfos;
}
/**
* @return string|false HTML Response content - Response::getContent()
*/
public function renderVueGuideMultiSegment(array $segmentsIds = [])
{
$segmentsDaysInfos = [];
foreach ($segmentsIds as $segmentId) {
/** @var DossierSegment $segment */
$segment = $this->em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$result = $this->dossierSegmentService->checkDuree($segment);
if(!$segment->getIsPrestationSeche()) {
$segment = $this->dossierSegmentService->setSiblingsData($segment);
}
$segmentsDaysInfos[$segmentId] = [
'segment' => $segment,
'daysInfos' => $this->getVueGuideDaysInfos($segment),
];
}
$existingService = [];
foreach ($segmentsDaysInfos as &$segmentDaysInfos) {
foreach ($segmentDaysInfos['daysInfos'] as $jour => &$services) {
foreach ($services as $key => $service) {
$date = $service['date'];
if ($service['date'] instanceof \DateTime) {
$date = $service['date']->format('Y-m-d');
}
$uniqueServiceString = $service['id'].'-'.$date;
if (!in_array($uniqueServiceString, $existingService)) {
$existingService[] = $uniqueServiceString;
} else {
unset($services[$key]);
}
}
}
}
return $this->render('dossier/vue-guide/_multi_segment.html.twig', [
'segmentsDaysInfos' => $segmentsDaysInfos,
])->getContent();
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/auto", name="segment_pax_auto", methods={"GET","POST"})
*/
public function autoPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, PaxService $paxService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$paxService->autoAddPaxToSegment($segment);
$this->addFlash(
'info',
"L'ajout automatique de Pax a bien été réalisé !"
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/traductions/save", name="save_traductions", methods={"POST"})
*/
public function saveTraductions(Request $request, EntityManagerInterface $em, Dossier $dossier, DossierService $dossierService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$libelle = $dossier->getLibelle();
$traductions = $request->request->get('traduction', null);
$save = $dossierService->saveTraductions($libelle, $traductions);
$data = json_encode($save, TRUE);
$code = 200;
$response = new Response($data, $code);
$response->headers->set('Content-Type', 'application/json');
return $response;
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/multi", name="segment_pax_multi", methods={"GET"})
*/
public function multiPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, PaxService $paxService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Params
$tiersIds = $request->query->get('tiersIds');
$paxService->multiAddPaxToSegment($segment, $tiersIds);
$this->addFlash(
'info',
"L'ajout de Groupement(s) a bien été réalisé !"
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/segment", name="segment_pax_segment", methods={"GET"})
*/
public function segmentPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$segmentModelId = $request->query->get('segmentModel');
$rooming = $request->query->get('rooming');
$segmentModel = $em->getRepository(DossierSegment::class)->find($segmentModelId);
if (!$segmentModel) {
throw $this->createNotFoundException("Le segment modèle n'existe pas");
}
$segmentService->duplicateSegmentPaxes($segmentModel, $segment, $rooming);
$this->addFlash(
'info',
"Les Pax ont bien été dupliqués !"
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/new", name="segment_pax_new", methods={"GET","POST"})
*/
public function newPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$request->query->set('iframe', 1);
$segmentPax = new DossierSegmentPax();
$segmentPax->setSegment($segment);
// Etat par défaut
$defautEtatId = $this->getParameter('pax_etat_defaut') ?: \App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID;
$etat = $em->getRepository(DossierSegmentPaxEtat::class)->find($defautEtatId);
if(!$etat)
{
$etat = $em->getRepository(DossierSegmentPaxEtat::class)->find(\App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID );
}
if ($etat)
{
$segmentPax->setDossierSegmentPaxEtat($etat);
}
// Guide
$guide = $request->query->get('guide', 0);
if ($guide)
{
$type = $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::GUIDE_ID);
} else
{
$type = $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::PAX_ID);
}
$segmentPax->setPaxType($type);
if (!$segmentPax->getTauxRemise() && $segmentPax->getPaxType())
{
$segmentPax->setTauxRemise($segmentPax->getPaxType()->getTauxRemiseParDefaut());
}
if (!$segmentPax->getMontantRemise() && $segmentPax->getPaxType())
{
$segmentPax->setMontantRemise($segmentPax->getPaxType()->getMontantRemiseParDefaut());
}
$form = $this->createForm(DossierSegmentPaxFormType::class, $segmentPax);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid() && $segmentPax->getContactId()) {
$entityManager = $this->getDoctrine()->getManager();
$segment->setIsCompoValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$entityManager->persist($segmentPax);
$entityManager->flush();
$this->addFlash(
'info',
"Le Pax " . $segmentPax->getLibelle(). ' a été ajouté !'
);
return $this->redirectToRoute('dossier_segment_pax_edit', ['id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'segmentPaxId' => $segmentPax->getId(), 'close' => 1]);
} else if($form->isSubmitted() && $form->isValid() && !$segmentPax->getContactId())
{
$this->addFlash(
'info',
"Le formulaire n'est pas valide, veuillez renseigner un PAX !"
);
}
return $this->render('dossier/segment-pax/new.html.twig', [
'segmentPax' => $segmentPax,
'form' => $form->createView(),
'action' => 'Ajouter un Pax',
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/multiple/status", name="segment_multiple_pax_status", methods={"GET"})
*/
public function multipleStatusPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Params
$ids = $request->query->get('ids');
$status = $request->query->get('statut');
$entityManager = $this->getDoctrine()->getManager();
$segmentPaxEtat = $entityManager->getRepository(DossierSegmentPaxEtat::class)->find($status);
if ($ids && $segmentPaxEtat)
{
$idsArray = explode(',', $ids);
foreach($idsArray as $id)
{
$segmentPax = $entityManager->getRepository(DossierSegmentPax::class)->find($id);
$segmentPax->setDossierSegmentPaxEtat($segmentPaxEtat);
}
// Si le nouveau statut est annulé, celà impacte les transfert aeriens
if ($status == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) {
$segment->setIsTransferValide(0);
}
$entityManager->flush();
$this->addFlash(
'info',
"La liste des participants a été mise à jour !"
);
}
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/multiple/delete", name="segment_multiple_pax_delete", methods={"GET"})
*/
public function multipleDeletePax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
// Params
$ids = $request->query->get('ids');
$entityManager = $this->getDoctrine()->getManager();
if ($ids)
{
$idsArray = explode(',', $ids);
foreach($idsArray as $id)
{
$segmentPax = $entityManager->getRepository(DossierSegmentPax::class)->find($id);
$segment->setIsCompoValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$segment->setIsTransferValide(0);
$segmentPax->setActif(0);
}
$entityManager->flush();
$this->addFlash(
'info',
"La liste des participants a été mise à jour !"
);
}
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/edit", name="segment_pax_edit", methods={"GET","POST"})
*/
public function editPax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $segmentPaxId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$segmentPax = $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
if (!$segmentPax) {
throw $this->createNotFoundException("Le Pax n'existe pas");
}
$request->query->set('iframe', 1);
if (!$segmentPax->getTauxRemise() && $segmentPax->getPaxType())
{
$segmentPax->setTauxRemise($segmentPax->getPaxType()->getTauxRemiseParDefaut());
}
if (!$segmentPax->getMontantRemise() && $segmentPax->getPaxType())
{
$segmentPax->setMontantRemise($segmentPax->getPaxType()->getMontantRemiseParDefaut());
}
$form = $this->createForm(DossierSegmentPaxFormType::class, $segmentPax);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Lorsque le pax est au statut annulé, on impact la gestion des vols
if ($segmentPax->getDossierSegmentPaxEtat()->getId() == \App\Enum\DossierSegmentPaxEtat::ANNULE_ID) {
$segment->setIsTransferValide(0);
}
$this->getDoctrine()->getManager()->flush();
$this->addFlash(
'info',
"Le Pax " . $segmentPax->getLibelle(). ' est mis à jour !'
);
return $this->redirectToRoute('dossier_segment_pax_edit', ['id' => $dossier->getId(), 'segmentId' => $segment->getId(), 'segmentPaxId' => $segmentPax->getId(), 'close' => 1]);
}
return $this->render('dossier/segment-pax/edit.html.twig', [
'segmentPax' => $segmentPax,
'form' => $form->createView(),
'action' => $segmentPax->getLibelle(),
'retour' => 'dossier_index'
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/duplicate", name="segment_pax_duplicate", methods={"GET"})
*/
public function duplicatePax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $segmentPaxId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$segmentPax = $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
if (!$segmentPax) {
throw $this->createNotFoundException("Le Pax n'existe pas");
}
$entityManager = $this->getDoctrine()->getManager();
$segment->setIsCompoValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$segmentPax->setActif(1);
$entityManager->flush();
$this->addFlash(
'info',
"Le Pax " . $segmentPax->getLibelle(). ' a été dupliqué !'
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/pax/{segmentPaxId}/delete", name="segment_pax_delete", methods={"GET"})
*/
public function deletePax(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, $segmentPaxId, CompanyService $companyService, DossierSegmentService $segmentService): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$segmentPax = $em->getRepository(DossierSegmentPax::class)->find($segmentPaxId);
if (!$segmentPax) {
throw $this->createNotFoundException("Le Pax n'existe pas");
}
$entityManager = $this->getDoctrine()->getManager();
$segment->setIsCompoValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$segment->setIsTransferValide(0);
$segmentPax->setActif(0);
$entityManager->flush();
$this->addFlash(
'info',
"Le Pax " . $segmentPax->getLibelle(). ' a été supprimé !'
);
$referer = $request->headers->get('referer');
if ($referer) {
return $this->redirect($referer);
} else {
return $this->redirectToRoute('dossier_index');
}
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/rooming/importXls", name="segment_rooming_import_xls")
*/
public function rooming_import(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, CompanyService $companyService, PaxService $paxService, ParameterBagInterface $params, LoggerInterface $logger): Response
{
// Va permettre d'importer les données d'après un fichier XLS
if (!$dossier)
{
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment)
{
throw $this->createNotFoundException("Le segment n'existe pas");
}
if (!$segment->getClientId())
{
$this->addFlash(
'warning',
'Aucun client trouvé pour le segment !'
);
return $this->redirectToRoute('dossier_edit', [
'id' => $dossier->getId(),
]);
}
// Params
$request->query->set('iframe', 1);
$file = $request->files->get('file') ;
$post = $request->request->all() ;
$get = $request->query->all() ;
$webDir = '/uploads/importXlsx/' ; // Chemin relatif URL
$uploadDir = $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir ; // Chemin sous la forme /var/www/...
$newPax = array() ; // Contient les paxs importés
$results = array() ;
$doublons = array() ;
$selectRoomingOptions = array() ;
// Pax présents dans la database
$paxOld = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->findBy(['segment' => $segment, 'actif' => true]);
// Pour le select libelle rooming
$roomingOptions = $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
foreach ($roomingOptions as $option)
{
$selectRoomingOptions[$option->getId()] = $option->getLibelle(); ;
}
//------------------------------------------------------------------
// Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
//------------------------------------------------------------------
// On enregistre le fichier puis retourne le nom du fichier
if (null !== $file)
{
// Un fichier a été reçu
// dropzone filtre le type de fichier
$extension = $file->guessExtension();
// fichier OK
$fileName = md5(uniqid()).'.'.$extension;
if (!file_exists($uploadDir) && !is_dir($uploadDir))
{
mkdir($uploadDir, 0775, true);
}
if ($file->move($uploadDir, $fileName))
{
// Tout OK on retourne le nom du fichier
return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']);
}
}
//---------------------------------------------------------------------
// Cas 2 Enregistre les modifications lorsque $_POST est non vide
//---------------------------------------------------------------------
// Si $_POST alors on save les données
if ( count($post) > 0 )
{
// si $_POST on traite le formulaire
foreach($post as $key => $item)
{
// édition ou création
$edit = true;
if (substr($key,0,3) == 'pax')
{
// Params
$defautEtatId = $this->getParameter('pax_etat_defaut') ?: \App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID;
$etat = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPaxEtat::class)->find($defautEtatId);
if(!$etat)
{
$etat = $em->getRepository(DossierSegmentPaxEtat::class)->findOneById(\App\Enum\DossierSegmentPaxEtat::NOUVEAU_ID);
}
$type = $em->getRepository(PaxType::class)->findOneById(\App\Enum\PaxType::PAX_ID );
if($this->getParameter('auto_pax_by_age'))
{
// Type selon âge
$dateNaissance = \DateTime::createFromFormat('d/m/Y', $item['date_naissance']);
if($dateNaissance)
{
$difference = $dateNaissance->diff($segment->getDateDepart());
$specialType = $em->getRepository(PaxType::class)->getByAge($difference->y);
if($specialType)
{
$type = $specialType;
}
}
}
// Edit
if ((array_key_exists('id', $item)) && ($item['id'] > 0))
{
$pax = $em->getRepository(DossierSegmentPax::class)->findOneById($item['id']);
$pax->SetPaxType($type);
// New
} else
{
$edit = false;
$pax = new DossierSegmentPax();
$pax->SetPaxType($type);
}
// Rooming
if ($pax->getRooming())
{
$segmentPaxRooming = $pax->getRooming();
} else
{
// Check
/*
if(!$item['rooming_numeroChambre'])
{
$logger->critical(
'Custom Log: Import Pax XLS findOneBySegmentAndNumeroChambre -> DossierController -> numéro de chambre ($item["rooming_numeroChambre"]) manquant',
[
'$item' => $item,
'$segmentId' => $segmentId,
'$_GET' => $_GET,
'$_POST' => $_POST,
'$_SERVER' => $_SERVER,
]
);
}
*/
// Vérifie que la chambre n'existe pas déjà pour ce segment
// auquel cas c'est une chambre avec plusieurs Pax
// Avec 1 seule entrée dans DossierSegmentPaxRooming
$segmentPaxRooming = $em->getRepository(DossierSegmentPaxRooming::class)->findOneBySegmentAndNumeroChambre($segmentId, $item['rooming_numeroChambre']);
if (null === $segmentPaxRooming)
{
$segmentPaxRooming = new DossierSegmentPaxRooming();
}
}
// Tiers & Contact DOLIBARR
$item['origine']= $segment->getClientId();
$pax = $paxService->handlePaxTiersAndContact($pax, $item);
// Rooming
$rooming = $em->getRepository(PaxRooming::class)->findOneById($item['rooming_libelle']);
// Modifie DossierSegmentPaxRooming()
$segmentPaxRooming->setPaxRooming($rooming);
$segmentPaxRooming->setNumeroChambre($item['rooming_numeroChambre']);
//$segmentPaxRooming->setLibelle($rooming->getLibelle()); // plus besoin ?
$em->persist($segmentPaxRooming);
// Set Values
$pax->SetSegment($segment);
$pax->SetDossierSegmentPaxEtat($etat);
$pax->SetRooming($segmentPaxRooming);
$pax->SetPrestations($item['prestations']);
$pax->SetNote($item['note']);
$pax->setActif(true);
if (!$edit)
{
$em->persist($pax);
}
}
$segment->setIsCompoValide(0);
$segment->setIsAchatsValide(0);
$segment->setIsVentesValide(0);
$em->flush();
$request->query->set('close', 1);
}
}
//-------------------------------------------------------------------
// Cas 3 Récupère les infos dans le fichier XLSX
//------------------------------------------------------------------
//
elseif ((count($get) > 0) && (array_key_exists('file', $get)))
{
// un fichier est passé en paramètre _GET
$obj = new \App\Utils\ImportPax($uploadDir.$get['file'], $params);
$datas = $obj->getDataAll(); // array
//---------------------------------------------------------------------
// Dédoublonne / Tri
//---------------------------------------------------------------------
// Doublon : même nom/prénom/date_naissance
// * Soit nouveau
// * soit déjà existant
// * Soit doublon
if($datas)
{
foreach ($datas as &$pax)
{
if (count($pax) < 22) {
continue;
}
$toTrim = array(1,2,3,5,6,7,11,12,13,14);
// Fix espaces impossibles à virer avec trim()
foreach($pax as $index => $data)
{
//if (in_array($index, $toTrim)) {
// $pax[$index] = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $data);
//} else {
// $pax[$index] = preg_replace('/[^\- 0-9a-zA-ZéèçùÉÈÇ\+\.\:]/', '', $data); // La à pose problème
//}
$data = preg_replace('/^\p{Z}+/u', '', $data);
$data = preg_replace('/\p{Z}+$/u', '', $data);
$pax[$index] = $data;
}
// Ajouter les champs ici
$numero = $pax['numero'] = trim($pax[1] ) ;
$civilite = $pax['civilite'] = trim($pax[2] ) ;
$nom = $pax['nom'] = trim($pax[3] ) ;
$prenom = $pax['prenom'] = trim($pax[4] ) ;
$rooming = $pax['rooming'] = trim($pax[5] ) ;
$date_naissance = $pax['date_naissance'] = trim($pax[6] ) ;
$age = $pax['age'] = trim($pax[7] ) ;
$regime_alimentaire = $pax['regime_alimentaire'] = trim($pax[8] ) ;
$prestations = $pax['prestations'] = trim($pax[9] ) ;
$regime_remarque = $pax['regime_remarque'] = trim($pax[10]) ;
$telephone = $pax['telephone'] = trim($pax[11]) ;
$nationalite = $pax['nationalite'] = trim($pax[12]) ;
$numero_passeport = $pax['numero_passeport'] = trim($pax[13]) ;
$validite_passeport = $pax['validite_passeport'] = trim($pax[14]) ;
$assurance = $pax['assurance'] = trim($pax[15]) ;
$nom_assurance = $pax['nom_assurance'] = trim($pax[16]) ;
$numero_assurance = $pax['numero_assurance'] = trim($pax[17]) ;
$contact_assurance = $pax['contact_assurance'] = trim($pax[18]) ;
$location_materiel = $pax['location_materiel'] = trim($pax[19]) ;
$location_poids = $pax['location_poids'] = trim($pax[20]) ;
$remarque = $pax['note'] = trim($pax[21]) ;
if ($params->get('instance') == 'vv' && strlen(trim($pax[22])) > 0) {
$pax['note'] = (strlen($pax['note']) > 0) ? implode("\n", array($pax['note'], trim($pax[22]))) : trim($pax[22]);
}
//extract( $pax, EXTR_IF_EXISTS );
if ($nom == '0' || strlen($nom) == 0)
{
continue; // filtre les colonnes dont le nom est 0 ou vide
}
$pax['id'] = null;
$pax['rooming_numeroChambre'] = "";
// Les informations ROOMING sont dans 1 champs
if ($params->get('instance') == 'vv') {
$rooming_infos = explode('/', trim($rooming));
$checkLibelle = $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findOneByLibelle($rooming_infos[0]);
$pax['rooming_libelle'] = $checkLibelle->getLibelle() ?: $pax['rooming_libelle'];
} else {
if (preg_match('/^([0-9]*)([a-zA-Z]*)$/', trim($rooming), $rooming_infos))
{
if (isset($rooming_infos[2])) {
$rooming_infos[2] = str_replace(array('TPL'), array('TRP'), $rooming_infos[2]);
}
$pax['rooming_libelle'] = isset($rooming_infos[2]) ? $rooming_infos[2] : $rooming;
$pax['rooming_numeroChambre'] = isset($rooming_infos[1]) ? $rooming_infos[1] : $rooming;
// Check RoomingPax Libellé
$checkLibelle = $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->getLibelleByCodeLike($pax['rooming_libelle']);
$pax['rooming_libelle'] = $checkLibelle ?: $pax['rooming_libelle'];
} else
{
$pax['rooming_libelle'] = "";
}
}
$pax['doublons'] = array();
// Fix Date Naissance
$dateNaissance = \DateTime::createFromFormat('Y-m-d', $date_naissance);
if(!$dateNaissance)
{
$dateNaissance = \DateTime::createFromFormat('d-m-Y', $date_naissance);
if(!$dateNaissance)
{
$dateNaissance = \DateTime::createFromFormat('d/m/Y', $date_naissance);
}
if(!$dateNaissance)
{
if (strtotime($date_naissance))
{
$dateNaissance = new \Datetime($date_naissance);
} else if(is_int(intval($date_naissance)) && strlen(intval($date_naissance)) >= 5)
{
$dateNaissance = new \Datetime('1899/12/30');
$dateNaissance->add(new \DateInterval('P' . intval($date_naissance) . 'D'));
} else
{
$dateNaissance = null;
}
}
}
// Rustines
$pax['location_materiel'] = str_replace("cm", ".", $pax['location_materiel']);
$pax['location_materiel'] = str_replace("m", "", $pax['location_materiel']);
$pax['location_poids'] = str_replace("kg", ".", $pax['location_poids']);
$pax['telephone'] = str_replace("GSM : ", "", $pax['telephone']);
$pax['telephone'] = str_replace("GSM", "", $pax['telephone']);
$pax['telephone'] = str_replace(":", "", $pax['telephone']);
$pax['telephone'] = trim($pax['telephone']);
$pax['civilite'] = str_replace(array("Ms", "MS"), "Madame", $pax['civilite'] );
$pax['civilite'] = str_replace(array("Mr", "MR"), "Monsieur", $pax['civilite'] );
// Pour VV, on n'importe pas la civilité
if ($this->getParameter('instance') == 'vv') {
$pax['civilite'] = '';
}
if($dateNaissance)
{
$pax['date_naissance'] = $dateNaissance->format('Y-m-d');
} else
{
$pax['date_naissance'] = $dateNaissance;
}
// Fix Date Passeport
$dateValiditePasseport = \DateTime::createFromFormat('Y-m-d', $validite_passeport);
if(!$dateValiditePasseport)
{
$dateValiditePasseport = \DateTime::createFromFormat('d-m-Y', $validite_passeport);
if(!$dateValiditePasseport)
{
$dateValiditePasseport = \DateTime::createFromFormat('d/m/Y', $validite_passeport);
}
if(!$dateValiditePasseport)
{
if (strtotime($validite_passeport))
{
$dateValiditePasseport = new \Datetime($validite_passeport);
} else if(is_int($validite_passeport) && strlen($validite_passeport) >= 5)
{
$dateValiditePasseport = new \Datetime('1899/12/30');
$dateValiditePasseport->add(new \DateInterval('P' . $validite_passeport . 'D'));
} else
{
$dateValiditePasseport = null;
}
}
}
if($dateValiditePasseport)
{
$pax['validite_passeport'] = $dateValiditePasseport->format('d/m/Y');
} else
{
$pax['validite_passeport'] = $dateValiditePasseport;
}
// Recherche le Pax dans la database
// $isKnown = $this->getDoctrine()->getManager()->getRepository(Pax::class)->findBy(['nom' => $nom, 'prenom' => $prenom, 'dateNaissance' => $dateNaissance, 'actif' => true, 'dossier' => $dossier]);
$isKnown = $this->getDoctrine()->getManager()->getRepository(DossierSegmentPax::class)->checkForXlsImport($nom, $prenom, $dateNaissance);
// Si aucun trouvé, il s'agit d'un nouveau
$isNew = (count($isKnown) == 0) ? true : false;
// Si plusieurs trouvés, alors c'est un doublon
$isDoublon = (count($isKnown) > 1 ) ? true : false;
if ($isDoublon)
{
$pax['statut'] = 'doublon' ;
foreach ($isKnown as $oldPax)
{
$pax['doublons'][] = $oldPax;
}
$doublons[] = $pax;
}
if ($isNew)
{
$pax['statut'] = 'nouveau';
$results[] = $pax;
}
// Si pas nouveau, ni doublon, c'est une mise à jour
if (!$isNew && !$isDoublon) {
$pax['statut'] = 'mise à jour';
$pax['id'] = $isKnown[0]['id'];
$results[] = $pax;
}
}
}
// unlink($uploadDir.$get['file']); // Supprime le fichier d'import // TODO a voir pour versionning
}
// Client
$client = $companyService->getOneById($segment->getClientId());
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
return $this->render('dossier/rooming/_import_xlsx.html.twig', [
'dossier' => $dossier
, 'linked' => $linked
, 'segment' => $segment
, 'client' => $client
, 'pax' => $paxOld
, 'doublons' => $doublons
, 'newPax' => array_values($results)
, 'action' => 'Pax: ' . $dossier->getLibelle() . ' - ' . $segment->getLibelle()
, 'retour' => 'dossier_index'
, 'selectRoomingOptions' => $selectRoomingOptions
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/transfer/importXls", name="transfert_import_xls")
*/
public function transfert_import(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, ParameterBagInterface $params): Response
{
// Va permettre d'importer les données d'après un fichier XLS
$message = 'Aucun vol à afficher, cliquer pour en ajouter.';
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$file = $request->files->get('file') ;
$post = $request->request->all() ;
$get = $request->query->all() ;
$webDir = '/uploads/importXlsx/' ; // Chemin relatif URL
$uploadDir = $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir ; // Chemin sous la forme /var/www/...
$newPax = array() ; // Contient les paxs importés
$results = array() ;
$doublons = array() ;
$selectRoomingOptions = array() ;
// Pax présents dans la database
$paxOld = array();
// Pour le select libelle rooming
$roomingOptions = $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
foreach ($roomingOptions as $option) {
$selectRoomingOptions[$option->getId()] = $option->getLibelle(); ;
}
//------------------------------------------------------------------
// Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
//------------------------------------------------------------------
// On enregistre le fichier puis retourne le nom du fichier
if (null !== $file) { // Un fichier a été reçu
// fichier OK
$fileName = md5(uniqid()).'.xlsx';
if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
mkdir($uploadDir, 0775, true);
}
if ($file->move($uploadDir, $fileName)) { // Tout OK on retourne le nom du fichier
return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']);
}
}
//---------------------------------------------------------------------
// Cas 2 Enregistre les modifications lorsque $_POST est non vide
//---------------------------------------------------------------------
// Si $_POST alors on save les données
elseif ((count($get) > 0) && (array_key_exists('file', $get))) { // un fichier est passé en paramètre _GET
$obj = new \App\Utils\ExtractFromXlsx($uploadDir.$get['file'], 'aerien', $params);
$datas = $obj->getDatas();
if (count($datas['RANGE']['PLAN DE VOL']) > 0) { // au moins 1 transfert existe
$plans_de_vol = array();
$le_plan_de_vol = $datas['SEARCH']['PLAN DE VOL']; // on récupère le nom du premier plan de vol
foreach ($datas['RANGE']['PLAN DE VOL'] as $key => $transfert) { // Formate les datas
if (count(array_filter($transfert)) == 1) {
$le_plan_de_vol = $transfert['date'];
}
elseif ($transfert['date'] != 'DATE') {
$plans_de_vol[$le_plan_de_vol][] = $transfert;
}
}
// Traite les datas
$o = 1;
foreach ($plans_de_vol as $alias => $groupe) {
// retrouve le plan de vol s'il existe
$plan_de_vol = $em->getRepository(PlanDeVol::class)->findOneBy(['libelle' => $alias, 'actif' => true]);
$relation = null ;
// crée le plan si pas trouvé
if (null != $plan_de_vol) {
$plan_de_vol->setUpdatedBy($this->getUser());
$plan_de_vol->setLibelle('PLAN DE VOL '.$o);
// trouve la relation sinon crée
$relation = $em->getRepository(DossierSegmentPlanDeVol::class)->findOneBy(['segment' => $segment, 'planDeVol' => $plan_de_vol]);
$o++;
}
else {
$plan_de_vol = new PlanDeVol();
//$plan_de_vol->setLibelle($alias);
$plan_de_vol->setLibelle('PLAN DE VOL '.$o);
$plan_de_vol->setActif(true);
$plan_de_vol->setCreatedBy($this->getUser());
$em->persist($plan_de_vol);
$em->flush();
$o++;
}
if (null === $relation) {
// ajoute le lien avec le segment
$relation = new DossierSegmentPlanDeVol();
$relation->setSegment($segment);
$relation->setPlanDeVol($plan_de_vol);
$em->persist($relation);
$em->flush();
}
// Ajoute les tranferts
foreach ($groupe as $item) {
$date = $debutVol = $finVol = $aerien = $referenceVol = $transferts = $informations = null;
extract( $item, EXTR_IF_EXISTS );
$debutVol = \DateTime::createFromFormat('Y-m-d H:i', $date.' '.$debutVol);
// retrouve le vol s'il existe
$transfert = $em->getRepository(TransfertAerien::class)->findOneBy(['referenceVol' => $referenceVol, 'debutVol' => $debutVol, 'actif' => true]);
$rel = null ;
// update le vol ou crée si pas trouvé
if (null != $transfert) {
$transfert->setUpdatedBy($this->getUser());
$rel = $em->getRepository(DossierSegmentTransfertAerien::class)->findOneBy(['segment' => $segment, 'transfertAerien' => $transfert, 'planDeVol' => $relation]);
}
else {
$transfert = new TransfertAerien();
$transfert->setCreatedBy($this->getUser());
}
$finVol = \DateTime::createFromFormat('Y-m-d H:i', $date.' '.$finVol);
$aerien = explode(' ', $aerien);
$transfert->setDebutVol($debutVol);
$transfert->setFinVol($finVol);
$transfert->setInformations($informations);
$transfert->setCodeOrigine(trim($aerien[0]));
$transfert->setCodeDestination(trim($aerien[1]));
$transfert->setReferenceVol($referenceVol);
$transfert->setTransferts($transferts);
$transfert->setActif(true);
//$transfert->addplanDeVol($plan_de_vol);
$em->persist($transfert);
$em->flush();
if (null === $rel) {
// ajoute le lien avec le segment
$rel = new DossierSegmentTransfertAerien();
$rel->setSegment($segment);
$rel->setTransfertAerien($transfert);
$rel->setPlanDeVol($relation);
$em->persist($rel);
$em->flush();
}
$em->flush();
}
}
}
$message = 'Les transfert ont été correctement importés, cliquer pour importer un autre fichier';
}
// Client
$client = null;
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
return $this->render('dossier/transfert/_import_xlsx.html.twig', [
'dossier' => $dossier
, 'linked' => $linked
, 'segment' => $segment
, 'client' => $client
, 'pax' => null //$paxOld
, 'doublons' => null //$doublons
, 'newPax' => array_values($results)
, 'action' => 'Transfert aérien: ' . $dossier->getLibelle()
, 'retour' => 'dossier_index'
, 'message' => $message
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/transfer/importXls-ta", name="transfert_import_xls_ta")
*/
public function transfert_import_ta(Request $request, EntityManagerInterface $em, Dossier $dossier, $segmentId, ParameterBagInterface $params): Response
{
// Va permettre d'importer les données d'après un fichier XLS
$message = 'Aucun vol à afficher, cliquer pour en ajouter.';
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$segment = $em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) {
throw $this->createNotFoundException("Le segment n'existe pas");
}
$file = $request->files->get('file') ;
$post = $request->request->all() ;
$get = $request->query->all() ;
$webDir = '/uploads/importXlsx/' ; // Chemin relatif URL
$uploadDir = $_SERVER['DOCUMENT_ROOT'].'symfony'.$webDir ; // Chemin sous la forme /var/www/...
$newPax = array() ; // Contient les paxs importés
$results = array() ;
$doublons = array() ;
$selectRoomingOptions = array() ;
// Pax présents dans la database
$paxOld = array();
// Pour le select libelle rooming
$roomingOptions = $this->getDoctrine()->getManager()->getRepository(PaxRooming::class)->findAll();
foreach ($roomingOptions as $option) {
$selectRoomingOptions[$option->getId()] = $option->getLibelle(); ;
}
//------------------------------------------------------------------
// Cas 1 Upload fichier puis renvoi le nom du fichier (ajax)
//------------------------------------------------------------------
// On enregistre le fichier puis retourne le nom du fichier
if (null !== $file) { // Un fichier a été reçu
// fichier OK
$fileName = md5(uniqid()).'.xlsx';
if (!file_exists($uploadDir) && !is_dir($uploadDir)) {
mkdir($uploadDir, 0775, true);
}
if ($file->move($uploadDir, $fileName)) { // Tout OK on retourne le nom du fichier
return new Response(json_encode($fileName), 200, ['Content-Type' => 'application/json']);
}
}
//---------------------------------------------------------------------
// Cas 2 Enregistre les modifications lorsque $_POST est non vide
//---------------------------------------------------------------------
// Si $_POST alors on save les données
elseif ((count($get) > 0) && (array_key_exists('file', $get))) { // un fichier est passé en paramètre _GET
$obj = new \App\Utils\ImportPlanDeVol($uploadDir.$get['file'], $params);
$data = $obj->getDataTA();
// retrouve le nombre de plans de vols
$existingPlanDeVol = $em->getRepository(DossierSegmentPlanDeVol::class)->findBy(['segment' => $segment]);
$counter = count($existingPlanDeVol);
$transports = array();
foreach ($data as $key => $planDeVol) {
$counter++;
$plan_de_vol = new PlanDeVol();
$plan_de_vol->setLibelle('PLAN DE VOL '.$counter);
$plan_de_vol->setActif(true);
$plan_de_vol->setCreatedBy($this->getUser());
$em->persist($plan_de_vol);
$em->flush();
// ajoute le lien avec le segment
$relation = new DossierSegmentPlanDeVol();
$relation->setSegment($segment);
$relation->setPlanDeVol($plan_de_vol);
$em->persist($relation);
$em->flush();
foreach ($data[$key]['infos'] as $n => $transfer) {
$transfer = str_replace('"', '', $transfer);
if (preg_match('/^[0-3][0-9]\/[01][0-9]\/[0-9]+/', $transfer, $output_array)) { // information vol sinon remarque
$infos = explode(' ', $transfer);
$debutVol = \DateTime::createFromFormat('d/m/Y H:i', $infos[0].' '.str_replace('h', ':', $infos[4]));
$finVol = \DateTime::createFromFormat('d/m/Y H:i', $infos[0].' '.str_replace('h', ':', $infos[5]));
$transfert = new TransfertAerien();
$transfert->setCreatedBy($this->getUser());
$transfert->setDebutVol($debutVol);
$transfert->setFinVol($finVol);
$transfert->setCodeOrigine(trim($infos[1]));
$transfert->setCodeDestination(trim($infos[2]));
$transfert->setReferenceVol($infos[3]);
$transfert->setTransferts(trim(str_replace('"', '', $data[$key]['transferts'][$n])));
$transfert->setActif(true);
if (!empty($data[$key]['notes'][$n])) {
$transfert->setInformations(trim(str_replace('"', '', $data[$key]['notes'][$n])));
}
$em->flush();
$em->persist($transfert);
// ajoute le lien avec le segment
$rel = new DossierSegmentTransfertAerien();
$rel->setSegment($segment);
$rel->setTransfertAerien($transfert);
$rel->setPlanDeVol($relation);
$em->persist($rel);
$em->flush();
// Liaison auto service
if (!empty($data[$key]['liaisons'][$n])) {
if (strtolower($data[$key]['liaisons'][$n]) == 'oui') {
foreach ($segment->getDossierSegmentServices() as $serv) {
if (null !== $serv->getService()) {
if ($serv->getService()->getType()->getId() == 1) {
//$transports[$rel->getId()] = $serv->getId();
$transports[$serv->getId()] = array($rel, $serv);
}
}
}
}
}
}
else {
$noteExisting = (strlen($plan_de_vol->getNote()) > 0) ? $plan_de_vol->getNote() : null;
//$encoding = mb_detect_encoding($transfer);
//if ($encoding != 'UTF-8') {
// $transfer = mb_convert_encoding($transfer, 'UTF-8', $encoding);
//}
$newNote = (strlen($transfer) > 0) ? $transfer : null;
$notes = array_filter(array($noteExisting, $newNote));
if (count($notes) > 0) {
$plan_de_vol->setNote(implode("<br>", $notes));
$em->flush();
}
}
}
// Gestion des paxes
$paxes = $em->getRepository(DossierSegmentPax::class)->findBy(['segment' => $segment]);
$names = array();
$keys = array();
foreach ($paxes as $pax) {
$names[$pax->getId()] = mb_strtolower($pax->getLibelle());
}
foreach ($data[$key]['users'] as $item) {
$item = str_replace('"', '', mb_strtolower($item));
if (in_array($item, $names)) {
$key = array_search($item, $names);
$pax = $em->getRepository(DossierSegmentPax::class)->findOneById($key);
$transfertPax = new DossierSegmentTransfertAerienPax();
$transfertPax->setActif(true);
$transfertPax->setSegmentPax($pax);
$transfertPax->setPlanDeVol($relation);
$transfertPax->setCreatedBy($this->getUser());
$em->persist($transfertPax);
$em->flush();
}
}
}
// Liaison auto service
foreach ($transports as $key => $value) {
$liaison = new DossierSegmentTransfertAerienService();
$liaison->setDossierSegment($segment);
$liaison->setTransfertAerien($value[0]);
$liaison->setDossierSegmentService($value[1]);
$liaison->setCreatedBy($this->getUser());
$em->persist($liaison);
$em->flush();
}
$message = 'Les transfert ont été correctement importés, cliquer pour importer un autre fichier';
}
// Client
$client = null;
// Segments
$linked = $em->getRepository(DossierSegment::class)->findBy(['dossier' => $dossier, 'actif' => true], ['dateDepart' => 'ASC']);
return $this->render('dossier/transfert/_import_xlsx_ta.html.twig', [
'dossier' => $dossier
, 'linked' => $linked
, 'segment' => $segment
, 'client' => $client
, 'pax' => null //$paxOld
, 'doublons' => null //$doublons
, 'newPax' => array_values($results)
, 'action' => 'Transfert aérien: ' . $dossier->getLibelle()
, 'retour' => 'dossier_index'
, 'message' => $message
]);
}
/**
* @Route("/close-modal", name="close_modal", methods={"GET","POST"})
*/
public function close_modal(Request $request ): Response
{
return $this->render('close_modale.html.twig', [
'action' => ""
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/delete-day/{dayIndex}", name="segment_composition_delete_day", methods={"POST"})
*/
public function deleteDay(Dossier $dossier, $segmentId, int $dayIndex, DossierSegmentService $dossierSegmentService): Response
{
/** @var DossierSegment $segment */
$segment = $this->em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) throw $this->createNotFoundException("Le segment n'existe pas");
$dossierSegmentService->deleteDay($segment, (int) $dayIndex);
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'closeDays' => true,
'index' => 1,
]);
}
/**
* @Route("/dossier/{id}/segment/{segmentId}/add-day/{dayIndex}", name="segment_composition_add_day", methods={"POST"})
*/
public function addDay(Dossier $dossier, $segmentId, int $dayIndex, DossierSegmentService $dossierSegmentService): Response
{
/** @var DossierSegment $segment */
$segment = $this->em->getRepository(DossierSegment::class)->find($segmentId);
if (!$segment) throw $this->createNotFoundException("Le segment n'existe pas");
$dossierSegmentService->addDay($segment, (int) $dayIndex);
return $this->redirectToRoute('dossier_segment_composition', [
'id' => $dossier->getId(),
'segmentId' => $segment->getId(),
'closeDays' => true,
'newDayIndex' => $dayIndex,
'index' => 1,
]);
}
/**
* @Route("/dossier/select2/task-listes", name="select2TaskListes", methods={"GET"})
*/
public function select2TaskListes(Request $request, EntityManagerInterface $em): Response
{
$params = $request->query->all();
$listes = $em->getRepository(TaskListe::class)->getForSelect2($params);
return new JsonResponse($listes);
}
/**
* @Route("/dossier/{id}/save-listes/{listeId}/{segmentId}", name="task_liste", methods={"GET","POST"})
*/
public function add_task_liste(Request $request, EntityManagerInterface $em, Dossier $dossier, $listeId, $segmentId): Response
{
if (!$dossier) {
throw $this->createNotFoundException("Le dossier n'existe pas");
}
$liste = $em->getRepository(TaskListe::class)->findOneById($listeId);
$segment = $em->getRepository(DossierSegment::class)->findOneById($segmentId);
foreach ($liste->getTask() as $task) {
if ($task->getActif() && $task->getTypeTache()->getActif()) {
$segmentTask = new DossierSegmentTodo();
$segmentTask->setDossierSegment($segment);
$segmentTask->setLibelle($task->getLibelle());
$segmentTask->setDescription($task->getDescription());
$segmentTask->setTypeTache($task->getTypeTache());
$segmentTask->setActif(true);
$segmentTask->setResponsable($dossier->getChargeDossier());
$date = date_create($segment->getDateDepart()->format('Y-m-d'));
date_sub($date,date_interval_create_from_date_string($task->getDelay()." days"));
$segmentTask->setDateLimite($date);
$em->persist($segmentTask);
}
}
$em->flush();
return new JsonResponse(array('success' => true));
}
/**
* @Route("/new_roadmap_document" , name="newRoadmapDocument" , methods={"GET", "POST"})
*/
public function newRoadmapDocument(Request $request, DocumentService $service, UserService $userService, GraphService $microsoft)
{
$entityManager = $this->getDoctrine()->getManager();
$dossier_id = $request->query->get('dossier_id', null);
$jour = $request->query->get('jour', null);
$langue = $request->get('langue', null);
$get = $request->query->all();
$refresh = false;
$token = $userService->getUserOfficeToken($this->getUser());
try {
$folders = $microsoft->listSharePointSites($token);
} catch (\Exception $e) {
$folders = null;
}
// Choix du fichier sharepoint
if($request->isMethod('POST'))
{
$errors = [];
try {
// détermination de la position du document
$arrAllItems = $entityManager->getRepository(RoadmapItem::class)->findBy(['dossier' => $dossier_id], ['ordre' => 'ASC']);
$lastOrdre = 0;
$bon_jour = false;
foreach($arrAllItems as $key => $item) {
if($item->getJour() == $jour && $item->getOrdre() > $lastOrdre) {
$lastOrdre = $item->getOrdre();
$bon_jour = true;
}
elseif(!$bon_jour && $item->getJour() < $jour) {
$lastOrdre = $item->getOrdre();
}
}
// add roadmap item
$objItem = new RoadmapItem();
$objItem->setDossier($this->getDoctrine()->getManager()->getRepository(Dossier::class)->find($dossier_id));
$objItem->setSharepointId($request->request->get("fileId"));
$objItem->setSharepointLibelle($request->request->get("libelle"));
$objItem->setJour($jour);
$objItem->setOrdre($lastOrdre + 1);
$entityManager->persist($objItem);
// changement positions des autres items
foreach($arrAllItems as $key => $item) {
if($item->getOrdre() >= $objItem->getOrdre()) {
$item->setOrdre($item->getOrdre() + 1);
}
}
$entityManager->flush();
$this->addFlash('success', 'Document ajouté avec succès au roadbook.');
return $this->json(['success' => true, 'itemId' => $objItem->getId(), 'message' => 'Document ajouté avec succès']);
}
catch (\Exception $e) {
$errors[] = $e->getMessage();
}
return new JsonResponse($errors);
}
return $this->render('dossier/add-roadbook-item.html.twig', [
'retour' => 'editorial_index' ,
'refresh' => $refresh,
'dossier_id' => $dossier_id,
'jour' => $jour,
'langue' => $langue,
'folders' => $folders
]);
}
/**
* @Route("/delete_roadmap_document" , name="deleteRoadmapDocument" , methods={"GET", "POST"})
*/
public function deleteRoadmapDocument(Request $request, DocumentService $service)
{
$entityManager = $this->getDoctrine()->getManager();
$jour = $request->get('jour', null);
$doc_id = $request->get('document_id', null);
$dossier_id = $request->get('dossier_id', null);
$objDossier = $entityManager->getRepository(Dossier::class)->find($dossier_id);
$objItem = $entityManager->getRepository(RoadmapItem::class)->findByDossierJourAndSharepointId($objDossier, $jour, $doc_id);
if($objItem) {
$entityManager->remove($objItem);
$entityManager->flush();
}
$this->addFlash('success', 'Document supprimé avec succès du roadbook.');
return new JsonResponse(["success" => true]);
}
}