From ff3659c9a3e88572cc96cd0ea00afa6335ad8b76 Mon Sep 17 00:00:00 2001 From: dario Date: Thu, 23 Apr 2020 16:50:12 +0200 Subject: [PATCH 01/26] =?UTF-8?q?Completata=20la=20pagina=20informativa=20?= =?UTF-8?q?con=20organigramma=20e=20ruoli=20per=20ciascun=20dipendente=20i?= =?UTF-8?q?n=20ePAS.=20Da=20terminare=20la=20definizione=20delle=20azioni?= =?UTF-8?q?=20che=20ciascun=20ruolo=20pu=C3=B2=20ricoprire?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/Groups.java | 33 ++-- app/dao/PersonReperibilityDayDao.java | 1 - app/dao/ShiftDao.java | 1 + app/manager/GroupManager.java | 79 +++++++++- app/models/dto/SeatSituationDto.java | 16 ++ app/views/Groups/seatOrganizationChart.html | 163 ++++++++++++++++++++ app/views/_employeeMenu.html | 8 + conf/messages.it | 20 ++- conf/permissions.drl | 2 + 9 files changed, 305 insertions(+), 18 deletions(-) create mode 100644 app/models/dto/SeatSituationDto.java create mode 100644 app/views/Groups/seatOrganizationChart.html diff --git a/app/controllers/Groups.java b/app/controllers/Groups.java index 49890d9ff..60bb6c49b 100644 --- a/app/controllers/Groups.java +++ b/app/controllers/Groups.java @@ -5,9 +5,12 @@ import dao.GroupDao; import dao.OfficeDao; import dao.PersonDao; +import dao.UsersRolesOfficesDao; import helpers.Web; import java.util.List; +import java.util.stream.Collectors; import javax.inject.Inject; +import lombok.val; import lombok.extern.slf4j.Slf4j; import manager.GroupManager; import models.GeneralSetting; @@ -16,6 +19,7 @@ import models.Role; import models.User; import models.UsersRolesOffices; +import models.dto.SeatSituationDto; import models.flows.Group; import play.data.validation.Valid; import play.data.validation.Validation; @@ -39,6 +43,8 @@ public class Groups extends Controller { private static PersonDao personDao; @Inject private static GeneralSettingDao settingDao; + @Inject + private static UsersRolesOfficesDao uroDao; /** * Metodo che crea il gruppo. @@ -140,19 +146,16 @@ public static void blank(long officeId) { render("@edit", office, peopleForGroups); } - // public static void manageGroup() { - // User currentUser = Security.getUser().get(); - // List managerGroups = Lists.newArrayList(); - // if (currentUser.isSystemUser()) { - // managerGroups = groupDao.groupsByManager(Optional.absent()); - // } - // if (!currentUser.hasRoles(Role.GROUP_MANAGER)) { - // flash.error("L'utente non dispone dei diritti per accedere alla funzionalità"); - // Application.index(); - // } - // //TODO: fare la regola drools per accedere alla funzionalità - // rules.checkIfPermitted(); - // managerGroups = groupDao.groupsByManager(Optional.fromNullable(currentUser.person)); - // render(managerGroups); - // } + public static void seatOrganizationChart() { + + val currentPerson = Security.getUser().get().person; + //Accesso da utente di sistema senza persona associata + if (currentPerson == null) { + Application.index(); + } + SeatSituationDto seatSituation = groupManager.createOrganizationChart(currentPerson); + List roles = uroDao.getUsersRolesOfficesByUser(currentPerson.user) + .stream().map(uro -> uro.role).collect(Collectors.toList()); + render(seatSituation, currentPerson, roles); + } } diff --git a/app/dao/PersonReperibilityDayDao.java b/app/dao/PersonReperibilityDayDao.java index a678bf644..9779f703c 100755 --- a/app/dao/PersonReperibilityDayDao.java +++ b/app/dao/PersonReperibilityDayDao.java @@ -285,5 +285,4 @@ public Optional byPersonDateAndType(Person person, return Optional.fromNullable(result); } - } diff --git a/app/dao/ShiftDao.java b/app/dao/ShiftDao.java index aee934882..80831db0c 100755 --- a/app/dao/ShiftDao.java +++ b/app/dao/ShiftDao.java @@ -353,5 +353,6 @@ public List getByPersonShiftAndDate( .fetch(); } + } diff --git a/app/manager/GroupManager.java b/app/manager/GroupManager.java index 53d50ae84..141771125 100644 --- a/app/manager/GroupManager.java +++ b/app/manager/GroupManager.java @@ -3,14 +3,21 @@ import com.google.common.base.Optional; import dao.GroupDao; +import dao.PersonReperibilityDayDao; import dao.RoleDao; +import dao.ShiftDao; import dao.UsersRolesOfficesDao; import java.util.List; +import java.util.stream.Collectors; import javax.inject.Inject; +import org.assertj.core.util.Lists; import lombok.extern.slf4j.Slf4j; import models.Office; +import models.Person; import models.Role; +import models.User; import models.UsersRolesOffices; +import models.dto.SeatSituationDto; import models.flows.Group; @Slf4j @@ -27,7 +34,8 @@ public class GroupManager { * @param groupDao il dao sui gruppi */ @Inject - public GroupManager(RoleDao roleDao, UsersRolesOfficesDao uroDao, GroupDao groupDao) { + public GroupManager(RoleDao roleDao, UsersRolesOfficesDao uroDao, + GroupDao groupDao) { this.roleDao = roleDao; this.uroDao = uroDao; this.groupDao = groupDao; @@ -78,4 +86,73 @@ public boolean deleteManager(Group group) { } return false; } + + /** + * Genera il dto contenente le liste dei possibili modificatori dello stato delle info + * della persona passata come parametro. + * @param person la persona di cui conoscere tutti i possibili modificatori delle proprie info + * @return il dto contenente tutte le informazioni degli utenti che possono in qualche modo + * modificare lo stato delle informazioni della persona passata come parametro. + */ + public SeatSituationDto createOrganizationChart(Person person) { + + SeatSituationDto seatSituation = new SeatSituationDto(); + seatSituation.personnelAdmins = getPersonnelAdminInSeat(person.office); + seatSituation.technicalAdmins = getTechnicalAdminInSeat(person.office); + seatSituation.seatSupervisors = getSeatSupervisor(person.office); + /* + * Turni, reperibilità e gruppi di lavoro devo cercarli sulla base + * dell'appartenenza della persona al gruppo/servizio + */ + if (!person.personShifts.isEmpty()) { + seatSituation.shiftSupervisors = person.personShifts.stream() + .flatMap(ps -> ps.personShiftShiftTypes.stream() + .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) + .collect(Collectors.toList()); + + } else { + seatSituation.shiftSupervisors = Lists.emptyList(); + } + if (!person.reperibility.isEmpty()) { + seatSituation.reperibilitySupervisors = person.reperibility.stream() + .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList()); + } else { + seatSituation.reperibilitySupervisors = Lists.emptyList(); + } + if (!person.groups.isEmpty()) { + seatSituation.groupManagers = person.groups.stream() + .map(g -> g.manager.user).collect(Collectors.toList()); + } else { + seatSituation.groupManagers = Lists.emptyList(); + } + + /* + * Fine + */ + seatSituation.mealTicketsManager = getMealTicketsManager(person.office); + seatSituation.registryManagers = getRegistryManager(person.office); + + return seatSituation; + } + + private List getTechnicalAdminInSeat(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.TECHNICAL_ADMIN), office); + } + + private List getPersonnelAdminInSeat(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.PERSONNEL_ADMIN), office); + } + + private List getSeatSupervisor(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.SEAT_SUPERVISOR), office); + } + + private List getMealTicketsManager(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.MEAL_TICKET_MANAGER), office); + } + + private List getRegistryManager(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.REGISTRY_MANAGER), office); + } + } diff --git a/app/models/dto/SeatSituationDto.java b/app/models/dto/SeatSituationDto.java new file mode 100644 index 000000000..96318b3e7 --- /dev/null +++ b/app/models/dto/SeatSituationDto.java @@ -0,0 +1,16 @@ +package models.dto; + +import java.util.List; +import models.User; + +public class SeatSituationDto { + + public List technicalAdmins; + public List personnelAdmins; + public List seatSupervisors; + public List shiftSupervisors; + public List reperibilitySupervisors; + public List mealTicketsManager; + public List registryManagers; + public List groupManagers; +} diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html new file mode 100644 index 000000000..9ac964006 --- /dev/null +++ b/app/views/Groups/seatOrganizationChart.html @@ -0,0 +1,163 @@ +#{extends 'main.html' /} +#{set header:'navbar' /} +#{set title:'ePAS - Organigramma di sede' /} + +
+ + #{title title:('Organigramma e ruoli per la sede ' + currentPerson.office.name) /} + +
+ #{accordionGroup 'generic'} + #{accordionItem 'Ruoli', parent:'codici', title:'Ruoli di '+ currentPerson.fullName() + ' sulla sede', open:false, color:'info'} +
    + #{list items:roles, as:'role'} +
  • + &{role.name} + + Cosa fa + +
  • + #{/list} +
+ #{/accordionItem} + + + #{accordionItem 'Organigramma', parent:'generic', title:'Organigramma', open:true, color:'info'} +

Responsabile sede

+ #{if seatSituation.seatSupervisors.empty } +
+ Non è stato ancora impostato alcun responsabile sede! +
+ #{/if} + #{else} +
    + #{list items:seatSituation.seatSupervisors, as:'userRole'} +
  • + ${userRole.person.fullname} + + Non può modificare i miei dati + +
  • + #{/list} +
+ #{/else} + + + #{if !seatSituation.groupManagers.empty } +

Responsabile gruppo di lavoro

+
    + #{list items:seatSituation.groupManagers, as:'userRole'} +
  • + ${userRole.person.fullname} + + Non può modificare i miei dati + +
  • + #{/list} +
+ #{/if} + +

Amministratore tecnico

+ #{if seatSituation.technicalAdmins.empty } +
+ Non è stato ancora impostato alcun amministratore tecnico! +
+ #{/if} + #{else} +
    + #{list items:seatSituation.technicalAdmins, as:'userRole'} +
  • + ${userRole.person.fullname} + + Può modificare i miei dati + +
  • + #{/list} +
+ #{/else} + +

Amministratore del personale

+ #{if seatSituation.personnelAdmins.empty } +
+ Non è stato ancora impostato alcun amministratore del personale! +
+ #{/if} + #{else} +
    + #{list items:seatSituation.personnelAdmins, as:'userRole'} +
  • + ${userRole.person.fullname} + + Può modificare i miei dati + +
  • + #{/list} +
+ #{/else} + + #{if !seatSituation.mealTicketsManager.empty } +

Gestori dei buoni pasto

+
    +
      + #{list items:seatSituation.mealTicketsManager, as:'userRole'} +
    • + ${userRole.person.fullname} + + Può modificare i miei dati + +
    • + #{/list} +
    +
+ #{/if} + + #{if !seatSituation.registryManagers.empty } +

Gestori dell'anagrafica

+
    +
      + #{list items:seatSituation.registryManagers, as:'userRole'} +
    • + ${userRole.person.fullname} + + Può modificare i miei dati + +
    • + #{/list} +
    +
+ #{/if} + + #{if !seatSituation.shiftSupervisors.empty } +

Responsabile servizio di turno

+
    + #{list items:seatSituation.shiftSupervisors, as:'userRole'} +
  • + ${userRole.person.fullname} + + Può modificare i miei dati + +
  • + #{/list} +
+ #{/if} + + #{if !seatSituation.reperibilitySupervisors.empty } +

Responsabile servizio di reperibilità

+
    + #{list items:seatSituation.reperibilitySupervisors, as:'userRole'} +
  • + ${userRole.person.fullname} + + Può modificare i miei dati + +
  • + #{/list} +
+ #{/if} + #{/accordionItem} + #{/accordionGroup} +
+ + + +
\ No newline at end of file diff --git a/app/views/_employeeMenu.html b/app/views/_employeeMenu.html index b40bb429e..a551cdff9 100644 --- a/app/views/_employeeMenu.html +++ b/app/views/_employeeMenu.html @@ -97,6 +97,10 @@ #{secure.li @MealTickets.mealTickets() } #{/secure.li} + + #{secure.li @Groups.seatOrganizationChart() } + + #{/secure.li} #{secure.check 'PrintTags.showTag'}
  • @@ -121,6 +125,10 @@ #{secure.li @Absences.absencesVisibleForEmployee(session.get("yearSelected"), session.get("monthSelected"), session.get("daySelected")) } #{/secure.li} + + + + *{ end items }* diff --git a/conf/messages.it b/conf/messages.it index ec5cac1d7..8eee16e72 100755 --- a/conf/messages.it +++ b/conf/messages.it @@ -734,6 +734,24 @@ ferieAnnoPassato= Ferie anno passato (da fare) ferieAnnoPresente= Ferie anno corrente (da fare) permessi= Permessi legge (da fare) +####################################################### +# Ruoli # +####################################################### + +seatSupervisor = Responsabile Sede +personnelAdmin = Amministratore Personale +personnelAdminMini = Amministratore Personale Sola lettura +employee = Dipendente +badgeReader = Lettore di badge +restClient = Client rest +technicalAdmin = Amministratore Tecnico +shiftManager = Gestore turni +reperibilityManager = Gestore reperibilità +groupManager = Responsabile gruppo +mealTicketManager = Gestore buoni pasto +registryManager = Gestore anagrafica +personDayReader = Lettore informazioni + ########################### # Messaggi di validazione ########################### @@ -830,7 +848,7 @@ AbsenceRequestType.COMPENSATORY_REST.blank =nuova richiesta riposo compensativo AbsenceRequestType.SHORT_TERM_PERMIT =permesso breve AbsenceRequestType.SHORT_TERM_PERMITS =permessi breve AbsenceRequestType.SHORT_TERM_PERMIT.blank =nuova richiesta permesso breve - +Groups.seatOrganizationChart =Organigramma sede e ruoli Institutes.list= Sedi e Amministratori MealTickets.editPersonMealTickets= Modifica Buoni Consegnati MealTickets.findCodeBlock= Ricerca Buoni Pasto diff --git a/conf/permissions.drl b/conf/permissions.drl index 725faf41a..5dcb43900 100755 --- a/conf/permissions.drl +++ b/conf/permissions.drl @@ -505,6 +505,8 @@ when "AbsenceRequests.show", "AbsenceRequests.flush", + /* Visualizzazione organigramma*/ + "Groups.seatOrganizationChart", /* Ferie */ "Vacations.show", From e17b51f36a07d00affd1ef18b442bdaf74e54cc0 Mon Sep 17 00:00:00 2001 From: dario Date: Thu, 23 Apr 2020 17:16:56 +0200 Subject: [PATCH 02/26] Riviste alcune denominazioni --- app/views/Groups/seatOrganizationChart.html | 56 +++++++++++---------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html index 9ac964006..d14cabe5e 100644 --- a/app/views/Groups/seatOrganizationChart.html +++ b/app/views/Groups/seatOrganizationChart.html @@ -4,7 +4,7 @@
    - #{title title:('Organigramma e ruoli per la sede ' + currentPerson.office.name) /} + #{title title:('Ruoli in ePAS per la sede ' + currentPerson.office.name) /}
    #{accordionGroup 'generic'} @@ -22,7 +22,7 @@ #{/accordionItem} - #{accordionItem 'Organigramma', parent:'generic', title:'Organigramma', open:true, color:'info'} + #{accordionItem 'Organigramma', parent:'generic', title:'Altri ruoli in ePAS', open:true, color:'info'}

    Responsabile sede

    #{if seatSituation.seatSupervisors.empty }
    @@ -35,7 +35,7 @@

    Responsabile sede

  • ${userRole.person.fullname} - Non può modificare i miei dati + Può visualizzare alcuni miei dati
  • #{/list} @@ -50,31 +50,14 @@

    Responsabile gruppo di lavoro

  • ${userRole.person.fullname} - Non può modificare i miei dati + Può visualizzare alcuni miei dati
  • #{/list} #{/if} -

    Amministratore tecnico

    - #{if seatSituation.technicalAdmins.empty } -
    - Non è stato ancora impostato alcun amministratore tecnico! -
    - #{/if} - #{else} -
      - #{list items:seatSituation.technicalAdmins, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può modificare i miei dati - -
    • - #{/list} -
    - #{/else} +

    Amministratore del personale

    #{if seatSituation.personnelAdmins.empty } @@ -88,7 +71,7 @@

    Amministratore del personale

  • ${userRole.person.fullname} - Può modificare i miei dati + Può modificare alcuni miei dati
  • #{/list} @@ -103,7 +86,7 @@

    Gestori dei buoni pasto

  • ${userRole.person.fullname} - Può modificare i miei dati + Può modificare alcuni miei dati
  • #{/list} @@ -119,7 +102,7 @@

    Gestori dell'anagrafica

  • ${userRole.person.fullname} - Può modificare i miei dati + Può modificare alcuni miei dati
  • #{/list} @@ -134,7 +117,7 @@

    Responsabile servizio di turno

  • ${userRole.person.fullname} - Può modificare i miei dati + Può modificare alcuni miei dati
  • #{/list} @@ -148,12 +131,31 @@

    Responsabile servizio di reperibilità

  • ${userRole.person.fullname} - Può modificare i miei dati + Può modificare alcuni miei dati
  • #{/list} #{/if} + +

    Amministratore tecnico

    + #{if seatSituation.technicalAdmins.empty } +
    + Non è stato ancora impostato alcun amministratore tecnico! +
    + #{/if} + #{else} +
      + #{list items:seatSituation.technicalAdmins, as:'userRole'} +
    • + ${userRole.person.fullname} + + Può visualizzare alcuni miei dati + +
    • + #{/list} +
    + #{/else} #{/accordionItem} #{/accordionGroup}
    From 4dfd77e7bbc26bb441be2174268971994f2479cd Mon Sep 17 00:00:00 2001 From: dario Date: Fri, 24 Apr 2020 17:46:35 +0200 Subject: [PATCH 03/26] Aggiunta descrizione dei ruoli e modificata la creazione della pagina --- app/controllers/Groups.java | 15 +- app/manager/GroupManager.java | 103 +++++++----- app/views/Groups/_tutorial.html | 54 +++++++ app/views/Groups/seatOrganizationChart.html | 167 ++++---------------- app/views/Groups/viewInfoRole.html | 5 + conf/messages.it | 5 + conf/permissions.drl | 1 + 7 files changed, 173 insertions(+), 177 deletions(-) create mode 100644 app/views/Groups/_tutorial.html create mode 100644 app/views/Groups/viewInfoRole.html diff --git a/app/controllers/Groups.java b/app/controllers/Groups.java index 60bb6c49b..4e5ce294a 100644 --- a/app/controllers/Groups.java +++ b/app/controllers/Groups.java @@ -1,13 +1,16 @@ package controllers; +import com.beust.jcommander.internal.Maps; import com.google.common.base.Optional; import dao.GeneralSettingDao; import dao.GroupDao; import dao.OfficeDao; import dao.PersonDao; +import dao.RoleDao; import dao.UsersRolesOfficesDao; import helpers.Web; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import javax.inject.Inject; import lombok.val; @@ -45,6 +48,8 @@ public class Groups extends Controller { private static GeneralSettingDao settingDao; @Inject private static UsersRolesOfficesDao uroDao; + @Inject + private static RoleDao roleDao; /** * Metodo che crea il gruppo. @@ -153,9 +158,15 @@ public static void seatOrganizationChart() { if (currentPerson == null) { Application.index(); } - SeatSituationDto seatSituation = groupManager.createOrganizationChart(currentPerson); + Map> map = groupManager.createOrganizationChart(currentPerson); + List roles = uroDao.getUsersRolesOfficesByUser(currentPerson.user) .stream().map(uro -> uro.role).collect(Collectors.toList()); - render(seatSituation, currentPerson, roles); + render(map, currentPerson, roles); + } + + public static void viewInfoRole(Long id) { + Role role = roleDao.getRoleById(id); + render(role); } } diff --git a/app/manager/GroupManager.java b/app/manager/GroupManager.java index 141771125..0b06dca45 100644 --- a/app/manager/GroupManager.java +++ b/app/manager/GroupManager.java @@ -1,6 +1,7 @@ package manager; +import com.beust.jcommander.internal.Maps; import com.google.common.base.Optional; import dao.GroupDao; import dao.PersonReperibilityDayDao; @@ -8,6 +9,7 @@ import dao.ShiftDao; import dao.UsersRolesOfficesDao; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import javax.inject.Inject; import org.assertj.core.util.Lists; @@ -94,45 +96,70 @@ public boolean deleteManager(Group group) { * @return il dto contenente tutte le informazioni degli utenti che possono in qualche modo * modificare lo stato delle informazioni della persona passata come parametro. */ - public SeatSituationDto createOrganizationChart(Person person) { + public Map> createOrganizationChart(Person person) { - SeatSituationDto seatSituation = new SeatSituationDto(); - seatSituation.personnelAdmins = getPersonnelAdminInSeat(person.office); - seatSituation.technicalAdmins = getTechnicalAdminInSeat(person.office); - seatSituation.seatSupervisors = getSeatSupervisor(person.office); - /* - * Turni, reperibilità e gruppi di lavoro devo cercarli sulla base - * dell'appartenenza della persona al gruppo/servizio - */ - if (!person.personShifts.isEmpty()) { - seatSituation.shiftSupervisors = person.personShifts.stream() - .flatMap(ps -> ps.personShiftShiftTypes.stream() - .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) - .collect(Collectors.toList()); - - } else { - seatSituation.shiftSupervisors = Lists.emptyList(); + Map> map = Maps.newHashMap(); + for (Role role: roleDao.getAll()) { + if (role.name.equals(Role.BADGE_READER)) { + continue; + } + if (role.name.equals(Role.EMPLOYEE)) { + continue; + } + if (role.name.equals(Role.GROUP_MANAGER)) { + if (!person.groups.isEmpty()) { + map.put(role, person.groups.stream() + .map(g -> g.manager.user).collect(Collectors.toList())); + } else { + map.put(role, Lists.emptyList()); + } + } + if (role.name.equals(Role.MEAL_TICKET_MANAGER)) { + map.put(role, getMealTicketsManager(person.office)); + } + if (role.name.equals(Role.PERSON_DAY_READER)) { + continue; + } + if (role.name.equals(Role.PERSONNEL_ADMIN)) { + map.put(role, getPersonnelAdminInSeat(person.office)); + } + if (role.name.equals(Role.PERSONNEL_ADMIN_MINI)) { + map.put(role, getPersonnelAdminMiniInSeat(person.office)); + } + if (role.name.equals(Role.REGISTRY_MANAGER)) { + map.put(role, getRegistryManager(person.office)); + } + if (role.name.equals(Role.REPERIBILITY_MANAGER)) { + if (!person.reperibility.isEmpty()) { + map.put(role, person.reperibility.stream() + .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList())); + } else { + map.put(role, Lists.emptyList()); + } + } + if (role.name.equals(Role.REST_CLIENT)) { + continue; + } + if (role.name.equals(Role.SEAT_SUPERVISOR)) { + map.put(role, getSeatSupervisor(person.office)); + } + if (role.name.equals(Role.SHIFT_MANAGER)) { + if (!person.personShifts.isEmpty()) { + map.put(role, person.personShifts.stream() + .flatMap(ps -> ps.personShiftShiftTypes.stream() + .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) + .collect(Collectors.toList())); + + } else { + map.put(role, Lists.emptyList()); + } + } + if (role.name.equals(Role.TECHNICAL_ADMIN)) { + map.put(role, getTechnicalAdminInSeat(person.office)); + } } - if (!person.reperibility.isEmpty()) { - seatSituation.reperibilitySupervisors = person.reperibility.stream() - .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList()); - } else { - seatSituation.reperibilitySupervisors = Lists.emptyList(); - } - if (!person.groups.isEmpty()) { - seatSituation.groupManagers = person.groups.stream() - .map(g -> g.manager.user).collect(Collectors.toList()); - } else { - seatSituation.groupManagers = Lists.emptyList(); - } - - /* - * Fine - */ - seatSituation.mealTicketsManager = getMealTicketsManager(person.office); - seatSituation.registryManagers = getRegistryManager(person.office); - return seatSituation; + return map; } private List getTechnicalAdminInSeat(Office office) { @@ -154,5 +181,9 @@ private List getMealTicketsManager(Office office) { private List getRegistryManager(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.REGISTRY_MANAGER), office); } + + private List getPersonnelAdminMiniInSeat(Office office) { + return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.PERSONNEL_ADMIN_MINI), office); + } } diff --git a/app/views/Groups/_tutorial.html b/app/views/Groups/_tutorial.html new file mode 100644 index 000000000..bba30a109 --- /dev/null +++ b/app/views/Groups/_tutorial.html @@ -0,0 +1,54 @@ + +#{alert color:'info', textcolor:'dark'} + + #{if role.name.equals('PERSONNEL_ADMIN')} + + #{/if} + + #{if role.name.equals('PERSONNEL_ADMIN_MINI')} + + #{/if} + + #{if role.name.equals('SEAT_SUPERVISOR')} + + #{/if} + + #{if role.name.equals('EMPLOYEE')} + + #{/if} + + #{if role.name.equals('SHIFT_MANAGER')} + + #{/if} + + #{if role.name.equals('REPERIBILITY_MANAGER')} + + #{/if} + + #{if role.name.equals('GROUP_MANAGER')} + + #{/if} + + #{if role.name.equals('REGISTRY_MANAGER')} + + #{/if} + + #{if role.name.equals('MEAL_TICKET_MANAGER')} + + #{/if} + + #{if role.name.equals('TECHNICAL_ADMIN')} + + #{/if} + + #{if role.name.equals('BADGE_READER')} + + #{/if} + + #{if role.name.equals('PERSON_DAY_READER')} + + #{/if} + + +#{/alert} + diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html index d14cabe5e..4327ac6a0 100644 --- a/app/views/Groups/seatOrganizationChart.html +++ b/app/views/Groups/seatOrganizationChart.html @@ -20,146 +20,35 @@ #{/list} #{/accordionItem} - - #{accordionItem 'Organigramma', parent:'generic', title:'Altri ruoli in ePAS', open:true, color:'info'} -

    Responsabile sede

    - #{if seatSituation.seatSupervisors.empty } -
    - Non è stato ancora impostato alcun responsabile sede! -
    - #{/if} - #{else} -
      - #{list items:seatSituation.seatSupervisors, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può visualizzare alcuni miei dati - -
    • - #{/list} -
    - #{/else} - - - #{if !seatSituation.groupManagers.empty } -

    Responsabile gruppo di lavoro

    -
      - #{list items:seatSituation.groupManagers, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può visualizzare alcuni miei dati - -
    • - #{/list} -
    - #{/if} + #{list items:map.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + + #{/list} + #{/accordionItem} + #{/accordionGroup} + +
    - -

    Amministratore del personale

    - #{if seatSituation.personnelAdmins.empty } -
    - Non è stato ancora impostato alcun amministratore del personale! -
    - #{/if} - #{else} -
      - #{list items:seatSituation.personnelAdmins, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può modificare alcuni miei dati - -
    • - #{/list} -
    - #{/else} - - #{if !seatSituation.mealTicketsManager.empty } -

    Gestori dei buoni pasto

    -
      -
        - #{list items:seatSituation.mealTicketsManager, as:'userRole'} -
      • - ${userRole.person.fullname} - - Può modificare alcuni miei dati - -
      • - #{/list} -
      -
    - #{/if} - - #{if !seatSituation.registryManagers.empty } -

    Gestori dell'anagrafica

    -
      -
        - #{list items:seatSituation.registryManagers, as:'userRole'} -
      • - ${userRole.person.fullname} - - Può modificare alcuni miei dati - -
      • - #{/list} -
      -
    - #{/if} - - #{if !seatSituation.shiftSupervisors.empty } -

    Responsabile servizio di turno

    -
      - #{list items:seatSituation.shiftSupervisors, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può modificare alcuni miei dati - -
    • - #{/list} -
    - #{/if} - - #{if !seatSituation.reperibilitySupervisors.empty } -

    Responsabile servizio di reperibilità

    -
      - #{list items:seatSituation.reperibilitySupervisors, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può modificare alcuni miei dati - -
    • - #{/list} -
    - #{/if} - -

    Amministratore tecnico

    - #{if seatSituation.technicalAdmins.empty } -
    - Non è stato ancora impostato alcun amministratore tecnico! -
    - #{/if} - #{else} -
      - #{list items:seatSituation.technicalAdmins, as:'userRole'} -
    • - ${userRole.person.fullname} - - Può visualizzare alcuni miei dati - -
    • - #{/list} -
    - #{/else} - #{/accordionItem} - #{/accordionGroup} -
    - - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/views/Groups/viewInfoRole.html b/app/views/Groups/viewInfoRole.html new file mode 100644 index 000000000..d2454bf38 --- /dev/null +++ b/app/views/Groups/viewInfoRole.html @@ -0,0 +1,5 @@ +#{modalAsync id:'modalViewRole', button:'Salva', title:'Azioni eseguibili dal ruolo '+ role.name } + +#{include './_tutorial.html' /} + +#{/modalAsync} \ No newline at end of file diff --git a/conf/messages.it b/conf/messages.it index 8eee16e72..a94ed877e 100755 --- a/conf/messages.it +++ b/conf/messages.it @@ -752,6 +752,11 @@ mealTicketManager = Gestore buoni pasto registryManager = Gestore anagrafica personDayReader = Lettore informazioni +######################################################### +# Azioni eseguibili dai ruoli # +######################################################### +seatSupervisor.action =Può vedere le presenze in sede,\n\r può vedere la situazione ferie dei dipendenti, può approvare le ferie e i rip.comp. dei dipendenti e/o dei responsabili di gruppo + ########################### # Messaggi di validazione ########################### diff --git a/conf/permissions.drl b/conf/permissions.drl index 5dcb43900..0fba626c9 100755 --- a/conf/permissions.drl +++ b/conf/permissions.drl @@ -507,6 +507,7 @@ when /* Visualizzazione organigramma*/ "Groups.seatOrganizationChart", + "Groups.viewInfoRole", /* Ferie */ "Vacations.show", From 7a32a46f2ddf3f56af4f8fe35e3143aa5b1775c2 Mon Sep 17 00:00:00 2001 From: dario Date: Mon, 27 Apr 2020 09:43:38 +0200 Subject: [PATCH 04/26] =?UTF-8?q?Completata=20la=20definizione=20delle=20a?= =?UTF-8?q?zioni=20eseguibili=20dai=20ruoli=20presenti=20sulla=20sede=20cu?= =?UTF-8?q?i=20il=20dipendente=20=C3=A8=20afferente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/Groups/_tutorial.html | 109 ++++++++++++++++---- app/views/Groups/seatOrganizationChart.html | 7 +- conf/messages.it | 2 +- 3 files changed, 92 insertions(+), 26 deletions(-) diff --git a/app/views/Groups/_tutorial.html b/app/views/Groups/_tutorial.html index bba30a109..808507519 100644 --- a/app/views/Groups/_tutorial.html +++ b/app/views/Groups/_tutorial.html @@ -1,51 +1,116 @@ #{alert color:'info', textcolor:'dark'} - #{if role.name.equals('PERSONNEL_ADMIN')} - + #{if role.name.equals('personnelAdmin')} +
      +
    • Può inserire, modificare, cancellare timbrature nei cartellini dei dipendenti
    • +
    • Può inserire, modificare, cancellare codici di assenza nei cartellini dei dipendenti
    • +
    • Può vedere le assenze del personale su base mensile e annuale
    • +
    • Può inserire, modificare, cancellare competenze accessorie
    • +
    • Può vedere la situazione delle ferie e dei permessi dei dipendenti
    • +
    • Può vedere i calendari di turni e reperibilità, se configurati
    • +
    • Può definire la configurazione della sede (orari di apertura/chiusura ecc...)
    • +
    • Può stampare i cartellini dei dipendenti
    • +
    • Può inviare i dati mensili alla piattaforma Attestati
    • +
    • Può definire gli orari di lavoro particolari che devono essere assegnati ai dipendenti della sede (part time orizzontali, verticali). +
    • +
    #{/if} - #{if role.name.equals('PERSONNEL_ADMIN_MINI')} - + #{if role.name.equals('personnelAdminMini')} +
      +
    • Può vedere le timbrature nei cartellini dei dipendenti
    • +
    • Può vedere i codici di assenza nei cartellini dei dipendenti
    • +
    • Può vedere le competenze accessorie
    • +
    • Può vedere le assenze del personale su base mensile e annuale
    • +
    #{/if} - #{if role.name.equals('SEAT_SUPERVISOR')} - + #{if role.name.equals('seatSupervisor')} +
      +
    • Può vedere le timbrature nei cartellini dei dipendenti
    • +
    • Può vedere i codici di assenza nei cartellini dei dipendenti
    • +
    • Può approvare/respingere le richieste di assenza dei dipendenti
    • +
    • Può vedere la situazione delle ferie e dei permessi dei dipendenti
    • +
    #{/if} - #{if role.name.equals('EMPLOYEE')} - + #{if role.name.equals('employee')} +
      +
    • Accede al sistema con le proprie credenziali
    • +
    • Può vedere il proprio cartellino mensile
    • +
    • Può vedere la situazione delle proprie ferie
    • +
    • Può vedere la situazione delle proprie assenze su base mensile/annuale
    • +
    • Può vedere la situazione delle competenze accessorie assegnate
    • +
    • Può stampare il proprio cartellino mensile
    • +
    • Può effettuare richieste di ferie/riposi compensativi
    • +
    • Può inserire le proprie timbrature per lavoro fuori sede (se abilitato dalla configurazione)
    • +
    • Può inserire alcuni tipi di assenza (se abilitato dalla configurazione)
    • +
    #{/if} - #{if role.name.equals('SHIFT_MANAGER')} - + #{if role.name.equals('shiftManager')} +
      +
    • Può assegnare, rimuovere una persona in turno in un certo giorno (visualizzando le eventuali assenze dei turnisti ma senza poter vedere la tipologia di assenza)
    • +
    • Può approvare/respingere il calendario dei turni
    • +
    • Può stampare il prospetto del calendario dei turni
    • +
    #{/if} - #{if role.name.equals('REPERIBILITY_MANAGER')} - + #{if role.name.equals('reperibilityManager')} +
      +
    • Può assegnare, rimuovere una persona in reperibilità in un certo giorno (visualizzando le eventuali assenze dei reperibili ma senza poter vedere la tipologia di assenza)
    • +
    • Può approvare/respingere il calendario della reperibilità
    • +
    • Può stampare il prospetto del calendario della reperibilità.
    • +
    #{/if} - #{if role.name.equals('GROUP_MANAGER')} - + #{if role.name.equals('groupManager')} +
      +
    • uò vedere le timbrature dei dipendenti appartenenti al proprio gruppo di lavoro (eventualmente modificabile se dovesse creare problemi)
    • +
    • Può inserire/rimuovere persone dal proprio gruppo di lavoro
    • +
    • Può approvare/respingere le ferie/riposi compensativi dei dipendenti del proprio gruppo di lavoro
    • +
    #{/if} - #{if role.name.equals('REGISTRY_MANAGER')} - + #{if role.name.equals('registryManager')} +
      +
    • Può inserire, modificare il personale afferente alla sede
    • +
    • Può inserire, modificare, cancellare i contratti del personale dipendente
    • +
    • Può inserire, modificare, cancellare gli orari di lavoro sul contratto dei dipendenti
    • +
    • Può inserire, modificare cancellare i piani ferie dei dipendenti
    • +
    • Può inserire, modificare, cancellare le fasce di presenza obbligatoria dei dipendenti
    • +
    • Può inserire, modificare, cancellare le inizializzazioni orarie e dei buoni pasto dei dipendenti in fase di avvio dell’utilizzo del programma
    • +
    • Può scaricare da “Attestati” le assenze pregresse dei dipendenti in fase di avvio dell’utilizzo del programma.
    • +
    #{/if} - #{if role.name.equals('MEAL_TICKET_MANAGER')} - + #{if role.name.equals('mealTicketManager')} +
      +
    • Può vedere la situazione dei buoni pasto assegnati ai dipendenti
    • +
    • Può inserire, modificare, cancellare i blocchetti di buoni pasto per ciascun dipendente
    • +
    • Può spostare i blocchetti di buoni pasto da un contratto ad un altro dello stesso dipendente.
    • +
    #{/if} - #{if role.name.equals('TECHNICAL_ADMIN')} + #{if role.name.equals('technicalAdmin')} +
      +
    • Può definire e configurare le sorgenti delle timbrature
    • +
    • Può definire e configurare il gruppo badge della sede (ovvero il pool di badge assegnato ai dipendenti della propria sede)
    • +
    • Può configurare degli indirizzi ip per l’autorizzazione alla timbratura via web
    • +
    • Può configurare dei ruoli operativi nella sede di appartenenza
    • +
    #{/if} - #{if role.name.equals('BADGE_READER')} - + #{if role.name.equals('badgeReader')} +
      +
    • è il ruolo assegnato all’utente con cui il client che rileva le timbrature localmente sulle singole sedi si autentica sul + sistema ePAS e consente l’inserimento delle timbrature sui cartellini dei singoli dipendenti appartenenti alle stesse sedi.
    • +
    #{/if} - #{if role.name.equals('PERSON_DAY_READER')} + #{if role.name.equals('personDayReader')} #{/if} diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html index 4327ac6a0..b3ecf37c8 100644 --- a/app/views/Groups/seatOrganizationChart.html +++ b/app/views/Groups/seatOrganizationChart.html @@ -13,9 +13,10 @@ #{list items:roles, as:'role'}
  • &{role.name} - - Cosa fa - + + Cosa può fare +
  • #{/list} diff --git a/conf/messages.it b/conf/messages.it index a94ed877e..b72f1da23 100755 --- a/conf/messages.it +++ b/conf/messages.it @@ -853,7 +853,7 @@ AbsenceRequestType.COMPENSATORY_REST.blank =nuova richiesta riposo compensativo AbsenceRequestType.SHORT_TERM_PERMIT =permesso breve AbsenceRequestType.SHORT_TERM_PERMITS =permessi breve AbsenceRequestType.SHORT_TERM_PERMIT.blank =nuova richiesta permesso breve -Groups.seatOrganizationChart =Organigramma sede e ruoli +Groups.seatOrganizationChart =Ruoli in ePAS all'interno della sede Institutes.list= Sedi e Amministratori MealTickets.editPersonMealTickets= Modifica Buoni Consegnati MealTickets.findCodeBlock= Ricerca Buoni Pasto From e00e899a677485c20db24d8183e4de5bcdc46485 Mon Sep 17 00:00:00 2001 From: dario Date: Mon, 27 Apr 2020 09:46:07 +0200 Subject: [PATCH 05/26] =?UTF-8?q?mancava=20una=20"p"=20a=20pu=C3=B2=20:-)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/Groups/_tutorial.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/Groups/_tutorial.html b/app/views/Groups/_tutorial.html index 808507519..da84b02ae 100644 --- a/app/views/Groups/_tutorial.html +++ b/app/views/Groups/_tutorial.html @@ -67,7 +67,7 @@ #{if role.name.equals('groupManager')}
      -
    • uò vedere le timbrature dei dipendenti appartenenti al proprio gruppo di lavoro (eventualmente modificabile se dovesse creare problemi)
    • +
    • Può vedere le timbrature dei dipendenti appartenenti al proprio gruppo di lavoro (eventualmente modificabile se dovesse creare problemi)
    • Può inserire/rimuovere persone dal proprio gruppo di lavoro
    • Può approvare/respingere le ferie/riposi compensativi dei dipendenti del proprio gruppo di lavoro
    From de30bc3cc58b1643b7ead369efb92456565e7269 Mon Sep 17 00:00:00 2001 From: dario Date: Thu, 18 Feb 2021 10:30:51 +0100 Subject: [PATCH 06/26] =?UTF-8?q?Rimosso=20ramo=20else=20nell'inserimento?= =?UTF-8?q?=20di=20eventuali=20informazioni=20mancanti=20sui=20gestori=20d?= =?UTF-8?q?i=20turni=20e=20reperibilit=C3=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/Groups.java | 5 ++++- app/manager/GroupManager.java | 11 +++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/app/controllers/Groups.java b/app/controllers/Groups.java index 59296c966..4991a2003 100644 --- a/app/controllers/Groups.java +++ b/app/controllers/Groups.java @@ -33,9 +33,9 @@ import java.util.Set; import java.util.stream.Collectors; import javax.inject.Inject; -import lombok.val; import lombok.extern.slf4j.Slf4j; import lombok.val; +import lombok.val; import manager.GroupManager; import models.GeneralSetting; import models.Office; @@ -205,6 +205,9 @@ public static void blank(long officeId) { render("@edit", office, peopleForGroups); } + /** + * Ritorna le informazioni sui ruoli presenti nella sede di appartenenza del dipendente. + */ public static void seatOrganizationChart() { val currentPerson = Security.getUser().get().person; diff --git a/app/manager/GroupManager.java b/app/manager/GroupManager.java index b31c40dba..88b7622a4 100644 --- a/app/manager/GroupManager.java +++ b/app/manager/GroupManager.java @@ -199,9 +199,7 @@ public Map> createOrganizationChart(Person person) { if (!person.reperibility.isEmpty()) { map.put(role, person.reperibility.stream() .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList())); - } else { - map.put(role, Lists.emptyList()); - } + } } if (role.name.equals(Role.REST_CLIENT)) { continue; @@ -214,11 +212,8 @@ public Map> createOrganizationChart(Person person) { map.put(role, person.personShifts.stream() .flatMap(ps -> ps.personShiftShiftTypes.stream() .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) - .collect(Collectors.toList())); - - } else { - map.put(role, Lists.emptyList()); - } + .collect(Collectors.toList())); + } } if (role.name.equals(Role.TECHNICAL_ADMIN)) { map.put(role, getTechnicalAdminInSeat(person.office)); From b2049ecd14040e39b74e18b1b5429bb31d95db34 Mon Sep 17 00:00:00 2001 From: dario Date: Thu, 18 Feb 2021 11:44:10 +0100 Subject: [PATCH 07/26] rimossi i vincoli che impediscono di vedere le timbrature in telelavoro --- app/views/Configurations/personShow.html | 5 ++--- app/views/_employeeMenu.html | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/views/Configurations/personShow.html b/app/views/Configurations/personShow.html index 6dd80bed9..6a96ba2b4 100644 --- a/app/views/Configurations/personShow.html +++ b/app/views/Configurations/personShow.html @@ -24,14 +24,13 @@ Valore #{list items:currentConfiguration, as:'conf'} - #{if conf.epasParam.general && - (conf.epasParam.name != 'telework_stampings' || teleworkStampingsActive)} + #{secure.link @Configurations.personEdit(conf.id), 'data-async-modal':'#defaultModal'} &{conf.epasParam}#{/secure.link} ${templateUtility.getObjectInConfiguration(conf.epasParam, conf.fieldValue).label()} - #{/if} + #{/list} diff --git a/app/views/_employeeMenu.html b/app/views/_employeeMenu.html index c526eec92..b56d8a681 100644 --- a/app/views/_employeeMenu.html +++ b/app/views/_employeeMenu.html @@ -55,11 +55,11 @@ #{secure.li @Stampings.stampings(session.get("yearSelected"), session.get("monthSelected")) } #{/secure.li} - #{if teleworkStampingsActive} + #{secure.li @TeleworkStampings.teleworkStampings(session.get("yearSelected"), session.get("monthSelected")) } #{/secure.li} - #{/if} + #{secure.li @Absences.absences(session.get("yearSelected"), session.get("monthSelected")) } From d29b77fecc2ca697da920372ba40557311b7f58c Mon Sep 17 00:00:00 2001 From: dario Date: Thu, 25 Feb 2021 09:57:30 +0100 Subject: [PATCH 08/26] Cambiata la render del controller per la compilazione dell'organigramma per il dipendente --- app/controllers/Groups.java | 21 ++- app/manager/GroupManager.java | 121 +++++++-------- app/views/Groups/seatOrganizationChart.html | 159 +++++++++++++++++++- 3 files changed, 231 insertions(+), 70 deletions(-) diff --git a/app/controllers/Groups.java b/app/controllers/Groups.java index 4991a2003..7b607c55b 100644 --- a/app/controllers/Groups.java +++ b/app/controllers/Groups.java @@ -215,11 +215,28 @@ public static void seatOrganizationChart() { if (currentPerson == null) { Application.index(); } - Map> map = groupManager.createOrganizationChart(currentPerson); + Map> seatSupervisors = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.SEAT_SUPERVISOR)); + Map> personnelAdmins = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.PERSONNEL_ADMIN)); + Map> technicalAdmins = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.TECHNICAL_ADMIN)); + Map> registryManagers = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.REGISTRY_MANAGER)); + Map> mealTicketsManagers = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.MEAL_TICKET_MANAGER)); + Map> personnelAdminsMini = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.PERSONNEL_ADMIN_MINI)); + Map> shiftManagers = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.SHIFT_MANAGER)); + Map> reperibilityManagers = groupManager + .createOrganizationChart(currentPerson, roleDao.getRoleByName(Role.REPERIBILITY_MANAGER)); + List roles = uroDao.getUsersRolesOfficesByUser(currentPerson.user) .stream().map(uro -> uro.role).collect(Collectors.toList()); - render(map, currentPerson, roles); + render(seatSupervisors, personnelAdmins, technicalAdmins, registryManagers, mealTicketsManagers, + personnelAdminsMini, shiftManagers, reperibilityManagers, currentPerson, roles); } public static void viewInfoRole(Long id) { diff --git a/app/manager/GroupManager.java b/app/manager/GroupManager.java index 88b7622a4..ad0fdd223 100644 --- a/app/manager/GroupManager.java +++ b/app/manager/GroupManager.java @@ -121,7 +121,7 @@ public boolean deleteManager(Group group) { } return false; } - + /** * Inserisce ed elimina le affiliazioni ad un gruppo con data * corrente in funzione della lista delle persone passate. @@ -135,8 +135,8 @@ public void updatePeople(Group group, Set people) { log.info("Person toDisable = {}", toDisable); val currentAffiliationsToDisable = group.getAffiliations().stream() - .filter(a -> !a.isActive() && toDisable.contains(a.getPerson())) - .collect(Collectors.toSet()); + .filter(a -> !a.isActive() && toDisable.contains(a.getPerson())) + .collect(Collectors.toSet()); currentAffiliationsToDisable.stream().forEach(a -> { a.setEndDate(LocalDate.now()); a.save(); @@ -154,7 +154,7 @@ public void updatePeople(Group group, Set people) { person.getFullname(), group.getName()); }); } - + /** * Genera il dto contenente le liste dei possibili modificatori dello stato delle info * della persona passata come parametro. @@ -162,91 +162,82 @@ public void updatePeople(Group group, Set people) { * @return il dto contenente tutte le informazioni degli utenti che possono in qualche modo * modificare lo stato delle informazioni della persona passata come parametro. */ - public Map> createOrganizationChart(Person person) { - + public Map> createOrganizationChart(Person person, Role role) { + Map> map = Maps.newHashMap(); - for (Role role: roleDao.getAll()) { - if (role.name.equals(Role.BADGE_READER)) { - continue; - } - if (role.name.equals(Role.EMPLOYEE)) { - continue; - } - if (role.name.equals(Role.GROUP_MANAGER)) { - if (!groupDao.myGroups(person).isEmpty()) { - map.put(role, groupDao.myGroups(person).stream() - .map(g -> g.manager.user).collect(Collectors.toList())); - } else { - map.put(role, Lists.emptyList()); - } - } - if (role.name.equals(Role.MEAL_TICKET_MANAGER)) { - map.put(role, getMealTicketsManager(person.office)); - } - if (role.name.equals(Role.PERSON_DAY_READER)) { - continue; - } - if (role.name.equals(Role.PERSONNEL_ADMIN)) { - map.put(role, getPersonnelAdminInSeat(person.office)); - } - if (role.name.equals(Role.PERSONNEL_ADMIN_MINI)) { - map.put(role, getPersonnelAdminMiniInSeat(person.office)); - } - if (role.name.equals(Role.REGISTRY_MANAGER)) { - map.put(role, getRegistryManager(person.office)); - } - if (role.name.equals(Role.REPERIBILITY_MANAGER)) { - if (!person.reperibility.isEmpty()) { - map.put(role, person.reperibility.stream() - .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList())); - } - } - if (role.name.equals(Role.REST_CLIENT)) { - continue; - } - if (role.name.equals(Role.SEAT_SUPERVISOR)) { - map.put(role, getSeatSupervisor(person.office)); - } - if (role.name.equals(Role.SHIFT_MANAGER)) { - if (!person.personShifts.isEmpty()) { - map.put(role, person.personShifts.stream() - .flatMap(ps -> ps.personShiftShiftTypes.stream() - .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) - .collect(Collectors.toList())); - } - } - if (role.name.equals(Role.TECHNICAL_ADMIN)) { - map.put(role, getTechnicalAdminInSeat(person.office)); + + if (role.name.equals(Role.GROUP_MANAGER)) { + if (!groupDao.myGroups(person).isEmpty()) { + map.put(role, groupDao.myGroups(person).stream() + .map(g -> g.manager.user).collect(Collectors.toList())); + } else { + map.put(role, Lists.emptyList()); } } - + if (role.name.equals(Role.MEAL_TICKET_MANAGER)) { + map.put(role, getMealTicketsManager(person.office)); + } + + if (role.name.equals(Role.PERSONNEL_ADMIN)) { + map.put(role, getPersonnelAdminInSeat(person.office)); + } + if (role.name.equals(Role.PERSONNEL_ADMIN_MINI)) { + map.put(role, getPersonnelAdminMiniInSeat(person.office)); + } + if (role.name.equals(Role.REGISTRY_MANAGER)) { + map.put(role, getRegistryManager(person.office)); + } + if (role.name.equals(Role.REPERIBILITY_MANAGER)) { + if (!person.reperibility.isEmpty()) { + map.put(role, person.reperibility.stream() + .map(pr -> pr.personReperibilityType.supervisor.user).collect(Collectors.toList())); + } + } + + if (role.name.equals(Role.SEAT_SUPERVISOR)) { + map.put(role, getSeatSupervisor(person.office)); + } + if (role.name.equals(Role.SHIFT_MANAGER)) { + if (!person.personShifts.isEmpty()) { + map.put(role, person.personShifts.stream() + .flatMap(ps -> ps.personShiftShiftTypes.stream() + .map(psst -> psst.shiftType.shiftCategories.supervisor.user)) + .collect(Collectors.toList())); + } + } + if (role.name.equals(Role.TECHNICAL_ADMIN)) { + map.put(role, getTechnicalAdminInSeat(person.office)); + } + + return map; } - + private List getTechnicalAdminInSeat(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.TECHNICAL_ADMIN), office); } - + private List getPersonnelAdminInSeat(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.PERSONNEL_ADMIN), office); } - + private List getSeatSupervisor(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.SEAT_SUPERVISOR), office); } - + private List getMealTicketsManager(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.MEAL_TICKET_MANAGER), office); } - + private List getRegistryManager(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao.getRoleByName(Role.REGISTRY_MANAGER), office); } - + private List getPersonnelAdminMiniInSeat(Office office) { return uroDao.getUsersWithRoleOnOffice(roleDao .getRoleByName(Role.PERSONNEL_ADMIN_MINI), office); } + } diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html index b3ecf37c8..eb3995199 100644 --- a/app/views/Groups/seatOrganizationChart.html +++ b/app/views/Groups/seatOrganizationChart.html @@ -22,7 +22,7 @@ #{/accordionItem} #{accordionItem 'Organigramma', parent:'generic', title:'Altri ruoli in ePAS', open:true, color:'info'} - #{list items:map.entrySet(), as:'entry'} + #{list items:seatSupervisors.entrySet(), as:'entry'} #{if entry.getValue().empty }
    Non è stato ancora impostato alcun &{entry.getKey().name} ! @@ -41,10 +41,163 @@

    &{entry.getKey().name}

    #{/list} - #{/else} - + #{/else} + #{/list} + #{list items:personnelAdmins.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} #{/list} + + #{list items:technicalAdmins.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + + #{list items:registryManagers.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + + #{list items:mealTicketsManagers.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + + #{list items:personnelAdminsMini.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + + #{list items:shiftManagers.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + + #{list items:reperibilityManagers.entrySet(), as:'entry'} + #{if entry.getValue().empty } +
    + Non è stato ancora impostato alcun &{entry.getKey().name} ! +
    + #{/if} + #{else} +

    &{entry.getKey().name}

    +
      + #{list items:entry.getValue(), as:'userRole'} +
    • + ${userRole.person.fullname} + + Cosa può fare + +
    • + #{/list} +
    + #{/else} + #{/list} + #{/accordionItem} #{/accordionGroup} From c241ac6f6c50d0750a820941bb5b0e357fcabe2c Mon Sep 17 00:00:00 2001 From: dario Date: Mon, 1 Mar 2021 15:34:35 +0100 Subject: [PATCH 09/26] Aggiunto link alla pagina di riepilogo --- app/controllers/TeleworkStampings.java | 18 ++++++++++++++++++ .../TeleworkStampings/teleworkStampings.html | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/app/controllers/TeleworkStampings.java b/app/controllers/TeleworkStampings.java index 222f520eb..9c9de86c2 100644 --- a/app/controllers/TeleworkStampings.java +++ b/app/controllers/TeleworkStampings.java @@ -288,5 +288,23 @@ public static void editTeleworkStamping(long teleworkStampingId) { render(stamping); } + + /** + * Metodo che ritorna la schermata riepilogativa da mandare all'approvazione del responsabile + * della sede di lavoro. + * @param year l'anno di riferimento + * @param month il mese di riferimento + */ + public static void report(final Integer year, final Integer month) { + if (year == null || month == null) { + Stampings.stampings(LocalDate.now().getYear(), LocalDate.now().getMonthOfYear()); + } + val currentPerson = Security.getUser().get().person; + //Accesso da utente di sistema senza persona associata + if (currentPerson == null) { + Application.index(); + } + render(); + } } diff --git a/app/views/TeleworkStampings/teleworkStampings.html b/app/views/TeleworkStampings/teleworkStampings.html index c45659ac6..2aeafbc52 100644 --- a/app/views/TeleworkStampings/teleworkStampings.html +++ b/app/views/TeleworkStampings/teleworkStampings.html @@ -6,6 +6,12 @@ #{title title:('Orario in telelavoro ' + templateUtility.monthName(month) + ' ' + year) /} + #{list items:list, as:'day'}
    • From d2ec1184d236c16c5fcdc9f6d89a990b49121fba Mon Sep 17 00:00:00 2001 From: dario Date: Wed, 3 Mar 2021 14:37:02 +0100 Subject: [PATCH 10/26] Aggiunta la pagina di report delle timbrature in telelavoro da inviare alla visione per il responsabile di sede --- app/controllers/Groups.java | 2 +- app/controllers/TeleworkStampings.java | 27 +++++++- app/views/TeleworkStampings/report.html | 61 +++++++++++++++++++ .../TeleworkStampings/teleworkStampings.html | 2 +- conf/permissions.drl | 3 +- 5 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 app/views/TeleworkStampings/report.html diff --git a/app/controllers/Groups.java b/app/controllers/Groups.java index 7b607c55b..d5d3f9cdb 100644 --- a/app/controllers/Groups.java +++ b/app/controllers/Groups.java @@ -17,7 +17,7 @@ package controllers; -import com.beust.jcommander.internal.Maps; + import com.google.common.base.Optional; import dao.GeneralSettingDao; import dao.GroupDao; diff --git a/app/controllers/TeleworkStampings.java b/app/controllers/TeleworkStampings.java index 9c9de86c2..bd6c44953 100644 --- a/app/controllers/TeleworkStampings.java +++ b/app/controllers/TeleworkStampings.java @@ -116,7 +116,7 @@ public static void teleworkStampings(final Integer year, final Integer month) + "L'applicazione potrebbe essere spenta o non raggiungibile." + "Riprovare più tardi"); } - + render(list, year, month); } @@ -294,8 +294,11 @@ public static void editTeleworkStamping(long teleworkStampingId) { * della sede di lavoro. * @param year l'anno di riferimento * @param month il mese di riferimento + * @throws ExecutionException + * @throws NoSuchFieldException */ - public static void report(final Integer year, final Integer month) { + public static void report(final Integer year, final Integer month) + throws NoSuchFieldException, ExecutionException { if (year == null || month == null) { Stampings.stampings(LocalDate.now().getYear(), LocalDate.now().getMonthOfYear()); } @@ -304,7 +307,25 @@ public static void report(final Integer year, final Integer month) { if (currentPerson == null) { Application.index(); } - render(); + LocalDate date = LocalDate.now(); + List list = Lists.newArrayList(); + IWrapperPerson wrperson = wrapperFactory.create(currentPerson); + + if (!wrperson.isActiveInMonth(new YearMonth(year, month))) { + flash.error("Non esiste situazione mensile per il mese di %s %s", + DateUtility.fromIntToStringMonth(month), year); + + YearMonth last = wrperson.getLastActiveMonth(); + Stampings.stampings(last.getYear(), last.getMonthOfYear()); + } + PersonStampingRecap psDto = stampingsRecapFactory + .create(wrperson.getValue(), year, month, true); + + log.debug("Chiedo la lista delle timbrature in telelavoro ad applicazione esterna."); + list = manager.getMonthlyStampings(psDto); + String[] info = wrperson.getValue().office.name.split("-"); + String place = info[1]; + render(list, wrperson, date, place); } } diff --git a/app/views/TeleworkStampings/report.html b/app/views/TeleworkStampings/report.html new file mode 100644 index 000000000..f4d5c268b --- /dev/null +++ b/app/views/TeleworkStampings/report.html @@ -0,0 +1,61 @@ +#{extends 'main.html' /} +#{set header:'navbar' /} +#{set title: 'ePAS - Report mensile di telelavoro' /} + + +
      + +
      +

      Articolazione oraria svolta in regime di telelavoro nell'ambito del monte orario d'obbligo

      +
      + + +
      + + + + + + + + + + + + + + #{list items:list, as:'day'} + + + + + + + + + + #{/list} + +
      GiornoInizio giornataInizio pausa pranzoFine pausa pranzoFine giornataInterruzione dalleInterruzione alle
      ${day.personDay.date.shortDayName()}${!day.beginEnd.isEmpty() && day.beginEnd.get(0) != null ? day.beginEnd.get(0).formattedHour() : ''}${!day.meal.isEmpty() && day.meal.get(0) != null ? day.meal.get(0).formattedHour() : ''}${!day.meal.isEmpty() && day.meal.get(1) != null ? day.meal.get(1).formattedHour() : ''}${!day.beginEnd.isEmpty() && day.beginEnd.get(1) != null ? day.beginEnd.get(1).formattedHour() : ''}${!day.interruptions.isEmpty() && day.interruptions.get(0) != null ? day.interruptions.get(0).formattedHour() : ''}${!day.interruptions.isEmpty() && day.interruptions.get(1) != null ? day.interruptions.get(1).formattedHour() : ''}
      + + +Il sottoscritto ${wrperson.value.getFullname()}, matr. ${wrperson.value.number}, comunica di avere svolto nel mese in oggetto, +nei giorni indicati, e secondo gli orari concordati con il Direttore/Dirigente sopra evidenziati, la propria prestazione in +regime di Telelavoro:
      +
        +
      • presso la propria abitazione, +
      • nella sede di lavoro prevista coerentemente con quanto localmente ed oggettivamente rilevabile ed in uniformità a quanto previsto +nel proprio contratto di telelavoro. + +
      +
      +${place}, ${date} + + +
      \ No newline at end of file diff --git a/app/views/TeleworkStampings/teleworkStampings.html b/app/views/TeleworkStampings/teleworkStampings.html index 2aeafbc52..845c66b53 100644 --- a/app/views/TeleworkStampings/teleworkStampings.html +++ b/app/views/TeleworkStampings/teleworkStampings.html @@ -8,7 +8,7 @@ diff --git a/conf/permissions.drl b/conf/permissions.drl index d6412cc43..0ff7bc4e3 100755 --- a/conf/permissions.drl +++ b/conf/permissions.drl @@ -770,7 +770,8 @@ when $p: Person() from currentOperator.person PersonConfiguration(epasParam == EpasParam.TELEWORK_STAMPINGS, fieldValue == true) from $p.personConfigurations $c: PermissionCheck(action in ("TeleworkStampings.teleworkStampings","TeleworkStampings.insertStamping", "TeleworkStampings.save", - "TeleworkStampings.deleteTeleworkStamping", "TeleworkStampings.editTeleworkStamping"), granted == false, target == null) + "TeleworkStampings.deleteTeleworkStamping", "TeleworkStampings.editTeleworkStamping", "TeleworkStampings.report"), + granted == false, target == null) then $c.grant(); end From 41788174a4654bd66282415f5677962226052e3f Mon Sep 17 00:00:00 2001 From: dario Date: Fri, 19 Aug 2022 15:48:19 +0200 Subject: [PATCH 11/26] Modificati versione e changelog --- CHANGELOG.md | 1 + VERSION | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51a173d87..ebea3c07e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 lavoro e in smart working - Corretta generazione form richiesta ferie quando richieste nel passato - Cambiato comportamento del codice 26 che non deve far maturare residuo orario + - Aggiunto organigramma della sede di appartenenza del dipendente ## [2.5.3] - 2022-08-16 ### Added diff --git a/VERSION b/VERSION index c442efe98..92fa09fe4 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.4-rc1 \ No newline at end of file +2.5.4-rc2 \ No newline at end of file From 2e136f75aa5c9edb06924d4ac24567b6368a43df Mon Sep 17 00:00:00 2001 From: dario Date: Fri, 19 Aug 2022 16:15:19 +0200 Subject: [PATCH 12/26] Rimosso metodo del controller obsoleto e suo template --- app/controllers/TeleworkStampings.java | 38 -------------------------- 1 file changed, 38 deletions(-) diff --git a/app/controllers/TeleworkStampings.java b/app/controllers/TeleworkStampings.java index d7a2e65af..58c9f3bab 100644 --- a/app/controllers/TeleworkStampings.java +++ b/app/controllers/TeleworkStampings.java @@ -402,44 +402,6 @@ public static void editTeleworkStamping(long teleworkStampingId) { render(stamping); } - /** - * Metodo che ritorna la schermata riepilogativa da mandare all'approvazione del responsabile - * della sede di lavoro. - * @param year l'anno di riferimento - * @param month il mese di riferimento - * @throws ExecutionException - * @throws NoSuchFieldException - */ - public static void report(final Integer year, final Integer month) - throws NoSuchFieldException, ExecutionException { - if (year == null || month == null) { - Stampings.stampings(LocalDate.now().getYear(), LocalDate.now().getMonthOfYear()); - } - val currentPerson = Security.getUser().get().person; - //Accesso da utente di sistema senza persona associata - if (currentPerson == null) { - Application.index(); - } - LocalDate date = LocalDate.now(); - List list = Lists.newArrayList(); - IWrapperPerson wrperson = wrapperFactory.create(currentPerson); - - if (!wrperson.isActiveInMonth(new YearMonth(year, month))) { - flash.error("Non esiste situazione mensile per il mese di %s %s", - DateUtility.fromIntToStringMonth(month), year); - - YearMonth last = wrperson.getLastActiveMonth(); - Stampings.stampings(last.getYear(), last.getMonthOfYear()); - } - PersonStampingRecap psDto = stampingsRecapFactory - .create(wrperson.getValue(), year, month, true); - - log.debug("Chiedo la lista delle timbrature in telelavoro ad applicazione esterna."); - list = manager.getMonthlyStampings(psDto); - String[] info = wrperson.getValue().office.name.split("-"); - String place = info[1]; - render(list, wrperson, date, place); - } /** * Genera il report mensile di telelavoro. From dfcf891be0d84d1b15dbf76b3524871e69820edd Mon Sep 17 00:00:00 2001 From: Cristian Lucchesi Date: Fri, 19 Aug 2022 18:23:43 +0200 Subject: [PATCH 13/26] =?UTF-8?q?Possibilit=C3=A0=20di=20disattivare=20e?= =?UTF-8?q?=20cancellare=20orari=20lavoro=20predefiniti.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aggiunta anche la possibilità di rinominare gli orari di lavoro predefiniti. --- CHANGELOG.md | 4 + app/controllers/WorkingTimes.java | 90 +++++++++++++++---- app/dao/ContractDao.java | 28 ++++++ app/dao/WorkingTimeTypeDao.java | 12 ++- app/dao/wrapper/IWrapperWorkingTimeType.java | 6 ++ app/dao/wrapper/WrapperWorkingTimeType.java | 18 ++-- app/views/WorkingTimes/editDescription.html | 20 +++++ .../WorkingTimes/manageOfficeWorkingTime.html | 15 ++-- app/views/WorkingTimes/manageWorkingTime.html | 57 +++--------- .../tags/workingTime/defaultWorkingTimes.html | 86 ++++++++++++++++++ db/evolutions/65.sql | 16 ---- 11 files changed, 262 insertions(+), 90 deletions(-) create mode 100644 app/views/WorkingTimes/editDescription.html create mode 100755 app/views/tags/workingTime/defaultWorkingTimes.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 4088fe37a..8cf0633b9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [2.5.4] - UNRELEASED +### Added + - Aggiunta la possibilità di disattivare e cancellare gli orari di lavoro predefiniti + non utilizzati. + - Aggiunta la possibilità di rinominare gli orari di lavoro predefiniti. ### Changed - Aggiunti codici LAGILE e LAGILE in esportazione situazione mensile relativo a presenza a lavoro e in smart working diff --git a/app/controllers/WorkingTimes.java b/app/controllers/WorkingTimes.java index 747e166e8..de736292d 100755 --- a/app/controllers/WorkingTimes.java +++ b/app/controllers/WorkingTimes.java @@ -31,6 +31,7 @@ import dao.wrapper.IWrapperWorkingTimeType; import dao.wrapper.function.WrapperModelFunctionFactory; import helpers.ValidationHelper; +import helpers.Web; import it.cnr.iit.epas.DateInterval; import it.cnr.iit.epas.DateUtility; import java.util.List; @@ -88,6 +89,48 @@ public class WorkingTimes extends Controller { @Inject private static PeriodManager periodManager; + /** + * Form per l'aggiornamento della descrizione di una tipologia di orario + * di lavoro. + */ + public static void editDescription(Long wttId) { + WorkingTimeType wtt = workingTimeTypeDao.getWorkingTimeTypeById(wttId); + notFoundIfNull(wtt); + if (wtt.office != null) { + rules.checkIfPermitted(wtt.office); + } else { + rules.checkAction("WorkingTime.editDescriptionDefaultWorkingTime"); + } + render(wtt); + } + + /** + * Aggiornamento della descrizione di una tipologia di orario di lavoro. + */ + public static void updateDescription(Long wttId, @Required String description) { + WorkingTimeType wtt = workingTimeTypeDao.getWorkingTimeTypeById(wttId); + notFoundIfNull(wtt); + if (wtt.office != null) { + rules.checkIfPermitted(wtt.office); + } else { + rules.checkAction("WorkingTime.updateDescriptionDefaultWorkingTime"); + } + if (Validation.hasErrors()) { + response.status = 400; + flash.error(Web.msgHasErrors()); + render("@edit", wttId, description); + } + + log.info("Changing working time type description {} to {}, id = {}.", + wtt.description, description, wtt.id); + wtt.description = description; + wtt.save(); + log.info("Saved working time type description {}, id = {}.", + wtt.description, wtt.id); + flash.success("Descrizione tipologia orario di lavoro aggiornata correttamente"); + redirectToManageWorkingTime(wtt.office); + } + /** * Gestione dei tipi orario. * @@ -98,12 +141,16 @@ public static void manageWorkingTime(Long officeId) { Office office = officeDao.getOfficeById(officeId); notFoundIfNull(office); rules.checkIfPermitted(office); - + List wttDefault = FluentIterable - .from(workingTimeTypeDao.getDefaultWorkingTimeType()) + .from(workingTimeTypeDao.getDefaultWorkingTimeType(Optional.of(false))) .transform(wrapperFunctionFactory.workingTimeType()).toList(); - render(wttDefault, office); + List wttDefaultDisabled = FluentIterable + .from(workingTimeTypeDao.getDefaultWorkingTimeType(Optional.of(true))) + .transform(wrapperFunctionFactory.workingTimeType()).toList(); + + render(wttDefault, wttDefaultDisabled, office); } /** @@ -453,12 +500,7 @@ public static void showHorizontal(Long wttId) { public static void showWorkingTimeType(Long wttId) { WorkingTimeType wtt = workingTimeTypeDao.getWorkingTimeTypeById(wttId); - if (wtt == null) { - - flash.error("Impossibile caricare il tipo orario specificato. " - + "Riprovare o effettuare una segnalazione."); - WorkingTimes.manageWorkingTime(null); - } + notFoundIfNull(wtt); rules.checkIfPermitted(wtt.office); @@ -488,10 +530,11 @@ public static void delete(Long wttId) { wttd.delete(); } wtt.delete(); + log.info("Eliminata tipologia orario di lavoro {}, id={}", + wtt.description, wtt.id); flash.success("Tipo orario eliminato."); - WorkingTimes.manageOfficeWorkingTime(wtt.office.id); - + redirectToManageWorkingTime(wtt.office); } /** @@ -508,11 +551,11 @@ public static void toggleWorkingTimeTypeEnabled(Long wttId) { IWrapperWorkingTimeType wwtt = wrapperFactory.create(wtt); //Prima di disattivarlo controllo che non sia associato ad alcun contratto attivo - if (wtt.disabled == false && wwtt.getAssociatedActiveContract(wtt.office).size() > 0) { + if (wtt.disabled == false && wwtt.getAllAssociatedActiveContract().size() > 0) { flash.error("Impossibile eliminare il tipo orario selezionato perchè " + "attualmente associato ad almeno un contratto attivo."); - manageOfficeWorkingTime(wtt.office.id); + redirectToManageWorkingTime(wtt.office); } if (wtt.disabled) { @@ -520,17 +563,34 @@ public static void toggleWorkingTimeTypeEnabled(Long wttId) { wtt.disabled = false; wtt.save(); flash.success("Riattivato correttamente orario di lavoro."); - manageOfficeWorkingTime(wtt.office.id); + log.info("Riattivata tipologia orario di lavoro {}, id={}", wtt.description, wtt.id); + redirectToManageWorkingTime(wtt.office); } else { wtt.disabled = true; wtt.save(); flash.success("Disattivato orario di lavoro."); - manageOfficeWorkingTime(wtt.office.id); + log.info("Disattivata tipologia orario di lavoro {}, id={}", wtt.description, wtt.id); + redirectToManageWorkingTime(wtt.office); } } + /** + * Effettua il redirect alla gestione degli orari di lavoro di un ufficio + * se passato come parametro, altrimenti se possibile fa il redirect + * agli orari di lavoro predefiniti. + */ + public static void redirectToManageWorkingTime(Office office) { + flash.keep(); + if (office != null && office.id != null) { + manageOfficeWorkingTime(office.id); + } else if (session.get("officeSelected") != null){ + manageWorkingTime(Long.parseLong(session.get("officeSelected"))); + } else { + Application.indexAdmin(); + } + } /** * Modale per il cambia orario a tutti. diff --git a/app/dao/ContractDao.java b/app/dao/ContractDao.java index afbecadb8..287cc16ef 100755 --- a/app/dao/ContractDao.java +++ b/app/dao/ContractDao.java @@ -34,15 +34,18 @@ import models.ContractStampProfile; import models.Office; import models.Person; +import models.WorkingTimeType; import models.query.QContract; import models.query.QContractMandatoryTimeSlot; import models.query.QContractStampProfile; +import models.query.QContractWorkingTimeType; import org.joda.time.LocalDate; /** * Dao per i contract. * * @author Dario Tagliaferri + * @author Cristian Lucchesi */ public class ContractDao extends DaoBase { @@ -78,6 +81,31 @@ public Contract getContractById(Long id) { .where(contract.id.eq(id)).fetchOne(); } + /** + * La lista dei contratti attivi che hanno un periodo attivo con associato + * il tipo di orario di lavoro indicato. + */ + public List getAllAssociatedActiveContracts(WorkingTimeType cwtt) { + final QContract contract = QContract.contract; + final QContractWorkingTimeType qCwtt = QContractWorkingTimeType.contractWorkingTimeType; + + val now = LocalDate.now(); + final BooleanBuilder condition = new BooleanBuilder() + .andAnyOf(contract.endContract.isNull().and(contract.endDate.isNull()), + contract.endContract.isNull().and(contract.endDate.goe(now)), + contract.endDate.isNull().and(contract.endContract.goe(now)), + contract.endDate.goe(now).and(contract.endContract.goe(now))); + + val cwttCondition = new BooleanBuilder(); + cwttCondition.andAnyOf( + qCwtt.id.eq(cwtt.id), + qCwtt.beginDate.before(now), + qCwtt.endDate.isNull().or(qCwtt.endDate.after(now))); + cwttCondition.and(qCwtt.workingTimeType.eq(cwtt)); + return getQueryFactory().selectFrom(contract) + .join(contract.contractWorkingTimeType, qCwtt).on(cwttCondition).where(condition).fetch(); + } + /** * La lista di contratti che sono attivi nel periodo compreso tra begin e end. * diff --git a/app/dao/WorkingTimeTypeDao.java b/app/dao/WorkingTimeTypeDao.java index e379209bf..a3d4e9ffc 100755 --- a/app/dao/WorkingTimeTypeDao.java +++ b/app/dao/WorkingTimeTypeDao.java @@ -27,6 +27,7 @@ import java.util.List; import javax.inject.Inject; import javax.persistence.EntityManager; +import lombok.val; import models.Contract; import models.ContractWorkingTimeType; import models.Office; @@ -89,7 +90,8 @@ public List getEnabledWorkingTimeTypeForOffice(Office office) { final QWorkingTimeType wtt = QWorkingTimeType.workingTimeType; return getQueryFactory() .selectFrom(wtt) - .where(wtt.office.isNull().or(wtt.office.eq(office).and(wtt.disabled.eq(false)))).fetch(); + .where(wtt.office.isNull().and(wtt.disabled.eq(false)) + .or(wtt.office.eq(office).and(wtt.disabled.eq(false)))).fetch(); } /** @@ -110,10 +112,14 @@ public WorkingTimeType getWorkingTimeTypeById(Long id) { * * @return la lista degli orari di lavoro presenti di default sul database. */ - public List getDefaultWorkingTimeType() { + public List getDefaultWorkingTimeType(Optional disabled) { final QWorkingTimeType wtt = QWorkingTimeType.workingTimeType; + val condition = new BooleanBuilder(wtt.office.isNull()); + if (disabled.isPresent()) { + condition.and(wtt.disabled.eq(disabled.get())); + } return getQueryFactory().selectFrom(wtt) - .where(wtt.office.isNull()).orderBy(wtt.description.asc()).fetch(); + .where(condition).orderBy(wtt.description.asc()).fetch(); } diff --git a/app/dao/wrapper/IWrapperWorkingTimeType.java b/app/dao/wrapper/IWrapperWorkingTimeType.java index ecaed2064..8b89f7897 100755 --- a/app/dao/wrapper/IWrapperWorkingTimeType.java +++ b/app/dao/wrapper/IWrapperWorkingTimeType.java @@ -28,6 +28,12 @@ */ public interface IWrapperWorkingTimeType extends IWrapperModel { + /** + * La lista dei contratti attivi che hanno un periodo attivo con hanno associato + * il tipo di orario di lavoro indicato. + */ + public List getAllAssociatedActiveContract(); + /** * I contratti attivi che attualmente hanno impostato il WorkingTimeType. */ diff --git a/app/dao/wrapper/WrapperWorkingTimeType.java b/app/dao/wrapper/WrapperWorkingTimeType.java index c1335a399..1d66715f3 100755 --- a/app/dao/wrapper/WrapperWorkingTimeType.java +++ b/app/dao/wrapper/WrapperWorkingTimeType.java @@ -23,19 +23,20 @@ import dao.ContractDao; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import manager.ContractManager; import models.Contract; import models.ContractWorkingTimeType; import models.Office; import models.WorkingTimeType; import org.joda.time.LocalDate; -import org.testng.collections.Lists; /** * WrapperWorkingTimeType con alcune funzionalità aggiuntive. * * @author Alessandro Martelli + * @author Cristian Lucchesi */ public class WrapperWorkingTimeType implements IWrapperWorkingTimeType { @@ -56,6 +57,14 @@ public WorkingTimeType getValue() { return value; } + /** + * La lista dei contratti attivi che hanno un periodo attivo con associato + * il tipo di orario di lavoro indicato. + */ + public List getAllAssociatedActiveContract() { + return contractDao.getAllAssociatedActiveContracts(getValue()); + } + /** * I contratti attivi che attualmente hanno impostato il WorkingTimeType. */ @@ -102,10 +111,7 @@ public List getAssociatedPeriodInActiveContract(Office @Override public List getAssociatedContract() { - List contracts = Lists.newArrayList(); - for (ContractWorkingTimeType cwtt : this.value.contractWorkingTimeType) { - contracts.add(cwtt.contract); - } - return contracts; + return value.contractWorkingTimeType.stream().map(cwtt -> cwtt.contract) + .collect(Collectors.toList()); } } diff --git a/app/views/WorkingTimes/editDescription.html b/app/views/WorkingTimes/editDescription.html new file mode 100644 index 000000000..d1c1b90d3 --- /dev/null +++ b/app/views/WorkingTimes/editDescription.html @@ -0,0 +1,20 @@ +#{modalAsync id:'defaultModal', +title:('Modifica descrizione tipologia orario di lavoro')} + +

      Descrizione attuale: ${wtt.description}

      + +
      + #{form action:@WorkingTimes.updateDescription(), method:'POST', autocomplete:false, + class:'form form-horizontal', 'data-async':'#page_content', + 'data-async-error':'#workingTimeData'} + + #{f.hidden 'wttId', value:wtt.id /} + #{f.input 'description', value:wtt.description, label:'Nuova descrizione' /} + + #{b.buttons center:true} + #{b.submit 'Aggiorna'/} + #{/b.buttons} + + #{/form} +
      +#{/modalAsync} \ No newline at end of file diff --git a/app/views/WorkingTimes/manageOfficeWorkingTime.html b/app/views/WorkingTimes/manageOfficeWorkingTime.html index a024edc5a..3733b1934 100755 --- a/app/views/WorkingTimes/manageOfficeWorkingTime.html +++ b/app/views/WorkingTimes/manageOfficeWorkingTime.html @@ -23,11 +23,11 @@
    #{/secure.check} - #{tabList} - #{tabItem id:'attivi', title:'Attivi', active:true /} - #{tabItem id:'inattivi', title:'Disattivati' /} - #{/tabList} -
    + #{tabList} + #{tabItem id:'attivi', title:'Attivi', active:true /} + #{tabItem id:'inattivi', title:'Disattivati' /} + #{/tabList} +
    #{tabContent} #{tabContentItem id:'attivi', active:true} @@ -42,7 +42,7 @@ Descrizione Riproporziona quantità
    codici assenza - Contratti attivi
    attualmente associati + Contratti attivi
    con periodi attivi
    attualmente associati Periodi associati
    a contratti attivi Contratti
    associati
    (storico) #{secure.check 'WorkingTimeType.externalId'} @@ -109,7 +109,8 @@ #{/secure.check} #{secure.check 'WorkingTimes.changeWorkingTimeTypeToAll'} - + Cambia diff --git a/app/views/WorkingTimes/manageWorkingTime.html b/app/views/WorkingTimes/manageWorkingTime.html index 2ce06a57a..b3daf07ba 100755 --- a/app/views/WorkingTimes/manageWorkingTime.html +++ b/app/views/WorkingTimes/manageWorkingTime.html @@ -18,48 +18,19 @@ del personale per creare nuovi tipi orario particolari per le sedi amministrate. - - - - - - - - - #{list items:wttDefault, as:'wtt'} - - - - - - - - #{/list} -
    DescrizioneOrizzontaleContratti attivi
    attualmente associati
    (alla data di oggi)
    Periodi associati
    a contratti attivi
    Cambia orario
    a tutti
    - ${wtt.value.description} - - - #{if wtt.value.horizontal} Si #{/if} - #{else} No#{/else} - - - ${wtt.getAssociatedActiveContract(office).size()} - - - - ${wtt.getAssociatedPeriodInActiveContract(office).size()} - - - - Cambia - -
    + #{tabList} + #{tabItem id:'attivi', title:'Attivi', active:true /} + #{tabItem id:'inattivi', title:'Disattivati' /} + #{/tabList} + + #{tabContent} + #{tabContentItem id:'attivi', active:true} + #{workingTime.defaultWorkingTimes wtts:wttDefault /} + #{/tabContentItem} + #{tabContentItem id:'inattivi'} + #{workingTime.defaultWorkingTimes wtts:wttDefaultDisabled /} + #{/tabContentItem} + #{/tabContent} + #{/panel} diff --git a/app/views/tags/workingTime/defaultWorkingTimes.html b/app/views/tags/workingTime/defaultWorkingTimes.html new file mode 100755 index 000000000..9aa46199a --- /dev/null +++ b/app/views/tags/workingTime/defaultWorkingTimes.html @@ -0,0 +1,86 @@ +*{ + activeAction: la action tab attiva +}* + +%{ + wtts = _wtts; + }% + + + + + + + + #{secure.check 'WorkingTimeType.getAllAssociatedActiveContracts'} + + + #{/secure.check} + + + #{list items:wtts, as:'wtt'} + + + + + + #{secure.check 'WorkingTimeType.getAllAssociatedActiveContracts'} + + + + #{/secure.check} + + + #{/list} +
    DescrizioneOrizzontaleContratti attivi
    con periodi attivi
    attualmente associati
    (alla data di oggi)
    Periodi associati
    a contratti attivi
    Tutti i contratti attivi
    con periodi attivi
    attualmente associati
    (alla data di oggi)
    Tutti i contratti
    associati
    (storico)
    Cambia orario
    a tutti
    + ${wtt.value.description} + + + #{secure.check 'WorkingTime.editDescriptionDefaultWorkingTime'} + + + + #{/secure.check} + + #{if wtt.value.horizontal} Si #{/if} + #{else} No#{/else} + + + ${wtt.getAssociatedActiveContract(office).size()} + + + + ${wtt.getAssociatedPeriodInActiveContract(office).size()} + + + ${wtt.getAllAssociatedActiveContract().size()} + #{if wtt.getAllAssociatedActiveContract().size() == 0 } + #{secure.check 'WorkingTimes.toggleWorkingTimeTypeEnabled'} + + + + #{/secure.check} + #{/if } + + ${wtt.getAssociatedContract().size()} + #{if wtt.getAssociatedContract().size() == 0 } + #{secure.check 'WorkingTimes.toggleWorkingTimeTypeEnabled'} + + + + #{/secure.check} + #{/if} + + + Cambia + +
    diff --git a/db/evolutions/65.sql b/db/evolutions/65.sql index 1efbb6791..67f3d7239 100755 --- a/db/evolutions/65.sql +++ b/db/evolutions/65.sql @@ -92,10 +92,8 @@ INSERT INTO vacation_codes (description, permission_days, vacation_days) VALUES -- INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (1, 'Normale', false, true, NULL, false); -INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (2, 'Maternità', false, true, NULL, false); INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (4, '50%', false, true, NULL, false); INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (5, '60%', false, true, NULL, false); -INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (6, 'Maternità Gemellare', false, true, NULL, false); INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (8, '80%', false, true, NULL, false); INSERT INTO working_time_types (id, description, shift, meal_ticket_enabled, office_id, disabled) VALUES (9, '85%', false, true, NULL, false); @@ -110,13 +108,6 @@ INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtic INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 5, false, 360, 0, 0, 0, 0, 0, 0, 432, 1, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 6, true, 360, 0, 0, 0, 0, 0, 0, 432, 1, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 7, true, 360, 0, 0, 0, 0, 0, 0, 432, 1, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 1, false, 312, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 2, false, 312, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 3, false, 312, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 4, false, 312, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 5, false, 312, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 6, true, 0, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 7, true, 0, 0, 0, 0, 0, 0, 0, 312, 2, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 1, false, 360, 0, 0, 0, 0, 0, 0, 216, 4, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 2, false, 360, 0, 0, 0, 0, 0, 0, 216, 4, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 3, false, 360, 0, 0, 0, 0, 0, 0, 216, 4, NULL, NULL); @@ -131,13 +122,6 @@ INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtic INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 5, false, 0, 0, 0, 0, 0, 0, 0, 260, 5, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 6, true, 0, 0, 0, 0, 0, 0, 0, 260, 5, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 7, true, 0, 0, 0, 0, 0, 0, 0, 260, 5, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 1, false, 192, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 2, false, 192, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 3, false, 192, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 4, false, 192, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 5, false, 192, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 6, true, 0, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); -INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (0, 7, true, 0, 0, 0, 0, 0, 0, 0, 192, 6, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 1, false, 600, 0, 0, 0, 0, 0, 0, 345, 8, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 2, false, 600, 0, 0, 0, 0, 0, 0, 345, 8, NULL, NULL); INSERT INTO working_time_type_days (breaktickettime, dayofweek, holiday, mealtickettime, timemealfrom, timemealto, timeslotentrancefrom, timeslotentranceto, timeslotexitfrom, timeslotexitto, workingtime, working_time_type_id, ticket_afternoon_threshold, ticket_afternoon_working_time) VALUES (30, 3, false, 600, 0, 0, 0, 0, 0, 0, 345, 8, NULL, NULL); From 0c7c6153dd2c06b7516efe0216cd9046b010c968 Mon Sep 17 00:00:00 2001 From: Cristian Lucchesi Date: Mon, 22 Aug 2022 10:53:07 +0200 Subject: [PATCH 14/26] Aggiunta visualizzazione di tutti i contratti di un tipo di orario. --- app/controllers/WorkingTimes.java | 27 +++++++++++++------ .../WorkingTimes/manageOfficeWorkingTime.html | 2 +- app/views/WorkingTimes/showContract.html | 10 ++++++- .../tags/workingTime/defaultWorkingTimes.html | 18 +++++++------ 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/app/controllers/WorkingTimes.java b/app/controllers/WorkingTimes.java index de736292d..47ca67d46 100755 --- a/app/controllers/WorkingTimes.java +++ b/app/controllers/WorkingTimes.java @@ -183,24 +183,35 @@ public static void manageOfficeWorkingTime(Long officeId) { /** - * I contratti attivi che per quella sede hanno quel tipo orario. + * I contratti attivi che per quella sede hanno quel tipo orario, + * oppure per tutte le sedi se si hanno i permessi giusti e si + * imposta il parametro allOffices a true. * * @param wttId orario * @param officeId sede + * @param allOffices boolean per mostrare i contratti di tutte le sedi */ - public static void showContract(Long wttId, Long officeId) { + public static void showContract(Long wttId, Long officeId, boolean allOffices) { WorkingTimeType wtt = workingTimeTypeDao.getWorkingTimeTypeById(wttId); notFoundIfNull(wtt); - Office office = officeDao.getOfficeById(officeId); - notFoundIfNull(office); - + rules.checkIfPermitted(wtt.office); - rules.checkIfPermitted(office); + List contractList = Lists.newArrayList(); + Office office = null; - List contractList = wrapperFactory.create(wtt).getAssociatedActiveContract(office); + if (allOffices) { + contractList = wrapperFactory.create(wtt).getAllAssociatedActiveContract(); + rules.checkAction("WorkingTimes.showAllContracts"); + } else { + office = officeDao.getOfficeById(officeId); + notFoundIfNull(office); + rules.checkIfPermitted(office); + + contractList = wrapperFactory.create(wtt).getAssociatedActiveContract(office); + } - render(wtt, contractList, office); + render(wtt, contractList, office, allOffices); } diff --git a/app/views/WorkingTimes/manageOfficeWorkingTime.html b/app/views/WorkingTimes/manageOfficeWorkingTime.html index 3733b1934..6e962d0d6 100755 --- a/app/views/WorkingTimes/manageOfficeWorkingTime.html +++ b/app/views/WorkingTimes/manageOfficeWorkingTime.html @@ -73,7 +73,7 @@ - + ${wtt.getAssociatedActiveContract(office).size()} diff --git a/app/views/WorkingTimes/showContract.html b/app/views/WorkingTimes/showContract.html index 99952519a..9a80a2634 100755 --- a/app/views/WorkingTimes/showContract.html +++ b/app/views/WorkingTimes/showContract.html @@ -6,7 +6,9 @@ #{alert color:'info'} -

    Elenco delle persone di ${office.name} +

    Elenco delle persone + #{if !allOffices}di ${office.name}#{/if} + #{else}di tutti gli uffici#{/else} con attualmente associato l'orario ${wtt.description}.

    #{/alert} @@ -14,6 +16,9 @@ Nome + #{if allOffices} + Ufficioth> + #{/if} Inizio Contratto Fine Contratto @@ -22,6 +27,9 @@ #{list items:contractList, as:'contract'} ${contract.person.surname} ${contract.person.name} + #{if allOffices} + ${contract.person.office.name} + #{/if} ${contract.beginDate?.format()} ${contract.endDate?.format()} diff --git a/app/views/tags/workingTime/defaultWorkingTimes.html b/app/views/tags/workingTime/defaultWorkingTimes.html index 9aa46199a..064cd9366 100755 --- a/app/views/tags/workingTime/defaultWorkingTimes.html +++ b/app/views/tags/workingTime/defaultWorkingTimes.html @@ -9,14 +9,14 @@ - - - + + + #{secure.check 'WorkingTimeType.getAllAssociatedActiveContracts'} #{/secure.check} - + #{list items:wtts, as:'wtt'} @@ -37,23 +37,25 @@ #{/secure.check} - - - #{secure.check 'WorkingTimeType.getAllAssociatedActiveContracts'}
    DescrizioneOrizzontaleContratti attivi
    con periodi attivi
    attualmente associati
    (alla data di oggi)
    Periodi associati
    a contratti attivi
    OrizzontaleContratti attivi
    con periodi attivi
    attualmente associati
    (alla data di oggi)
    Periodi associati
    a contratti attivi
    Tutti i contratti attivi
    con periodi attivi
    attualmente associati
    (alla data di oggi)
    Tutti i contratti
    associati
    (storico)
    Cambia orario
    a tutti
    Cambia orario
    a tutti
    + #{if wtt.value.horizontal} Si #{/if} #{else} No#{/else} + ${wtt.getAssociatedActiveContract(office).size()} + ${wtt.getAssociatedPeriodInActiveContract(office).size()} - ${wtt.getAllAssociatedActiveContract().size()} + + ${wtt.getAllAssociatedActiveContract().size()} + #{if wtt.getAllAssociatedActiveContract().size() == 0 } #{secure.check 'WorkingTimes.toggleWorkingTimeTypeEnabled'} From 8ba809171595b6f8a0b86bf938525806569accfc Mon Sep 17 00:00:00 2001 From: dario Date: Mon, 22 Aug 2022 15:52:34 +0200 Subject: [PATCH 15/26] Migliorata la visualizzazione delle casistiche di inizializzazione. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nella pagina dei dati contrattuali, spezzati i controlli che determinano un alert per mancanza di inizializzazione oraria (la più importante) d quelli che determinano una differenza di date tra inizializzazione oraria e di buoni pasto (che possono essere volute a causa di inizializzazioni successive) --- app/views/Contracts/personContracts.html | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app/views/Contracts/personContracts.html b/app/views/Contracts/personContracts.html index 33037ee7d..4d56d30b6 100755 --- a/app/views/Contracts/personContracts.html +++ b/app/views/Contracts/personContracts.html @@ -17,20 +17,27 @@ Il dipendente attualmente non ha un contratto attivo. #{/if} #{else} - #{if wrCurrentContract.initializationMissing() || wrCurrentContract.mealTicketInitBeforeGeneralInit() } + #{if wrCurrentContract.initializationMissing()} #{alert color:'danger', center:true}

    Il contratto attuale non è correttamente inizializzato.

    #{b.buttons center:true} - #{if wrCurrentContract.initializationMissing()} - #{b.link @Contracts.initializationsStatus(wrCurrentContract.value.person.office.id), color:'danger', title:'Inizializza'/} - #{/if} - #{else} - #{b.link @Contracts.initializationsMeal(wrCurrentContract.value.person.office.id), color:'danger', title:'Inizializza'/} - #{/else} + #{b.link @Contracts.initializationsStatus(wrCurrentContract.value.person.office.id), color:'danger', title:'Inizializza'/} #{/b.buttons} #{/alert} #{/if} + #{if wrCurrentContract.mealTicketInitBeforeGeneralInit()} + #{alert color:'warning', center:true} +

    + Le date di inizializzazione del residuo orario e dei buoni pasto non coincidono.
    + Nel caso in cui le inizializzazioni fossero volutamente diverse per motivi gestionali, ignorare + il presente alert. +

    + #{b.buttons center:true} + #{b.link @Contracts.initializationsMeal(wrCurrentContract.value.person.office.id), color:'warning', title:'Inizializza'/} + #{/b.buttons} + #{/alert} + #{/if}
    From 4045ca2e6a95fbb6e64146e0419bcf2ad44dcd36 Mon Sep 17 00:00:00 2001 From: dario Date: Mon, 22 Aug 2022 15:56:52 +0200 Subject: [PATCH 16/26] Modificato changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24fb8c24c..952915dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Corretta generazione form richiesta ferie quando richieste nel passato - Cambiato comportamento del codice 26 che non deve far maturare residuo orario - Aggiunto organigramma della sede di appartenenza del dipendente + - Modificata la visualizzazione sui dati contrattuali del tipo di incongruenza sulle inizializzazioni ## [2.5.3] - 2022-08-16 ### Added From fe27c784460aa39eae853733d4937a28e9067364 Mon Sep 17 00:00:00 2001 From: darietto1983 Date: Tue, 23 Aug 2022 14:34:16 +0200 Subject: [PATCH 17/26] Aggiunto controllo drools sulle ferie anno passato dopo deadline. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Secure.check sul template che controlla il risultato di una drools che verifica se il parametro è a sì nella configurazione della sede cui appartiene il dipendente. --- app/views/_workflowsMenu.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/views/_workflowsMenu.html b/app/views/_workflowsMenu.html index 3970a110f..1ad7f168c 100644 --- a/app/views/_workflowsMenu.html +++ b/app/views/_workflowsMenu.html @@ -60,10 +60,11 @@ #{/secure.li} - + #{secure.check 'AbsenceRequests.pastYearEnabled'} #{secure.li @AbsenceRequests.vacationsPastYearAfterDeadline()} #{/secure.li} + #{/secure.check} @@ -121,7 +122,7 @@ #{/if} #{/secure.li} - + #{secure.check 'AbsenceRequests.pastYearEnabled'} #{secure.li @AbsenceRequests.vacationsPastYearAfterDeadlineToApprove()} @@ -130,6 +131,7 @@ #{/if} #{/secure.li} + #{/secure.check} #{secure.check 'InformationRequests.enabled'} From 3904c37bb198816526174e3c98ef91b207d17d8b Mon Sep 17 00:00:00 2001 From: darietto1983 Date: Tue, 23 Aug 2022 14:45:20 +0200 Subject: [PATCH 18/26] Modificato Changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 952915dbd..04b4e7411 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Cambiato comportamento del codice 26 che non deve far maturare residuo orario - Aggiunto organigramma della sede di appartenenza del dipendente - Modificata la visualizzazione sui dati contrattuali del tipo di incongruenza sulle inizializzazioni + - Aggiunto controllo per impedire la visualizzazione del flusso ferie anno passato dopo deadline se il + corrispondente parametro in configurazione è a NO ## [2.5.3] - 2022-08-16 ### Added From fe13f83f3a3619de89fad8cab66768719b7f754c Mon Sep 17 00:00:00 2001 From: Cristian Lucchesi Date: Wed, 24 Aug 2022 15:43:39 +0200 Subject: [PATCH 19/26] =?UTF-8?q?Reso=20pi=C3=B9=20robusto=20l'invio=20del?= =?UTF-8?q?l'email=20per=20missioni=20problematiche.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 ++ VERSION | 2 +- app/manager/NotificationManager.java | 30 ++++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04b4e7411..b3c8e6ec3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Aggiunta la possibilità di disattivare e cancellare gli orari di lavoro predefiniti non utilizzati. - Aggiunta la possibilità di rinominare gli orari di lavoro predefiniti. + - Inviata email al dipendente ed all'ufficio opportuno quando ci sono problemi + nell'inserimento di una richiesta di missione o di rimborso ### Changed - Aggiunti codici LAGILE e LAGILE in esportazione situazione mensile relativo a presenza a lavoro e in smart working diff --git a/VERSION b/VERSION index 92fa09fe4..dbfe81db6 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.5.4-rc2 \ No newline at end of file +2.5.4-rc3 \ No newline at end of file diff --git a/app/manager/NotificationManager.java b/app/manager/NotificationManager.java index 651b879c5..1e3103ed1 100644 --- a/app/manager/NotificationManager.java +++ b/app/manager/NotificationManager.java @@ -18,6 +18,7 @@ package manager; import com.google.common.base.Optional; +import com.google.common.base.Strings; import com.google.common.base.Verify; import com.google.inject.Inject; import controllers.Security; @@ -1774,15 +1775,35 @@ public void sendEmailMissionFromClientProblems(MissionFromClient mission) { SimpleEmail simpleEmail = new SimpleEmail(); String replayTo = (String) configurationManager .configValue(person.office, EpasParam.EMAIL_TO_CONTACT); + + if (Strings.isNullOrEmpty(replayTo)) { + person.office.usersRolesOffices.stream() + .filter(uro -> uro.role.name.equals(Role.PERSONNEL_ADMIN)) + .map(uro -> uro.user).forEach(u -> { + try { + simpleEmail.addCc(u.person.email); + } catch (EmailException e) { + log.error("Impossibile impostare cc nell'email per missione " + + "con problemi. {}", mission, e); + } + }); + } else { + try { + simpleEmail.addReplyTo(replayTo); + simpleEmail.addCc(replayTo); + } catch (EmailException e) { + log.error("Impossibile impostare cc o bcc nell'email per missione " + + "con problemi. {}", mission, e); + } + } + try { simpleEmail.addTo(person.email); - simpleEmail.addReplyTo(replayTo); - simpleEmail.addCc(replayTo); } catch (EmailException e) { log.error("Errore nell'invio dell'email per missione con problemi", e); e.printStackTrace(); } - + simpleEmail.setSubject( String.format("ePas: verificare missione n. %s del %s di %s", mission.numero, mission.anno, mission.person.getFullname())); @@ -1802,7 +1823,8 @@ public void sendEmailMissionFromClientProblems(MissionFromClient mission) { try { simpleEmail.setMsg(mailBody); } catch (EmailException e) { - e.printStackTrace(); + log.error("Errore nell'invio dell'email per missione con problemi. {}", + mission, e); } Mail.send(simpleEmail); log.info("Inviata email per problemi sulla missione n. {} del {} di {} dal {} al {}", From 6aa2e7dbab13de14c36c8187d02776b6b8e387dd Mon Sep 17 00:00:00 2001 From: dario Date: Wed, 24 Aug 2022 17:09:47 +0200 Subject: [PATCH 20/26] Corretto bug in visualizzazione dell'utente con ruolo sulla sede. Nel caso sia un utente orfano ad avere un ruolo sulla sede viene ora mostrato l'username. --- app/views/Groups/seatOrganizationChart.html | 25 +++++++++++---------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/views/Groups/seatOrganizationChart.html b/app/views/Groups/seatOrganizationChart.html index eb3995199..3233eb4d8 100644 --- a/app/views/Groups/seatOrganizationChart.html +++ b/app/views/Groups/seatOrganizationChart.html @@ -30,16 +30,17 @@ #{/if} #{else}

    &{entry.getKey().name}

    -