Compare commits
15 Commits
api_doliba
...
pkg/stable
Author | SHA1 | Date | |
---|---|---|---|
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_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_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_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='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_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">
|
<variable type='string' name="schedule_office_hour_start" description="Heure de début d'une journée">
|
||||||
<value>09:00</value>
|
<value>09:00</value>
|
||||||
</variable>
|
</variable>
|
||||||
|
@@ -57,15 +57,10 @@ CAS_EMAIL=email
|
|||||||
CAS_LASTNAME=lastname
|
CAS_LASTNAME=lastname
|
||||||
CAS_FIRSTNAME=firstname
|
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
|
||||||
SENTRY_DSN=
|
SENTRY_DSN=
|
||||||
|
|
||||||
|
# Dolibar
|
||||||
DOLIBARR_ACTIVE=false
|
DOLIBARR_ACTIVE=false
|
||||||
DOLIBARR_API_KEY=
|
DOLIBARR_API_KEY=
|
||||||
DOLIBARR_URI=
|
DOLIBARR_URI=
|
||||||
|
@@ -428,6 +428,10 @@ export_offers:
|
|||||||
path: /export/export_offers
|
path: /export/export_offers
|
||||||
defaults: { _controller: App\Controller\ExportController: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 ======================================================================================================
|
#== Export ======================================================================================================
|
||||||
app_stat_view:
|
app_stat_view:
|
||||||
|
@@ -20,10 +20,7 @@ APP_SECRET=52c1cb88ee822cd2643abe29e16a68a6
|
|||||||
###< symfony/framework-bundle ###
|
###< symfony/framework-bundle ###
|
||||||
|
|
||||||
###> symfony/mailer ###
|
###> symfony/mailer ###
|
||||||
MAILER_METHOD=sendmail
|
# MAILER_DSN=smtp://localhost
|
||||||
MAILER_URL=
|
|
||||||
MAILER_NOREPLY=noreply@noreply.fr
|
|
||||||
MAILER_DEFAULT_NOTIF=
|
|
||||||
###< symfony/mailer ###
|
###< symfony/mailer ###
|
||||||
|
|
||||||
###< doctrine/doctrine-bundle ###
|
###< doctrine/doctrine-bundle ###
|
||||||
@@ -35,6 +32,16 @@ APP_NAME=Schedule
|
|||||||
APP_ENV=PROD
|
APP_ENV=PROD
|
||||||
APP_CRON=false
|
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
|
# BDD
|
||||||
DATABASE_NAME=
|
DATABASE_NAME=
|
||||||
DATABASE_USER=
|
DATABASE_USER=
|
||||||
@@ -45,14 +52,15 @@ DATABASE_HOST=
|
|||||||
CAS_HOST=
|
CAS_HOST=
|
||||||
CAS_PORT=
|
CAS_PORT=
|
||||||
CAS_PATH=
|
CAS_PATH=
|
||||||
|
CAS_USERNAME=username
|
||||||
OFFICE_HOUR_START=09:00
|
CAS_EMAIL=email
|
||||||
OFFICE_HOUR_END=17:30
|
CAS_LASTNAME=lastname
|
||||||
|
CAS_FIRSTNAME=firstname
|
||||||
|
|
||||||
## Sentry DSN
|
## Sentry DSN
|
||||||
SENTRY_DSN=
|
SENTRY_DSN=
|
||||||
|
|
||||||
## Dolibarr
|
# Dolibar
|
||||||
DOLIBARR_ACTIVE=false
|
DOLIBARR_ACTIVE=false
|
||||||
DOLIBARR_API_KEY=
|
DOLIBARR_API_KEY=
|
||||||
DOLIBARR_URI=
|
DOLIBARR_URI=
|
||||||
|
@@ -174,10 +174,10 @@ while($row=$queryold->fetch()) {
|
|||||||
$nature=$row["task_nature"];
|
$nature=$row["task_nature"];
|
||||||
if($row["task_id"]<=-70) $nature=-200;
|
if($row["task_id"]<=-70) $nature=-200;
|
||||||
if($row["task_id"]==-85 || $row["task_id"]==-70) $nature=-190;
|
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"]);
|
$quantity=($row["task_quantity"]==0?null:$row["task_quantity"]);
|
||||||
$query=$bddnew->prepare($q);
|
$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("");
|
writeligne("");
|
||||||
|
@@ -473,5 +473,58 @@ class ExportController extends AbstractController
|
|||||||
return $response;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -55,6 +55,7 @@ class TaskController extends AbstractController
|
|||||||
$data = new Entity();
|
$data = new Entity();
|
||||||
$defaultnature = $em->getRepository("App:Nature")->findOneBy(['name' => 'Prestation']);
|
$defaultnature = $em->getRepository("App:Nature")->findOneBy(['name' => 'Prestation']);
|
||||||
$data->setNature($defaultnature);
|
$data->setNature($defaultnature);
|
||||||
|
$data->setActive(true);
|
||||||
// Création du formulaire
|
// Création du formulaire
|
||||||
$form = $this->createForm(Form::class,$data,array("mode"=>"submit"));
|
$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)
|
* @ORM\OneToMany(targetEntity="Penalty", mappedBy="task", cascade={"persist"}, orphanRemoval=false)
|
||||||
*/
|
*/
|
||||||
private $penaltys;
|
private $penaltys;
|
||||||
|
/**
|
||||||
|
* @ORM\Column(name="active", type="boolean")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private $active;
|
||||||
/**
|
/**
|
||||||
* Calculate Displayname
|
* Calculate Displayname
|
||||||
*/
|
*/
|
||||||
@@ -228,6 +232,19 @@ class Task
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getActive(): ?bool
|
||||||
|
{
|
||||||
|
return $this->active;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setActive(bool $active): self
|
||||||
|
{
|
||||||
|
$this->active = $active;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Collection|Penalty[]
|
* @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',
|
$builder->add('color',
|
||||||
TextType::class, [
|
TextType::class, [
|
||||||
"label" => "Couleur",
|
"label" => "Couleur",
|
||||||
|
@@ -99,7 +99,9 @@
|
|||||||
{% for project in projects|sort((a, b) => a.displayname <=> b.displayname) %}
|
{% for project in projects|sort((a, b) => a.displayname <=> b.displayname) %}
|
||||||
<optgroup label="{{project.displayname}}">
|
<optgroup label="{{project.displayname}}">
|
||||||
{% for task in project.tasks|sort((a, b) => a.displayname <=> b.displayname) %}
|
{% for task in project.tasks|sort((a, b) => a.displayname <=> b.displayname) %}
|
||||||
|
{% if task.active %}
|
||||||
<option value="{{task.id}}">{{task.displayname}}</option>
|
<option value="{{task.id}}">{{task.displayname}}</option>
|
||||||
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</optgroup>
|
</optgroup>
|
||||||
{% endfor %}
|
{% 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>
|
||||||
</div>
|
</div>
|
||||||
<p></p>
|
<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 %}
|
{% endblock %}
|
@@ -54,6 +54,7 @@
|
|||||||
{{ form_row(form.name) }}
|
{{ form_row(form.name) }}
|
||||||
{{ form_row(form.project) }}
|
{{ form_row(form.project) }}
|
||||||
{{ form_row(form.nature) }}
|
{{ form_row(form.nature) }}
|
||||||
|
{{ form_row(form.active) }}
|
||||||
{{ form_row(form.quantity) }}
|
{{ form_row(form.quantity) }}
|
||||||
{{ form_row(form.color) }}
|
{{ form_row(form.color) }}
|
||||||
</div>
|
</div>
|
||||||
|
@@ -63,6 +63,7 @@
|
|||||||
<th width="100px">Nature</th>
|
<th width="100px">Nature</th>
|
||||||
<th width="100px">Projet</th>
|
<th width="100px">Projet</th>
|
||||||
<th>Tâche</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">Estimation</th>
|
||||||
<th width="100px" class="text-center no-string">Validé</th>
|
<th width="100px" class="text-center no-string">Validé</th>
|
||||||
<th width="100px" class="text-center no-string">Planifié</th>
|
<th width="100px" class="text-center no-string">Planifié</th>
|
||||||
@@ -99,6 +100,7 @@
|
|||||||
<td>{{task.nature.name}}</td>
|
<td>{{task.nature.name}}</td>
|
||||||
<td>{{task.project.name}}</td>
|
<td>{{task.project.name}}</td>
|
||||||
<td>{{task.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">{{task.quantity|number_format(2, '.', ' ')}}</td>
|
||||||
<td class="text-right">{{(totvalidate*-1)|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>
|
<td class="text-right">{{((totplanified-totvalidate)*-1)|number_format(2, '.', ' ')}}</td>
|
||||||
|
Reference in New Issue
Block a user