Compare commits

..

27 Commits

Author SHA1 Message Date
18d993f307 Merge branch 'master' into dist/eole/2.7.2/master 2021-03-05 10:24:51 +01:00
94fa9d1f0b switch task inactives ref #61 2021-03-04 10:17:13 +01:00
5343d61401 correction mise en page rapport pdf ref #58 2021-03-04 09:26:18 +01:00
6bd189271f correction fermeture div dans rapport ref #57 2021-03-04 09:18:17 +01:00
f8b4d0446d Merge branch 'master' into dist/eole/2.7.2/master 2021-03-03 16:16:59 +01:00
ce10df9293 Correction affichage calendrier sélectionné ref #60 2021-03-03 16:10:48 +01:00
b14fc3d0e1 Merge branch 'master' into dist/eole/2.7.2/master 2021-03-03 14:55:03 +01:00
164da2ee48 correction on planing 2021-03-03 14:51:22 +01:00
1fec858f01 suppression trace de debug 2021-02-04 17:05:39 +01:00
697c7a8f1c Merge branch 'dist/eole/2.7.2/master' of https://forge.cadoles.com/Cadoles/schedule into dist/eole/2.7.2/master 2021-02-04 16:17:23 +01:00
24ecd6c87e Merge branch 'master' into dist/eole/2.7.2/master 2021-02-04 16:17:18 +01:00
6acf427696 correctif sur autosubmit des users 2021-02-04 16:13:35 +01:00
b17024cccd Merge branch 'master' into dist/eole/2.7.2/master 2021-01-28 12:15:43 +01:00
cdb2537d3f update migration script 2020-12-17 11:04:01 +01:00
2ba143e5a2 Ajout notion de tâche active, et affichage uniquement des taches active lors de la création d'événements #55 2020-12-17 10:53:52 +01:00
5037b0945e ajout export jours facturés #56 2020-12-16 16:40:15 +01:00
a0b87b907f Merge branch 'master' into dist/eole/2.7.2/master 2020-11-13 10:20:38 +01:00
c31d14bff4 mise à niveau des fichiers d'environnement 2020-11-13 10:20:05 +01:00
dfa5a993ce Merge branch 'master' into dist/eole/2.7.2/master 2020-11-13 09:30:06 +01:00
91536ed930 update dico description 2020-11-06 15:25:29 +01:00
10cb25730b Merge branch 'api_dolibarr' of Cadoles/schedule into master 2020-11-03 09:55:46 +01:00
937ec6f4ca Merge branch 'master' into dist/eole/2.7.2/master 2020-09-29 08:58:50 +02:00
7e988ff7a9 Merge branch 'master' into dist/eole/2.7.0/master 2020-09-23 09:15:06 +02:00
c66962097d Merge branch 'master' into dist/eole/2.7.0/master 2020-09-22 14:32:26 +02:00
db11d66ae0 Merge branch 'master' into dist/eole/2.7.0/master 2020-05-13 14:06:01 +02:00
2d42e3016d Merge branch 'master' into dist/eole/2.7.0/master 2020-05-12 11:35:36 +02:00
ba4acc1b89 ajout repertoire debian 2020-05-12 09:49:53 +02:00
33 changed files with 383 additions and 148 deletions

1
debian/compat vendored Normal file
View File

@@ -0,0 +1 @@
7

24
debian/control vendored Normal file
View 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
View 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
View File

@@ -0,0 +1 @@
usr/share/eole

3
debian/gbp.conf vendored Normal file
View File

@@ -0,0 +1,3 @@
# Set per distribution debian tag
[DEFAULT]
debian-tag = debian/envole/%(version)s

8
debian/rules vendored Executable file
View 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
View File

@@ -0,0 +1 @@
var/www/html

1
debian/schedule-sso.install vendored Normal file
View File

@@ -0,0 +1 @@
usr/share/sso

1
debian/source/format vendored Normal file
View File

@@ -0,0 +1 @@
3.0 (native)

View File

@@ -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>

View File

@@ -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=

View File

@@ -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,11 +18,11 @@ document.addEventListener('DOMContentLoaded', function() {
locale: frLocale,
weekNumbers: true,
selectable: true,
events: 'event/load',
eventLimit:8,
events: 'event/load/'+iduser,
eventLimit:8,
eventDrop: function(info) {
info.revert();
},
},
eventRender: function (info) {
eventRender(info);
},
@@ -33,4 +35,4 @@ document.addEventListener('DOMContentLoaded', function() {
});
global.calendar = calendar;
calendar.render();
});
});

View File

@@ -22,7 +22,7 @@ app_home_selectservice:
#== Security ====================================================================================================
app_login:
path: /login
defaults: { _controller: App\Controller\SecurityController:login }
defaults: { _controller: App\Controller\SecurityController:login }
app_logincheck:
path: /logincheck
@@ -53,11 +53,11 @@ app_crop02:
oneup_uploader:
resource: .
type: uploader
#== Cron ========================================================================================================
app_cron:
path: /admin/cron
defaults: { _controller: App\Controller\CronController:list }
defaults: { _controller: App\Controller\CronController:list }
app_cron_ajax_list:
path: /admin/cron/ajax/list
@@ -65,16 +65,16 @@ app_cron_ajax_list:
app_cron_update:
path: /admin/cron/update/{id}
defaults: { _controller: App\Controller\CronController:update }
defaults: { _controller: App\Controller\CronController:update }
app_cron_exec:
path: /admin/cron/exec/{id}
defaults: { _controller: App\Controller\CronController:exec }
defaults: { _controller: App\Controller\CronController:exec }
app_cron_log:
path: /admin/cron/log/{id}
controller: App\Controller\Cron:log
defaults: { id: "cron" }
defaults: { id: "cron" }
#== User ========================================================================================================
app_user:
@@ -147,7 +147,7 @@ app_customer_update:
app_customer_delete:
path: /master/customer/delete/{id}
defaults: { _controller: App\Controller\CustomerController:delete }
#== Job =====================================================================================================
app_job:
path: /admin/job
@@ -186,7 +186,7 @@ app_project_update:
app_project_delete:
path: /master/project/delete/{id}
defaults: { _controller: App\Controller\ProjectController:delete }
app_project_activeproject:
path: /master/project/activeproject
defaults: { _controller: App\Controller\ProjectController:activeproject }
@@ -207,7 +207,7 @@ app_project_users_del:
app_project_users:
path: /master/project/users/{id}
defaults: { _controller: App\Controller\ProjectController:users }
#== Offer ====================================================================================================
app_offer:
path: /master/offer
@@ -224,7 +224,7 @@ app_offer_update:
app_offer_delete:
path: /master/offer/delete/{id}
defaults: { _controller: App\Controller\OfferController:delete }
app_offer_activeproject:
path: /master/offer/activeproject
defaults: { _controller: App\Controller\OfferController:activeproject }
@@ -257,18 +257,22 @@ app_task_update:
app_task_delete:
path: /master/task/delete/{id}
defaults: { _controller: App\Controller\TaskController:delete }
app_task_activeproject:
path: /master/task/activeproject
defaults: { _controller: App\Controller\TaskController:activeproject }
app_task_activetask:
path: /master/task/activetask
defaults: { _controller: App\Controller\TaskController:activetask }
#== Event ====================================================================================================
app_event:
path: /user/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,13 +403,17 @@ 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' }
app_customer_planning:
path: /customer/planning/{key}
defaults: { _controller: App\Controller\ReportController:planning, access: 'customer' }
defaults: { _controller: App\Controller\ReportController:planning, access: 'customer' }
#== Export ======================================================================================================
app_export_view:
@@ -414,7 +422,7 @@ app_export_view:
app_export_penalty_additional:
path: /export/export_penalty_additional
defaults: { _controller: App\Controller\ExportController:export_penalty_additional }
defaults: { _controller: App\Controller\ExportController:export_penalty_additional }
export_project_weekly:
path: /export/export_project_weekly
@@ -426,7 +434,11 @@ export_full_worked_days:
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 ======================================================================================================
@@ -437,4 +449,4 @@ app_stat_view:
#== API ===========================================================================================================
app_api:
path: /api/{key}
defaults: { _controller: App\Controller\ApiController:api }
defaults: { _controller: App\Controller\ApiController:api }

View File

@@ -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();
@@ -86,4 +88,4 @@ document.addEventListener('DOMContentLoaded', function () {
/***/ })
},[["./assets/js/fullcalendar.js","runtime","vendors~fullcalendar"]]]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvZnVsbGNhbGVuZGFyLmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJjYWxlbmRhciIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImNhbGVuZGFyRWwiLCJnZXRFbGVtZW50QnlJZCIsIkNhbGVuZGFyIiwicGx1Z2lucyIsImludGVyYWN0aW9uUGx1Z2luIiwiZGF5R3JpZFBsdWdpbiIsImxvY2FsZSIsImZyTG9jYWxlIiwid2Vla051bWJlcnMiLCJzZWxlY3RhYmxlIiwiZXZlbnRzIiwiZXZlbnRMaW1pdCIsImV2ZW50RHJvcCIsImluZm8iLCJyZXZlcnQiLCJldmVudFJlbmRlciIsInNlbGVjdCIsInNlbGVjdGlvbkluZm8iLCJldmVudFNlbGVjdCIsImV2ZW50Q2xpY2siLCJnbG9iYWwiLCJyZW5kZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQUEsbUJBQU8sQ0FBQywrRUFBRCxDQUFQOztBQUNBQSxtQkFBTyxDQUFDLHFGQUFELENBQVA7O0FBQ0FBLG1CQUFPLENBQUMscUZBQUQsQ0FBUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlDLFFBQUo7QUFDQUMsUUFBUSxDQUFDQyxnQkFBVCxDQUEwQixrQkFBMUIsRUFBOEMsWUFBVztBQUNyRCxNQUFJQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixjQUF4QixDQUFqQjtBQUNBSixVQUFRLEdBQUcsSUFBSUssMkRBQUosQ0FBYUYsVUFBYixFQUF5QjtBQUNoQ0csV0FBTyxFQUFFLENBQUVDLGlFQUFGLEVBQXFCQyw2REFBckIsQ0FEdUI7QUFFaENDLFVBQU0sRUFBRUMsdUVBRndCO0FBR2hDQyxlQUFXLEVBQUUsSUFIbUI7QUFJaENDLGNBQVUsRUFBRSxJQUpvQjtBQUtoQ0MsVUFBTSxFQUFFLFlBTHdCO0FBTWhDQyxjQUFVLEVBQUMsQ0FOcUI7QUFPaENDLGFBQVMsRUFBRSxtQkFBU0MsSUFBVCxFQUFlO0FBQ3RCQSxVQUFJLENBQUNDLE1BQUw7QUFDSCxLQVQrQjtBQVVoQ0MsZUFBVztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxNQUFFLFVBQVVGLElBQVYsRUFBZ0I7QUFDekJFLGlCQUFXLENBQUNGLElBQUQsQ0FBWDtBQUNILEtBRlUsQ0FWcUI7QUFhaENHLFVBQU0sRUFBRSxnQkFBU0MsYUFBVCxFQUF3QjtBQUM1QkMsaUJBQVcsQ0FBQ0QsYUFBRCxDQUFYO0FBQ0gsS0FmK0I7QUFnQmhDRSxjQUFVO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLE1BQUUsVUFBU04sSUFBVCxFQUFlO0FBQ3ZCTSxnQkFBVSxDQUFDTixJQUFELENBQVY7QUFDSCxLQUZTO0FBaEJzQixHQUF6QixDQUFYO0FBb0JBTyxRQUFNLENBQUN2QixRQUFQLEdBQWtCQSxRQUFsQjtBQUNBQSxVQUFRLENBQUN3QixNQUFUO0FBQ0gsQ0F4QkQsRSIsImZpbGUiOiJmdWxsY2FsZW5kYXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGdWxsY2FsZW5kYXJcbnJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9tYWluLmNzcycpO1xucmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9kYXlncmlkL21haW4uY3NzJyk7XG5yZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2RheWdyaWQvbWFpbi5jc3MnKTtcblxuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tICdAZnVsbGNhbGVuZGFyL2NvcmUnO1xuaW1wb3J0IGZyTG9jYWxlIGZyb20gJ0BmdWxsY2FsZW5kYXIvY29yZS9sb2NhbGVzL2ZyLmpzJztcbmltcG9ydCBpbnRlcmFjdGlvblBsdWdpbiBmcm9tICdAZnVsbGNhbGVuZGFyL2ludGVyYWN0aW9uJztcbmltcG9ydCBkYXlHcmlkUGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvZGF5Z3JpZCc7XG5cbnZhciBjYWxlbmRhcjtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FsZW5kYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxsY2FsZW5kYXInKTtcbiAgICBjYWxlbmRhciA9IG5ldyBDYWxlbmRhcihjYWxlbmRhckVsLCB7XG4gICAgICAgIHBsdWdpbnM6IFsgaW50ZXJhY3Rpb25QbHVnaW4sIGRheUdyaWRQbHVnaW4gXSxcbiAgICAgICAgbG9jYWxlOiBmckxvY2FsZSxcbiAgICAgICAgd2Vla051bWJlcnM6IHRydWUsXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIGV2ZW50czogJ2V2ZW50L2xvYWQnLFxuICAgICAgICBldmVudExpbWl0OjQsIFxuICAgICAgICBldmVudERyb3A6IGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgICAgIGluZm8ucmV2ZXJ0KCk7XG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAgZXZlbnRSZW5kZXI6IGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgICBldmVudFJlbmRlcihpbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihzZWxlY3Rpb25JbmZvKSB7XG4gICAgICAgICAgICBldmVudFNlbGVjdChzZWxlY3Rpb25JbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRDbGljazogZnVuY3Rpb24oaW5mbykge1xuICAgICAgICAgICAgZXZlbnRDbGljayhpbmZvKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGdsb2JhbC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgIGNhbGVuZGFyLnJlbmRlcigpO1xufSk7ICBcbiJdLCJzb3VyY2VSb290IjoiIn0=
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9hc3NldHMvanMvZnVsbGNhbGVuZGFyLmpzIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJjYWxlbmRhciIsImRvY3VtZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsImNhbGVuZGFyRWwiLCJnZXRFbGVtZW50QnlJZCIsIkNhbGVuZGFyIiwicGx1Z2lucyIsImludGVyYWN0aW9uUGx1Z2luIiwiZGF5R3JpZFBsdWdpbiIsImxvY2FsZSIsImZyTG9jYWxlIiwid2Vla051bWJlcnMiLCJzZWxlY3RhYmxlIiwiZXZlbnRzIiwiZXZlbnRMaW1pdCIsImV2ZW50RHJvcCIsImluZm8iLCJyZXZlcnQiLCJldmVudFJlbmRlciIsInNlbGVjdCIsInNlbGVjdGlvbkluZm8iLCJldmVudFNlbGVjdCIsImV2ZW50Q2xpY2siLCJnbG9iYWwiLCJyZW5kZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQUEsbUJBQU8sQ0FBQywrRUFBRCxDQUFQOztBQUNBQSxtQkFBTyxDQUFDLHFGQUFELENBQVA7O0FBQ0FBLG1CQUFPLENBQUMscUZBQUQsQ0FBUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlDLFFBQUo7QUFDQUMsUUFBUSxDQUFDQyxnQkFBVCxDQUEwQixrQkFBMUIsRUFBOEMsWUFBVztBQUNyRCxNQUFJQyxVQUFVLEdBQUdGLFFBQVEsQ0FBQ0csY0FBVCxDQUF3QixjQUF4QixDQUFqQjtBQUNBSixVQUFRLEdBQUcsSUFBSUssMkRBQUosQ0FBYUYsVUFBYixFQUF5QjtBQUNoQ0csV0FBTyxFQUFFLENBQUVDLGlFQUFGLEVBQXFCQyw2REFBckIsQ0FEdUI7QUFFaENDLFVBQU0sRUFBRUMsdUVBRndCO0FBR2hDQyxlQUFXLEVBQUUsSUFIbUI7QUFJaENDLGNBQVUsRUFBRSxJQUpvQjtBQUtoQ0MsVUFBTSxFQUFFLFlBTHdCO0FBTWhDQyxjQUFVLEVBQUMsQ0FOcUI7QUFPaENDLGFBQVMsRUFBRSxtQkFBU0MsSUFBVCxFQUFlO0FBQ3RCQSxVQUFJLENBQUNDLE1BQUw7QUFDSCxLQVQrQjtBQVVoQ0MsZUFBVztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQSxNQUFFLFVBQVVGLElBQVYsRUFBZ0I7QUFDekJFLGlCQUFXLENBQUNGLElBQUQsQ0FBWDtBQUNILEtBRlUsQ0FWcUI7QUFhaENHLFVBQU0sRUFBRSxnQkFBU0MsYUFBVCxFQUF3QjtBQUM1QkMsaUJBQVcsQ0FBQ0QsYUFBRCxDQUFYO0FBQ0gsS0FmK0I7QUFnQmhDRSxjQUFVO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBLE1BQUUsVUFBU04sSUFBVCxFQUFlO0FBQ3ZCTSxnQkFBVSxDQUFDTixJQUFELENBQVY7QUFDSCxLQUZTO0FBaEJzQixHQUF6QixDQUFYO0FBb0JBTyxRQUFNLENBQUN2QixRQUFQLEdBQWtCQSxRQUFsQjtBQUNBQSxVQUFRLENBQUN3QixNQUFUO0FBQ0gsQ0F4QkQsRSIsImZpbGUiOiJmdWxsY2FsZW5kYXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBGdWxsY2FsZW5kYXJcbnJlcXVpcmUoJ0BmdWxsY2FsZW5kYXIvY29yZS9tYWluLmNzcycpO1xucmVxdWlyZSgnQGZ1bGxjYWxlbmRhci9kYXlncmlkL21haW4uY3NzJyk7XG5yZXF1aXJlKCdAZnVsbGNhbGVuZGFyL2RheWdyaWQvbWFpbi5jc3MnKTtcblxuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tICdAZnVsbGNhbGVuZGFyL2NvcmUnO1xuaW1wb3J0IGZyTG9jYWxlIGZyb20gJ0BmdWxsY2FsZW5kYXIvY29yZS9sb2NhbGVzL2ZyLmpzJztcbmltcG9ydCBpbnRlcmFjdGlvblBsdWdpbiBmcm9tICdAZnVsbGNhbGVuZGFyL2ludGVyYWN0aW9uJztcbmltcG9ydCBkYXlHcmlkUGx1Z2luIGZyb20gJ0BmdWxsY2FsZW5kYXIvZGF5Z3JpZCc7XG5cbnZhciBjYWxlbmRhcjtcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICB2YXIgY2FsZW5kYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmdWxsY2FsZW5kYXInKTtcbiAgICBjYWxlbmRhciA9IG5ldyBDYWxlbmRhcihjYWxlbmRhckVsLCB7XG4gICAgICAgIHBsdWdpbnM6IFsgaW50ZXJhY3Rpb25QbHVnaW4sIGRheUdyaWRQbHVnaW4gXSxcbiAgICAgICAgbG9jYWxlOiBmckxvY2FsZSxcbiAgICAgICAgd2Vla051bWJlcnM6IHRydWUsXG4gICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIGV2ZW50czogJ2V2ZW50L2xvYWQnLFxuICAgICAgICBldmVudExpbWl0OjQsIFxuICAgICAgICBldmVudERyb3A6IGZ1bmN0aW9uKGluZm8pIHtcbiAgICAgICAgICAgIGluZm8ucmV2ZXJ0KCk7XG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAgZXZlbnRSZW5kZXI6IGZ1bmN0aW9uIChpbmZvKSB7XG4gICAgICAgICAgICBldmVudFJlbmRlcihpbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihzZWxlY3Rpb25JbmZvKSB7XG4gICAgICAgICAgICBldmVudFNlbGVjdChzZWxlY3Rpb25JbmZvKTtcbiAgICAgICAgfSxcbiAgICAgICAgZXZlbnRDbGljazogZnVuY3Rpb24oaW5mbykge1xuICAgICAgICAgICAgZXZlbnRDbGljayhpbmZvKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGdsb2JhbC5jYWxlbmRhciA9IGNhbGVuZGFyO1xuICAgIGNhbGVuZGFyLnJlbmRlcigpO1xufSk7ICBcbiJdLCJzb3VyY2VSb290IjoiIn0=

View File

@@ -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=

View File

@@ -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("");

View File

@@ -19,7 +19,7 @@ class EventController extends AbstractController
private $entity = "App:Event";
private $notificator;
public function __construct(\App\Service\notificationService $notificator) {
public function __construct(\App\Service\notificationService $notificator) {
$this->notificator = $notificator;
}
@@ -29,7 +29,7 @@ class EventController extends AbstractController
$users = $em->getRepository("App:User")->findAll();
$tasks = $em->getRepository("App:Task")->findAll();
$projects= $em->getRepository("App:Project")->findBy(["active"=>true]);
return $this->render($this->render.'list.html.twig',[
"useheader" => true,
"usesidebar" => true,
@@ -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();
@@ -72,16 +72,16 @@ class EventController extends AbstractController
}
foreach($events as $event) {
//Filtre par service
if($this->get('session')->get('idservice')!="all") {
$idservice=$event->getUser()->getService()->getId();
if ($idservice!=$this->get('session')->get('idservice')){
continue;
}
}
// Filtre par project
if($this->get('session')->get('idproject')!="all") {
$idproject=$event->getTask()->getProject()->getId();
if($idproject!=$this->get('session')->get('idproject'))
@@ -144,7 +144,7 @@ class EventController extends AbstractController
$output=["return"=>"KO","error"=>"Tâche inconnu"];
return new Response(json_encode($output));
}
// Convertir les dates string en date
$datestart=new \DateTime($start);
$dateend =new \DateTime($end);
@@ -291,9 +291,9 @@ class EventController extends AbstractController
$output=$this->formatEvent($event);
}
return new Response(json_encode($output));
}
return new Response(json_encode($output));
}
public function update(Request $request)
{
$em = $this->getDoctrine()->getManager();
@@ -321,8 +321,8 @@ class EventController extends AbstractController
$output=["return"=>"KO","error"=>"Tâche inconnue"];
return new Response(json_encode($output));
}
// Astreinte
// Astreinte
if($fgastreinte) {
// Recherche de l'event
$penalty = $em->getRepository("App:Penalty")->find($idevent);
@@ -418,10 +418,10 @@ class EventController extends AbstractController
$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));
}
}
// Modification de l'évenement
$event->setStart($datestart);
$event->setEnd($dateend);
@@ -431,14 +431,14 @@ class EventController extends AbstractController
$event->setExternalTrip($externaltrip);
$event->setUser($user);
$event->setTask($task);
$em->persist($event);
$em->flush();
$output=$this->formatEvent($event);
}
return new Response(json_encode($output));
}
return new Response(json_encode($output));
}
public function delete(Request $request)
@@ -449,7 +449,7 @@ class EventController extends AbstractController
$idevent = str_replace("A","",$request->request->get('idevent'));
$fgastreinte = ($request->request->get('fgastreinte')=="true");
// Astreinte
// Astreinte
if($fgastreinte) {
// Recherche de l'event
$penalty = $em->getRepository("App:Penalty")->find($idevent);
@@ -488,19 +488,19 @@ class EventController extends AbstractController
}
$output=[];
return new Response(json_encode($output));
}
return new Response(json_encode($output));
}
public function formatEvent($event) {
$editable=(!($event->getValidate())&&!($event->getValidateholiday()));
// Si l'utilisateur en cours est différent de celui de l'event = seul MASTER - ADMIN peuvent modifier
if($event->getUser()!=$this->getUser()) {
if(!$this->isGranted('ROLE_ADMIN')&&!$this->isGranted('ROLE_MASTER'))
$editable=false;
}
$tmp= [
"id"=> ($event instanceof Penalty?"A":"").$event->getId(),
"title" => ($event instanceof Penalty?"ASTREINTE = ":"").$event->getTask()->getDisplayname(),
@@ -532,7 +532,7 @@ class EventController extends AbstractController
public function formatBreakday($event) {
$editable=false;
$tmp= [
"id"=> "B".$event->getId(),
"title" => "Jour Férié",
@@ -577,5 +577,5 @@ class EventController extends AbstractController
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
}
}
}
}
}

View File

@@ -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;
}
}

View File

@@ -25,13 +25,21 @@ 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');
$this->get('session')->set('nbmonth',$nbmonth);
$output=["return"=>"OK"];
return new Response(json_encode($output));
}
}
public function selectuser(Request $request)
{
@@ -39,7 +47,7 @@ class HomeController extends AbstractController
$this->get('session')->set('iduser',$iduser);
$output=["return"=>"OK"];
return new Response(json_encode($output));
}
}
public function selectproject(Request $request)
{
@@ -47,7 +55,7 @@ class HomeController extends AbstractController
$this->get('session')->set('idproject',$idproject);
$output=["return"=>"OK"];
return new Response(json_encode($output));
}
}
public function selectservice(Request $request)
{

View File

@@ -121,7 +121,7 @@ class ReportController extends AbstractController
$st->add(new \DateInterval('P1D'));
}
}
// On formate le tableau des astreintes
$start=new \Datetime('first day of this month');
@@ -206,7 +206,7 @@ class ReportController extends AbstractController
);
}
else {
return $this->render('Report/synthese.html.twig',[
"useheader" => true,
"usesidebar" => ($this->getUser()),
@@ -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,
@@ -367,7 +372,7 @@ class ReportController extends AbstractController
$tbproject["months"][$start->format("Ym")]["users"][$user->getId()]["days"][$start->format("Ymd")]=$tbday;
}
$start->add(new \DateInterval('P1D'));
}
$tbprojects[$project->getId()]=$tbproject;
@@ -375,10 +380,12 @@ 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);
@@ -543,7 +550,7 @@ class ReportController extends AbstractController
"offers"=>[],
"weeks"=>[],
];
// Somme event validé avant la date
$end=new \Datetime('first day of this month');
$end->sub(new \DateInterval('P'.$nbmonth.'M'));
@@ -632,14 +639,14 @@ class ReportController extends AbstractController
}
$tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")]["cumul"] = $tbproject["weeks"][$event->getStart()->format("Y")][$event->getStart()->format("W")]["cumul"]+$event->getDuration();
}
// Somme astreintes validé par semaine
$start=new \Datetime('first day of this month');
$start->sub(new \DateInterval('P'.$nbmonth.'M'));
$start->setTime(0,0,0);
$endmonth = new \Datetime('first day of this month');
$endmonth->add(new \DateInterval('P1M'));
$penaltybyweek = $em
->createQueryBuilder('penalty')
@@ -681,7 +688,7 @@ class ReportController extends AbstractController
];
$tbproject["weeks_by_name"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("W")]["users"][$penalty->getUser()->getId()] = $tbuser;
}
$tbproject["weeks_by_name"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("W")]["users"][$penalty->getUser()->getId()]["cumul"] = $tbproject["weeks_by_name"][$penalty->getStart()->format("Y")][$penalty->getStart()->format("W")]["users"][$penalty->getUser()->getId()]["cumul"]+$penalty->getDuration();
}
@@ -845,7 +852,7 @@ class ReportController extends AbstractController
}
}
}
if($request->query->get('fgprint')) {
$render = $this->renderView('Report/report.html.twig',[
"useheader" => true,

View File

@@ -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
return $this->redirect($this->generateUrl('app_home'));
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'));
}
}

View File

@@ -31,13 +31,13 @@ class TaskController extends AbstractController
"services" => $services,
"useheader" => true,
"usesidebar" => true,
"fgprint" => true,
"fgprint" => true,
]);
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render,["orientation"=>"Landscape"]),
'taches.pdf'
);
);
}
else {
return $this->render($this->render.'list.html.twig',[
@@ -55,35 +55,36 @@ 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"));
// Récupération des data du formulaire
$form->handleRequest($request);
// Sur erreur
$this->getErrorForm(null,$form,$request,$data,"submit");
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->redirectToRoute($this->route);
}
// Affichage du formulaire
return $this->render($this->render.'edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
'usesidebar' => true,
$this->data => $data,
'mode' => 'submit',
'form' => $form->createView()
]);
}
}
public function update($id,Request $request)
{
// Initialisation de l'enregistrement
@@ -98,43 +99,43 @@ class TaskController extends AbstractController
// Sur erreur
$this->getErrorForm(null,$form,$request,$data,"update");
// Sur validation
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
if ($form->get('submit')->isClicked() && $form->isValid()) {
$data = $form->getData();
$em->persist($data);
$em->flush();
// Retour à la liste
return $this->redirectToRoute($this->route);
}
// Affichage du formulaire
if($request->query->get('fgprint')) {
$render = $this->renderView($this->render.'edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
'usesidebar' => true,
$this->data => $data,
'mode' => 'update',
'form' => $form->createView(),
"fgprint" => true,
"fgprint" => true,
]);
return new PdfResponse(
$this->knpSnappy->getOutputFromHtml($render),
'tache.pdf'
);
);
}
else {
return $this->render($this->render.'edit.html.twig', [
'useheader' => true,
'usesidebar' => true,
'usesidebar' => true,
$this->data => $data,
'mode' => 'update',
'form' => $form->createView()
]);
}
}
}
public function delete($id,Request $request)
{
@@ -160,13 +161,18 @@ class TaskController extends AbstractController
// Retour à la liste
return $this->redirectToRoute($this->route);
}
}
}
public function activeproject() {
$this->get('session')->set('activeproject',!$this->get('session')->get('activeproject'));
return $this->redirectToRoute($this->route);
}
public function activetask() {
$this->get('session')->set('activetask',!$this->get('session')->get('activetask'));
return $this->redirectToRoute($this->route);
}
public function activeoffer() {
$this->get('session')->set('activeoffer',!$this->get('session')->get('activeoffer'));
return $this->redirectToRoute($this->route);
@@ -188,5 +194,5 @@ class TaskController extends AbstractController
$request->getSession()->getFlashBag()->add("error", $error->getMessage());
}
}
}
}
}

View File

@@ -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
*/
@@ -227,6 +231,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[]

View File

@@ -56,6 +56,13 @@ class TaskType extends AbstractType
"choice_label" => "name",
]
);
$builder->add("active",
ChoiceType::class,[
"label" => "Actif",
"choices" => ["Non"=>false, "Oui"=>true]
]
);
$builder->add('color',
TextType::class, [

View File

@@ -33,7 +33,7 @@ class sessionListener {
$haverole=true;
}
}
return $haverole;
}
@@ -67,11 +67,12 @@ class sessionListener {
// Initialisation de la session
if($regen) {
$session->set('activeproject',true);
$session->set('activetask',true);
$session->set('activeoffer',true);
$session->set('activeholiday',true);
$session->set('activetimer',true);
$session->set('nbmonth',3);
if($curentuser!="anon.") {
if(in_array("ROLE_USER",$roles))
$session->set('iduser',$curentuser->getId());
@@ -86,7 +87,7 @@ class sessionListener {
$session->set('idproject',"all");
$session->set('idservice',"all");
}
$tbusers=[];
$users=$this->em->getRepository('App:User')->findAll();
foreach($users as $user) {
@@ -99,7 +100,7 @@ class sessionListener {
}
}
$session->set('users',$tbusers);
$tbprojects=[];
$projects=$this->em->getRepository('App:Project')->findBy(["active"=>true]);
foreach($projects as $project) {
@@ -110,7 +111,7 @@ class sessionListener {
array_push($tbprojects,$tmp);
}
$session->set('projects',$tbprojects);
$tbservices=[];
$services=$this->em->getRepository('App:Service')->findAll();
foreach($services as $service) {
@@ -120,8 +121,8 @@ class sessionListener {
];
array_push($tbservices,$tmp);
}
$session->set('services',$tbservices);
$session->set('services',$tbservices);
}
}
}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View 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 %}

View File

@@ -59,7 +59,7 @@
}
.astreinte {
height: 12px;
font-size: 10px;
font-size: 10px;
}
{% if fgprint is defined and fgprint %}
@@ -68,7 +68,7 @@
float:none !important;
margin:0px;
}
table { width:100%; font-size:10px;}
.card-header .synthese {
@@ -83,14 +83,13 @@
.small { font-size:10px;}
h4 {
padding-top: 20px;
padding-top: 20px;
}
{% endif %}
{% endif %}
{% endblock %}
{% block body %}
{% if fgprint is defined and fgprint %}<h1>Planning</h1>{%endif%}
{% if access=="customer" and not app.user %}
@@ -104,7 +103,7 @@
{% for i in 1..48 %}
{% set selected="" %}
{%if i==app.session.get('nbmonth') %}
{% set selected="selected" %}
{% set selected="selected" %}
{% endif %}
<option value="{{i}}" {{selected}}>{{i}}</option>
{% endfor %}
@@ -126,8 +125,6 @@
<div class="card-body">
<h3>RAPPORT</h3>
<div class="small">
<div class="new-page">&nbsp;</div>
{% for month in project.months %}
<h3 class="month">{{ month.monthlabel }}</h3>
@@ -179,21 +176,15 @@
<td class="text-right">{{ month.totala|number_format(2, '.', ' ') }}</td>
</tr>
{% endif %}
<tfoot>
<tr>
<td style="min-width:200px">TOTAL</td>
<td class="text-right" style="min-width:100px">{{ (month.total + month.totala)|number_format(2, '.', ' ') }}</td>
</tr>
</tfoot>
</tfoot>
</table>
{% endif %}
{% endfor %}
<h4>CUMUL HEBDOMADAIRE</h4>
<table>
{% for year, weeks in project.weeks %}
@@ -204,22 +195,21 @@
{% for week in weeks %}
<th class="text-center">
S{{ week.weeknumber}}
</th>
</th>
{% endfor %}
</thead>
<tr class="text-center">
<td class="text-center">
</td>
{% for week in weeks %}
<td class="text-center">
{{ week.cumul}}
</td>
</td>
{% endfor %}
</tr>
{% endfor %}
</table>
<div class="new-page">&nbsp;</div>
{% if not project.offers is empty %}
<h4>COMMANDES</h4>
{% set count=(project.offers|length)-8 %}
@@ -236,15 +226,15 @@
</thead>
{% set tot=0 %}
{% for offer in project.offers %}
{% if loop.index<count %}
{% if loop.index<count %}
{% set totbefore10=totbefore10+offer.quantity %}
{% if loop.index+1==count %}
<tr>
<td colspan="2">Précédente</td>
<td class="text-right">{{ totbefore10|number_format(2, '.', ' ') }}</td>
<td class="text-right">
{% if decovalidate >= totbefore10 %}
{% if decovalidate >= totbefore10 %}
{{ totbefore10|number_format(2, '.', ' ') }}
{% set todel=totbefore10 %}
{% else %}
@@ -272,9 +262,9 @@
<td>{{ offer.name }}</td>
<td>{{ offer.ref }}</td>
<td class="text-right">{{ offer.quantity|number_format(2, '.', ' ') }}</td>
<td class="text-right">
{% if decovalidate >= offer.quantity %}
{% if decovalidate >= offer.quantity %}
{{ offer.quantity|number_format(2, '.', ' ') }}
{% set todel=offer.quantity %}
{% else %}
@@ -299,9 +289,9 @@
<td>{{ offer.name }}</td>
<td>{{ offer.ref }}</td>
<td class="text-right">{{ offer.quantity|number_format(2, '.', ' ') }}</td>
<td class="text-right">
{% if decovalidate >= 0 %}
{% if decovalidate >= 0 %}
{{ decovalidate|number_format(2, '.', ' ') }}
{% set todel=decovalidate %}
{% else %}
@@ -316,7 +306,7 @@
{% set decoproposed=decoproposed-totbefore10 %}
</td>
</tr>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
<tfoot>
@@ -326,8 +316,6 @@
<td class="text-right">{{ (project.proposed - project.validate)|number_format(2, '.', ' ') }}</td>
</tfoot>
</table>
<div class="new-page">&nbsp;</div>
{% endif %}
<h4>CONSOMMATION PASSEE</h4>
{% if project.hors!=0 %}
@@ -358,7 +346,6 @@
</tr>
{% endfor %}
</table>
{% if not project.beforeastreinte is empty %}
<h4>ASTREINTES PASSEES</h4>
@@ -389,6 +376,8 @@
{% endif %}
</div>
</div>
</div>
<div class="new-page">&nbsp;</div>
{% endif %}
{% endfor %}
<br>

View File

@@ -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>

View File

@@ -13,7 +13,7 @@
thead {
display: table-header-group;
}
tr { page-break-inside: avoid; }
tr { page-break-inside: avoid; }
{%endif%}
{% endblock %}
@@ -30,6 +30,11 @@
<label class="custom-control-label" for="switchactive">Projet Actif</label>
</div>
<div class="custom-control custom-switch float-right" style="margin-right:20px">
<input type="checkbox" class="custom-control-input" id="switchactivetask" {% if app.session.get('activetask') %} checked {% endif %}>
<label class="custom-control-label" for="switchactivetask">Tâche Active</label>
</div>
<p></p>
{%for service in services %}
@@ -44,7 +49,7 @@
{% endif %}
{% set haveproject=true %}
{% endif %}
{% endif %}
{% endfor %}
{% if haveproject and havetask %}
@@ -63,6 +68,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>
@@ -74,6 +80,7 @@
{% for project in service.projects %}
{% if app.session.get('activeproject')==project.active and (app.session.get('idproject')=="all" or app.session.get('idproject')==project.id) %}
{% for task in project.tasks %}
{% if app.session.get('activetask')==task.active %}
{% set totvalidate=task.validate %}
{% set totplanified=task.validate %}
{% for event in task.events %}
@@ -99,12 +106,14 @@
<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>
<td class="text-right">{{(task.quantity-totplanified)|number_format(2, '.', ' ')}}</td>
<td class="text-center" style="background-color:{{task.color}}; color:#ffffff">{{task.color}}</td>
</tr>
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
@@ -129,17 +138,20 @@
order: [[ 1, "asc" ]]
});
{%else%}
$('#dataTables').removeClass("table table-striped table-bordered table-hover small dataTable no-footer");
$('#dataTables').removeClass("table table-striped table-bordered table-hover small dataTable no-footer");
{% endif %}
});
$('#switchactive').change(function() {
window.location="{{ path('app_task_activeproject' )}}";
});
$('#switchactivetask').change(function() {
window.location="{{ path('app_task_activetask' )}}";
});
function myprint() {
href=document.location.href;
document.location.href=href+"?fgprint=true";
}
{% endblock %}
}
{% endblock %}

View File

@@ -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">