Compare commits
23 Commits
api_doliba
...
pkg/stable
Author | SHA1 | Date | |
---|---|---|---|
f8b4d0446d | |||
ce10df9293 | |||
b14fc3d0e1 | |||
164da2ee48 | |||
1fec858f01 | |||
697c7a8f1c | |||
24ecd6c87e | |||
6acf427696 | |||
b17024cccd | |||
cdb2537d3f | |||
2ba143e5a2 | |||
5037b0945e | |||
a0b87b907f | |||
c31d14bff4 | |||
dfa5a993ce | |||
91536ed930 | |||
10cb25730b | |||
937ec6f4ca | |||
7e988ff7a9 | |||
c66962097d | |||
db11d66ae0 | |||
2d42e3016d | |||
ba4acc1b89 |
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@@ -0,0 +1 @@
|
||||
7
|
24
debian/control
vendored
Normal file
24
debian/control
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
Source: eole-schedule
|
||||
Section: web
|
||||
Priority: optional
|
||||
Maintainer: Cadoles <contact@cadoles.com>
|
||||
Build-Depends: debhelper (>= 7.0.50)
|
||||
Standards-Version: 3.8.4
|
||||
Homepage: https://forge.cadoles.com/Cadoles/schedule
|
||||
Vcs-Git: https://forge.cadoles.com/Cadoles/schedule
|
||||
Vcs-Browser: https://forge.cadoles.com/Cadoles/schedule
|
||||
|
||||
Package: schedule-sso
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}, eole-sso
|
||||
Description: Filtre SSO pour schedule "EOLE".
|
||||
|
||||
Package: eole-schedule
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}, eole-envole-dependances, schedule-sso
|
||||
Description: Eolisation de l'application schedule.
|
||||
|
||||
Package: schedule-apps
|
||||
Architecture: all
|
||||
Depends: ${misc:Depends}, envole-dependances-apps
|
||||
Description: Sources pour schedule "EOLE".
|
44
debian/copyright
vendored
Normal file
44
debian/copyright
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
Format: http://dep.debian.net/deps/dep5
|
||||
Upstream-Name: {PROJECT}
|
||||
Source: {URL}
|
||||
|
||||
Files: *
|
||||
Copyright: YEAR {UPSTREAM} {AUTHOR} <{MAIL}>
|
||||
License: {UPSTREAM LICENSE}
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2012 Équipe EOLE <eole@ac-dijon.fr>
|
||||
License: CeCILL-2
|
||||
|
||||
License: {UPSTREAM LICENSE}
|
||||
{TEXT OF THE LICENSE}
|
||||
|
||||
License: CeCILL-2
|
||||
This software is governed by the CeCILL-2 license under French law and
|
||||
abiding by the rules of distribution of free software. You can use,
|
||||
modify and or redistribute the software under the terms of the CeCILL-2
|
||||
license as circulated by CEA, CNRS and INRIA at the following URL
|
||||
"http://www.cecill.info";.
|
||||
.
|
||||
As a counterpart to the access to the source code and rights to copy,
|
||||
modify and redistribute granted by the license, users are provided only
|
||||
with a limited warranty and the software's author, the holder of the
|
||||
economic rights, and the successive licensors have only limited
|
||||
liability.
|
||||
.
|
||||
In this respect, the user's attention is drawn to the risks associated
|
||||
with loading, using, modifying and/or developing or reproducing the
|
||||
software by the user in light of its specific status of free software,
|
||||
that may mean that it is complicated to manipulate, and that also
|
||||
therefore means that it is reserved for developers and experienced
|
||||
professionals having in-depth computer knowledge. Users are therefore
|
||||
encouraged to load and test the software's suitability as regards their
|
||||
requirements in conditions enabling the security of their systems and/or
|
||||
data to be ensured and, more generally, to use and operate it in the
|
||||
same conditions as regards security.
|
||||
.
|
||||
The fact that you are presently reading this means that you have had
|
||||
knowledge of the CeCILL-2 license and that you accept its terms.
|
||||
.
|
||||
On Eole systems, the complete text of the CeCILL-2 License can be found
|
||||
in '/usr/share/common-licenses/CeCILL-2-en'.
|
1
debian/eole-schedule.install
vendored
Normal file
1
debian/eole-schedule.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/share/eole
|
3
debian/gbp.conf
vendored
Normal file
3
debian/gbp.conf
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# Set per distribution debian tag
|
||||
[DEFAULT]
|
||||
debian-tag = debian/envole/%(version)s
|
8
debian/rules
vendored
Executable file
8
debian/rules
vendored
Executable file
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/make -f
|
||||
# -*- makefile -*-
|
||||
|
||||
# Uncomment this to turn on verbose mode.
|
||||
#export DH_VERBOSE=1
|
||||
|
||||
%:
|
||||
dh $@
|
1
debian/schedule-apps.install
vendored
Normal file
1
debian/schedule-apps.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
var/www/html
|
1
debian/schedule-sso.install
vendored
Normal file
1
debian/schedule-sso.install
vendored
Normal file
@@ -0,0 +1 @@
|
||||
usr/share/sso
|
1
debian/source/format
vendored
Normal file
1
debian/source/format
vendored
Normal file
@@ -0,0 +1 @@
|
||||
3.0 (native)
|
@@ -34,8 +34,8 @@
|
||||
<variable type='string' name='schedule_allow_hosts' description="Hôtes authorisés à utiliser la base de données" multi='True'/>
|
||||
<variable type='string' name='schedule_dbuser' description='Utilisateur du serveur de base de données'/>
|
||||
<variable type='string' name='schedule_dbpass' description='Fichier de mot de passe du serveur'/>
|
||||
<variable type='string' name='schedule_email_global_notif' description='URL de connexion au serveur smtp'/>
|
||||
<variable type='string' name='schedule_email_url' description='Email pour envoie de notifications'/>
|
||||
<variable type='string' name='schedule_email_url' description='URL de connexion au serveur smtp'/>
|
||||
<variable type='string' name='schedule_email_global_notif' description='Email pour envoie de notifications'/>
|
||||
<variable type='string' name="schedule_office_hour_start" description="Heure de début d'une journée">
|
||||
<value>09:00</value>
|
||||
</variable>
|
||||
|
@@ -57,15 +57,10 @@ CAS_EMAIL=email
|
||||
CAS_LASTNAME=lastname
|
||||
CAS_FIRSTNAME=firstname
|
||||
|
||||
###> symfony/swiftmailer-bundle ###
|
||||
# For Gmail as a transport, use: "gmail://username:password@localhost"
|
||||
# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode="
|
||||
# Delivery is disabled by default via "null://localhost"
|
||||
MAILER_URL=
|
||||
|
||||
## Sentry DSN
|
||||
SENTRY_DSN=
|
||||
|
||||
# Dolibar
|
||||
DOLIBARR_ACTIVE=false
|
||||
DOLIBARR_API_KEY=
|
||||
DOLIBARR_URI=
|
||||
|
@@ -9,6 +9,8 @@ import interactionPlugin from '@fullcalendar/interaction';
|
||||
import dayGridPlugin from '@fullcalendar/daygrid';
|
||||
|
||||
var calendar;
|
||||
var e = document.getElementById("sideuser");
|
||||
var iduser = e.value;
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
var calendarEl = document.getElementById('fullcalendar');
|
||||
calendar = new Calendar(calendarEl, {
|
||||
@@ -16,7 +18,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
locale: frLocale,
|
||||
weekNumbers: true,
|
||||
selectable: true,
|
||||
events: 'event/load',
|
||||
events: 'event/load/'+iduser,
|
||||
eventLimit:8,
|
||||
eventDrop: function(info) {
|
||||
info.revert();
|
||||
|
@@ -268,7 +268,7 @@ app_event:
|
||||
defaults: { _controller: App\Controller\EventController:list }
|
||||
|
||||
app_event_load:
|
||||
path: /user/event/load
|
||||
path: /user/event/load/{id}
|
||||
defaults: { _controller: App\Controller\EventController:load }
|
||||
|
||||
app_event_submit:
|
||||
@@ -399,6 +399,10 @@ app_timer_delete:
|
||||
|
||||
|
||||
#== Customer ======================================================================================================
|
||||
app_customer_home:
|
||||
path: /customer
|
||||
defaults: { _controller: App\Controller\HomeController:customer }
|
||||
|
||||
app_customer_report:
|
||||
path: /customer/report/{key}
|
||||
defaults: { _controller: App\Controller\ReportController:report, access: 'customer' }
|
||||
@@ -428,6 +432,10 @@ export_offers:
|
||||
path: /export/export_offers
|
||||
defaults: { _controller: App\Controller\ExportController:export_offers }
|
||||
|
||||
export_month_charged_days:
|
||||
path: /export/export_month_charged_days
|
||||
defaults: { _controller: App\Controller\ExportController:export_month_charged_days }
|
||||
|
||||
|
||||
#== Export ======================================================================================================
|
||||
app_stat_view:
|
||||
|
@@ -36,6 +36,8 @@ __webpack_require__(/*! @fullcalendar/daygrid/main.css */ "./node_modules/@fullc
|
||||
|
||||
|
||||
var calendar;
|
||||
var e = document.getElementById("sideuser");
|
||||
var iduser = e.value;
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
var calendarEl = document.getElementById('fullcalendar');
|
||||
calendar = new _fullcalendar_core__WEBPACK_IMPORTED_MODULE_3__["Calendar"](calendarEl, {
|
||||
@@ -43,7 +45,7 @@ document.addEventListener('DOMContentLoaded', function () {
|
||||
locale: _fullcalendar_core_locales_fr_js__WEBPACK_IMPORTED_MODULE_4___default.a,
|
||||
weekNumbers: true,
|
||||
selectable: true,
|
||||
events: 'event/load',
|
||||
events: 'event/load/'+iduser,
|
||||
eventLimit: 8,
|
||||
eventDrop: function eventDrop(info) {
|
||||
info.revert();
|
||||
|
@@ -20,10 +20,7 @@ APP_SECRET=52c1cb88ee822cd2643abe29e16a68a6
|
||||
###< symfony/framework-bundle ###
|
||||
|
||||
###> symfony/mailer ###
|
||||
MAILER_METHOD=sendmail
|
||||
MAILER_URL=
|
||||
MAILER_NOREPLY=noreply@noreply.fr
|
||||
MAILER_DEFAULT_NOTIF=
|
||||
# MAILER_DSN=smtp://localhost
|
||||
###< symfony/mailer ###
|
||||
|
||||
###< doctrine/doctrine-bundle ###
|
||||
@@ -35,6 +32,16 @@ APP_NAME=Schedule
|
||||
APP_ENV=PROD
|
||||
APP_CRON=false
|
||||
|
||||
# Office hours
|
||||
OFFICE_HOUR_START=09:00
|
||||
OFFICE_HOUR_END=17:30
|
||||
|
||||
# MAIL sendmail / smtp
|
||||
MAILER_METHOD=sendmail
|
||||
MAILER_URL=
|
||||
MAILER_NOREPLY=noreply@noreply.fr
|
||||
MAILER_DEFAULT_NOTIF=
|
||||
|
||||
# BDD
|
||||
DATABASE_NAME=
|
||||
DATABASE_USER=
|
||||
@@ -45,14 +52,15 @@ DATABASE_HOST=
|
||||
CAS_HOST=
|
||||
CAS_PORT=
|
||||
CAS_PATH=
|
||||
|
||||
OFFICE_HOUR_START=09:00
|
||||
OFFICE_HOUR_END=17:30
|
||||
CAS_USERNAME=username
|
||||
CAS_EMAIL=email
|
||||
CAS_LASTNAME=lastname
|
||||
CAS_FIRSTNAME=firstname
|
||||
|
||||
## Sentry DSN
|
||||
SENTRY_DSN=
|
||||
|
||||
## Dolibarr
|
||||
# Dolibar
|
||||
DOLIBARR_ACTIVE=false
|
||||
DOLIBARR_API_KEY=
|
||||
DOLIBARR_URI=
|
||||
|
@@ -174,10 +174,10 @@ while($row=$queryold->fetch()) {
|
||||
$nature=$row["task_nature"];
|
||||
if($row["task_id"]<=-70) $nature=-200;
|
||||
if($row["task_id"]==-85 || $row["task_id"]==-70) $nature=-190;
|
||||
$q="INSERT IGNORE INTO task (id, name, color, quantity, validate, project_id, nature_id ) VALUES (?,?,?,?,?,?,?)";
|
||||
$q="INSERT IGNORE INTO task (id, name, color, quantity, validate, project_id, nature_id, active) VALUES (?,?,?,?,?,?,?,?)";
|
||||
$quantity=($row["task_quantity"]==0?null:$row["task_quantity"]);
|
||||
$query=$bddnew->prepare($q);
|
||||
$query->execute([$row["task_id"],$row["task_name"],"#".$row["task_color"],$quantity,$row["task_validate"],$row["task_project"],$nature ]);
|
||||
$query->execute([$row["task_id"],$row["task_name"],"#".$row["task_color"],$quantity,$row["task_validate"],$row["task_project"],$nature, 1]);
|
||||
}
|
||||
|
||||
writeligne("");
|
||||
|
@@ -38,13 +38,13 @@ class EventController extends AbstractController
|
||||
]);
|
||||
}
|
||||
|
||||
public function load(Request $request)
|
||||
public function load($iduser, Request $request)
|
||||
{
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$tbevents=[];
|
||||
$start = $request->query->get('start');
|
||||
$end = $request->query->get('end');
|
||||
$iduser=$this->get("session")->get("iduser");
|
||||
//$iduser=$this->get("session")->get("iduser");
|
||||
// Evenements
|
||||
if($iduser=="all") {
|
||||
$events=$em->getRepository("App:Event")->findAll();
|
||||
|
@@ -473,5 +473,58 @@ class ExportController extends AbstractController
|
||||
return $response;
|
||||
}
|
||||
|
||||
public function export_month_charged_days(Request $request,$access=null): Response {
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$nbmonth=$this->get("session")->get("nbmonth");
|
||||
|
||||
$tbevents=[];
|
||||
// On formate le tableau des event
|
||||
$start=new \Datetime('first day of this month');
|
||||
$start->sub(new \DateInterval('P'.$nbmonth.'M'));
|
||||
$start->setTime(0,0,0);
|
||||
$end = new \Datetime('first day of this month');
|
||||
$end->add(new \DateInterval('P1M'));
|
||||
$end->setTime(23,59,0);
|
||||
|
||||
$events = $em
|
||||
->createQueryBuilder('event')
|
||||
->select('event')
|
||||
->from('App:Event','event')
|
||||
->Where('event.start>=:start AND event.end <:end')
|
||||
->setParameter('start',$start)
|
||||
->setParameter('end',$end)
|
||||
->getQuery()->getResult();
|
||||
|
||||
foreach($events as $event) {
|
||||
if (!isset($tbevents[$event->getStart()->format("m")])) {
|
||||
$tbevents[$event->getStart()->format("m")]["f"]=0;
|
||||
$tbevents[$event->getStart()->format("m")]["nf"]=0;
|
||||
}
|
||||
if ($event->getTask()->getNature()->getName() == "Prestation") {
|
||||
if (!isset($tbevents[$event->getStart()->format("m")])){
|
||||
|
||||
$tbevents[$event->getStart()->format("m")]['f'] = $event->getDuration();
|
||||
}else{
|
||||
$tbevents[$event->getStart()->format("m")]['f'] += $event->getDuration();
|
||||
}
|
||||
}
|
||||
|
||||
if ($event->getTask()->getNature()->getName() != "Prestation") {
|
||||
if (!isset($tbevents[$event->getStart()->format("m")])){
|
||||
$tbevents[$event->getStart()->format("m")]['nf'] = $event->getDuration();
|
||||
}else{
|
||||
$tbevents[$event->getStart()->format("m")]['nf'] += $event->getDuration();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$csv = $this->renderView('Export/export_month_charged_days.csv.twig', ["events" => $tbevents]);
|
||||
$response = new Response($csv);
|
||||
$response->headers->set('Content-Type', 'text/csv; charset=utf-8');
|
||||
$response->headers->set('Content-Disposition', 'attachment; filename="export_month_charged_days.csv"');
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -25,6 +25,14 @@ class HomeController extends AbstractController
|
||||
*/
|
||||
}
|
||||
|
||||
public function customer()
|
||||
{
|
||||
return $this->render('Home/customer.html.twig',[
|
||||
"useheader" => true,
|
||||
"usesidebar" => false,
|
||||
]);
|
||||
}
|
||||
|
||||
public function selectmonth(Request $request)
|
||||
{
|
||||
$nbmonth = $request->request->get('nbmonth');
|
||||
|
@@ -255,9 +255,11 @@ class ReportController extends AbstractController
|
||||
|
||||
// Ne pas prendre les projects sans event dans la durée
|
||||
$start=new \Datetime('first day of this month');
|
||||
$start->setTime(0,0,0);
|
||||
$end=new \Datetime('first day of this month');
|
||||
$end->add(new \DateInterval('P'.$nbmonth.'M'));
|
||||
$end->sub(new \DateInterval('P1D'));
|
||||
$end->setTime(23,59,0);
|
||||
$events = $em
|
||||
->createQueryBuilder('event')
|
||||
->select('event')
|
||||
@@ -291,9 +293,11 @@ class ReportController extends AbstractController
|
||||
|
||||
// Formater les mois
|
||||
$start=new \Datetime('first day of this month');
|
||||
$start->setTime(0,0,0);
|
||||
$end=new \Datetime('first day of this month');
|
||||
$end->add(new \DateInterval('P'.$nbmonth.'M'));
|
||||
$end->sub(new \DateInterval('P1D'));
|
||||
$end->setTime(23,59,0);
|
||||
while($start<$end) {
|
||||
$tbproject["months"][$start->format("Ym")]=[
|
||||
"monthid"=> $start->format("Ym"),
|
||||
@@ -323,7 +327,7 @@ class ReportController extends AbstractController
|
||||
->from('App:Event','event')
|
||||
->Where('task.project=:project')
|
||||
->andWhere('event.task=task')
|
||||
->andWhere('event.end >=:start')
|
||||
->andWhere('event.start >=:start')
|
||||
->andWhere('event.end <:end')
|
||||
->setParameter('project',$project)
|
||||
->setParameter('start',$start)
|
||||
@@ -343,10 +347,11 @@ class ReportController extends AbstractController
|
||||
|
||||
// Formater les jours
|
||||
$start=new \Datetime('first day of this month');
|
||||
$start->setTime(0,0,0);
|
||||
$end=new \Datetime('first day of this month');
|
||||
$end->add(new \DateInterval('P'.$nbmonth.'M'));
|
||||
$end->sub(new \DateInterval('P1D'));
|
||||
|
||||
$end->setTime(23,59,0);
|
||||
while($start<$end) {
|
||||
$tbday=[
|
||||
"date"=>clone $start,
|
||||
@@ -375,9 +380,11 @@ class ReportController extends AbstractController
|
||||
|
||||
// Formater les utilisateurs
|
||||
$start=new \Datetime('first day of this month');
|
||||
$start->setTime(0,0,0);
|
||||
$end=new \Datetime('first day of this month');
|
||||
$end->add(new \DateInterval('P'.$nbmonth.'M'));
|
||||
$end->sub(new \DateInterval('P1D'));
|
||||
$end->setTime(23,59,0);
|
||||
|
||||
foreach($users as $user) {
|
||||
$tbevents = $this->getEventuser($user,$start,$end,false);
|
||||
|
@@ -97,7 +97,7 @@ class SecurityController extends AbstractController
|
||||
$user->setPassword("CASPWD-".$username);
|
||||
$user->setSalt("CASPWD-".$username);
|
||||
|
||||
$user->setRole("ROLE_USER");
|
||||
$user->setRoles(["ROLE_VISITOR"]);
|
||||
|
||||
$em->persist($user);
|
||||
$em->flush();
|
||||
@@ -125,8 +125,13 @@ class SecurityController extends AbstractController
|
||||
// Redirection
|
||||
if($redirect)
|
||||
return $this->redirect($redirect);
|
||||
else
|
||||
else {
|
||||
$roles=$user->getRoles();
|
||||
if(!in_array("ROLE_VISITOR",$roles))
|
||||
return $this->redirect($this->generateUrl('app_home'));
|
||||
else
|
||||
return $this->redirect($this->generateUrl('app_customer_home'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -55,6 +55,7 @@ class TaskController extends AbstractController
|
||||
$data = new Entity();
|
||||
$defaultnature = $em->getRepository("App:Nature")->findOneBy(['name' => 'Prestation']);
|
||||
$data->setNature($defaultnature);
|
||||
$data->setActive(true);
|
||||
// Création du formulaire
|
||||
$form = $this->createForm(Form::class,$data,array("mode"=>"submit"));
|
||||
|
||||
|
@@ -70,7 +70,11 @@ class Task
|
||||
* @ORM\OneToMany(targetEntity="Penalty", mappedBy="task", cascade={"persist"}, orphanRemoval=false)
|
||||
*/
|
||||
private $penaltys;
|
||||
|
||||
/**
|
||||
* @ORM\Column(name="active", type="boolean")
|
||||
*
|
||||
*/
|
||||
private $active;
|
||||
/**
|
||||
* Calculate Displayname
|
||||
*/
|
||||
@@ -228,6 +232,19 @@ class Task
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getActive(): ?bool
|
||||
{
|
||||
return $this->active;
|
||||
}
|
||||
|
||||
public function setActive(bool $active): self
|
||||
{
|
||||
$this->active = $active;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return Collection|Penalty[]
|
||||
*/
|
||||
|
@@ -57,6 +57,13 @@ class TaskType extends AbstractType
|
||||
]
|
||||
);
|
||||
|
||||
$builder->add("active",
|
||||
ChoiceType::class,[
|
||||
"label" => "Actif",
|
||||
"choices" => ["Non"=>false, "Oui"=>true]
|
||||
]
|
||||
);
|
||||
|
||||
$builder->add('color',
|
||||
TextType::class, [
|
||||
"label" => "Couleur",
|
||||
|
@@ -99,7 +99,9 @@
|
||||
{% for project in projects|sort((a, b) => a.displayname <=> b.displayname) %}
|
||||
<optgroup label="{{project.displayname}}">
|
||||
{% for task in project.tasks|sort((a, b) => a.displayname <=> b.displayname) %}
|
||||
{% if task.active %}
|
||||
<option value="{{task.id}}">{{task.displayname}}</option>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</optgroup>
|
||||
{% endfor %}
|
||||
|
@@ -0,0 +1,6 @@
|
||||
{% block body %}
|
||||
Mois;Jours_facturés;Jour_non_facturés
|
||||
{% for month, event in events %}
|
||||
{{month}};{{event.f}};{{event.nf}}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
@@ -43,4 +43,14 @@ EXPORTS DE DONNEES
|
||||
</div>
|
||||
</div>
|
||||
<p></p>
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<a class="btn btn-success" href={{ path('export_month_charged_days') }}>Export des jours facturés/non-facturés</a>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>Exporter la liste du nombre de jours facturés et non-facturés par mois</p>
|
||||
<p>Filtres utiles : Nombre de mois</p>
|
||||
</div>
|
||||
</div>
|
||||
<p></p>
|
||||
{% endblock %}
|
8
src/schedule-2.0/templates/Home/customer.html.twig
Normal file
8
src/schedule-2.0/templates/Home/customer.html.twig
Normal file
@@ -0,0 +1,8 @@
|
||||
{% extends "base.html.twig" %}
|
||||
|
||||
{% block body %}
|
||||
|
||||
<center>Merci d'utiliser l'URL qui vous a été communiquée pour visualiser votre rapport.</center>
|
||||
|
||||
{% endblock %}
|
||||
|
@@ -54,6 +54,7 @@
|
||||
{{ form_row(form.name) }}
|
||||
{{ form_row(form.project) }}
|
||||
{{ form_row(form.nature) }}
|
||||
{{ form_row(form.active) }}
|
||||
{{ form_row(form.quantity) }}
|
||||
{{ form_row(form.color) }}
|
||||
</div>
|
||||
|
@@ -63,6 +63,7 @@
|
||||
<th width="100px">Nature</th>
|
||||
<th width="100px">Projet</th>
|
||||
<th>Tâche</th>
|
||||
<th>Actif</th>
|
||||
<th width="100px" class="text-center no-string">Estimation</th>
|
||||
<th width="100px" class="text-center no-string">Validé</th>
|
||||
<th width="100px" class="text-center no-string">Planifié</th>
|
||||
@@ -99,6 +100,7 @@
|
||||
<td>{{task.nature.name}}</td>
|
||||
<td>{{task.project.name}}</td>
|
||||
<td>{{task.name}}</td>
|
||||
<td>{{task.active ? "actif":"non-actif"}}</td>
|
||||
<td class="text-right">{{task.quantity|number_format(2, '.', ' ')}}</td>
|
||||
<td class="text-right">{{(totvalidate*-1)|number_format(2, '.', ' ')}}</td>
|
||||
<td class="text-right">{{((totplanified-totvalidate)*-1)|number_format(2, '.', ' ')}}</td>
|
||||
|
@@ -216,7 +216,7 @@
|
||||
</div>
|
||||
|
||||
<ul class="nav navbar-top-links navbar-right">
|
||||
{% if app.user %}
|
||||
{% if app.user and ("ROLE_USER" in app.user.roles or "ROLE_MASTER" in app.user.roles or "ROLE_VALIDATOR" in app.user.roles or "ROLE_ADMIN" in app.user.roles)%}
|
||||
<li>
|
||||
<a href="{{path("app_user_profil")}}">
|
||||
<img src="\{{appAlias}}\uploads\avatar\{{app.user.avatar}}" class="avatar">
|
||||
|
Reference in New Issue
Block a user