From 23a46b4be35277e06ec89f48730eeb694e686be8 Mon Sep 17 00:00:00 2001
From: Kenmegne <stephanie.kenmegne@gmail.com>
Date: Thu, 18 Jun 2026 15:40:06 +0000
Subject: [PATCH] add fdx-commons and fdx-consultation

---
 fdx-consultation/fdxconsultation-core-impl/src/main/java/com/megatim/fdxconsultation/core/impl/stats/TableauBordManagerImpl.java |  316 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 316 insertions(+), 0 deletions(-)

diff --git a/fdx-consultation/fdxconsultation-core-impl/src/main/java/com/megatim/fdxconsultation/core/impl/stats/TableauBordManagerImpl.java b/fdx-consultation/fdxconsultation-core-impl/src/main/java/com/megatim/fdxconsultation/core/impl/stats/TableauBordManagerImpl.java
new file mode 100644
index 0000000..35aa9df
--- /dev/null
+++ b/fdx-consultation/fdxconsultation-core-impl/src/main/java/com/megatim/fdxconsultation/core/impl/stats/TableauBordManagerImpl.java
@@ -0,0 +1,316 @@
+package com.megatim.fdxconsultation.core.impl.stats;
+
+import com.megatim.fdxcommons.core.ifaces.helper.DataInMemoryHandler;
+import com.megatim.fdxcommons.model.integration.ColumnDefinition;
+import com.megatim.fdxcommons.model.referentiel.TypeFichier;
+import com.megatim.fdxcommons.tools.database.connection.DBConnection;
+import com.megatim.fdxcommons.tools.database.exceptions.BadQueryCriteriaException;
+import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError;
+import com.megatim.fdxcommons.tools.database.tables.FdxTable;
+import com.megatim.fdxcommons.tools.database.tables.FdxTableColumns;
+import com.megatim.fdxcommons.tools.exceptions.CommonApplicationValidationException;
+import com.megatim.fdxcommons.tools.exceptions.CommonRessourceNotFoundException;
+import com.megatim.fdxconsultation.core.ifaces.integration.ColumnDefinitionManager;
+import com.megatim.fdxconsultation.core.ifaces.referentiel.ReferentielManager;
+import com.megatim.fdxconsultation.core.ifaces.stats.TableauBordManager;
+import com.megatim.fdxconsultation.core.impl.factory.FdxConsultationTableFactory;
+import com.megatim.fdxconsultation.dao.ifaces.abstracts.PaginationWithSearchEnityDAO;
+import com.megatim.fdxconsultation.dao.ifaces.stats.TableauBordDAO;
+import com.megatim.fdxconsultation.model.administration.User;
+import com.megatim.fdxconsultation.model.dto.stats.StatResultDto;
+import com.megatim.fdxconsultation.model.stats.TableauBord;
+import com.megatim.fdxconsultation.model.enums.TypeConfigurationTableauBord;
+import com.megatim.fdxconsultation.model.searchentities.TableauBordSearch;
+import com.megatim.fdxconsultation.model.stats.TableConfiguration;
+import com.megatim.fdxconsultation.model.stats.dto.TableauBordRequest;
+import com.megatim.fdxconsultation.tools.context.AppCommonContext;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.annotation.Resource;
+import javax.ejb.EJB;
+import javax.enterprise.context.Dependent;
+import javax.inject.Inject;
+import javax.naming.NamingException;
+import javax.sql.DataSource;
+
+/**
+ *
+ * @author ASUS
+ */
+@Dependent
+public class TableauBordManagerImpl implements TableauBordManager {
+
+    @Resource(lookup = AppCommonContext.JNDI_NAME)
+    private DataSource dataSource;
+
+    @EJB
+    private TableauBordDAO dao;
+
+    @Inject
+    private DataInMemoryHandler dataInMemoryHandler;
+
+    @Inject
+    private ReferentielManager refManager;
+
+    @Inject
+    private ColumnDefinitionManager columnDefinitionManager;
+
+    @Override
+    public TableauBordDAO getDao() {
+        return dao;
+    }
+
+    @Override
+    public PaginationWithSearchEnityDAO<TableauBord, Long, TableauBordSearch> getPaginationDao() {
+        return dao;
+    }
+
+    @Override
+    public List<TableauBord> findByReferentiel(String referentielVersion) {
+        return getDao().findByReferentiel(referentielVersion);
+    }
+
+    @Override
+    public TableauBord findByUserAndTypeFichierAndReferentiel(Long userId, String codeTypeFichier, String referentielVersion) {
+        TableauBord tableauBord = getDao().findByUserAndTypeFichierAndReferentiel(userId, codeTypeFichier, referentielVersion);
+        if (tableauBord == null) {
+            throw new CommonRessourceNotFoundException("La ressource ayant le fichier " + codeTypeFichier + " et le référentiel " + referentielVersion + " est introuvable");
+        }
+        return tableauBord;
+    }
+
+    @Override
+    public Map<String, List<String>> userTableauBordToTypeFichiers(String userName) {
+        Map<String, List<String>> particpantToFichierDto = new HashMap<>();
+        dao.tableauBordToTypeFichiers(userName, dataInMemoryHandler.getDataInMemory().getReferentielEnCours().getVersion()).forEach(p -> {
+            String key = p.getCodeParticipant();
+            List<String> value = particpantToFichierDto.get(key);
+            if (value == null) {
+                value = new ArrayList<>();
+            }
+            value.add(p.getCodeFichier());
+            particpantToFichierDto.put(key, value);
+        });
+        return particpantToFichierDto;
+    }
+
+    @Override
+    public Map<String, List<String>> globalTableauBordToTypeFichiers() {
+        Map<String, List<String>> particpantToFichierDto = new HashMap<>();
+        dao
+                .tableauBordToTypeFichiers(TypeConfigurationTableauBord.GLOBAL, dataInMemoryHandler.getDataInMemory().getReferentielEnCours().getVersion())
+                .forEach(p -> {
+                    String key = p.getCodeParticipant();
+                    List<String> value = particpantToFichierDto.get(key);
+                    if (value == null) {
+                        value = new ArrayList<>();
+                    }
+                    value.add(p.getCodeFichier());
+                    particpantToFichierDto.put(key, value);
+                });
+        return particpantToFichierDto;
+    }
+
+    @Override
+    public List<TableauBord> deleteUserTableauBord(User user) {
+        //Tous les tableaux de bord associés à l'utilisateur user
+        List<TableauBord> tableauxBords = getDao().findByUser(user.getId(), refManager.getReferentielEnCours().getVersion());
+        List<TableauBord> tableauxBordsDeleted = new ArrayList<>();
+
+        //TypeFichiers auxquels l'utilisateur user à accès
+        Map<String, TypeFichier> typeFichiersMap = user.getTypeFichiers()
+                .stream()
+                .collect(Collectors.toMap(TypeFichier::getCode, Function.identity()));
+
+        for (TableauBord t : tableauxBords) {
+            //Supprimer les tableaux de bord dont le typefichier n'est plus accessible à user
+            if (!typeFichiersMap.containsKey(t.getTypeFichier().getCode())) {
+                getDao().delete(t);
+                tableauxBordsDeleted.add(t);
+            }
+        }
+        return tableauxBordsDeleted;
+    }
+
+    @Override
+    public TableauBord findByTypeConfigurationAndReferentiel(String codeTypeFichier, String referentielVersion, TypeConfigurationTableauBord typeConfiguration) {
+        return getDao().findByTypeConfigurationAndReferentiel(codeTypeFichier, referentielVersion, typeConfiguration);
+    }
+
+    @Override
+    public TableauBord save(TableauBordRequest tableauBordRequest) {
+
+        try ( Connection connection = new DBConnection(dataSource).connection()) {
+
+            String codeTypeFichier = tableauBordRequest.getTypeFichier().getCode();
+            String referentielVersion = tableauBordRequest.getReferentiel().getVersion();
+
+            FdxTable fdxTable = FdxConsultationTableFactory.createTable(codeTypeFichier, referentielVersion, connection);
+            List<ColumnDefinition> columnDefinitions = fdxTable.tableDefinition(connection).tableDefinition().getColumnDefinitions();
+            FdxTableColumns fdxTableColumns = fdxTable.tableColumns(connection);
+
+            stopIfRequestIsNotCorrect(codeTypeFichier, referentielVersion, tableauBordRequest, columnDefinitions);
+
+            TableauBord tableauBord = new ConvertedTableauBord(tableauBordRequest, columnDefinitions, fdxTableColumns).tableauBord();
+            tableauBord.setTypeConfiguration(TypeConfigurationTableauBord.GLOBAL);
+            return save(tableauBord);
+
+        } catch (BadQueryCriteriaException | LocalDateTimeValueParseError | SQLException | NamingException ex) {
+            throw new CommonApplicationValidationException(ex.getMessage());
+        }
+
+    }
+
+    @Override
+    public TableauBord save(User user, TableauBordRequest tableauBordRequest) {
+
+        try ( Connection connection = new DBConnection(dataSource).connection()) {
+
+            String codeTypeFichier = tableauBordRequest.getTypeFichier().getCode();
+            String referentielVersion = tableauBordRequest.getReferentiel().getVersion();
+
+            FdxTable fdxTable = FdxConsultationTableFactory.createTable(codeTypeFichier, referentielVersion, connection);
+            List<ColumnDefinition> columnDefinitions = fdxTable.tableDefinition(connection).tableDefinition().getColumnDefinitions();
+            FdxTableColumns fdxTableColumns = fdxTable.tableColumns(connection);
+
+            stopIfRequestIsNotCorrect(user.getId(), codeTypeFichier, referentielVersion, tableauBordRequest, columnDefinitions);
+
+            TableauBord tableauBord = new ConvertedTableauBord(tableauBordRequest, columnDefinitions, fdxTableColumns).tableauBord();
+            tableauBord.setTypeConfiguration(TypeConfigurationTableauBord.USER_SPECIFIC);
+            tableauBord.setUser(user);
+
+            TableauBord entity = save(tableauBord);
+            return entity;
+
+        } catch (BadQueryCriteriaException | LocalDateTimeValueParseError | SQLException | NamingException ex) {
+            throw new CommonApplicationValidationException(ex.getMessage());
+        }
+    }
+
+    @Override
+    public void update(Long id, TableauBordRequest tableauBordRequest) {
+
+        try ( Connection connection = new DBConnection(dataSource).connection()) {
+
+            TableauBord tableauBord = get(id);
+
+            FdxTable fdxTable = FdxConsultationTableFactory.createTable(
+                    tableauBord.getTypeFichier().getCode(),
+                    tableauBord.getReferentiel().getVersion(),
+                    connection
+            );
+            List<ColumnDefinition> columnDefinitions = fdxTable.tableDefinition(connection).tableDefinition().getColumnDefinitions();
+            FdxTableColumns fdxTableColumns = fdxTable.tableColumns(connection);
+
+            stopIfTableauBordRequestIncorrect(tableauBordRequest, columnDefinitions);
+
+            TableauBord convertedTableauBord
+                    = new ConvertedTableauBord(tableauBordRequest, columnDefinitions, fdxTableColumns).tableauBord();
+
+            tableauBord.getTableConfigurations().clear();
+            for (TableConfiguration tableConfiguration : convertedTableauBord.getTableConfigurations()) {
+                tableauBord.getTableConfigurations().add(tableConfiguration);
+                tableConfiguration.setTableauBord(tableauBord);
+            }
+
+            tableauBord.setDescription(convertedTableauBord.getDescription());
+
+            save(tableauBord);
+
+        } catch (BadQueryCriteriaException | LocalDateTimeValueParseError | SQLException | NamingException ex) {
+            throw new CommonApplicationValidationException(ex.getMessage());
+        }
+    }
+
+    @Override
+    public TableauBord get(Long id) {
+        TableauBord tableauBord = getById(id);
+        if (tableauBord == null) {
+            throw new CommonRessourceNotFoundException("La ressource ayant l'identifiant " + id + " est introuvable");
+        }
+        return tableauBord;
+    }
+
+    @Override
+    public void delete(Long id) {
+        throw new UnsupportedOperationException("Not supported yet.");
+    }
+
+    @Override
+    public StatResultDto getDatas(User user, String referentielVersion, String codeTypeFichier) {
+        try {
+            return new TableauBordResult(specificTableauBord(user, codeTypeFichier, referentielVersion), dataSource).result();
+        } catch (Exception ex) {
+            throw new CommonApplicationValidationException(ex.getMessage());
+        }
+    }
+
+    @Override
+    public StatResultDto getDatas(String referentielVersion, String codeTypeFichier) {
+        try {
+            return new TableauBordResult(globalTableauBord(codeTypeFichier, referentielVersion), dataSource).result();
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            throw new CommonApplicationValidationException(ex.getMessage());
+        }
+    }
+
+    private TableauBord globalTableauBord(String codeTypeFichier, String referentielVersion) {
+        TableauBord tableauBord = getDao().findGlobalTableauBord(codeTypeFichier, referentielVersion);
+        if (tableauBord == null) {
+            throw new CommonRessourceNotFoundException("La ressource ayant le fichier " + codeTypeFichier + " et le référentiel " + referentielVersion + " est introuvable");
+        }
+        return tableauBord;
+    }
+
+    private TableauBord specificTableauBord(User user, String codeTypeFichier, String referentielVersion) {
+        TableauBord tableauBord = getDao().findSpecificTableauBord(user.getId(), codeTypeFichier, referentielVersion);
+        if (tableauBord == null) {
+            throw new CommonRessourceNotFoundException("La ressource ayant le fichier " + codeTypeFichier + " et le référentiel " + referentielVersion + " est introuvable");
+        }
+        return tableauBord;
+    }
+
+    private void stopIfRequestIsNotCorrect(String codeTypeFichier, String referentielVersion, TableauBordRequest tableauBordRequest, List<ColumnDefinition> columnDefinitions) {
+        stopIfTypeFichierNotStructured(codeTypeFichier, referentielVersion);
+        stopIfTableauBordExist(codeTypeFichier, referentielVersion);
+        stopIfTableauBordRequestIncorrect(tableauBordRequest, columnDefinitions);
+    }
+
+    private void stopIfRequestIsNotCorrect(Long userId, String codeTypeFichier, String referentielVersion, TableauBordRequest tableauBordRequest, List<ColumnDefinition> columnDefinitions) {
+        stopIfTypeFichierNotStructured(codeTypeFichier, referentielVersion);
+        stopIfTableauBordExist(userId, codeTypeFichier, referentielVersion);
+        stopIfTableauBordRequestIncorrect(tableauBordRequest, columnDefinitions);
+    }
+
+    private void stopIfTableauBordRequestIncorrect(TableauBordRequest tableauBordRequest, List<ColumnDefinition> columnDefinitions) throws CommonApplicationValidationException {
+        String tableauBordError = new TableauBordRequestError(tableauBordRequest, columnDefinitions).error();
+        if (!tableauBordError.isEmpty()) {
+            throw new CommonApplicationValidationException(tableauBordError);
+        }
+    }
+
+    private void stopIfTableauBordExist(Long userId, String codeTypeFichier, String referentielVersion) {
+        if (dao.findSpecificTableauBord(userId, codeTypeFichier, referentielVersion) != null) {
+            throw new CommonApplicationValidationException("Une configuration existe déjà pour ce typefichier, cet utilisateur et ce référentiel");
+        }
+    }
+
+    private void stopIfTableauBordExist(String codeTypeFichier, String referentielVersion) {
+        if (dao.findGlobalTableauBord(codeTypeFichier, referentielVersion) != null) {
+            throw new CommonApplicationValidationException("Une configuration existe déjà pour ce typefichier, cet utilisateur et ce référentiel");
+        }
+    }
+
+    private void stopIfTypeFichierNotStructured(String codeTypeFichier, String referentielVersion) {
+        if (columnDefinitionManager.findByReferentielAndTypeFichier(referentielVersion, codeTypeFichier).isEmpty()) {
+            throw new CommonApplicationValidationException("Le type de fichier ciblé n'est pas structuré");
+        }
+    }
+}

--
Gitblit v1.10.0