Compare commits
11 Commits
pkg/stable
...
master
Author | SHA1 | Date | |
---|---|---|---|
a3f54b2f11 | |||
386d639151 | |||
a2899ee93b | |||
efe978130c | |||
9c752523b4 | |||
|
43c1b6f5ce | ||
|
bfedc2f593 | ||
|
f1baf4d87e | ||
|
57220794b9 | ||
|
3edae845f0 | ||
0ba36598fa |
@@ -6,8 +6,10 @@
|
|||||||
|
|
||||||
<containers>
|
<containers>
|
||||||
<container name='web'>
|
<container name='web'>
|
||||||
<package>schedule-apps</package>
|
<!--
|
||||||
|
<package>schedule-apps</package>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- service de configuration apache -->
|
<!-- service de configuration apache -->
|
||||||
<service method="apache" servicelist="schedule">schedule</service>
|
<service method="apache" servicelist="schedule">schedule</service>
|
||||||
|
|
||||||
|
@@ -51,7 +51,10 @@
|
|||||||
"preferred-install": {
|
"preferred-install": {
|
||||||
"*": "dist"
|
"*": "dist"
|
||||||
},
|
},
|
||||||
"sort-packages": true
|
"sort-packages": true,
|
||||||
|
"allow-plugins": {
|
||||||
|
"symfony/flex": true
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
@@ -72,6 +75,9 @@
|
|||||||
"symfony/polyfill-php56": "*"
|
"symfony/polyfill-php56": "*"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
"pre-install-cmd": [
|
||||||
|
"php scripts/checkcomposer.php"
|
||||||
|
],
|
||||||
"auto-scripts": {
|
"auto-scripts": {
|
||||||
"cache:clear": "symfony-cmd",
|
"cache:clear": "symfony-cmd",
|
||||||
"cache:clear --env=prod": "symfony-cmd",
|
"cache:clear --env=prod": "symfony-cmd",
|
||||||
|
@@ -1,15 +1,11 @@
|
|||||||
# Read the documentation: https://symfony.com/doc/master/bundles/FOSRestBundle/index.html
|
# Read the documentation: https://symfony.com/doc/master/bundles/FOSRestBundle/index.html
|
||||||
fos_rest: null
|
fos_rest:
|
||||||
# param_fetcher_listener: true
|
param_fetcher_listener: true
|
||||||
# allowed_methods_listener: true
|
body_listener: true
|
||||||
# routing_loader: true
|
|
||||||
# view:
|
format_listener:
|
||||||
# view_response_listener: true
|
enabled: true
|
||||||
# exception:
|
rules:
|
||||||
# codes:
|
- { path: '/rest', priorities: ['json', 'xml'], fallback_format: 'html' }
|
||||||
# App\Exception\MyException: 403
|
- { path: '/', fallback_format: 'html' }
|
||||||
# messages:
|
|
||||||
# App\Exception\MyException: Forbidden area.
|
|
||||||
# format_listener:
|
|
||||||
# rules:
|
|
||||||
# - { path: ^/api, prefer_extension: true, fallback_format: json, priorities: [ json, html ] }
|
|
||||||
|
@@ -1,9 +1,9 @@
|
|||||||
nelmio_api_doc:
|
nelmio_api_doc:
|
||||||
documentation:
|
documentation:
|
||||||
info:
|
info:
|
||||||
title: My App
|
title: '%appName%'
|
||||||
description: This is an awesome app!
|
description:
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
areas: # to filter documented areas
|
areas: # to filter documented areas
|
||||||
path_patterns:
|
path_patterns:
|
||||||
- ^/api(?!/doc$) # Accepts routes under /api except /api/doc
|
- /rest # Accepts routes under /rest except /rest/doc
|
||||||
|
@@ -1,12 +1,4 @@
|
|||||||
# Expose your documentation as JSON swagger compliant
|
app_swagger_ui:
|
||||||
app.swagger:
|
path: /rest
|
||||||
path: /api/doc.json
|
|
||||||
methods: GET
|
methods: GET
|
||||||
defaults: { _controller: nelmio_api_doc.controller.swagger }
|
defaults: { _controller: nelmio_api_doc.controller.swagger_ui }
|
||||||
|
|
||||||
## Requires the Asset component and the Twig bundle
|
|
||||||
## $ composer require twig asset
|
|
||||||
#app.swagger_ui:
|
|
||||||
# path: /api/doc
|
|
||||||
# methods: GET
|
|
||||||
# defaults: { _controller: nelmio_api_doc.controller.swagger_ui }
|
|
||||||
|
@@ -6,6 +6,7 @@
|
|||||||
parameters:
|
parameters:
|
||||||
appAlias: '%env(resolve:APP_ALIAS)%'
|
appAlias: '%env(resolve:APP_ALIAS)%'
|
||||||
appAuth: '%env(resolve:APP_AUTH)%'
|
appAuth: '%env(resolve:APP_AUTH)%'
|
||||||
|
appSecret: '%env(resolve:APP_SECRET)%'
|
||||||
appName: '%env(resolve:APP_NAME)%'
|
appName: '%env(resolve:APP_NAME)%'
|
||||||
appEnv: '%env(resolve:APP_ENV)%'
|
appEnv: '%env(resolve:APP_ENV)%'
|
||||||
appCron: '%env(resolve:APP_CRON)%'
|
appCron: '%env(resolve:APP_CRON)%'
|
||||||
@@ -80,3 +81,6 @@ services:
|
|||||||
public: true
|
public: true
|
||||||
class: App\Service\mailService
|
class: App\Service\mailService
|
||||||
arguments: ["@mailer", "@twig"]
|
arguments: ["@mailer", "@twig"]
|
||||||
|
|
||||||
|
App\Controller\RestController:
|
||||||
|
public: true
|
13
src/schedule-2.0/scripts/checkcomposer.php
Normal file
13
src/schedule-2.0/scripts/checkcomposer.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$requiredVersion = 'version 1'; // La version interdite
|
||||||
|
|
||||||
|
$composerVersion = trim(shell_exec('COMPOSER_ALLOW_SUPERUSER=1 composer --version --no-ansi'));
|
||||||
|
echo $composerVersion."\n";
|
||||||
|
|
||||||
|
if (stripos($composerVersion,$requiredVersion)===false ) {
|
||||||
|
echo "La version de Composer $requiredVersion n'est pas autorisée" . PHP_EOL;
|
||||||
|
echo "Veuillez mettre à jour Composer avec 'composer self-update --1'." . PHP_EOL;
|
||||||
|
echo "Ou executez le scripts/reconfigure.sh" . PHP_EOL;
|
||||||
|
exit(1); // Quitte avec un code d'erreur
|
||||||
|
}
|
@@ -1,4 +1,2 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# Si besoin export des valeurs de HTTP_PROXY et HTTPS_PROXY
|
# Si besoin export des valeurs de HTTP_PROXY et HTTPS_PROXY
|
||||||
export HTTP_PROXY="192.168.57.160:8080"
|
|
||||||
export HTTPS_PROXY="192.168.57.160:8080"
|
|
||||||
|
@@ -6,12 +6,13 @@ cd /var/www/html/schedule
|
|||||||
. scripts/proxy.sh
|
. scripts/proxy.sh
|
||||||
|
|
||||||
# Mise en place du fichier d'environnement model
|
# Mise en place du fichier d'environnement model
|
||||||
if [ ! -f /var/www/html/schedule/.env ]; then
|
yes 2>/dev/null | cp /var/www/html/schedule/scripts/.env.model $DIR/.env
|
||||||
mv /var/www/html/schedule/scripts/.env.model /var/www/html/schedule/.env
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Installation des dépendances composer
|
# Installation des dépendances composer
|
||||||
composer install
|
echo COMPOSER = Install
|
||||||
|
export COMPOSER_ALLOW_SUPERUSER=1
|
||||||
|
composer self-update --1 --quiet
|
||||||
|
composer install --quiet
|
||||||
|
|
||||||
php bin/console app:AppInit --env=prod
|
php bin/console app:AppInit --env=prod
|
||||||
php bin/console app:CronInit --env=prod
|
php bin/console app:CronInit --env=prod
|
||||||
|
@@ -174,7 +174,13 @@ class EventController extends AbstractController
|
|||||||
|
|
||||||
// Astreinte
|
// Astreinte
|
||||||
if($astreinte) {
|
if($astreinte) {
|
||||||
// On regarde si une tache ne commence pas pendant une autre intervention ou qui se termine pendant une autre intervention ou qui a une intervention compris dans ses dates
|
// Une astreinte ne peut-etre un congès
|
||||||
|
if($task->getNature()->getIsvacation()) {
|
||||||
|
$output=["return"=>"KO","error"=>"Une astreinte ne peut être de nature congès","start"=>$datestart,"end"=>$dateend,"events"=>null];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
|
||||||
|
// On regarde si une astreinte ne commence pas pendant une autre astreinte ou qui se termine pendant une autre astreinte ou qui a une astreinte compris dans ses dates
|
||||||
$penaltys = $em->createQueryBuilder('penalty')
|
$penaltys = $em->createQueryBuilder('penalty')
|
||||||
->select('penalty')
|
->select('penalty')
|
||||||
->from('App:Penalty','penalty')
|
->from('App:Penalty','penalty')
|
||||||
@@ -199,6 +205,42 @@ class EventController extends AbstractController
|
|||||||
return new Response(json_encode($output));
|
return new Response(json_encode($output));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// On regarde si un évenement ne commence pas pendant un autre évenement ou qui se termine pendant un autre évenement ou qui a un évenement compris dans ses dates
|
||||||
|
$events = $em->createQueryBuilder('event')
|
||||||
|
->select('event')
|
||||||
|
->from('App:Event','event')
|
||||||
|
->Where('event.user=:user AND event.start<=:start AND event.end >:start')
|
||||||
|
->orWhere('event.user=:user AND event.start<:end AND event.end >=:end')
|
||||||
|
->orWhere('event.user=:user AND event.start>:start AND event.end <:end')
|
||||||
|
->setParameter('user',$iduser)
|
||||||
|
->setParameter('start',$datestart)
|
||||||
|
->setParameter('end',$dateend)
|
||||||
|
->getQuery()->getResult();
|
||||||
|
if($events) {
|
||||||
|
$tbevent=[];
|
||||||
|
$validate=false;
|
||||||
|
$holiday=false;
|
||||||
|
foreach($events as $event) {
|
||||||
|
$tmp=[
|
||||||
|
"id" => $event->getId(),
|
||||||
|
"start" => $event->getStart(),
|
||||||
|
"end" => $event->getEnd(),
|
||||||
|
];
|
||||||
|
array_push($tbevent,$tmp);
|
||||||
|
if($event->getValidate()) $validate=true;
|
||||||
|
if($event->getTask()->getNature()->getIsvacation()) $holiday=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if($validate) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a sa semaine de validé","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($holiday) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a posé des congés sur cette période","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Création de l'astreinte
|
// Création de l'astreinte
|
||||||
$penalty = new Penalty();
|
$penalty = new Penalty();
|
||||||
$penalty->setStart($datestart);
|
$penalty->setStart($datestart);
|
||||||
@@ -232,6 +274,8 @@ class EventController extends AbstractController
|
|||||||
->getQuery()->getResult();
|
->getQuery()->getResult();
|
||||||
if($events) {
|
if($events) {
|
||||||
$tbevent=[];
|
$tbevent=[];
|
||||||
|
$validate=false;
|
||||||
|
$holiday=false;
|
||||||
foreach($events as $event) {
|
foreach($events as $event) {
|
||||||
$tmp=[
|
$tmp=[
|
||||||
"id" => $event->getId(),
|
"id" => $event->getId(),
|
||||||
@@ -239,9 +283,26 @@ class EventController extends AbstractController
|
|||||||
"end" => $event->getEnd(),
|
"end" => $event->getEnd(),
|
||||||
];
|
];
|
||||||
array_push($tbevent,$tmp);
|
array_push($tbevent,$tmp);
|
||||||
|
if($event->getValidate()) $validate=true;
|
||||||
|
if($event->getTask()->getNature()->getIsvacation()) $holiday=true;
|
||||||
}
|
}
|
||||||
$output=["return"=>"KO","error"=>"Cet intervant a déjà une tache à cette date","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
|
||||||
return new Response(json_encode($output));
|
if(!$this->isGranted('ROLE_ADMIN')&&!$this->isGranted('ROLE_MASTER')) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a déjà une tache à cette date","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($validate) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a sa semaine de validé","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($holiday) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a posé des congés sur cette période","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($task->getNature()->getIsvacation()) {
|
||||||
|
$output=["return"=>"KO","error"=>"Vous ne pouvez pas poser de congés à cette date, une intervention y est déjà plannifiée","start"=>$datestart,"end"=>$dateend,"events"=>null];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// On regarde si un jour férié ne commence pas pendant une autre intervention ou qui se termine pendant une autre intervention ou qui a une intervention compris dans ses dates
|
// On regarde si un jour férié ne commence pas pendant une autre intervention ou qui se termine pendant une autre intervention ou qui a une intervention compris dans ses dates
|
||||||
@@ -288,7 +349,7 @@ class EventController extends AbstractController
|
|||||||
$idevent=$event->getId();
|
$idevent=$event->getId();
|
||||||
//$valid_url = $this->generateUrl('app_validationholiday',[],true);
|
//$valid_url = $this->generateUrl('app_validationholiday',[],true);
|
||||||
$valid_url = $this->router->generate('app_validationholiday', [], urlGeneratorInterface::ABSOLUTE_URL);
|
$valid_url = $this->router->generate('app_validationholiday', [], urlGeneratorInterface::ABSOLUTE_URL);
|
||||||
$this->notificator->sendNotifAttenteValid("Congés en attente de validation", $iduser, $idevent, $valid_url);
|
// $this->notificator->sendNotifAttenteValid("Congés en attente de validation", $iduser, $idevent, $valid_url);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,6 +389,12 @@ class EventController extends AbstractController
|
|||||||
|
|
||||||
// Astreinte
|
// Astreinte
|
||||||
if($fgastreinte) {
|
if($fgastreinte) {
|
||||||
|
// Une astreinte ne peut-etre un congès
|
||||||
|
if($task->getNature()->getIsvacation()) {
|
||||||
|
$output=["return"=>"KO","error"=>"Une astreinte ne peut être de nature congès"];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
|
||||||
// Recherche de l'event
|
// Recherche de l'event
|
||||||
$penalty = $em->getRepository("App:Penalty")->find($idevent);
|
$penalty = $em->getRepository("App:Penalty")->find($idevent);
|
||||||
if(!$penalty) {
|
if(!$penalty) {
|
||||||
@@ -394,6 +461,7 @@ class EventController extends AbstractController
|
|||||||
$dateend->SetTime(17,0,0);
|
$dateend->SetTime(17,0,0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// On regarde si une tache ne commence pas pendant une autre intervention ou qui se termine pendant une autre intervention ou qui a une intervention compris dans ses dates
|
// On regarde si une tache ne commence pas pendant une autre intervention ou qui se termine pendant une autre intervention ou qui a une intervention compris dans ses dates
|
||||||
$events = $em->createQueryBuilder('event')
|
$events = $em->createQueryBuilder('event')
|
||||||
->select('event')
|
->select('event')
|
||||||
@@ -407,6 +475,9 @@ class EventController extends AbstractController
|
|||||||
->getQuery()->getResult();
|
->getQuery()->getResult();
|
||||||
if($events) {
|
if($events) {
|
||||||
$tbevent=[];
|
$tbevent=[];
|
||||||
|
$validate=false;
|
||||||
|
$holiday=false;
|
||||||
|
|
||||||
foreach($events as $ev) {
|
foreach($events as $ev) {
|
||||||
if ($event->getId() != $ev->getId()) {
|
if ($event->getId() != $ev->getId()) {
|
||||||
$tmp=[
|
$tmp=[
|
||||||
@@ -416,11 +487,28 @@ class EventController extends AbstractController
|
|||||||
"end" => $ev->getEnd(),
|
"end" => $ev->getEnd(),
|
||||||
];
|
];
|
||||||
array_push($tbevent,$tmp);
|
array_push($tbevent,$tmp);
|
||||||
|
if($ev->getValidate()) $validate=true;
|
||||||
|
if($ev->getTask()->getNature()->getIsvacation()) $holiday=true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sizeof($tbevent)>0) {
|
if (sizeof($tbevent)>0) {
|
||||||
$output=["return"=>"KO","error"=>"Cet intervant a déjà une tache à cette date","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
if(!$this->isGranted('ROLE_ADMIN')&&!$this->isGranted('ROLE_MASTER')) {
|
||||||
return new Response(json_encode($output));
|
$output=["return"=>"KO","error"=>"Cet intervant a déjà une tache à cette date","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($validate) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a sa semaine de validé","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($holiday) {
|
||||||
|
$output=["return"=>"KO","error"=>"Cet intervant a posé des congés sur cette période","start"=>$datestart,"end"=>$dateend,"events"=>$tbevent];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
elseif($task->getNature()->getIsvacation()) {
|
||||||
|
$output=["return"=>"KO","error"=>"Vous ne pouvez pas poser de congés à cette date, une intervention y est déjà plannifiée","start"=>$datestart,"end"=>$dateend,"events"=>null];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -262,6 +262,8 @@ class ExportController extends AbstractController
|
|||||||
$tbproject["projectname"] = $project->getDisplayname();
|
$tbproject["projectname"] = $project->getDisplayname();
|
||||||
$tbproject["name"] = $project->getname();
|
$tbproject["name"] = $project->getname();
|
||||||
$tbproject["customer"] = $project->getCustomer()->getName();
|
$tbproject["customer"] = $project->getCustomer()->getName();
|
||||||
|
$tbproject["service"] = $project->getService()->getName();
|
||||||
|
$tbproject["domaine"] = $project->getDomaine()->getName();
|
||||||
// Somme event validé par semaine
|
// Somme event validé par semaine
|
||||||
$start=new \Datetime('first day of this month');
|
$start=new \Datetime('first day of this month');
|
||||||
$start->sub(new \DateInterval('P'.$nbmonth.'M'));
|
$start->sub(new \DateInterval('P'.$nbmonth.'M'));
|
||||||
|
@@ -53,15 +53,7 @@ class ReportController extends AbstractController
|
|||||||
|
|
||||||
$tmp["events"][$idday] = [
|
$tmp["events"][$idday] = [
|
||||||
"date"=>clone $start,
|
"date"=>clone $start,
|
||||||
"allday"=>false,
|
"events"=>[],
|
||||||
"colorday"=>"",
|
|
||||||
"descriptionday"=>"",
|
|
||||||
"am"=>false,
|
|
||||||
"coloram"=>"",
|
|
||||||
"descriptionam"=>"",
|
|
||||||
"ap"=>false,
|
|
||||||
"colorap"=>"",
|
|
||||||
"descriptionap"=>"",
|
|
||||||
"astreinte"=>false,
|
"astreinte"=>false,
|
||||||
"colorastreinte"=>"",
|
"colorastreinte"=>"",
|
||||||
"descriptionastreinte"=>"",
|
"descriptionastreinte"=>"",
|
||||||
@@ -99,22 +91,16 @@ class ReportController extends AbstractController
|
|||||||
while($st<$event->getEnd()) {
|
while($st<$event->getEnd()) {
|
||||||
$idday=$st->format("Ymd");
|
$idday=$st->format("Ymd");
|
||||||
if($event->getAllday()) {
|
if($event->getAllday()) {
|
||||||
$tmp["events"][$idday]["allday"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>true,"colorday"=>$event->getTask()->getColor(),"descriptionday"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription()];
|
||||||
$tmp["events"][$idday]["colorday"]=$event->getTask()->getColor();
|
|
||||||
$tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Matin ou après-midi ?
|
// Matin ou après-midi ?
|
||||||
$time=$event->getStart()->format("H");
|
$time=$event->getStart()->format("H");
|
||||||
if($time==9) {
|
if($time==9) {
|
||||||
$tmp["events"][$idday]["am"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>false,"am"=>true,"ap"=>false,"coloram"=>$event->getTask()->getColor(),"descriptionam"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription()];
|
||||||
$tmp["events"][$idday]["coloram"]=$event->getTask()->getColor();
|
|
||||||
$tmp["events"][$idday]["descriptionam"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tmp["events"][$idday]["ap"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>false,"am"=>false,"ap"=>true,"colorap"=>$event->getTask()->getColor(),"descriptionap"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription()];
|
||||||
$tmp["events"][$idday]["colorap"]=$event->getTask()->getColor();
|
|
||||||
$tmp["events"][$idday]["descriptionap"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,18 +166,19 @@ class ReportController extends AbstractController
|
|||||||
$st=clone $breakday->getStart();
|
$st=clone $breakday->getStart();
|
||||||
while($st<$breakday->getEnd()) {
|
while($st<$breakday->getEnd()) {
|
||||||
$idday=$st->format("Ymd");
|
$idday=$st->format("Ymd");
|
||||||
$tmp["events"][$idday]["allday"]=true;
|
$tmp["events"][$idday]["events"][-2000]["allday"]=true;
|
||||||
$tmp["events"][$idday]["colorday"]="#6c7a89";
|
$tmp["events"][$idday]["events"][-2000]["colorday"]="#6c7a89";
|
||||||
$tmp["events"][$idday]["descriptionday"]="Jour Férié";
|
$tmp["events"][$idday]["events"][-2000]["descriptionday"]="Jour Férié";
|
||||||
|
|
||||||
$st->add(new \DateInterval('P1D'));
|
$st->add(new \DateInterval('P1D'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
array_push($tbevents,$tmp);
|
array_push($tbevents,$tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//dump($tbevents);
|
||||||
|
|
||||||
if($request->query->get('fgprint')) {
|
if($request->query->get('fgprint')) {
|
||||||
$render = $this->renderView('Report/synthese.html.twig',[
|
$render = $this->renderView('Report/synthese.html.twig',[
|
||||||
"useheader" => true,
|
"useheader" => true,
|
||||||
|
132
src/schedule-2.0/src/Controller/RestController.php
Normal file
132
src/schedule-2.0/src/Controller/RestController.php
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Controller;
|
||||||
|
|
||||||
|
use FOS\RestBundle\Controller\AbstractFOSRestController;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use FOS\RestBundle\Controller\Annotations as FOSRest;
|
||||||
|
use Swagger\Annotations as SWG;
|
||||||
|
|
||||||
|
use App\Entity\Cache;
|
||||||
|
|
||||||
|
|
||||||
|
class RestController extends AbstractFOSRestController
|
||||||
|
{
|
||||||
|
private $output=[];
|
||||||
|
private $cpt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return list of maps
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* @FOSRest\Post("/rest/getBreakdays")
|
||||||
|
* @SWG\Response(
|
||||||
|
* response=200,
|
||||||
|
* description="Return list of breakday events"
|
||||||
|
* )
|
||||||
|
* )
|
||||||
|
* @SWG\Parameter(
|
||||||
|
* name="key",
|
||||||
|
* in="formData",
|
||||||
|
* required=true,
|
||||||
|
* description="APIKey",
|
||||||
|
* type="string"
|
||||||
|
* )
|
||||||
|
* @SWG\Parameter(
|
||||||
|
* name="username",
|
||||||
|
* in="formData",
|
||||||
|
* required=true,
|
||||||
|
* description="username",
|
||||||
|
* type="string"
|
||||||
|
* )
|
||||||
|
*/
|
||||||
|
|
||||||
|
public function getBreakdays(Request $request) {
|
||||||
|
set_time_limit(0);
|
||||||
|
ini_set('memory_limit', '1024M');
|
||||||
|
|
||||||
|
// Initalisation Manager
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
// Récupération des parametres
|
||||||
|
$key=$request->get("key");
|
||||||
|
$username=$request->get("username");
|
||||||
|
|
||||||
|
if($key!=$this->getParameter("appSecret")) {
|
||||||
|
$view = $this->view("API Key inconnue", 403);
|
||||||
|
return $this->handleView($view);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user=$em->getRepository("App:User")->findOneBy(["username"=>$username]);
|
||||||
|
if(!$user) {
|
||||||
|
$view = $this->view("User inconnue", 403);
|
||||||
|
return $this->handleView($view);
|
||||||
|
}
|
||||||
|
|
||||||
|
// On formate le tableau de jour
|
||||||
|
$start=new \Datetime('2022-03-07 00:00');
|
||||||
|
$end=new \Datetime('00:00');
|
||||||
|
$end->modify("last day of this month");
|
||||||
|
$end->modify("next sunday");
|
||||||
|
|
||||||
|
$events = $em
|
||||||
|
->createQueryBuilder('event')
|
||||||
|
->select('event')
|
||||||
|
->from('App:Event','event')
|
||||||
|
->Where('event.user=:user AND event.start>=:start AND event.end <:end')
|
||||||
|
->setParameter('user',$user)
|
||||||
|
->setParameter('start',$start)
|
||||||
|
->setParameter('end',$end)
|
||||||
|
->getQuery()->getResult();
|
||||||
|
|
||||||
|
|
||||||
|
$output=[
|
||||||
|
"start"=>$start->format("d/m/Y"),
|
||||||
|
"end"=>$end->format("d/m/Y"),
|
||||||
|
"events"=>[],
|
||||||
|
];
|
||||||
|
|
||||||
|
$tbnature=[-200,-190,-100];
|
||||||
|
foreach($events as $event) {
|
||||||
|
if(in_array($event->getTask()->getNature()->getId(),$tbnature)) {
|
||||||
|
$tmp = [
|
||||||
|
"eventstart"=>$event->getStart(),
|
||||||
|
"eventend"=>$event->getEnd(),
|
||||||
|
"eventallday"=>$event->getAllday(),
|
||||||
|
"taskid"=>$event->getTask()->getId(),
|
||||||
|
"taskname"=>$event->getTask()->getName(),
|
||||||
|
"natureid"=>$event->getTask()->getNature()->getId(),
|
||||||
|
"naturename"=>$event->getTask()->getNature()->getName(),
|
||||||
|
];
|
||||||
|
|
||||||
|
array_push($output["events"],$tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$events = $em
|
||||||
|
->createQueryBuilder('breakday')
|
||||||
|
->select('breakday')
|
||||||
|
->from('App:Breakday','breakday')
|
||||||
|
->Where('breakday.start>=:start AND breakday.end <:end')
|
||||||
|
->setParameter('start',$start)
|
||||||
|
->setParameter('end',$end)
|
||||||
|
->getQuery()->getResult();
|
||||||
|
|
||||||
|
foreach($events as $event) {
|
||||||
|
$tmp = [
|
||||||
|
"eventstart"=>$event->getStart(),
|
||||||
|
"eventend"=>$event->getEnd(),
|
||||||
|
"eventallday"=>true,
|
||||||
|
"taskid"=>null,
|
||||||
|
"taskname"=>"Jour Férié",
|
||||||
|
"natureid"=>null,
|
||||||
|
"naturename"=>"Jour Férié",
|
||||||
|
];
|
||||||
|
|
||||||
|
array_push($output["events"],$tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
$view = $this->view($output, 200);
|
||||||
|
return $this->handleView($view);
|
||||||
|
}
|
||||||
|
}
|
@@ -101,16 +101,7 @@ class ValidationController extends AbstractController
|
|||||||
|
|
||||||
$tmp["events"][$idday] = [
|
$tmp["events"][$idday] = [
|
||||||
"date"=>clone $start,
|
"date"=>clone $start,
|
||||||
"allday"=>false,
|
"events"=>[],
|
||||||
"colorday"=>"",
|
|
||||||
"descriptionday"=>"",
|
|
||||||
"am"=>false,
|
|
||||||
"coloram"=>"",
|
|
||||||
"descriptionam"=>"",
|
|
||||||
"ap"=>false,
|
|
||||||
"colorap"=>"",
|
|
||||||
"descriptionap"=>"",
|
|
||||||
"validate"=>$validate,
|
|
||||||
"astreinte"=>false,
|
"astreinte"=>false,
|
||||||
"colorastreinte"=>"",
|
"colorastreinte"=>"",
|
||||||
"descriptionastreinte"=>"",
|
"descriptionastreinte"=>"",
|
||||||
@@ -138,22 +129,16 @@ class ValidationController extends AbstractController
|
|||||||
while($st<$event->getEnd()) {
|
while($st<$event->getEnd()) {
|
||||||
$idday=$st->format("Ymd");
|
$idday=$st->format("Ymd");
|
||||||
if($event->getAllday()) {
|
if($event->getAllday()) {
|
||||||
$tmp["events"][$idday]["allday"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>true,"colorday"=>$event->getTask()->getColor(),"descriptionday"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(),"validate"=>$event->getValidate()];
|
||||||
$tmp["events"][$idday]["colorday"]=$event->getTask()->getColor();
|
}
|
||||||
$tmp["events"][$idday]["descriptionday"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
// Matin ou après-midi ?
|
// Matin ou après-midi ?
|
||||||
$time=$event->getStart()->format("H");
|
$time=$event->getStart()->format("H");
|
||||||
if($time==9) {
|
if($time==9) {
|
||||||
$tmp["events"][$idday]["am"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>false,"am"=>true,"ap"=>false,"coloram"=>$event->getTask()->getColor(),"descriptionam"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(),"validate"=>$event->getValidate()];
|
||||||
$tmp["events"][$idday]["coloram"]=$event->getTask()->getColor();
|
|
||||||
$tmp["events"][$idday]["descriptionam"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$tmp["events"][$idday]["ap"]=true;
|
$tmp["events"][$idday]["events"][$event->getId()]=["allday"=>false,"am"=>false,"ap"=>true,"colorap"=>$event->getTask()->getColor(),"descriptionap"=>strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription(),"validate"=>$event->getValidate()];
|
||||||
$tmp["events"][$idday]["colorap"]=$event->getTask()->getColor();
|
|
||||||
$tmp["events"][$idday]["descriptionap"]=strtoupper($event->getTask()->getDisplayname())."\n\n".$event->getDescription();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -295,7 +280,7 @@ class ValidationController extends AbstractController
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($duration!= 5) {
|
if($duration< 5) {
|
||||||
$output=["return"=>"KO","error"=>"Validation impossible = semaine incomplète"];
|
$output=["return"=>"KO","error"=>"Validation impossible = semaine incomplète"];
|
||||||
return new Response(json_encode($output));
|
return new Response(json_encode($output));
|
||||||
}
|
}
|
||||||
@@ -500,7 +485,7 @@ class ValidationController extends AbstractController
|
|||||||
$em->flush();
|
$em->flush();
|
||||||
$iduser=$event->getUser()->getId();
|
$iduser=$event->getUser()->getId();
|
||||||
$idevent=$event->getId();
|
$idevent=$event->getId();
|
||||||
$this->notificator->sendNotifValid("Congé validé", $iduser, $event);
|
// $this->notificator->sendNotifValid("Congé validé", $iduser, $event);
|
||||||
}
|
}
|
||||||
|
|
||||||
$output=[];
|
$output=[];
|
||||||
|
@@ -227,6 +227,20 @@
|
|||||||
"phpdocumentor/type-resolver": {
|
"phpdocumentor/type-resolver": {
|
||||||
"version": "1.1.0"
|
"version": "1.1.0"
|
||||||
},
|
},
|
||||||
|
"phpunit/phpunit": {
|
||||||
|
"version": "8.5",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "4.7",
|
||||||
|
"ref": "db276258424d15e572d35a4eb834b8f815662b25"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
".env.test",
|
||||||
|
"phpunit.xml.dist",
|
||||||
|
"tests/bootstrap.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
"psr/cache": {
|
"psr/cache": {
|
||||||
"version": "1.0.1"
|
"version": "1.0.1"
|
||||||
},
|
},
|
||||||
|
@@ -1,12 +1,12 @@
|
|||||||
{% block body %}
|
{% block body %}
|
||||||
Client;Projet;Tâche;Nature;Utilisateur;Année;Semaine;Cumul;
|
Client;Projet;Tâche;Activité;Domaine;Nature;Utilisateur;Année;Semaine;Cumul;
|
||||||
{% for project in projects %}
|
{% for project in projects %}
|
||||||
{% if project.weeks_by_task_by_user is defined %}
|
{% if project.weeks_by_task_by_user is defined %}
|
||||||
{% for year,weeks in project.weeks_by_task_by_user %}
|
{% for year,weeks in project.weeks_by_task_by_user %}
|
||||||
{% for week in weeks %}
|
{% for week in weeks %}
|
||||||
{% for task in week.tasks%}
|
{% for task in week.tasks%}
|
||||||
{% for user in task.users%}
|
{% for user in task.users%}
|
||||||
{{project.customer}};{{project.name}};{{task.taskname|replace({"&": "et"})}};{{task.nature}};{{user.displayname}};{{week.isoyear}};{{week.isoweek}};{{user.cumul|replace({".": ","})}};
|
{{project.customer}};{{project.name}};{{task.taskname|replace({"&": "et"})}};{{project.service}};{{project.domaine}};{{task.nature}};{{user.displayname}};{{week.isoyear}};{{week.isoweek}};{{user.cumul|replace({".": ","})}};
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@@ -34,14 +34,16 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
float:left;
|
float:left;
|
||||||
width:100%;
|
width:100%;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.am, .ap {
|
.am, .ap {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
float:left;
|
float:left;
|
||||||
width:50%;
|
width:50%;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.astreinte {
|
.astreinte {
|
||||||
@@ -83,27 +85,30 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
<td>
|
<td>
|
||||||
<div class="date">{{ event.date | date("d/m") }}</div>
|
<div class="date">{{ event.date | date("d/m") }}</div>
|
||||||
{% if event.allday %}
|
<div class="d-flex flex-wrap">
|
||||||
<div class='allday' style='background-color:{{ event.colorday }};' title='{{ event.descriptionday }}'>1</div>
|
{% set haveam=false %}
|
||||||
{% else %}
|
{% for detail in event.events %}
|
||||||
{%if event.am %}
|
{% if detail.allday %}
|
||||||
<div class='am' style='background-color:{{ event.coloram }};' title='{{ event.descriptionam }}'>0.5</div>
|
<div class='allday' style='background-color:{{ detail.colorday }};' title='{{ detail.descriptionday }}'>1</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class='am'></div>
|
{%if detail.am %}
|
||||||
{% endif %}
|
{% set haveam=true %}
|
||||||
|
<div class='am' style='background-color:{{ detail.coloram }};' title='{{ detail.descriptionam }}'>0.5</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{%if event.ap %}
|
{%if detail.ap %}
|
||||||
<div class='ap' style='background-color:{{ event.colorap }};' title='{{ event.descriptionap }}'>0.5</div>
|
{% if not haveam %}<div class='am'></div>{%endif%}
|
||||||
{% else %}
|
<div class='ap ml-auto' style='background-color:{{ detail.colorap }};' title='{{ detail.descriptionap }}'>0.5</div>
|
||||||
<div class='ap'></div>
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endfor %}
|
||||||
|
|
||||||
{% if event.astreinte %}
|
{% if event.astreinte %}
|
||||||
<div class='astreinte' style='background-color:{{ event.colorastreinte }};' title='{{ event.descriptionastreinte }}'>*</div>
|
<div class='astreinte' style='background-color:{{ event.colorastreinte }};' title='{{ event.descriptionastreinte }}'>*</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class='astreinte'></div>
|
<div class='astreinte'></div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
{% set nbday=nbday+1 %}
|
{% set nbday=nbday+1 %}
|
||||||
@@ -126,4 +131,14 @@
|
|||||||
function myprint() {
|
function myprint() {
|
||||||
document.location.href="{{path(app.request.attributes.get('_route'),{fgprint:true})}}";
|
document.location.href="{{path(app.request.attributes.get('_route'),{fgprint:true})}}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$(document).ready(function() {
|
||||||
|
maxheight=0;
|
||||||
|
$( ".card" ).each(function( index ) {
|
||||||
|
if($(this).height()>maxheight)
|
||||||
|
maxheight=$(this).height();
|
||||||
|
});
|
||||||
|
$( ".card" ).height(maxheight);
|
||||||
|
});
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@@ -34,14 +34,16 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
float:left;
|
float:left;
|
||||||
width:100%;
|
width:100%;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.am, .ap {
|
.am, .ap {
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
float:left;
|
float:left;
|
||||||
width:50%;
|
width:50%;
|
||||||
height: 18px;
|
height: 18px;
|
||||||
|
flex: 0 0 auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
.astreinte {
|
.astreinte {
|
||||||
@@ -83,7 +85,8 @@
|
|||||||
{% if nbday==1 %}
|
{% if nbday==1 %}
|
||||||
<tr id="{{user.user.id}}-{{event.date|date("Ymd")}}"}">
|
<tr id="{{user.user.id}}-{{event.date|date("Ymd")}}"}">
|
||||||
<td class="no-print" style="vertical-align:middle">
|
<td class="no-print" style="vertical-align:middle">
|
||||||
{% if event.validate %}
|
{% set first=event.events|first %}
|
||||||
|
{% if first and first.validate %}
|
||||||
<i class="fa fa-thumbs-down devalidate-{{user.user.id}}" onClick="devalidate({{user.user.id}},'{{event.date|date("Ymd")}}','{{event.date|date("m/d/Y")}}')" style="cursor:pointer; color:red;"></i>
|
<i class="fa fa-thumbs-down devalidate-{{user.user.id}}" onClick="devalidate({{user.user.id}},'{{event.date|date("Ymd")}}','{{event.date|date("m/d/Y")}}')" style="cursor:pointer; color:red;"></i>
|
||||||
{%else%}
|
{%else%}
|
||||||
<i class="fa fa-thumbs-up validate-{{user.user.id}}" onClick="validate({{user.user.id}},'{{event.date|date("Ymd")}}','{{event.date|date("m/d/Y")}}')" style="cursor:pointer; color:green;{% if btnvalidate %}display:none{% endif %}"></i>
|
<i class="fa fa-thumbs-up validate-{{user.user.id}}" onClick="validate({{user.user.id}},'{{event.date|date("Ymd")}}','{{event.date|date("m/d/Y")}}')" style="cursor:pointer; color:green;{% if btnvalidate %}display:none{% endif %}"></i>
|
||||||
@@ -95,21 +98,24 @@
|
|||||||
|
|
||||||
<td>
|
<td>
|
||||||
<div class="date">{{ event.date | date("d/m") }}</div>
|
<div class="date">{{ event.date | date("d/m") }}</div>
|
||||||
{% if event.allday %}
|
<div class="d-flex flex-wrap">
|
||||||
<div class='allday' style='background-color:{{ event.colorday }};' title='{{ event.descriptionday }}'>1</div>
|
{% set haveam=false %}
|
||||||
{% else %}
|
{% for detail in event.events %}
|
||||||
{%if event.am %}
|
{% if detail.allday %}
|
||||||
<div class='am' style='background-color:{{ event.coloram }};' title='{{ event.descriptionam }}'>0.5</div>
|
<div class='allday' style='background-color:{{ detail.colorday }};' title='{{ detail.descriptionday }}'>1</div>
|
||||||
{% else %}
|
{% else %}
|
||||||
<div class='am'></div>
|
{%if detail.am %}
|
||||||
{% endif %}
|
{% set haveam=true %}
|
||||||
|
<div class='am' style='background-color:{{ detail.coloram }};' title='{{ detail.descriptionam }}'>0.5</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{%if event.ap %}
|
{%if detail.ap %}
|
||||||
<div class='ap' style='background-color:{{ event.colorap }};' title='{{ event.descriptionap }}'>0.5</div>
|
{% if not haveam %}<div class='am'></div>{%endif%}
|
||||||
{% else %}
|
<div class='ap' style='background-color:{{ detail.colorap }};' title='{{ detail.descriptionap }}'>0.5</div>
|
||||||
<div class='ap'></div>
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
{% if event.astreinte %}
|
{% if event.astreinte %}
|
||||||
<div class='astreinte' style='background-color:{{ event.colorastreinte }};' title='{{ event.descriptionastreinte }}'>*</div>
|
<div class='astreinte' style='background-color:{{ event.colorastreinte }};' title='{{ event.descriptionastreinte }}'>*</div>
|
||||||
|
Reference in New Issue
Block a user