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-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/TableDataValidationError.java |  174 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 174 insertions(+), 0 deletions(-)

diff --git a/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/TableDataValidationError.java b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/TableDataValidationError.java
new file mode 100644
index 0000000..172c8b8
--- /dev/null
+++ b/fdx-commons/fdxcommons-tools/src/main/java/com/megatim/fdxcommons/tools/database/queries/validation/TableDataValidationError.java
@@ -0,0 +1,174 @@
+package com.megatim.fdxcommons.tools.database.queries.validation;
+
+import com.megatim.fdxcommons.model.enumeration.TypeDonnee;
+import com.megatim.fdxcommons.model.integration.ColumnDefinition;
+import com.megatim.fdxcommons.tools.database.exceptions.LocalDateTimeValueParseError;
+import com.megatim.fdxcommons.tools.database.queries.metadata.InsertionLocalDateTimeValue;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.apache.commons.validator.GenericValidator;
+
+/**
+ *
+ * @author Gabuntu
+ */
+public class TableDataValidationError {
+
+    private final ArrayList<String> errors = new ArrayList<>();
+
+    private final Map<String, ColumnDefinition> columnNameToColumnDefinition;
+    private final List<ColumnDefinition> columnDefinitions;
+    private final List<LinkedHashMap<String, Object>> data;
+    private final boolean withOptionalColumn;
+
+    public TableDataValidationError(List<LinkedHashMap<String, Object>> data, List<ColumnDefinition> columnDefinitions) {
+        this(data, columnDefinitions, false);
+    }
+
+    public TableDataValidationError(List<LinkedHashMap<String, Object>> data, List<ColumnDefinition> columnDefinitions, boolean withOptionalColumn) {
+        this.data = data;
+        this.withOptionalColumn = withOptionalColumn;
+        this.columnDefinitions = columnDefinitions;
+        this.columnNameToColumnDefinition = columnDefinitions.stream().collect(Collectors.toMap(c -> c.getName().trim().toLowerCase(), c -> c));
+    }
+
+    public String validationError() {
+        if (errors.isEmpty()) {
+            int index = 1;
+            for (Map<String, Object> dataItem : data) {
+                processDataItem(dataItem, index++);
+            }
+        }
+        return error();
+    }
+
+    private String error() {
+        StringBuilder stringBuilder = new StringBuilder("");
+        errors.forEach(e -> {
+            if (e != null && !e.isEmpty()) {
+                stringBuilder.append(e).append("\n");
+            }
+        }
+        );
+        return stringBuilder.toString();
+    }
+
+    private void processDataItem(Map<String, Object> dataItem, int index) {
+
+        for (Map.Entry<String, Object> dataItemEntry : dataItem.entrySet()) {
+
+            String columnName = dataItemEntry.getKey();
+            Object columnValue = dataItemEntry.getValue();
+
+            ColumnDefinition columnDefinition = columnNameToColumnDefinition.get(columnName.trim().toLowerCase());
+            if (columnDefinition == null) {
+                errors.add("La colonne " + columnName + " n'existe pas pour ce fichier. " + lineNumberString(index));
+                return;
+            }
+
+            String error = columnValueError(columnValue, columnDefinition);
+            if (error != null && !error.isEmpty()) {
+                errors.add(error + " " + lineNumberString(index));
+            }
+
+        }
+
+        if (!withOptionalColumn) {
+            addErrorForNotFoundColumn(dataItem, index);
+        }
+    }
+
+    private void addErrorForNotFoundColumn(Map<String, Object> dataItem, int index) {
+        columnDefinitions.forEach(columnDefinition -> {
+            String columnDefinitionName = columnDefinition.getName().toLowerCase();
+            if (!columnNameExist(dataItem, columnDefinitionName)) {
+                errors.add("La colonne " + columnDefinitionName + " est manquante dans la requête. " + lineNumberString(index));
+            }
+        });
+    }
+
+    private String columnValueError(Object columnValue, ColumnDefinition columnDefinition) {
+        String columnType = columnDefinition.getTypeDonnee();
+
+        if (columnType.equals(TypeDonnee.ALPHANUMERIQUE.toString())) {
+
+            if (!isAlphaNumericColumn(columnValue)) {
+                return "La colonne " + columnDefinition.getName() + " doit être alpha numérique";
+            } else if (!lengthLowerOrEquals((String) columnValue, columnDefinition.getTaille())) {
+                return "La taille de la colonne " + columnDefinition.getName() + " doit être inférieure ou égale à" + columnDefinition.getTaille();
+            }
+
+        } else if (columnType.equals(TypeDonnee.DECIMAL.toString())) {
+
+            if (columnValue != null) {
+
+                String stringValue = columnValue.toString();
+                if (!GenericValidator.isDouble(stringValue)) {
+                    return "La colonne " + columnDefinition.getName() + " doit être décimale";
+                } else if (!lengthLowerOrEquals(stringValue, columnDefinition.getTaille())) {
+                    return "La taille de la colonne " + columnDefinition.getName() + " doit être inférieure ou égale à " + columnDefinition.getTaille();
+                }
+
+            }
+
+        } else if (columnType.equals(TypeDonnee.NUMERIQUE.toString())) {
+
+            if (columnValue != null) {
+
+                String stringValue = columnValue.toString();
+                if (!GenericValidator.isLong(stringValue)) {
+                    return "La colonne " + columnDefinition.getName() + " doit être numérique";
+                } else if (!lengthLowerOrEquals(stringValue, columnDefinition.getTaille())) {
+                    return "La taille de la colonne " + columnDefinition.getName() + " doit être inférieure ou égale à " + columnDefinition.getTaille();
+                }
+
+            }
+
+        } else if (columnType.equals(TypeDonnee.DATE.toString())) {
+
+            if (columnValue != null) {
+
+                String stringValue = columnValue.toString();
+                if (!GenericValidator.isDate(stringValue, columnDefinition.getFormatDate(), true)) {
+                    return "La colonne " + columnDefinition.getName() + " doit être une date";
+                } else if (!lengthEquals(stringValue, columnDefinition.getTaille())) {
+                    return "La taille de la colonne " + columnDefinition.getName() + " doit être égale à " + columnDefinition.getTaille();
+                }
+
+                try {
+                    new InsertionLocalDateTimeValue(columnDefinition.getFormatDate(), columnValue).value();
+                } catch (LocalDateTimeValueParseError ex) {
+                    return "Impossible de parser la valeur " + stringValue + " au format " + columnDefinition.getFormatDate() + " pour la colonne " + columnDefinition.getName();
+                }
+
+            }
+
+        }
+
+        return null;
+    }
+
+    private boolean isAlphaNumericColumn(Object columnValue) {
+        return (columnValue == null || columnValue instanceof String);
+    }
+
+    private boolean lengthEquals(String value, int columnMaxLength) {
+        return value.trim().length() == columnMaxLength;
+    }
+
+    private boolean lengthLowerOrEquals(String value, int columnMaxLength) {
+        return value.trim().length() <= columnMaxLength;
+    }
+
+    private String lineNumberString(int index) {
+        return "Ligne " + index;
+    }
+
+    private boolean columnNameExist(Map<String, Object> dataItem, String columnDefinitionName) {
+        return dataItem.entrySet().stream().map(e -> e.getKey()).filter(key -> key.trim().toLowerCase().equals(columnDefinitionName)).findAny().isPresent();
+    }
+
+}

--
Gitblit v1.10.0